Delegation and Self like things for Squeak
Stephen Pair
spair at yahoo.com
Sat Aug 18 03:56:13 UTC 2001
The following is copied from the web page: http://spair.swiki.net/21
(which also contains screenshot). It thought it may be of interest
to the people on this list.
-------------
=== Overview
This change set adds delegation capabilities to the Squeak VM. It
also extends some previous work on prototypes by Hans Martin Mosner
to implement a Self-like (http://self.sunlabs.com) system within
Squeak.
Delegation is the act of forwarding a message to another object, but
maintaining the original receiver such that sends to self in the new
method context will be directed back to the delegating object.
=== Screenshot
The following screenshot shows ProtoInspectors open on a family
(literally) of objects. They are arranged according to their
inheritance hierarchy. Slots with an asterisk denote parent slots
(their behavior is inherited by the child). The image doesn't show
it, but you may have any number of parent slots.
<<see web page: http://spair.swiki.net/21>>
=== Implementation Details
Two new bytecodes are added to the VM:
singleExtendedDelegateBytecode
doubleExtendedDelegateBytecode
(but the compiler has not yet been modified to generate these
bytecodes)
Several new primtives are added to support delegation and reflection
primitiveDelegate - added to Object as #delegate:,
#delegate:with:, ...etc
primitiveDelegateArgs - added to Object as #delegate:withArguments:
The following primitives allow a Mirror to reflect on objects without
needing to send messages to the reflectee (this allows mirror to
manipulate objects that may have a very lightweight protocol):
primitiveGetSlots
primitiveSetSlots
primitiveGetProtoBehavior
primitiveSetProtoBehavior
The message lookup algorithm is also modified to search the parent
slots of objects whos class is an instance of ProtoBehavior. This
allows for instance based, multiple inheritance.
Bytecodes accessing the internal structure of an object
(pushReceiverVariable and kin) are modified such that the look to
the "receiverStorage" object in the active context. In normal
messages receiverStorage is identical to receiver, but in delegated
methods, they will be different.
You may create object that inherit behavior from normal Smalltalk
instances (direct instance variable manipulation will affect the
parent object, not the child's slots).
Hans Martin Mosner's HmmProtoObject class has been dropped in favor
of the Mirror class and a reflection based approach to meta-
programming in the spirit of Self. To add or remove slots or methods,
you must use a mirror (unless you add methods to your instance). The
ProtoInpector now uses a Mirror to manipulate an object. This allows
objects to be inspected and manipulated even if they have no behavior.
The VM has also been enhanced such that a recursive
#doesNotUnderstand: will not crash the image, but lookup the
#doesNotUnderstand: on Object (and you will get a #doesNotUnderstand:
on a #doesNotUnderstand: message). This was done because the
likelyhood of accidentally creating objects that don't understand
#doesNotUnderstand: has increased dramatically with the introduction
of ProtoBehavior.
There should now be enough support in the VM to implement a pretty
robust implementation of Self within Squeak. It would be really cool
to see the Self tools for manipulating objects recreated in Squeak.
=== Issues
The compiler has not been modified in any way, shape or form to
implement anything like the Self syntax. This means that doing
certain things can be awkward. Additionally, this means that you must
use #delegate: or one of it's variants in order to accomplish what
Self calls a "resend." Also, only a directed resend is possible.
There is no way to store instance based source code, therefore, all
methods appear in their de-compiled form. This is a pain.
=== Downloading
There are three things that you can download:
1. A bundle that includes a demo image, changes file, and a Win32 VM
2. Just the change set (you will need to compile your own VM and
follow the procedure below to get an existing image prepared to run
on it) 3. Just the win32 VM (note, trying to run a base Squeak image
on this VM won't get you very far very fast)
If you are going to compile you own VM, you will need to load the
change set, and then execute the following code in a workspace to
prepare the existing method contexts in your image:
MethodContext allInstances do:
[ :ea | ea instVarNamed: #receiverMap put: ea receiver ]. Smalltalk
snapshot: true andQuit: true.
Then, you should have an image that will work on your new VM with
support for delegation.
More information about the Self-interest
mailing list