[squeak-dev] The Trunk: Kernel-eem.1208.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Jan 3 02:23:13 UTC 2019

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

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

Name: Kernel-eem.1208
Author: eem
Time: 2 January 2019, 6:23:10.701672 pm
UUID: ab73a8b6-86f3-469b-a61e-cecb1017b96a
Ancestors: Kernel-eem.1207

Fix the simulation of the three argument form of primitive 188.  The symptom is that when using Debug It the class of the method shown at the top of the open debugger is CompiledMethod class, and the actual receiver appears to inherit from it (e.g. CompiledMethod class(Process)>>terminate).  The bug was that the simulation used the receiver of the receiver:withArguments:executeMethod: method, not the receiver argument there-in.

=============== Diff against Kernel-eem.1207 ===============

Item was changed:
  ----- Method: Context>>doPrimitive:method:receiver:args: (in category 'private') -----
  doPrimitive: primitiveIndex method: meth receiver: receiver args: arguments
  	"Simulate a primitive method whose index is primitiveIndex.  The simulated receiver and
  	 arguments are given as arguments to this message. If successful, push result and return
  	 resuming context, else ^ {errCode, PrimitiveFailToken}. Any primitive which provokes
  	 execution needs to be intercepted and simulated to avoid execution running away."
  	| value |
  	"Judicious use of primitive 19 (a null primitive that doesn't do anything) prevents
  	 the debugger from entering various run-away activities such as spawning a new
  	 process, etc.  Injudicious use results in the debugger not being able to debug
  	 interesting code, such as the debugger itself.  Hence use primitive 19 with care :-)"
  	"SystemNavigation new browseAllSelect: [:m| m primitive = 19]"
  	primitiveIndex = 19 ifTrue:
  			debugContext: self
  			label:'Code simulation error'
  			contents: nil].
  	((primitiveIndex between: 201 and: 222)
  	 and: [(self objectClass: receiver) includesBehavior: BlockClosure]) ifTrue:
  		[(primitiveIndex = 206
  		  or: [primitiveIndex = 208]) ifTrue:						"[Full]BlockClosure>>valueWithArguments:"
  			[^receiver simulateValueWithArguments: arguments first caller: self].
  		 ((primitiveIndex between: 201 and: 209)			 "[Full]BlockClosure>>value[:value:...]"
  		  or: [primitiveIndex between: 221 and: 222]) ifTrue: "[Full]BlockClosure>>valueNoContextSwitch[:]"
  			[^receiver simulateValueWithArguments: arguments caller: self]].
  	primitiveIndex = 83 ifTrue: "afr 9/11/1998 19:50" "Object>>perform:[with:...]"
  		[^self send: arguments first to: receiver with: arguments allButFirst].
  	primitiveIndex = 84 ifTrue: "afr 9/11/1998 19:50 & eem 8/18/2009 17:04" "Object>>perform:withArguments:"
  		[^self send: arguments first to: receiver with: (arguments at: 2) lookupIn: (self objectClass: receiver)].
  	primitiveIndex = 100 ifTrue: "eem 8/18/2009 16:57" "Object>>perform:withArguments:inSuperclass:"
  		[^self send: arguments first to: receiver with: (arguments at: 2) lookupIn: (arguments at: 3)].
  	(primitiveIndex = 186 or: [primitiveIndex = 187]) ifTrue:
  		[| effective |
  		 effective := Processor activeProcess effectiveProcess.
  		 "active == effective"
  		 value := primitiveIndex = 186
  					ifTrue: [receiver primitiveEnterCriticalSectionOnBehalfOf: effective]
  					ifFalse: [receiver primitiveTestAndSetOwnershipOfCriticalSectionOnBehalfOf: effective].
  		 ^(self isPrimFailToken: value)
  			ifTrue: [value]
  			ifFalse: [self push: value]].
  	primitiveIndex = 188 ifTrue:	"Object>>withArgs:executeMethod:
  									CompiledMethod class>>receiver:withArguments:executeMethod:
  									VMMirror>>ifFail:object:with:executeMethod: et al"
+ 		[| n args methodArg thisReceiver |
- 		[| n args methodArg |
  		 ((n := arguments size) between: 2 and: 4) ifFalse:
  			[^self class primitiveFailTokenFor: #'unsupported operation'].
  		 ((self objectClass: (args := arguments at: n - 1)) == Array
  		  and: [(self objectClass: (methodArg := arguments at: n)) includesBehavior: CompiledMethod]) ifFalse:
  			[^self class primitiveFailTokenFor: #'bad argument'].
  		 methodArg numArgs = args size ifFalse:
  			[^self class primitiveFailTokenFor: #'bad number of arguments'].
+ 		 thisReceiver := arguments at: n - 2.
  		 methodArg primitive > 0 ifTrue:
  			[methodArg isQuick ifTrue:
+ 				[^self push: (methodArg valueWithReceiver: thisReceiver arguments: args)].
+ 			 ^self doPrimitive: methodArg primitive method: meth receiver: thisReceiver args: args].
- 				[^self push: (methodArg valueWithReceiver: receiver arguments: args)].
- 			 ^self doPrimitive: methodArg primitive method: meth receiver: receiver args: args].
  			sender: self
+ 			receiver: thisReceiver
- 			receiver: receiver
  			method: methodArg
  			arguments: args].
  	primitiveIndex = 118 ifTrue: "[receiver:]tryPrimitive:withArgs:; avoid recursing in the VM"
  		[(arguments size = 3
  		  and: [(self objectClass: arguments second) == SmallInteger
  		  and: [(self objectClass: arguments last) == Array]]) ifTrue:
  			[^self doPrimitive: arguments second method: meth receiver: arguments first args: arguments last].
  		 (arguments size = 2
  		 and: [(self objectClass: arguments first) == SmallInteger
  		 and: [(self objectClass: arguments last) == Array]]) ifFalse:
  			[^self class primitiveFailTokenFor: nil].
  		 ^self doPrimitive: arguments first method: meth receiver: receiver args: arguments last].
  	value := primitiveIndex = 120 "FFI method"
  				ifTrue: [(meth literalAt: 1) tryInvokeWithArguments: arguments]
  					[primitiveIndex = 117 "named primitives"
  						ifTrue: [self tryNamedPrimitiveIn: meth for: receiver withArgs: arguments]
  						ifFalse: "should use self receiver: receiver tryPrimitive: primitiveIndex withArgs: arguments but this is only in later VMs (and appears to be broken)"
  							[receiver tryPrimitive: primitiveIndex withArgs: arguments]].
  	^(self isPrimFailToken: value)
  		ifTrue: [value]
  		ifFalse: [self push: value]!

More information about the Squeak-dev mailing list