[squeak-dev] The Trunk: Compiler-eem.357.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Jul 13 00:14:41 UTC 2017


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 at 2) printString and in the context inspector on the Point(Object)>>printString activation try and evaluate x at 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!



More information about the Squeak-dev mailing list