[squeak-dev] The Trunk: Compiler-ar.108.mcz

Eliot Miranda eliot.miranda at gmail.com
Tue Dec 22 21:00:36 UTC 2009


On Tue, Dec 22, 2009 at 5:41 AM, Nicolas Cellier <
nicolas.cellier.aka.nice at gmail.com> wrote:

> Why does this depend on interactive ?
>
>       method := self interactive ifTrue: [    methodNode
> generateWithTempNames ]
>               ifFalse: [methodNode generate].
>
> Nicolas
>
>

The assumption is that one wants temp names preserved in doits, but is not
particularly interested in temp names in automatic compiles.  Essentially
the system is in two modes.  One, with source, does not preserve temp names
except for doits because the temp names are in the sources files.  The
other, without sources, converts all methods to sourceless with encoded temp
names.  But this isn't yet reflected in the code.  The code would better
read something like

      method := (self interactive or: [self noSourcesFiles])
                      ifTrue: [methodNode generateWithTempNames]
                      ifFalse: [methodNode generate]

and of course (self interactive or: [self noSourcesFiles]) could be
extracted into e.g. a class-side method on CompiledMethod or Compiler such
as

encodeTempNames: isInteractive
    ^interactive or: [SourceFiles isNil]


> 2009/12/22  <commits at source.squeak.org>:
> > Andreas Raab uploaded a new version of Compiler to project The Trunk:
> > http://source.squeak.org/trunk/Compiler-ar.108.mcz
> >
> > ==================== Summary ====================
> >
> > Name: Compiler-ar.108
> > Author: ar
> > Time: 22 December 2009, 12:48:23 pm
> > UUID: 538bb76e-8967-e445-9b2c-161c98c289d6
> > Ancestors: Compiler-ar.107
> >
> > CompiledMethodTrailer phase 2.
> >
> > =============== Diff against Compiler-ar.107 ===============
> >
> > Item was changed:
> >  ----- Method: Compiler>>compiledMethodFor:in:to:notifying:ifFail:logged:
> (in category 'public access') -----
> >  compiledMethodFor: textOrStream in: aContext to: receiver notifying:
> aRequestor ifFail: failBlock logged: logFlag
> >        "Compiles the sourceStream into a parse tree, then generates code
> >         into a method, and answers it.  If receiver is not nil, then the
> text can
> >         refer to instance variables of that receiver (the Inspector uses
> this).
> >         If aContext is not nil, the text can refer to temporaries in that
> context
> >         (the Debugger uses this). If aRequestor is not nil, then it will
> receive a
> >         notify:at: message before the attempt to evaluate is aborted."
> >
> >        | methodNode method |
> >        class := (aContext == nil ifTrue: [receiver] ifFalse: [aContext
> receiver]) class.
> >        self from: textOrStream class: class context: aContext notifying:
> aRequestor.
> >        methodNode := self translate: sourceStream noPattern: true ifFail:
> [^failBlock value].
> > +       method := self interactive ifTrue: [    methodNode
> generateWithTempNames ]
> > +               ifFalse: [methodNode generate].
> > +
> > -       method := methodNode generate: #(0 0 0 0).
> > -       self interactive ifTrue:
> > -               [method := method copyWithTempsFromMethodNode:
> methodNode].
> >        logFlag ifTrue:
> >                [SystemChangeNotifier uniqueInstance evaluated:
> sourceStream contents context: aContext].
> >        ^method!
> >
> > Item was changed:
> >  ----- Method: Compiler>>evaluate:in:to:notifying:ifFail:logged: (in
> category 'public access') -----
> >  evaluate: textOrStream in: aContext to: receiver notifying: aRequestor
> ifFail: failBlock logged: logFlag
> >        "Compiles the sourceStream into a parse tree, then generates code
> into a
> >        method. This method is then installed in the receiver's class so
> that it
> >        can be invoked. In other words, if receiver is not nil, then the
> text can
> >        refer to instance variables of that receiver (the Inspector uses
> this). If
> >        aContext is not nil, the text can refer to temporaries in that
> context (the
> >        Debugger uses this). If aRequestor is not nil, then it will
> receive a
> >        notify:at: message before the attempt to evaluate is aborted.
> Finally, the
> >        compiled method is invoked from here as DoIt or (in the case of
> >        evaluation in aContext) DoItIn:. The method is subsequently
> removed
> >        from the class, but this will not get done if the invocation
> causes an
> >        error which is terminated. Such garbage can be removed by
> executing:
> >        Smalltalk allBehaviorsDo: [:cl | cl removeSelector: #DoIt;
> removeSelector:
> >        #DoItIn:]."
> >
> >        | methodNode method value toLog itsSelection itsSelectionString |
> >        class := (aContext == nil ifTrue: [receiver] ifFalse: [aContext
> receiver]) class.
> >        self from: textOrStream class: class context: aContext notifying:
> aRequestor.
> >        methodNode := self translate: sourceStream noPattern: true ifFail:
> >                [^failBlock value].
> > +
> > +       method := self interactive ifTrue: [    methodNode
> generateWithTempNames ]
> > +               ifFalse: [methodNode generate].
> > -       method := methodNode generate: #(0 0 0 0).
> > -       self interactive ifTrue:
> > -               [method := method copyWithTempsFromMethodNode:
> methodNode].
> >
> >        value := receiver
> >                                withArgs: (context ifNil: [#()] ifNotNil:
> [{context}])
> >                                executeMethod: method.
> >
> >        logFlag ifTrue:[
> >                toLog := ((requestor respondsTo: #selection)
> >                        and:[(itsSelection := requestor selection) notNil
> >                        and:[(itsSelectionString := itsSelection asString)
> isEmptyOrNil not]])
> >                                ifTrue:[itsSelectionString]
> >                                ifFalse:[sourceStream contents].
> >                SystemChangeNotifier uniqueInstance evaluated: toLog
> context: aContext].
> >        ^ value!
> >
> >
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20091222/c9f86d6e/attachment.htm


More information about the Squeak-dev mailing list