The reason for the question is strictly pedagogical. I am learning Smalltalk and i am playing with implementation of a Cells type package ala LISP or pyCells and Cellulose from the Python world.
I do not really expect complete this, as I said its just a learning exercise.
The question around the instance variables stems from the fact that they appear to be tantalizingly close to the surface given the fact that the Browser recognizes undeclared identifiers and asks if they are temps or instance and then plugs in the code for me.
I am just too new to be able to figure out how to intercept the messages being sent.
Thanks for the help and suggestions.
beginners-request@lists.squeakfoundation.org wrote:
Send Beginners mailing list submissions to beginners@lists.squeakfoundation.org
To subscribe or unsubscribe via the World Wide Web, visit http://lists.squeakfoundation.org/mailman/listinfo/beginners or, via email, send a message with subject or body 'help' to beginners-request@lists.squeakfoundation.org
You can reach the person managing the list at beginners-owner@lists.squeakfoundation.org
When replying, please edit your Subject line so it is more specific than "Re: Contents of Beginners digest..."
Today's Topics:
- How to introspect method instance variables (rdmerrio)
- Re: How to introspect method instance variables (Michael van der Gulik)
- Re: How to introspect method instance variables (Yoshiki Ohshima)
Message: 1 Date: Mon, 24 Aug 2009 21:16:16 -0500 From: rdmerrio rdmerrio@gmail.com Subject: [Newbies] How to introspect method instance variables To: beginners@lists.squeakfoundation.org Message-ID: 4A934970.4070202@gmail.com Content-Type: text/plain; charset=ISO-8859-1; format=flowed
I have defined a method, i.e.,
someMethod anInstVariable := anotherInstVariable1 + anotherInstVariable2.
I would like to intercept the acceptance of this method by the browser and programatically determine what instance variables this method is using so that I can grab these names for other processing tasks.
Additionally, I would really like to be able to determine what instance variables are being assigned to, for instance, anInstVariable in this case and which ones are the "independent" instance variables, anotherInstVariable1 and anotherInstVariable2 in this case.
How can I do this?
Thanks
Message: 2 Date: Tue, 25 Aug 2009 14:34:18 +1200 From: Michael van der Gulik mikevdg@gmail.com Subject: Re: [Newbies] How to introspect method instance variables To: "A friendly place to get answers to even the most basic questions about Squeak." beginners@lists.squeakfoundation.org Message-ID: 1b61adf40908241934ve0f2ba1iacb768b3b122b94d@mail.gmail.com Content-Type: text/plain; charset="iso-8859-1"
On Tue, Aug 25, 2009 at 2:16 PM, rdmerrio rdmerrio@gmail.com wrote:
I have defined a method, i.e.,
someMethod anInstVariable := anotherInstVariable1 + anotherInstVariable2.
I would like to intercept the acceptance of this method by the browser and programatically determine what instance variables this method is using so that I can grab these names for other processing tasks.
Additionally, I would really like to be able to determine what instance variables are being assigned to, for instance, anInstVariable in this case and which ones are the "independent" instance variables, anotherInstVariable1 and anotherInstVariable2 in this case.
How can I do this?
Why? What are you trying to achieve? You're talking about some pretty intrusive techniques. Unless you're developing a code analyser of some sort, you probably should be looking at a better way of doing what you're doing.
To capture the acceptance of a method (assuming you mean the action that happens when you press alt+s), you insert a bit of code into PluggableTextMorph>>accept.
To determine which instance variables are being assigned to, you'll need to somehow look at the bytecodes. They're not too hard to analyse, but it can be a bit of work. Alternatively, maybe the refactory browser can help, or maybe you can look at the intermediate code that the compiler generates.
The bytecodes are described here: http://burks.bton.ac.uk/burks/language/smaltalk/goldberg/blueb003.htm. They're in the "Blue book chapter 28" if you need to Google it. You'll want the "store" bytecodes.
To see real bytecodes, either inspect "Morph>>#basicInitialize" to see a CompiledMethod, or use the "byteCodes" view in a Browser (hidden behind the "source" button).
Gulik.
"rdmerrio" == rdmerrio rdmerrio@gmail.com writes:
rdmerrio> The question around the instance variables stems from the fact that rdmerrio> they appear to be tantalizingly close to the surface given the fact rdmerrio> that the Browser recognizes undeclared identifiers and asks if they rdmerrio> are temps or instance and then plugs in the code for me.
Not the browser, the compiler. And the compiler knows all the identifiers in scope, or it couldn't compile the code.
On 26.08.2009, at 00:36, rdmerrio wrote:
The reason for the question is strictly pedagogical. I am learning Smalltalk and i am playing with implementation of a Cells type package ala LISP or pyCells and Cellulose from the Python world.
You mean
http://common-lisp.net/project/cells/
So you basically want something that looks like an instance variable but in fact is a computed value.
Squeak's instance variables are not reified. The compiler produces bytecodes accessing them directly (and very efficiently) but it's not possible to intercept inst var accesses at the byte code level. You would need to change the compiler to not generate the direct access bytecodes, but a message send instead, that can be intercepted.
Tweak's compiler does this. See class CCompiler in Croquet.
It has an extended notion of instance variables called "fields". A field can be an actual instance variable (like in Smalltalk), a property (a dictionary entry, like in Python), or a "virtual field" (like in Cells). Accesses to virtual fields are actually compiled as message sends. So if "foo" is a virtual field, then
foo := foo + 1
is compiled to
self foo: self foo + 1
behind the scenes, and you are free to implement #foo and #foo: however you like.
So ... all you need to do is hack the Compiler :)
Alternatively, look at Marcus Denker's IRBuilder and ByteSurgeon which lets you experiment with byte codes.
- Bert -
beginners@lists.squeakfoundation.org