Proxy DNU vs CannotInterpret. (Ghost related)
I compared doesNotUnderstand: vs cannotInterpret: versions of proxies. DNUProxy>>doesNotUnderstand: aMessage lastMessage := aMessage. ^'from DNU proxy' CannotInterpretProxy>>cannotInterpret: aMessage lastMessage := aMessage. ^'from cannot interpret proxy' And DNU proxy works 2 times faster then #cannotInterpret proxy. [proxy someMessage] benchFor: 2 seconds. DNU: "a BenchmarkResult(22,377,669 iterations in 2 seconds. 11,188,835 per second)" CannotInterpet: "a BenchmarkResult(13,148,735 iterations in 2 seconds 2 milliseconds. 6,567,800 per second) Also DNU version is much more easy to explain. So why Ghost uses #cannotInterpret for proxies? (after reading Ghost paper I can't understand this). Naked proxy can be easily done by setting superclass to nil: ProtoObject subclass: #DNUProxy instanceVariableNames: '' classVariableNames: '' package: 'DNUProxy'. DNUProxy superclass: nil
Well, the main drawback is that you'll not be able to trap any messages implemented by DNUProxy, because as they are implemented, they are understood. Also, the idea of Ghost was not only to use cannot interpret, but to provide a library that allowed to proxy objects as well as methods and classes. Finally, I'm curious about the performance difference... because the interpreter code handling DNU and cannot interpret is not much different... Maybe the JIT is not handling it (because nobody proposed it before)? Guille On 02/15/2016 03:11 PM, Denis Kudriashov wrote:
I compared doesNotUnderstand: vs cannotInterpret: versions of proxies.
DNUProxy>>doesNotUnderstand: aMessage lastMessage := aMessage. ^'from DNU proxy'
CannotInterpretProxy>>cannotInterpret: aMessage lastMessage := aMessage. ^'from cannot interpret proxy'
And DNU proxy works 2 times faster then #cannotInterpret proxy.
[proxy someMessage] benchFor: 2 seconds.
DNU: "a BenchmarkResult(22,377,669 iterations in 2 seconds. 11,188,835 per second)"
CannotInterpet: "a BenchmarkResult(13,148,735 iterations in 2 seconds 2 milliseconds. 6,567,800 per second)
Also DNU version is much more easy to explain.
So why Ghost uses #cannotInterpret for proxies? (after reading Ghost paper I can't understand this). Naked proxy can be easily done by setting superclass to nil:
ProtoObject subclass: #DNUProxy instanceVariableNames: '' classVariableNames: '' package: 'DNUProxy'. DNUProxy superclass: nil
Hi Guille,
On Feb 15, 2016, at 6:28 AM, Guille Polito <guillermopolito@gmail.com> wrote:
Well, the main drawback is that you'll not be able to trap any messages implemented by DNUProxy, because as they are implemented, they are understood.
Also, the idea of Ghost was not only to use cannot interpret, but to provide a library that allowed to proxy objects as well as methods and classes.
Finally, I'm curious about the performance difference... because the interpreter code handling DNU and cannot interpret is not much different... Maybe the JIT is not handling it (because nobody proposed it before)?
The JIT optimises MNU dispatch using PICs. The idea is that a PIC can also record that a given selector is not understood and hence avoid both the failing lookup for the send that is not understood (which is very slow because it scans all classes in the receivers hierarchy searching for a selector that isn't there) and the send of doesNotUnderstand:. In spur there's also a possibility of further optimising the creation of the message which could be done in machine code, rather than as now, with a slower call into the interpreter runtime.
Guille
On 02/15/2016 03:11 PM, Denis Kudriashov wrote: I compared doesNotUnderstand: vs cannotInterpret: versions of proxies.
DNUProxy>>doesNotUnderstand: aMessage lastMessage := aMessage. ^'from DNU proxy'
CannotInterpretProxy>>cannotInterpret: aMessage lastMessage := aMessage. ^'from cannot interpret proxy'
And DNU proxy works 2 times faster then #cannotInterpret proxy.
[proxy someMessage] benchFor: 2 seconds.
DNU: "a BenchmarkResult(22,377,669 iterations in 2 seconds. 11,188,835 per second)"
CannotInterpet: "a BenchmarkResult(13,148,735 iterations in 2 seconds 2 milliseconds. 6,567,800 per second)
Also DNU version is much more easy to explain.
So why Ghost uses #cannotInterpret for proxies? (after reading Ghost paper I can't understand this). Naked proxy can be easily done by setting superclass to nil:
ProtoObject subclass: #DNUProxy instanceVariableNames: '' classVariableNames: '' package: 'DNUProxy'. DNUProxy superclass: nil
On Mon, Feb 15, 2016 at 11:11 AM, Denis Kudriashov <dionisiydk@gmail.com> wrote:
I compared doesNotUnderstand: vs cannotInterpret: versions of proxies.
DNUProxy>>doesNotUnderstand: aMessage lastMessage := aMessage. ^'from DNU proxy'
CannotInterpretProxy>>cannotInterpret: aMessage lastMessage := aMessage. ^'from cannot interpret proxy'
And DNU proxy works 2 times faster then #cannotInterpret proxy.
[proxy someMessage] benchFor: 2 seconds.
DNU: "a BenchmarkResult(22,377,669 iterations in 2 seconds. 11,188,835 per second)"
CannotInterpet: "a BenchmarkResult(13,148,735 iterations in 2 seconds 2 milliseconds. 6,567,800 per second)
Also DNU version is much more easy to explain.
So why Ghost uses #cannotInterpret for proxies? (after reading Ghost paper I can't understand this). Naked proxy can be easily done by setting superclass to nil:
ProtoObject subclass: #DNUProxy instanceVariableNames: '' classVariableNames: '' package: 'DNUProxy'. DNUProxy superclass: nil
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed. If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work. The #cannotInterpret: over #dnu: is only one of the decisions behind Ghost. That is, you can still get some of the Ghost benefits if you use dnu (separation of proxy from handler, dynamically allow debugging or not, be able to proxy and become classed and methods, etc etc). ps: I don't remember if there was something also with the fact of proxying (and becoming) classes and methods. Ghost allows to proxify classes and methods, and even leave instances of them in the system...and sending a message to those instances (whose class is a proxy) would intercept the message in the class. Ghost has several tests for all these cases. So if you want to give it a try with the DNU approach you should check if this still works... The #cannotInterpret may have some trick for when we proxy classes... I cannot remember... but maybe. Cheers, -- Mariano http://marianopeck.wordpress.com
2016-02-15 15:32 GMT+01:00 Mariano Martinez Peck <marianopeck@gmail.com>:
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed.
If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work.
Actually I already implemented it many yeas ago for Mocketry. But subclassing from nil works correctly only in VW. I got problems when porting it to Squeak (at that time). Now I want to give DNU another chance. It will simplify logic very much. It will remove strange hierarchy of proxies which is needed for trick but raises many questions.
On Mon, Feb 15, 2016 at 11:53 AM, Denis Kudriashov <dionisiydk@gmail.com> wrote:
2016-02-15 15:32 GMT+01:00 Mariano Martinez Peck <marianopeck@gmail.com>:
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed.
If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work.
Actually I already implemented it many yeas ago for Mocketry. But subclassing from nil works correctly only in VW. I got problems when porting it to Squeak (at that time).
Exactly. And myself in Pharo 4 years ago.
Now I want to give DNU another chance.
Sure, it's a good idea.
It will simplify logic very much. It will remove strange hierarchy of proxies which is needed for trick but raises many questions.
You mean the hierarchy because of #cannotInterpret: is sent to the superclass? If true, then yes, it will simplify that. -- Mariano http://marianopeck.wordpress.com
Hi Denis,
On Feb 15, 2016, at 6:53 AM, Denis Kudriashov <dionisiydk@gmail.com> wrote:
2016-02-15 15:32 GMT+01:00 Mariano Martinez Peck <marianopeck@gmail.com>:
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed.
If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work.
Actually I already implemented it many yeas ago for Mocketry. But subclassing from nil works correctly only in VW. I got problems when porting it to Squeak (at that time). Now I want to give DNU another chance. It will simplify logic very much. It will remove strange hierarchy of proxies which is needed for trick but raises many questions.
In principle there's no reason why
Hi Denis,
On Feb 15, 2016, at 6:53 AM, Denis Kudriashov <dionisiydk@gmail.com> wrote:
2016-02-15 15:32 GMT+01:00 Mariano Martinez Peck <marianopeck@gmail.com>:
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed.
If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work.
Actually I already implemented it many yeas ago for Mocketry. But subclassing from nil works correctly only in VW. I got problems when porting it to Squeak (at that time). Now I want to give DNU another chance. It will simplify logic very much. It will remove strange hierarchy of proxies which is needed for trick but raises many questions.
There is no reason in principle why Squeak/Pharo should not be able to use MNU proxies in the same way as VW. The key is to use the mirror primitives in basic inspectors that are used to inspect the proxies and in the debugger to simulate code. Without the mirror primitives many sends to a proxy are likely to create an infinite recursion. As yet we don't have a robust low space handler that catches infinite recursion so debugging can be frustrating. But we can work on this. IMO the MNU approach is to be preferred.
Hi eliot I think that the difference is really what guillermo explained. With DNU you can only trapped methods that are not defined while if you want to implement true proxy you do not want holes. I think that also with DNU proxy there were some limits realyed to classe but I do not remember. Stef Le 15/2/16 16:06, Eliot Miranda a écrit :
Hi Denis,
On Feb 15, 2016, at 6:53 AM, Denis Kudriashov <dionisiydk@gmail.com <mailto:dionisiydk@gmail.com>> wrote:
2016-02-15 15:32 GMT+01:00 Mariano Martinez Peck <marianopeck@gmail.com <mailto:marianopeck@gmail.com>>:
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed.
If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work.
Actually I already implemented it many yeas ago for Mocketry. But subclassing from nil works correctly only in VW. I got problems when porting it to Squeak (at that time). Now I want to give DNU another chance. It will simplify logic very much. It will remove strange hierarchy of proxies which is needed for trick but raises many questions.
There is no reason in principle why Squeak/Pharo should not be able to use MNU proxies in the same way as VW. The key is to use the mirror primitives in basic inspectors that are used to inspect the proxies and in the debugger to simulate code. Without the mirror primitives many sends to a proxy are likely to create an infinite recursion. As yet we don't have a robust low space handler that catches infinite recursion so debugging can be frustrating. But we can work on this. IMO the MNU approach is to be preferred.
Hi Stef, On Mon, Feb 15, 2016 at 8:18 AM, stepharo <stepharo@free.fr> wrote:
Hi eliot
I think that the difference is really what guillermo explained. With DNU you can only trapped methods that are not defined while if you want to implement true proxy you do not want holes. I think that also with DNU proxy there were some limits realyed to classe but I do not remember.
As far as the VM goes, there is /one/ minor issue with special selector #== and #class (*). But the real issue is that ProtoObject implements far too much protocol. If one creates a class that inherits from nil all it needs to do is implement doersNotUnderstand: and it will catch every message (*). For this to work the debugger and basic inspectors must use the mirror primitives otherwise there will be infinite recursion of MNUs. Now the issue with special selector #== and #class is that these bytecodes are specified as no lookup. So if one uses bytecodes 182 (#==) or 199 (#class) these operate without sending messages and will compare the object or answer the object's class without sending #doesNotUnderstand:. In the VW VM I added a flag so one could turn this behaviour off, and that's certainly easy to do in our VM. Another approach is to have the bytecode compiler not send these. But given our VM it is certainly possible to use doesNotUnderstand: proxies, using a much slimmer class than ProtoObject. In fact a good project would be to try and shrink ProtoObject until it provides the minimum, which would be a #doesNotUnderstand: method that raises an error that reminds the programmer that they need to implement their own doesNotUnderstand: handler in subclasses of ProtoObject.
Stef
Le 15/2/16 16:06, Eliot Miranda a écrit :
Hi Denis,
On Feb 15, 2016, at 6:53 AM, Denis Kudriashov < <dionisiydk@gmail.com> dionisiydk@gmail.com> wrote:
2016-02-15 15:32 GMT+01:00 Mariano Martinez Peck < <marianopeck@gmail.com> marianopeck@gmail.com>:
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed.
If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work.
Actually I already implemented it many yeas ago for Mocketry. But subclassing from nil works correctly only in VW. I got problems when porting it to Squeak (at that time). Now I want to give DNU another chance. It will simplify logic very much. It will remove strange hierarchy of proxies which is needed for trick but raises many questions.
There is no reason in principle why Squeak/Pharo should not be able to use MNU proxies in the same way as VW. The key is to use the mirror primitives in basic inspectors that are used to inspect the proxies and in the debugger to simulate code. Without the mirror primitives many sends to a proxy are likely to create an infinite recursion. As yet we don't have a robust low space handler that catches infinite recursion so debugging can be frustrating. But we can work on this. IMO the MNU approach is to be preferred.
-- _,,,^..^,,,_ best, Eliot
2016-02-15 19:34 GMT+01:00 Eliot Miranda <eliot.miranda@gmail.com>:
Hi Stef,
On Mon, Feb 15, 2016 at 8:18 AM, stepharo <stepharo@free.fr> wrote:
Hi eliot
I think that the difference is really what guillermo explained. With DNU you can only trapped methods that are not defined while if you want to implement true proxy you do not want holes. I think that also with DNU proxy there were some limits realyed to classe but I do not remember.
As far as the VM goes, there is /one/ minor issue with special selector #== and #class (*). But the real issue is that ProtoObject implements far too much protocol. If one creates a class that inherits from nil all it needs to do is implement doersNotUnderstand: and it will catch every message (*). For this to work the debugger and basic inspectors must use the mirror primitives otherwise there will be infinite recursion of MNUs.
Now the issue with special selector #== and #class is that these bytecodes are specified as no lookup. So if one uses bytecodes 182 (#==) or 199 (#class) these operate without sending messages and will compare the object or answer the object's class without sending #doesNotUnderstand:.
In the VW VM I added a flag so one could turn this behaviour off, and that's certainly easy to do in our VM. Another approach is to have the bytecode compiler not send these.
But given our VM it is certainly possible to use doesNotUnderstand: proxies, using a much slimmer class than ProtoObject. In fact a good project would be to try and shrink ProtoObject until it provides the minimum, which would be a #doesNotUnderstand: method that raises an error that reminds the programmer that they need to implement their own doesNotUnderstand: handler in subclasses of ProtoObject.
Hello, The #class primitive bytecode is not used in Pharo to avoid this kind of problem. It is indeed possible to add a setting in Opal compiler not to compile #== using the inlined selector to avoid issues there too. However, even in proxies, it may make sense to have this inlined selector.
Stef
Le 15/2/16 16:06, Eliot Miranda a écrit :
Hi Denis,
On Feb 15, 2016, at 6:53 AM, Denis Kudriashov < <dionisiydk@gmail.com> dionisiydk@gmail.com> wrote:
2016-02-15 15:32 GMT+01:00 Mariano Martinez Peck < <marianopeck@gmail.com>marianopeck@gmail.com>:
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed.
If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work.
Actually I already implemented it many yeas ago for Mocketry. But subclassing from nil works correctly only in VW. I got problems when porting it to Squeak (at that time). Now I want to give DNU another chance. It will simplify logic very much. It will remove strange hierarchy of proxies which is needed for trick but raises many questions.
There is no reason in principle why Squeak/Pharo should not be able to use MNU proxies in the same way as VW. The key is to use the mirror primitives in basic inspectors that are used to inspect the proxies and in the debugger to simulate code. Without the mirror primitives many sends to a proxy are likely to create an infinite recursion. As yet we don't have a robust low space handler that catches infinite recursion so debugging can be frustrating. But we can work on this. IMO the MNU approach is to be preferred.
-- _,,,^..^,,,_ best, Eliot
On Mon, Feb 15, 2016 at 4:46 PM, Clément Bera <bera.clement@gmail.com> wrote:
2016-02-15 19:34 GMT+01:00 Eliot Miranda <eliot.miranda@gmail.com>:
Hi Stef,
On Mon, Feb 15, 2016 at 8:18 AM, stepharo <stepharo@free.fr> wrote:
Hi eliot
I think that the difference is really what guillermo explained. With DNU you can only trapped methods that are not defined while if you want to implement true proxy you do not want holes. I think that also with DNU proxy there were some limits realyed to classe but I do not remember.
As far as the VM goes, there is /one/ minor issue with special selector #== and #class (*). But the real issue is that ProtoObject implements far too much protocol. If one creates a class that inherits from nil all it needs to do is implement doersNotUnderstand: and it will catch every message (*). For this to work the debugger and basic inspectors must use the mirror primitives otherwise there will be infinite recursion of MNUs.
Now the issue with special selector #== and #class is that these bytecodes are specified as no lookup. So if one uses bytecodes 182 (#==) or 199 (#class) these operate without sending messages and will compare the object or answer the object's class without sending #doesNotUnderstand:.
In the VW VM I added a flag so one could turn this behaviour off, and that's certainly easy to do in our VM. Another approach is to have the bytecode compiler not send these.
But given our VM it is certainly possible to use doesNotUnderstand: proxies, using a much slimmer class than ProtoObject. In fact a good project would be to try and shrink ProtoObject until it provides the minimum, which would be a #doesNotUnderstand: method that raises an error that reminds the programmer that they need to implement their own doesNotUnderstand: handler in subclasses of ProtoObject.
Hello,
The #class primitive bytecode is not used in Pharo to avoid this kind of problem.
It is indeed possible to add a setting in Opal compiler not to compile #== using the inlined selector to avoid issues there too. However, even in proxies, it may make sense to have this inlined selector.
When I made Ghost, Pharo still using the inlined version of #class. So when loading Ghost I used to hack on Opal to avoid optimizing #class. At that time, I did a bench and it showed me that remove the optimization had almost none penalization at all. And in fact, in future Pharo released this ended up being removed. Cheers,
Stef
Le 15/2/16 16:06, Eliot Miranda a écrit :
Hi Denis,
On Feb 15, 2016, at 6:53 AM, Denis Kudriashov < <dionisiydk@gmail.com> dionisiydk@gmail.com> wrote:
2016-02-15 15:32 GMT+01:00 Mariano Martinez Peck < <marianopeck@gmail.com>marianopeck@gmail.com>:
As far as I can remember (this was about 4 years ago) The use of #cannotInterpret: was the only way to be able to intercept everything without breaking the system. Subclassing from ProtoObject make your proxy to understand some messages. Subclassing from nil was technically possible, but I found out the system would simply crash as it didn't know at all how to handle other subclasses of nil. Even with the debugging support I added as you can read in the paper. Maybe things have changed.
If subclassing from nil does not break the system and you can still inspect, debug proxies, then sure, you can give a try to Ghost using #dnu rather than #cannotInterpret:. In fact, I would like to have a dnu-based approeach that is as reliable as it was #cannotInterpret: in the sense of how much I can intercept. With #cannotInterpret I could trap EVERYTHING (everything but #==) and then decide what to do. Subclassing from nil would get you there too if you make it work.
Actually I already implemented it many yeas ago for Mocketry. But subclassing from nil works correctly only in VW. I got problems when porting it to Squeak (at that time). Now I want to give DNU another chance. It will simplify logic very much. It will remove strange hierarchy of proxies which is needed for trick but raises many questions.
There is no reason in principle why Squeak/Pharo should not be able to use MNU proxies in the same way as VW. The key is to use the mirror primitives in basic inspectors that are used to inspect the proxies and in the debugger to simulate code. Without the mirror primitives many sends to a proxy are likely to create an infinite recursion. As yet we don't have a robust low space handler that catches infinite recursion so debugging can be frustrating. But we can work on this. IMO the MNU approach is to be preferred.
-- _,,,^..^,,,_ best, Eliot
-- Mariano http://marianopeck.wordpress.com
participants (6)
-
Clément Bera -
Denis Kudriashov -
Eliot Miranda -
Guille Polito -
Mariano Martinez Peck -
stepharo