What's the correct way to create anonymous subclasses in Pharo?
Hi everybody, I am attempting to create subclasses of existing classes at runtime. They must not be in their superclass' list of subclasses, because they have to be garbage collected when they are no longer needed. This is what I tried to create such a class in Pharo 1.0: newMeta := (Metaclass new) superclass: Rectangle class methodDictionary: MethodDictionary new format: Rectangle class format; yourself. newClass := (newMeta new) superclass: Rectangle methodDictionary: MethodDictionary new format: Rectangle format; setName: #MyRectangle; yourself. newClass new class == newClass "--> false" The result of "newClass new" seems to be an instance of Rectangle, not of newClass. The test at the end of the code snippet answers false. When I compile a new method in newClass and install it in newClass' methodDictionary, an instance will not understand a message with the method's selector. Almost the same code will do what I want in VisualWorks: | newMeta newClass | newMeta := (Metaclass new) superclass: Rectangle class; methodDictionary: MethodDictionary new; setInstanceFormat: Rectangle class format; yourself. newClass := (newMeta new) superclass: Rectangle; methodDictionary: MethodDictionary new; setInstanceFormat: Rectangle format; setName: #MyRectangle; yourself. newClass new class == newClass "--> true" Does anybody have an idea what the problem is and what can be done to circumvent it? Thanks in advance! Joachim Geidel
Do you really need to create a meta? If not , then you can do just: newClass := Rectangle clone. newClass superclass: Rectangle; organization: nil; methodDict: MethodDictionary new. On 23 May 2010 15:49, Joachim Geidel <joachim.geidel@onlinehome.de> wrote:
Hi everybody,
I am attempting to create subclasses of existing classes at runtime. They must not be in their superclass' list of subclasses, because they have to be garbage collected when they are no longer needed.
This is what I tried to create such a class in Pharo 1.0:
  newMeta := (Metaclass new)     superclass: Rectangle class       methodDictionary: MethodDictionary new       format: Rectangle class format;     yourself.   newClass := (newMeta new)     superclass: Rectangle       methodDictionary: MethodDictionary new       format: Rectangle format;     setName: #MyRectangle;     yourself.   newClass new class == newClass  "--> false"
