[squeak-dev] The Trunk: Compiler-ar.108.mcz
Igor Stasenko
siguctua at gmail.com
Tue Dec 22 13:51:25 UTC 2009
2009/12/22 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>:
> Why does this depend on interactive ?
>
> method := self interactive ifTrue: [ methodNode
> generateWithTempNames ]
> ifFalse: [methodNode generate].
>
who knows :)
i just changed this code to use more convenient forms, but not changed
semantics.
(it is now more readable, up to the point that you start asking questions) :)
> Nicolas
>
> 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!
>>
>>
>>
>
>
--
Best regards,
Igor Stasenko AKA sig.
More information about the Squeak-dev
mailing list
|