ghost
DESCRIPTION
ESUG 2011, EdinburghTRANSCRIPT
![Page 2: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/2.jpg)
What is a proxy?
2
A proxy object is a surrogate or placeholder that controls access to
another target object.
Monday, August 22, 2011
![Page 3: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/3.jpg)
Glossary
Target: object to proxify.
Client: user of the proxy.
Interceptor: object that intercepts message sending.
Handler: object that performs a desired action as a consequence of an interception.
3
Monday, August 22, 2011
![Page 4: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/4.jpg)
Forwarder and Logging example
4
Monday, August 22, 2011
![Page 5: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/5.jpg)
With or without Object replacement?
In proxies with object replacement (#become:), the target object is replaced by a proxy.
Proxies without object replacement are a kind of factory.
5
Monday, August 22, 2011
![Page 6: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/6.jpg)
With or without Object replacement?
In proxies with object replacement (#become:), the target object is replaced by a proxy.
Proxies without object replacement are a kind of factory.
5
Monday, August 22, 2011
![Page 7: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/7.jpg)
Traditional proxy implementations
6
Usage of a minimal object together with an implementation of a custom #doesNotUnderstand
doesNotUnderstand:executeBeforeHandlingexecuteAfterHandling
targetProxy
identityHashpointersTonextObject...
ProtoObject
Monday, August 22, 2011
![Page 8: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/8.jpg)
7
We are going to play a little game...
Monday, August 22, 2011
![Page 9: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/9.jpg)
8
Are both prints in Transcript the same or not?
Monday, August 22, 2011
![Page 10: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/10.jpg)
8
Are both prints in Transcript the same or not?
Conclusion: methods understood are NOT intercepted.Is that bad?
Monday, August 22, 2011
![Page 11: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/11.jpg)
8
Are both prints in Transcript the same or not?
Conclusion: methods understood are NOT intercepted.Is that bad?
Different execution paths Errors difficult to findMonday, August 22, 2011
![Page 12: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/12.jpg)
9
Do we want the regular #doesNotUnderstand or to intercept the message?
Monday, August 22, 2011
![Page 13: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/13.jpg)
10
Do we want the regular #doesNotUnderstand or to intercept the message?
Monday, August 22, 2011
![Page 14: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/14.jpg)
11
I wanted the normal #doesNotUnderstand!!!
Monday, August 22, 2011
![Page 15: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/15.jpg)
12
I wanted the normal #doesNotUnderstand!!!
Monday, August 22, 2011
![Page 16: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/16.jpg)
Problems #doesNotUnderstand: cannot be trapped like a regular message.
Mix of handling procedure and proxy interception.
Only methods that are not understood are intercepted.
No separation between proxies and handlers
13
This approach is not stratified
Monday, August 22, 2011
![Page 17: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/17.jpg)
14
Subclassing from nil does not solve the problem.
Monday, August 22, 2011
![Page 18: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/18.jpg)
15
VM CRASH
This solution is not uniform
Monday, August 22, 2011
![Page 19: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/19.jpg)
16
A Uniform, Light-weight and Stratified Proxy Model and Implementation.
Monday, August 22, 2011
![Page 20: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/20.jpg)
Used hooks
Object replacement (#become:)
Change an object’s class (#adoptInstance:)
Objects as methods (#run:with:in:)
Classes with no method dictionary (#cannotInterpret:)
17
Monday, August 22, 2011
![Page 21: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/21.jpg)
Object replacement
18
AB
CD
AB
CD
c become: d
Monday, August 22, 2011
![Page 22: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/22.jpg)
Objects as methods
19
The VM sends #run: aSelector with: anArray in: aReceiver
Monday, August 22, 2011
![Page 23: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/23.jpg)
Objects as methods
19
The VM sends #run: aSelector with: anArray in: aReceiver
So.....We can implement in Proxy:
Monday, August 22, 2011
![Page 24: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/24.jpg)
CLasses with no method dictionary
20
aProxy
aProxy username
1: #username send
methodDict := nilProxyTrap
cannotInterpret: aMessageProxy
Object
2: #aProxy lookup
3: Since the method dictionary was nil, the VM sends #cannotInterpret to
the receiver but starting the lookup in the superclass
4: #cannotInterpret: lookup
Referencesinstance ofmessage sendlookupsubclass
Monday, August 22, 2011
![Page 25: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/25.jpg)
Ghost model
21
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
handleInterception: anInterceptionProxyHandler
handleInterception: anInterceptionSimpleForwarderHandler
messageproxyproxyState
Interception
Monday, August 22, 2011
![Page 26: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/26.jpg)
How it works?
22
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
Monday, August 22, 2011
![Page 27: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/27.jpg)
How it works?
22
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
Proxy class >>
Monday, August 22, 2011
![Page 28: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/28.jpg)
How it works?
22
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
aProxy
‘Mariano’aHandler
instanceOf
Proxy class >>
Monday, August 22, 2011
![Page 29: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/29.jpg)
How it works?
22
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
aProxy
‘Mariano’aHandler
instanceOf
Proxy class >>
ProxyTrap class >>
Monday, August 22, 2011
![Page 30: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/30.jpg)
How it works?
22
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
aProxy
‘Mariano’aHandler
instanceOf
Proxy class >>
ProxyTrap class >>
Monday, August 22, 2011
![Page 31: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/31.jpg)
How it works?
22
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
aProxy
‘Mariano’aHandler
instanceOf
Proxy class >>
Monday, August 22, 2011
![Page 32: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/32.jpg)
aProxy
aProxy username
1: #username send
methodDict := nilProxyTrap
cannotInterpret: aMessageProxy
Object
2: #aProxy lookup
3: Since the method dictionary was nil, the VM sends #cannotInterpret to
the receiver but starting the lookup in the superclass
4: #cannotInterpret: lookup
Referencesinstance ofmessage sendlookupsubclass
How it works?
23
Monday, August 22, 2011
![Page 33: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/33.jpg)
aProxy
aProxy username
1: #username send
methodDict := nilProxyTrap
cannotInterpret: aMessageProxy
Object
2: #aProxy lookup
3: Since the method dictionary was nil, the VM sends #cannotInterpret to
the receiver but starting the lookup in the superclass
4: #cannotInterpret: lookup
Referencesinstance ofmessage sendlookupsubclass
How it works?
23
Monday, August 22, 2011
![Page 34: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/34.jpg)
aProxy
aProxy username
1: #username send
methodDict := nilProxyTrap
cannotInterpret: aMessageProxy
Object
2: #aProxy lookup
3: Since the method dictionary was nil, the VM sends #cannotInterpret to
the receiver but starting the lookup in the superclass
4: #cannotInterpret: lookup
Referencesinstance ofmessage sendlookupsubclass
How it works?
23
Monday, August 22, 2011
![Page 35: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/35.jpg)
aProxy
aProxy username
1: #username send
methodDict := nilProxyTrap
cannotInterpret: aMessageProxy
Object
2: #aProxy lookup
3: Since the method dictionary was nil, the VM sends #cannotInterpret to
the receiver but starting the lookup in the superclass
4: #cannotInterpret: lookup
Referencesinstance ofmessage sendlookupsubclass
How it works?
23
Monday, August 22, 2011
![Page 36: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/36.jpg)
aProxy
aProxy username
1: #username send
methodDict := nilProxyTrap
cannotInterpret: aMessageProxy
Object
2: #aProxy lookup
3: Since the method dictionary was nil, the VM sends #cannotInterpret to
the receiver but starting the lookup in the superclass
4: #cannotInterpret: lookup
Referencesinstance ofmessage sendlookupsubclass
How it works?
23
Monday, August 22, 2011
![Page 37: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/37.jpg)
aProxy
aProxy username
1: #username send
methodDict := nilProxyTrap
cannotInterpret: aMessageProxy
Object
2: #aProxy lookup
3: Since the method dictionary was nil, the VM sends #cannotInterpret to
the receiver but starting the lookup in the superclass
4: #cannotInterpret: lookup
Referencesinstance ofmessage sendlookupsubclass
How it works?
23
Proxy >>
Monday, August 22, 2011
![Page 38: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/38.jpg)
aProxy
aProxy username
1: #username send
methodDict := nilProxyTrap
cannotInterpret: aMessageProxy
Object
2: #aProxy lookup
3: Since the method dictionary was nil, the VM sends #cannotInterpret to
the receiver but starting the lookup in the superclass
4: #cannotInterpret: lookup
Referencesinstance ofmessage sendlookupsubclass
How it works?
23
Proxy >>
SimpleForwarderHandler >>
Monday, August 22, 2011
![Page 39: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/39.jpg)
24
Traditional Ghost
#doesNotUnderstand: cannot be trapped like a regular message.
#cannotInterpret: is trapped like a regular message.
Mix of handling procedure and proxy interception.
No mix of handling procedure and proxy interception.
Only methods that are not understood are intercepted.
“All” methods are intercepted.
No separation between proxies and handlers.
Clear separation between proxies and handlers.
Monday, August 22, 2011
![Page 40: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/40.jpg)
25
is stratified
Monday, August 22, 2011
![Page 41: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/41.jpg)
Methods not intercepted
26
1) Optimizations done by the Compiler
2) Special shortcut bytecodes between Compiler and VM
2.1) Methods NEVER sent: #== and #class2.2) Methods that may or may not be executed depending
on the receiver and arguments: e.g. in ‘1+1’ #+ is not executed. But with ‘1+$C’ #+ is executed.
2.3)Always executed, they are just little optimizations. Examples #new, #next, #nextPut:, #size, etc.
Monday, August 22, 2011
![Page 42: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/42.jpg)
Methods not intercepted
26
1) Optimizations done by the Compiler
2) Special shortcut bytecodes between Compiler and VM
2.1) Methods NEVER sent: #== and #class2.2) Methods that may or may not be executed depending
on the receiver and arguments: e.g. in ‘1+1’ #+ is not executed. But with ‘1+$C’ #+ is executed.
2.3)Always executed, they are just little optimizations. Examples #new, #next, #nextPut:, #size, etc.
Monday, August 22, 2011
![Page 43: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/43.jpg)
Methods not intercepted
26
1) Optimizations done by the Compiler
2) Special shortcut bytecodes between Compiler and VM
2.1) Methods NEVER sent: #== and #class2.2) Methods that may or may not be executed depending
on the receiver and arguments: e.g. in ‘1+1’ #+ is not executed. But with ‘1+$C’ #+ is executed.
2.3)Always executed, they are just little optimizations. Examples #new, #next, #nextPut:, #size, etc.
Monday, August 22, 2011
![Page 44: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/44.jpg)
Proxy for classes
27
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
cannotInterpret:proxyFor:
superclass methodDictformathandlertarget
ClassProxy
initializenilMethodDict
ClassProxyTrap
logIn:validate:
usernameage
User
Monday, August 22, 2011
![Page 45: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/45.jpg)
Proxy for classes
27
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
cannotInterpret:proxyFor:
superclass methodDictformathandlertarget
ClassProxy
initializenilMethodDict
ClassProxyTrap
logIn:validate:
usernameage
User
Monday, August 22, 2011
![Page 46: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/46.jpg)
Proxy for classes
27
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
cannotInterpret:proxyFor:
superclass methodDictformathandlertarget
ClassProxy
initializenilMethodDict
ClassProxyTrap
logIn:validate:
usernameage
User
Monday, August 22, 2011
![Page 47: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/47.jpg)
Proxy for classes
27
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
cannotInterpret:proxyFor:
superclass methodDictformathandlertarget
ClassProxy
initializenilMethodDict
ClassProxyTrap
logIn:validate:
usernameage
User
Monday, August 22, 2011
![Page 48: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/48.jpg)
Proxy for classes
27
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
cannotInterpret:proxyFor:
superclass methodDictformathandlertarget
ClassProxy
initializenilMethodDict
ClassProxyTrap
aUseraClassProxy
methodDict = nilsuperclass = ClassProxy
logIn:validate:
usernameage
User
instance of
Monday, August 22, 2011
![Page 49: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/49.jpg)
Proxy for classes
27
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
cannotInterpret:proxyFor:
superclass methodDictformathandlertarget
ClassProxy
initializenilMethodDict
ClassProxyTrap
aUseraClassProxy
methodDict = nilsuperclass = ClassProxy
logIn:validate:
usernameage
User
instance of
User nameMonday, August 22, 2011
![Page 50: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/50.jpg)
Proxy for classes
27
cannotInterpret:proxyFor:
handlertarget
Proxy
initializenilMethodDict
ProxyTrap
Object
cannotInterpret:proxyFor:
superclass methodDictformathandlertarget
ClassProxy
initializenilMethodDict
ClassProxyTrap
aUseraClassProxy
methodDict = nilsuperclass = ClassProxy
logIn:validate:
usernameage
User
instance of
aUser username
User nameMonday, August 22, 2011
![Page 51: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/51.jpg)
Proxy for methods
28
Monday, August 22, 2011
![Page 52: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/52.jpg)
Proxy for methods
28
Regular message
Monday, August 22, 2011
![Page 53: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/53.jpg)
Proxy for methods
28
Regular messageMethod execution
Monday, August 22, 2011
![Page 54: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/54.jpg)
Proxy for methods
28
Just handling #run:with:in correctly is enough to also intercept method execution.
Regular messageMethod execution
Monday, August 22, 2011
![Page 55: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/55.jpg)
is
29
Uniform
Monday, August 22, 2011
![Page 56: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/56.jpg)
is
29
moreUniform
Monday, August 22, 2011
![Page 57: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/57.jpg)
More features
Low memory footprint.
Compact classes.
Store the minimal needed state.
Easy debugging.
Custom list of messages.
30
Monday, August 22, 2011
![Page 58: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/58.jpg)
Conclusion
31
With a little bit of special support from the VM (#cannotInterpret hook), we can have an image-side proxy solution
much better than the classic #doesNotUnderstand:
Monday, August 22, 2011
![Page 59: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/59.jpg)
Future work
Experiment with immediate proxies (memory address tag) in VM side.
Think how to correctly intercept non-executed methods.
32
Monday, August 22, 2011
![Page 60: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/60.jpg)
Links
http://rmod.lille.inria.fr/web/pier/software/Marea/GhostProxies
http://www.squeaksource.com/Marea.html
33
Monday, August 22, 2011
![Page 61: Ghost](https://reader033.vdocuments.site/reader033/viewer/2022061202/547ac3ffb4af9f66518b457e/html5/thumbnails/61.jpg)
Mariano Martinez [email protected]
http://marianopeck.wordpress.com/
RMod
A Uniform, Light-weight and Stratified Proxy Model and Implementation
Monday, August 22, 2011