[squeak-dev] The Trunk: Kernel-ct.1438.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Dec 28 20:13:29 UTC 2021

Christoph Thiede uploaded a new version of Kernel to project The Trunk:

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

Name: Kernel-ct.1438
Author: ct
Time: 28 December 2021, 9:13:10.136249 pm
UUID: 0477e714-e01d-d34d-b6aa-0939494a4abc
Ancestors: Kernel-mt.1437, Kernel-ct.1403

Merges Kernel-ct.1403 (fixes simulation of dynamic-forwarding objects as methods).

=============== Diff against Kernel-mt.1437 ===============

Item was changed:
  ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') -----
  send: selector to: rcvr with: arguments lookupIn: lookupClass
  	"Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method."
+ 	| meth methClass primIndex val ctxt |
- 	| meth primIndex val ctxt |
  	(meth := lookupClass lookupSelector: selector) ifNil:
  		[selector == #doesNotUnderstand: ifTrue:
  			[self error: 'Recursive message not understood!!' translated].
  		^self send: #doesNotUnderstand:
  				to: rcvr
  				with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass}
  				lookupIn: lookupClass].
+ 	((methClass := self objectClass: meth) == CompiledMethod or: [methClass == CompiledBlock]) ifFalse:
- 	meth isCompiledMethod ifFalse:
  		["Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062."
  		^self send: #run:with:in:
  			to: meth
  			with: {selector. arguments. rcvr}].
  	meth numArgs = arguments size ifFalse:
  		[^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})].
  	(primIndex := meth primitive) > 0 ifTrue:
  		[val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments.
  		(self isPrimFailToken: val) ifFalse:
  	ctxt := self activateMethod: meth withArgs: arguments receiver: rcvr.
  	(primIndex isInteger and: [primIndex > 0]) ifTrue:
  		[ctxt failPrimitiveWith: val].

More information about the Squeak-dev mailing list