Hello,The logging of sources is not part of the compiler. It is part of the behavior API.��
Something like that would work :
ATMinimalLearningObject >> addFromObjectSelector: aSelector
�� �� self class compile:��(Object >> aSelector) sourceCode classified: #foo
Now it is strange that the decompiler can't decompile instVarAt: . It looks like it is a bug related to primitive error code decompilation. This is something I should look at during the sprint...
2016-01-27 20:42 GMT+01:00 stepharo <stepharo@free.fr>:
Hi guys
I'm on holidays (no book no mooc no bugs just playing magic good music and hacking a bit)
and I wanted to implemented a fun object that learn from Object by copying the methods.
ProtoObject subclass: #ATMinimalLearningObject
�� �� instanceVariableNames: ''
�� �� classVariableNames: ''
�� �� package: 'MiniActalk2'
ATMinimalLearningObject >> doesNotUnderstand: aMessage
�� �� | sel |
�� �� sel := aMessage selector.
�� �� Transcript show: 'Does not understand ',�� sel printString ; cr.
�� �� ^ (Object includesSelector: sel)
�� �� �� �� ifTrue: [
�� �� �� �� �� �� �� �� self addFromObjectSelector: sel.
�� �� �� �� �� �� �� �� aMessage sendTo: self ]
�� �� �� �� ifFalse: [ super doesNotUnderstand: aMessage ].
ATMinimalLearningObject >> addFromObjectSelector: aSelector
�� �� | method |
�� �� method := OpalCompiler new
�� �� �� �� �� �� �� �� �� �� class: self class;
�� �� �� �� �� �� �� �� �� �� source: (Object sourceCodeAt: aSelector);
�� �� �� �� �� �� �� �� �� �� compile.
�� �� self class addSelector: aSelector withMethod: method.
ATMinimalLearningObject subclass: #ATProtozoid
�� �� instanceVariableNames: 'ff'
�� �� classVariableNames: ''
�� �� package: 'MiniActalk2'
Now it is working but I have the impression that we may have a problem.
When I do
ATProtozoid new instVarAt: 1
I get the following definition for instVarAt:
instVarAt: t1
�� �� self error: 'Decompilation failed'
but
Object sourceCodeAt: #instVarAt: returns the correct string.
��'instVarAt: index
�� �� "Primitive. Answer a fixed variable in an object. The numbering of the variables
�� �� ��corresponds to the named instance variables, followed by the indexed instance
�� �� ��variables. Fail if the index is not an Integer or is not the index of a fixed variable.
�� �� ��Essential. See Object documentation whatIsAPrimitive."
�� �� <primitive: 173 error: ec>
�� �� self primitiveFailed'
May be the compile is not logging the method body.
But since the compiler is full uncommented this is super nice to learn and get empowered.
Stef