[squeak-dev] The Trunk: EToys-eem.305.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Jul 13 00:17:49 UTC 2017

Eliot Miranda uploaded a new version of EToys to project The Trunk:

==================== Summary ====================

Name: EToys-eem.305
Author: eem
Time: 12 July 2017, 5:17:21.792431 pm
UUID: 6180f254-4baa-41f9-a31d-adb1fa208d77
Ancestors: EToys-eem.304

Fix the ScriptCompiler's evaluate:in:to:notifying:ifFail:logged: method 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.

At the same time eliminate its reliance on DoIt: and DoItIn:

=============== Diff against EToys-eem.304 ===============

Item was changed:
  ----- Method: ScriptCompiler>>evaluate:in:to:notifying:ifFail:logged: (in category 'as yet unclassified') -----
  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."
- 	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 itsSelectionString itsSelection |
- 	| class methodNode method value selector toLog itsSelectionString itsSelection |
- 	class := (aContext == nil ifTrue: [receiver] ifFalse: [aContext receiver]) class.
  	methodNode :=  self parser new
  		parse: textOrStream readStream
+ 		class: (self classForReceiver: receiver context: aContext)
- 		class: class
  		noPattern: true
  		context: aContext
  		notifying: aRequestor
+ 		ifFail: [^ failBlock value]
+ 		for: receiver.
+ 	method := methodNode generate: (CompiledMethodTrailer empty sourceCode: methodNode sourceText; yourself).
- 		ifFail: [^ failBlock value] for: receiver.
- 	method := methodNode generate: (CompiledMethodTrailer empty sourceCode: (methodNode sourceText); yourself).
  	self interactive ifTrue:
  		[method := method copyWithTempNames: methodNode tempNames].
+ 	value := receiver
+ 				withArgs: (aContext ifNil: [#()] ifNotNil: [{aContext}])
+ 				executeMethod: method.
- 	selector := aContext isNil
- 		ifTrue: [#DoIt]
- 		ifFalse: [#DoItIn:].
- 	class addSelectorSilently: selector withMethod: method.
- 	value := aContext isNil
- 		ifTrue: [receiver DoIt]
- 		ifFalse: [receiver DoItIn: aContext].
- 	InMidstOfFileinNotification signal 
- 		ifFalse: [class basicRemoveSelector: selector].
  	logFlag ifTrue:
  		[toLog := ((aRequestor respondsTo: #selection)  and:
  			[(itsSelection := aRequestor selection) notNil] and:
  			[(itsSelectionString := itsSelection asString) isEmptyOrNil not] )
  				[textOrStream readStream contents].
  		SystemChangeNotifier uniqueInstance evaluated: toLog context: aContext].
+ 	^value!
- 	^ value!

More information about the Squeak-dev mailing list