Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.357.mcz ==================== Summary ==================== Name: Compiler-eem.357 Author: eem Time: 12 July 2017, 5:14:16.035903 pm UUID: 3965b31d-87f6-47e3-b23e-57dd1dd273b9 Ancestors: Compiler-eem.356 Fix the Compiler's evaluate:in: methods for non-cil contexts (e.g. the ContextVariablesInspector bottom right pane in the debugger). The old code used aContext methodClass which would exclude the variables of a receiver whose class inherited the method, rather than implemented it directly (e.g. debug (1@2) printString and in the context inspector on the Point(Object)>>printString activation try and evaluate x@y. Using methodClass excludes Point's inst vars. =============== Diff against Compiler-eem.356 =============== Item was added: + ----- Method: Compiler>>classForReceiver:context: (in category 'private') ----- + classForReceiver: receiver context: contextOrNil + "Answer the class to compile in for a receiver and aContext. + If aContext is non-nil use its receiver's class (if we use the context's + methodClass we may exclude instance variables of the receiver). + Access the class of the receiver via the mirror primitive to avoid issues with proxies." + + ^thisContext objectClass: (contextOrNil ifNil: [receiver] ifNotNil: [contextOrNil receiver])! Item was changed: ----- Method: Compiler>>compiledMethodFor:in:to:notifying:ifFail: (in category 'public access') ----- compiledMethodFor: textOrStream in: aContext to: receiver notifying: aRequestor ifFail: failBlock "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 | - | methodNode method theClass | - theClass := (aContext == nil ifTrue: [receiver] ifFalse: [aContext receiver]) class. methodNode := self compileNoPattern: textOrStream + in: (self classForReceiver: receiver context: aContext) - in: theClass context: aContext notifying: aRequestor ifFail: [^failBlock value]. method := self interactive ifTrue: [ methodNode generateWithTempNames ] ifFalse: [ methodNode generate ]. ^method! Item was changed: ----- Method: Compiler>>evaluate:in:to:environment:notifying:ifFail:logged: (in category 'public access logging') ----- evaluate: textOrStream in: aContext to: receiver environment: anEnvironment notifying: aRequestor ifFail: failBlock logged: logFlag "Same as #evaluate:in:to:notifying:ifFail:logged: but with an explicit environment" - | theClass | - theClass := (aContext == nil ifTrue: [receiver class] ifFalse: [aContext methodClass]). ^self evaluateCue: (CompilationCue source: textOrStream context: aContext receiver: receiver + class: (self classForReceiver: receiver context: aContext) - class: theClass environment: anEnvironment requestor: aRequestor) ifFail: failBlock logged: logFlag! Item was changed: ----- Method: Compiler>>evaluate:in:to:notifying:ifFail: (in category 'public access') ----- evaluate: textOrStream in: aContext to: receiver notifying: aRequestor ifFail: failBlock "Compiles the sourceStream into a parse tree, then generates code into a method. 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 via withArgs:executeMethod:, hence the system no longer creates Doit method litter on errors." | theClass | + theClass := self classForReceiver: receiver context: aContext. - theClass := aContext ifNil: [receiver class] ifNotNil: [:ctx | ctx methodClass]. ^self evaluateCue: (CompilationCue source: textOrStream context: aContext receiver: receiver class: theClass environment: theClass environment requestor: aRequestor) ifFail: failBlock! Item was changed: ----- Method: Compiler>>evaluate:in:to:notifying:ifFail:logged: (in category 'public access logging') ----- 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. 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 via withArgs:executeMethod:, hence the system no longer creates Doit method litter on errors." | theClass | + theClass := self classForReceiver: receiver context: aContext. - theClass := (aContext == nil ifTrue: [receiver class] ifFalse: [aContext methodClass]). ^self evaluateCue: (CompilationCue source: textOrStream context: aContext receiver: receiver class: theClass environment: theClass environment requestor: aRequestor) ifFail: failBlock logged: logFlag! |
Free forum by Nabble | Edit this page |