"thisContext selector" (the revenge)
Alejandro F. Reimondo
aleReimondo at sugarweb.com
Fri Aug 21 23:06:08 UTC 1998
"Alejandro F. Reimondo" <<aleReimondo at sugarweb.com> wrote...
>>What can I do to get the sent selector of thisContext
>> from the VM stack (or current method) ?
Tim Olson <<tim at jumpnet.com> replied...
>You will have to look at the bytecode prior to the sender's PC to
>determine its type. If it is a literal send (> 208), then you can get
>the selector using something like:
> | method pc |
> method := thisContext sender method.
> pc := thisContext sender pc.
> ^ method literals at: ((method at: pc-1) - 207)
>Common selectors
.... [snip]
>
>You can determine the selector for these by building a
>bytecode->selector dictionary.
Dan Ingalls <<DanI at wdi.disney.com>> replied...
>...[snip]...you can get all of the special selectors, ..[snip]...
>Smalltalk specialObjectsArray at: 24
It is working ok as suggested by Tim and using the expression
Smalltalk specialSelectorAt: index
to find the special selectors.
It works the first time!
but...
what happens when you send a #perform: message?
It is solved in a primitive method that sends the message inside the VM;
activating a new method context to solve the performed message.
Then, when I look for the sent message in the context, the message found
is #perform:... and the activated method is NOT the #perform implementation
Ouch!
The #perform: implementation does not create a MethodContext because
it is a primitive method!
mmm...
When I search in the contexts (actual and the sender's context)
I can find the #perform: selector, but the arguments are missing
( has been absorbed by primitive)
Provably the problem will be difficult to solve with the contexts information only...
Is there any known (easy) way to solve the #perform: problem?
thanks.
Ale.
More information about the Squeak-dev
mailing list
|