The result of "newClass new" seems to be an instance of Rectangle, not of newClass. The test at the end of the code snippet answers false. When I compile a new method in newClass and install it in newClass' methodDictionary, an instance will not understand a message with the method's selector.
Almost the same code will do what I want in VisualWorks:
| newMeta newClass |  newMeta := (Metaclass new)     superclass: Rectangle class;     methodDictionary: MethodDictionary new;     setInstanceFormat: Rectangle class format;     yourself.   newClass := (newMeta new)     superclass: Rectangle;     methodDictionary: MethodDictionary new;     setInstanceFormat: Rectangle format;     setName: #MyRectangle;     yourself.   newClass new class == newClass  "--> true"
Does anybody have an idea what the problem is and what can be done to circumvent it?
Thanks in advance! Joachim Geidel
_______________________________________________ Pharo-users mailing list Pharo-users@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-users
-- Best regards, Igor Stasenko AKA sig.
Am 23.05.10 15:15 schrieb Igor Stasenko:
Do you really need to create a meta? > > If not , then you can do just: > > newClass := Rectangle clone. > newClass > superclass: Rectangle; > organization: nil; > methodDict: MethodDictionary new. Unfortunately, this doesn¹t solve the problem:
| newClass method | newClass := Rectangle clone. newClass superclass: Rectangle; organization: nil; methodDict: MethodDictionary new; setName: #MyRectangle. newClass new class name. "--> #Rectangle" newClass new class == newClass. "--> false" method := (newClass compile: 'testGhost ^42' classified: nil notifying: nil trailer: newClass defaultMethodTrailer ifFail: [nil]) method. newClass addSelectorSilently: #testGhost withMethod: method. newClass canUnderstand: #testGhost. "--> true". newClass new respondsTo: #testGhost. "--> false" newClass new testGhost. "--> Message not understood, should answer 42"
The problem is not the MetaClass (I do need it), but that the new class doesn¹t create instances of itself, which I find very, very strange. Best regards, Joachim Geidel
On 23 May 2010 16:38, Joachim Geidel <joachim.geidel@onlinehome.de> wrote:
Am 23.05.10 15:15 schrieb Igor Stasenko:
Do you really need to create a meta? > > If not , then you can do just: >
newClass := Rectangle clone. > newClass > Â Â superclass: Rectangle; > Â Â organization: nil; > Â Â methodDict: MethodDictionary new. Unfortunately, this doesnât solve the problem:
| newClass method | newClass := Rectangle clone. newClass   superclass: Rectangle;   organization: nil;   methodDict: MethodDictionary new;   setName: #MyRectangle. newClass new class name. "--> #Rectangle" newClass new class == newClass. "--> false"
^^^ That's really strange. Have you tried to debug it?
method := (newClass compile: 'testGhost ^42'         classified: nil         notifying: nil         trailer: newClass defaultMethodTrailer         ifFail: [nil]) method. newClass addSelectorSilently: #testGhost withMethod: method. newClass canUnderstand: #testGhost. "--> true". newClass new respondsTo: #testGhost. "--> false" newClass new testGhost. "--> Message not understood, should answer 42"
The problem is not the MetaClass (I do need it), but that the new class doesnât create instances of itself, which I find very, very strange.
Best regards, Joachim Geidel
_______________________________________________ Pharo-users mailing list Pharo-users@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-users
-- Best regards, Igor Stasenko AKA sig.
Yes, I tried to debug it, but I can¹t step into basicNew, of course, which already returns an instance of the wrong class. Joachim Geidel Am 23.05.10 15:46 schrieb Igor Stasenko:
On 23 May 2010 16:38, Joachim Geidel <joachim.geidel@onlinehome.de> wrote: > | newClass method | > newClass := Rectangle clone. > newClass > Â Â superclass: Rectangle; > Â Â organization: nil; > Â Â methodDict: MethodDictionary new; > Â Â setName: #MyRectangle. > newClass new class name. "--> #Rectangle" > newClass new class == newClass. "--> false" ^^^ That's really strange. Have you tried to debug it?
clone is depreacted. On May 23, 2010, at 3:38 PM, Joachim Geidel wrote:
Am 23.05.10 15:15 schrieb Igor Stasenko:
Do you really need to create a meta? > > If not , then you can do just: > > newClass := Rectangle clone. > newClass > superclass: Rectangle; > organization: nil; > methodDict: MethodDictionary new. Unfortunately, this doesnât solve the problem:
| newClass method | newClass := Rectangle clone. newClass superclass: Rectangle; organization: nil; methodDict: MethodDictionary new; setName: #MyRectangle. newClass new class name. "--> #Rectangle" newClass new class == newClass. "--> false" method := (newClass compile: 'testGhost ^42' classified: nil notifying: nil trailer: newClass defaultMethodTrailer ifFail: [nil]) method. newClass addSelectorSilently: #testGhost withMethod: method. newClass canUnderstand: #testGhost. "--> true". newClass new respondsTo: #testGhost. "--> false" newClass new testGhost. "--> Message not understood, should answer 42"
The problem is not the MetaClass (I do need it), but that the new class doesnât create instances of itself, which I find very, very strange.
Best regards, Joachim Geidel _______________________________________________ Pharo-users mailing list Pharo-users@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-users
Hi Joachim: if you figured out how to do it, it would be cool to write it down in the http://book.pharo-project.org/ let me know if you want to do it and I create an user for you cheers mariano On Mon, May 24, 2010 at 9:29 AM, Stéphane Ducasse <stephane.ducasse@inria.fr
wrote:
clone is depreacted. On May 23, 2010, at 3:38 PM, Joachim Geidel wrote:
Am 23.05.10 15:15 schrieb Igor Stasenko:
Do you really need to create a meta? > > If not , then you can do just: newClass := Rectangle clone. > newClass > superclass: Rectangle; > organization: nil; > methodDict: MethodDictionary new. Unfortunately, this doesnât solve the problem:
| newClass method | newClass := Rectangle clone. newClass superclass: Rectangle; organization: nil; methodDict: MethodDictionary new; setName: #MyRectangle. newClass new class name. "--> #Rectangle" newClass new class == newClass. "--> false" method := (newClass compile: 'testGhost ^42' classified: nil notifying: nil trailer: newClass defaultMethodTrailer ifFail: [nil]) method. newClass addSelectorSilently: #testGhost withMethod: method. newClass canUnderstand: #testGhost. "--> true". newClass new respondsTo: #testGhost. "--> false" newClass new testGhost. "--> Message not understood, should answer 42"
The problem is not the MetaClass (I do need it), but that the new class doesnât create instances of itself, which I find very, very strange.
Best regards, Joachim Geidel _______________________________________________ Pharo-users mailing list Pharo-users@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-users
_______________________________________________ Pharo-users mailing list Pharo-users@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-users
Mariano, Am 21.06.10 11:49 schrieb Mariano Martinez Peck:
Hi Joachim: if you figured out how to do it, it would be cool to write it down in the http://book.pharo-project.org/
The problem is a bug in Squeak and Pharo, apparently at the VM level. Subclasses of classes in the specialObjectsArray create instances of their superclass when sent #new or #basicNew. I have already submitted a bug report for Pharo and should probably enter a similar one for Squeak: http://code.google.com/p/pharo/issues/detail?id=2523 I have tested this only on Mac OS X 10.6, so it is possible that only the Mac OS X VM has this problem. It should be easy to check if it happens with other VMs too. Concerning contributions to Pharo and Squeak: I will restrict my work to JNIPort and won't get involved in any work on Pharo or Squeak. The reason is that I have a very limited amount of time to spend on open source projects, so I have to draw a strict borderline. Cheers, Joachim Geidel
can you enter a bug entry in the bug report? Stef On May 23, 2010, at 2:49 PM, Joachim Geidel wrote:
Hi everybody,
I am attempting to create subclasses of existing classes at runtime. They must not be in their superclass' list of subclasses, because they have to be garbage collected when they are no longer needed.
This is what I tried to create such a class in Pharo 1.0:
newMeta := (Metaclass new) superclass: Rectangle class methodDictionary: MethodDictionary new format: Rectangle class format; yourself. newClass := (newMeta new) superclass: Rectangle methodDictionary: MethodDictionary new format: Rectangle format; setName: #MyRectangle; yourself. newClass new class == newClass "--> false"
The result of "newClass new" seems to be an instance of Rectangle, not of newClass. The test at the end of the code snippet answers false. When I compile a new method in newClass and install it in newClass' methodDictionary, an instance will not understand a message with the method's selector.
Almost the same code will do what I want in VisualWorks:
| newMeta newClass | newMeta := (Metaclass new) superclass: Rectangle class; methodDictionary: MethodDictionary new; setInstanceFormat: Rectangle class format; yourself. newClass := (newMeta new) superclass: Rectangle; methodDictionary: MethodDictionary new; setInstanceFormat: Rectangle format; setName: #MyRectangle; yourself. newClass new class == newClass "--> true"
Does anybody have an idea what the problem is and what can be done to circumvent it?
Thanks in advance! Joachim Geidel
_______________________________________________ Pharo-users mailing list Pharo-users@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-users
participants (4)
-
Igor Stasenko -
Joachim Geidel -
Mariano Martinez Peck -
Stéphane Ducasse