Hi:

On 17 Jan 2012, at 09:47, Mariano Martinez Peck wrote:

> Stefan, another approach would be to store the source code in the compiled 
> method trailer.
Looks like everything is there already, but it does not seem to work stable 
enough.


With the code below, this should work: (do not apply the change to 
getSourceFromFile!!)
-------------
|trailer source m |
m := (Gofer>>#load).
trailer := m trailer.
source := m getSource.
trailer sourceCode: source.
m recompileWithTrailer: trailer.
-------------



Here the code:
-------------
!Behavior methodsFor: 'compiling' stamp: 'StefanMarr 1/17/2012 15:14' prior: 
82391250!
recompile: selector from: oldClass withNewTrailer: trailer
        "Compile the method associated with selector in the receiver's method 
dictionary."
        "ar 7/10/1999: Use oldClass compiledMethodAt: not self 
compiledMethodAt:"
        | method methodNode |
        method := oldClass compiledMethodAt: selector.
        methodNode := self compilerClass new
                                compile: (oldClass sourceCodeAt: selector)
                                in: self
                                notifying: nil
                                ifFail: [^ self].   "Assume OK after proceed 
from SyntaxError"
        selector == methodNode selector ifFalse: [self error: 'selector 
changed!!'].
        self basicAddSelector: selector withMethod: (methodNode generate: 
trailer).
! !

!Behavior methodsFor: 'compiling' stamp: 'StefanMarr 1/17/2012 15:15' prior: 
82391969!
recompile: selector from: oldClass
        | method |
        method := oldClass compiledMethodAt: selector.
        self recompile: selector from: oldClass withNewTrailer:  method trailer.
! !
!CompiledMethod methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/17/2012 
15:16' prior: 82392229!
recompileWithTrailer: trailer
        self methodClass recompile: self selector from: self methodClass 
withNewTrailer: trailer.! !


!CompiledMethod methodsFor: 'source code management' stamp: 'StefanMarr 
1/17/2012 15:23' prior: 68352220!
getSourceFromFile
        "Read the source code from file, determining source file index and
        file position from the last 3 bytes of this method."
        | position source trailer |
        trailer := self trailer.
        source  := trailer sourceCode.
        
        source ifNotNil: [
                ^ source ].
        
        (position := self filePosition) = 0 ifTrue: [^ nil].
        source := (RemoteString newFileNumber: self fileIndex position: 
position) string.
        
        trailer sourceCode: source.
        self recompileWithTrailer: trailer.
        ^ source.! !
-------------


This is unfortunately undebuggable. At least I do not get a debugger (which 
seems logical if there is something going wrong and recurses in getSource...)

Good that we have a stratified system.

Best regards
Stefan

> 
> PS: I will interested if you do it :)
In return, I would really appreciate if you could learn a bit about etiquette 
and quoting 
http://www.gweep.ca/~edmonds/usenet/ml-etiquette.html#SECTION00090000000000000000
 

And I am apparently not the only one who would like that. See the recent 
reference to http://emailcharter.org/


-- 
Stefan Marr
Software Languages Lab
Vrije Universiteit Brussel
Pleinlaan 2 / B-1050 Brussels / Belgium
http://soft.vub.ac.be/~smarr
Phone: +32 2 629 2974
Fax:   +32 2 629 3525


Reply via email to