[comp.sys.mac.programmer] RecoverHandle in INITs

hawley@adobe.COM (Steve Hawley) (09/28/90)

Several days ago Tracy Narine (tracyn@dgp.toronto.edu) posted a question on
how to solve the problem of recovering a handle to yourself in an INIT in
MPW C without having to resort to writing an assembly language stub to load
a resource genertaed by C.

In think C, you have the benefit of an inline assembler, so you can do something
like:

Handle this_is_me;

main()
{
	asm {
		_RecoverHandle /* a0 is set up already */
		move.l a0, this_is_me
	}
	HLock(this_is_me); /* or whatever */
}

In discussing this with her I came up with the following code:

Handle this_is_me;

typedef Handle (*FuncReturningHandle)();

static unsigned short FooledYou[] = {
	0xa128, /* trap word for _RecoverHandle */
	0x2008, /* code for move.l a0, d0 */
	0x4e75  /* code for rts */
};

main()
{
	this_is_me = (*((FuncReturningHandle)FooledYou))();
	/* This treats the static array, FooledYou, as a function and
	 * executes it.  Being a good citizen we follow C and Macintosh
	 * conventions of leaving the return value of the function in
	 * register d0, which gets assigned to this_is_me.
	 */
	HLock(this_is_me); /* etc */
}

I'd appreciate it if someone would test this.  I don't have MPW.  I checked it
on a Sun 3/80, eliminating the trap word and stepping through the code an
instruction at a time, and it worked like a gem.  Hopefully, getting the
address of the static array shouldn't get in the way.

I realize this is an abuse of the sleazy handling of C pointers, but I think
this is a clever way around the problem.

Enjoy.

Steve Hawley
hawley@adobe.com
-- 
"I'm sick and tired of being told that ordinary decent people are fed up with
being sick and tired.  I know I'm certainly not, and I'm sick and tired of
begin told that I am." -Monty Python