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

commits at source.squeak.org commits at source.squeak.org
Thu Oct 9 20:36:45 UTC 2014


Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.879.mcz

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

Name: Kernel-eem.879
Author: eem
Time: 9 October 2014, 1:35:55.93 pm
UUID: fbc8b106-b977-4d3b-8df9-4f4836beff40
Ancestors: Kernel-eem.878

Add a usable unusedBytecode hook that allows
InstructionClients to define unusedBytecode and
act appropriately.

Remove the obsolete interpretExtension:in:for:

=============== Diff against Kernel-eem.878 ===============

Item was removed:
- ----- Method: InstructionStream>>interpretExtension:in:for: (in category 'private') -----
- interpretExtension: offset in: method for: client
- 	| type offset2 byte2 byte3 byte4 |
- 	offset <= 6 ifTrue: 
- 		["Extended op codes 128-134"
- 		byte2 := method at: pc. pc := pc + 1.
- 		offset <= 2 ifTrue:
- 			["128-130:  extended pushes and pops"
- 			type := byte2 // 64.
- 			offset2 := byte2 \\ 64.
- 			offset = 0 ifTrue: 
- 				[type = 0 ifTrue: [^client pushReceiverVariable: offset2].
- 				type = 1 ifTrue: [^client pushTemporaryVariable: offset2].
- 				type = 2  ifTrue: [^client pushConstant: (method literalAt: offset2 + 1)].
- 				type = 3 ifTrue: [^client pushLiteralVariable: (method literalAt: offset2 + 1)]].
- 			offset = 1 ifTrue: 
- 				[type = 0 ifTrue: [^client storeIntoReceiverVariable: offset2].
- 				type = 1 ifTrue: [^client storeIntoTemporaryVariable: offset2].
- 				type = 2 ifTrue: [self error: 'illegalStore'].
- 				type = 3 ifTrue: [^client storeIntoLiteralVariable: (method literalAt: offset2 + 1)]].
- 			offset = 2 ifTrue: 
- 				[type = 0 ifTrue: [^client popIntoReceiverVariable: offset2].
- 				type = 1 ifTrue: [^client popIntoTemporaryVariable: offset2].
- 				type = 2 ifTrue: [self error: 'illegalStore'].
- 				type = 3  ifTrue: [^client popIntoLiteralVariable: (method literalAt: offset2 + 1)]]].
- 		"131-134: extended sends"
- 		offset = 3 ifTrue:  "Single extended send"
- 			[^client send: (method literalAt: byte2 \\ 32 + 1)
- 					super: false numArgs: byte2 // 32].
- 		offset = 4 ifTrue:    "Double extended do-anything"
- 			[byte3 := method at: pc. pc := pc + 1.
- 			type := byte2 // 32.
- 			type = 0 ifTrue: [^client send: (method literalAt: byte3 + 1)
- 									super: false numArgs: byte2 \\ 32].
- 			type = 1 ifTrue: [^client send: (method literalAt: byte3 + 1)
- 									super: true numArgs: byte2 \\ 32].
- 			type = 2 ifTrue: [^client pushReceiverVariable: byte3].
- 			type = 3 ifTrue: [^client pushConstant: (method literalAt: byte3 + 1)].
- 			type = 4 ifTrue: [^client pushLiteralVariable: (method literalAt: byte3 + 1)].
- 			type = 5 ifTrue: [^client storeIntoReceiverVariable: byte3].
- 			type = 6 ifTrue: [^client popIntoReceiverVariable: byte3].
- 			type = 7 ifTrue: [^client storeIntoLiteralVariable: (method literalAt: byte3 + 1)]].
- 		offset = 5 ifTrue:  "Single extended send to super"
- 			[^client send: (method literalAt: byte2 \\ 32 + 1)
- 					super: true numArgs: byte2 // 32].
- 		offset = 6 ifTrue:   "Second extended send"
- 			[^client send: (method literalAt: byte2 \\ 64 + 1)
- 					super: false numArgs: byte2 // 64]].
- 	offset = 7 ifTrue: [^client doPop].
- 	offset = 8 ifTrue: [^client doDup].
- 	offset = 9 ifTrue: [^client pushActiveContext].
- 	byte2 := method at: pc. pc := pc + 1.
- 	offset = 10 ifTrue:
- 		[^byte2 < 128
- 			ifTrue: [client pushNewArrayOfSize: byte2]
- 			ifFalse: [client pushConsArrayWithElements: byte2 - 128]].
- 	offset = 11 ifTrue: [^self error: 'unusedBytecode'].
- 	byte3 := method at: pc.  pc := pc + 1.
- 	offset = 12 ifTrue: [^client pushRemoteTemp: byte2 inVectorAt: byte3].
- 	offset = 13 ifTrue: [^client storeIntoRemoteTemp: byte2 inVectorAt: byte3].
- 	offset = 14 ifTrue: [^client popIntoRemoteTemp: byte2 inVectorAt: byte3].
- 	"offset = 15"
- 	byte4 := method at: pc.  pc := pc + 1.
- 	^client
- 		pushClosureCopyNumCopiedValues: (byte2 bitShift: -4)
- 		numArgs: (byte2 bitAnd: 16rF)
- 		blockSize: (byte3 * 256) + byte4!

Item was changed:
  ----- Method: InstructionStream>>interpretNextV3ClosuresInstructionFor: (in category 'decoding - private - v3 plus closures') -----
  interpretNextV3ClosuresInstructionFor: client 
  	"Send to the argument, client, a message that specifies the type of the 
  	 next instruction."
  
  	| byte type offset method |
  	method := self method.  
  	byte := method at: pc.
  	type := byte // 16.  
  	offset := byte \\ 16.  
  	pc := pc+1.
  	"We do an inline binary search on each of the possible 16 values of type."
  	type < 8 ifTrue:
  		[type < 4 ifTrue:
  			[type < 2 ifTrue:
  				[type = 0 ifTrue:
  					[^ client pushReceiverVariable: offset].
  				^ client pushTemporaryVariable: offset].				"type = 1"
  			type = 2 ifTrue: 
  				[^ client pushConstant: (method literalAt: offset + 1)].
  			^ client pushConstant: (method literalAt: offset + 17)].		"type = 3"
  		type < 6 ifTrue:
  			[type = 4 ifTrue:
  				[^ client pushLiteralVariable: (method literalAt: offset + 1)].
  			^ client pushLiteralVariable: (method literalAt: offset + 17)]."type = 5"
  		type = 6 ifTrue:
  			[offset < 8 ifTrue:
  				[^ client popIntoReceiverVariable: offset].
  			^ client popIntoTemporaryVariable: offset - 8].
  		"type = 7"
  		offset = 0 ifTrue: [^ client pushReceiver].
  		offset < 8 ifTrue: [^ client pushConstant: (SpecialConstants at: offset)].
  		offset = 8 ifTrue: [^ client methodReturnReceiver].
  		offset < 12 ifTrue: [^ client methodReturnConstant: (SpecialConstants at: offset - 8)].
  		offset = 12 ifTrue: [^ client methodReturnTop].
  		offset = 13 ifTrue: [^ client blockReturnTop].
+ 		^ self unusedBytecode: client at: pc - 1]. "offset = 14 & offset = 15, 126 & 127"
- 		offset > 13 ifTrue: [^ self error: 'unusedBytecode']].
  	type < 12 ifTrue:
  		[type < 10 ifTrue:
  			[type = 8 ifTrue:
  				[^ self
  					interpretV3ClosuresExtension: offset
  					in: method
  					for: client].
  			"type = 9 (short jumps)"
  			offset < 8 ifTrue: [^ client jump: offset + 1].
  			^ client jump: offset - 8 + 1 if: false].
  		type = 10 ifTrue: "(long jumps)"
  			[byte := method at: pc.
  			pc := pc + 1.
  			offset < 8 ifTrue: [^ client jump: offset - 4 * 256 + byte].
  			^ client jump: (offset bitAnd: 3) * 256 + byte if: offset < 12].
  		"type = 11; arithmetic special selector sends"
  		^ client
  			send: (Smalltalk specialSelectorAt: offset + 1)
  			super: false
  			numArgs: (Smalltalk specialNargsAt: offset + 1)].
  		type = 12 ifTrue: "non-arithmetic special selector sends"
  			[^ client
  				send: (Smalltalk specialSelectorAt: offset + 17)
  				super: false
  				numArgs: (Smalltalk specialNargsAt: offset + 17)].
  	"type = 13, 14 or 15"
  	^ client
  		send: (method literalAt: offset + 1)
  		super: false
  		numArgs: type - 13 "0, 1 & 2"!

Item was changed:
  ----- Method: InstructionStream>>interpretNextV3InstructionFor: (in category 'decoding - private - v3 plus closures') -----
  interpretNextV3InstructionFor: client 
  	"Send to the argument, client, a message that specifies the type of the 
  	 next instruction."
  
  	| byte type offset method |
  	method := self method.  
  	byte := method at: pc.
  	type := byte // 16.  
  	offset := byte \\ 16.  
  	pc := pc+1.
  	"We do an inline binary search on each of the possible 16 values of type."
  	type < 8 ifTrue:
  		[type < 4 ifTrue:
  			[type < 2 ifTrue:
  				[type = 0 ifTrue:
  					[^ client pushReceiverVariable: offset].
  				^ client pushTemporaryVariable: offset].				"type = 1"
  			type = 2 ifTrue: 
  				[^ client pushConstant: (method literalAt: offset + 1)].
  			^ client pushConstant: (method literalAt: offset + 17)].		"type = 3"
  		type < 6 ifTrue:
  			[type = 4 ifTrue:
  				[^ client pushLiteralVariable: (method literalAt: offset + 1)].
  			^ client pushLiteralVariable: (method literalAt: offset + 17)]."type = 5"
  		type = 6 ifTrue:
  			[offset < 8 ifTrue:
  				[^ client popIntoReceiverVariable: offset].
  			^ client popIntoTemporaryVariable: offset - 8].
  		"type = 7"
  		offset = 0 ifTrue: [^ client pushReceiver].
  		offset < 8 ifTrue: [^ client pushConstant: (SpecialConstants at: offset)].
  		offset = 8 ifTrue: [^ client methodReturnReceiver].
  		offset < 12 ifTrue: [^ client methodReturnConstant: (SpecialConstants at: offset - 8)].
  		offset = 12 ifTrue: [^ client methodReturnTop].
  		offset = 13 ifTrue: [^ client blockReturnTop].
+ 		^ self unusedBytecode: client at: pc - 1]. "offset = 14 & offset = 15, 126 & 127"
- 		^ self error: 'unusedBytecode']. "offset = 14 & offset = 15, 126 & 127"
  	type < 12 ifTrue:
  		[type < 10 ifTrue:
  			[type = 8 ifTrue:
  				[^ self
  					interpretV3Extension: offset
  					in: method
  					for: client].
  			"type = 9 (short jumps)"
  			offset < 8 ifTrue: [^ client jump: offset + 1].
  			^ client jump: offset - 8 + 1 if: false].
  		type = 10 ifTrue: "(long jumps)"
  			[byte := method at: pc.
  			pc := pc + 1.
  			offset < 8 ifTrue: [^ client jump: offset - 4 * 256 + byte].
  			^ client jump: (offset bitAnd: 3) * 256 + byte if: offset < 12].
  		"type = 11; arithmetic special selector sends"
  		^ client
  			send: (Smalltalk specialSelectorAt: offset + 1)
  			super: false
  			numArgs: (Smalltalk specialNargsAt: offset + 1)].
  		type = 12 ifTrue: "non-arithmetic special selector sends"
  			[^ client
  				send: (Smalltalk specialSelectorAt: offset + 17)
  				super: false
  				numArgs: (Smalltalk specialNargsAt: offset + 17)].
  	"type = 13, 14 or 15"
  	^ client
  		send: (method literalAt: offset + 1)
  		super: false
  		numArgs: type - 13 "0, 1 & 2"!

Item was changed:
  ----- Method: InstructionStream>>interpretV3ClosuresExtension:in:for: (in category 'decoding - private - v3 plus closures') -----
  interpretV3ClosuresExtension: offset in: method for: client
  	| type offset2 byte2 byte3 byte4 |
  	offset <= 6 ifTrue: 
  		["Extended op codes 128-134"
  		byte2 := method at: pc. pc := pc + 1.
  		offset <= 2 ifTrue:
  			["128-130:  extended pushes and pops"
  			type := byte2 // 64.
  			offset2 := byte2 \\ 64.
  			offset = 0 ifTrue: 
  				[type = 0 ifTrue: [^client pushReceiverVariable: offset2].
  				type = 1 ifTrue: [^client pushTemporaryVariable: offset2].
  				type = 2  ifTrue: [^client pushConstant: (method literalAt: offset2 + 1)].
  				type = 3 ifTrue: [^client pushLiteralVariable: (method literalAt: offset2 + 1)]].
  			offset = 1 ifTrue: 
  				[type = 0 ifTrue: [^client storeIntoReceiverVariable: offset2].
  				type = 1 ifTrue: [^client storeIntoTemporaryVariable: offset2].
  				type = 2 ifTrue: [self error: 'illegalStore'].
  				type = 3 ifTrue: [^client storeIntoLiteralVariable: (method literalAt: offset2 + 1)]].
  			offset = 2 ifTrue: 
  				[type = 0 ifTrue: [^client popIntoReceiverVariable: offset2].
  				type = 1 ifTrue: [^client popIntoTemporaryVariable: offset2].
  				type = 2 ifTrue: [self error: 'illegalStore'].
  				type = 3  ifTrue: [^client popIntoLiteralVariable: (method literalAt: offset2 + 1)]]].
  		"131-134: extended sends"
  		offset = 3 ifTrue:  "Single extended send"
  			[^client send: (method literalAt: byte2 \\ 32 + 1)
  					super: false numArgs: byte2 // 32].
  		offset = 4 ifTrue:    "Double extended do-anything"
  			[byte3 := method at: pc. pc := pc + 1.
  			type := byte2 // 32.
  			type = 0 ifTrue: [^client send: (method literalAt: byte3 + 1)
  									super: false numArgs: byte2 \\ 32].
  			type = 1 ifTrue: [^client send: (method literalAt: byte3 + 1)
  									super: true numArgs: byte2 \\ 32].
  			type = 2 ifTrue: [^client pushReceiverVariable: byte3].
  			type = 3 ifTrue: [^client pushConstant: (method literalAt: byte3 + 1)].
  			type = 4 ifTrue: [^client pushLiteralVariable: (method literalAt: byte3 + 1)].
  			type = 5 ifTrue: [^client storeIntoReceiverVariable: byte3].
  			type = 6 ifTrue: [^client popIntoReceiverVariable: byte3].
  			type = 7 ifTrue: [^client storeIntoLiteralVariable: (method literalAt: byte3 + 1)]].
  		offset = 5 ifTrue:  "Single extended send to super"
  			[^client send: (method literalAt: byte2 \\ 32 + 1)
  					super: true
  					numArgs: byte2 // 32].
  		offset = 6 ifTrue:   "Second extended send"
  			[^client send: (method literalAt: byte2 \\ 64 + 1)
  					super: false
  					numArgs: byte2 // 64]].
  	offset = 7 ifTrue: [^client doPop].
  	offset = 8 ifTrue: [^client doDup].
  	offset = 9 ifTrue: [^client pushActiveContext].
  	byte2 := method at: pc. pc := pc + 1.
  	offset = 10 ifTrue:
  		[^byte2 < 128
  			ifTrue: [client pushNewArrayOfSize: byte2]
  			ifFalse: [client pushConsArrayWithElements: byte2 - 128]].
+ 	offset = 11 ifTrue: [^self unusedBytecode: client at: pc - 1].
- 	offset = 11 ifTrue: [^self error: 'unusedBytecode'].
  	byte3 := method at: pc.  pc := pc + 1.
  	offset = 12 ifTrue: [^client pushRemoteTemp: byte2 inVectorAt: byte3].
  	offset = 13 ifTrue: [^client storeIntoRemoteTemp: byte2 inVectorAt: byte3].
  	offset = 14 ifTrue: [^client popIntoRemoteTemp: byte2 inVectorAt: byte3].
  	"offset = 15"
  	byte4 := method at: pc.  pc := pc + 1.
  	^client
  		pushClosureCopyNumCopiedValues: (byte2 bitShift: -4)
  		numArgs: (byte2 bitAnd: 16rF)
  		blockSize: (byte3 * 256) + byte4!

Item was changed:
  ----- Method: InstructionStream>>interpretV3Extension:in:for: (in category 'decoding - private - v3 plus closures') -----
  interpretV3Extension: offset in: method for: client
  	| type offset2 byte2 byte3 |
  	offset <= 6 ifTrue: 
  		["Extended op codes 128-134"
  		byte2 := method at: pc. pc := pc + 1.
  		offset <= 2 ifTrue:
  			["128-130:  extended pushes and pops"
  			type := byte2 // 64.
  			offset2 := byte2 \\ 64.
  			offset = 0 ifTrue: 
  				[type = 0 ifTrue: [^client pushReceiverVariable: offset2].
  				type = 1 ifTrue: [^client pushTemporaryVariable: offset2].
  				type = 2  ifTrue: [^client pushConstant: (method literalAt: offset2 + 1)].
  				type = 3 ifTrue: [^client pushLiteralVariable: (method literalAt: offset2 + 1)]].
  			offset = 1 ifTrue: 
  				[type = 0 ifTrue: [^client storeIntoReceiverVariable: offset2].
  				type = 1 ifTrue: [^client storeIntoTemporaryVariable: offset2].
  				type = 2 ifTrue: [self error: 'illegalStore'].
  				type = 3 ifTrue: [^client storeIntoLiteralVariable: (method literalAt: offset2 + 1)]].
  			offset = 2 ifTrue: 
  				[type = 0 ifTrue: [^client popIntoReceiverVariable: offset2].
  				type = 1 ifTrue: [^client popIntoTemporaryVariable: offset2].
  				type = 2 ifTrue: [self error: 'illegalStore'].
  				type = 3  ifTrue: [^client popIntoLiteralVariable: (method literalAt: offset2 + 1)]]].
  		"131-134: extended sends"
  		offset = 3 ifTrue:  "Single extended send"
  			[^client send: (method literalAt: byte2 \\ 32 + 1)
  					super: false numArgs: byte2 // 32].
  		offset = 4 ifTrue:    "Double extended do-anything"
  			[byte3 := method at: pc. pc := pc + 1.
  			type := byte2 // 32.
  			type = 0 ifTrue: [^client send: (method literalAt: byte3 + 1)
  									super: false numArgs: byte2 \\ 32].
  			type = 1 ifTrue: [^client send: (method literalAt: byte3 + 1)
  									super: true numArgs: byte2 \\ 32].
  			type = 2 ifTrue: [^client pushReceiverVariable: byte3].
  			type = 3 ifTrue: [^client pushConstant: (method literalAt: byte3 + 1)].
  			type = 4 ifTrue: [^client pushLiteralVariable: (method literalAt: byte3 + 1)].
  			type = 5 ifTrue: [^client storeIntoReceiverVariable: byte3].
  			type = 6 ifTrue: [^client popIntoReceiverVariable: byte3].
  			type = 7 ifTrue: [^client storeIntoLiteralVariable: (method literalAt: byte3 + 1)]].
  		offset = 5 ifTrue:  "Single extended send to super"
  			[^client send: (method literalAt: byte2 \\ 32 + 1)
  					super: true
  					numArgs: byte2 // 32].
  		offset = 6 ifTrue:   "Second extended send"
  			[^client send: (method literalAt: byte2 \\ 64 + 1)
  					super: false
  					numArgs: byte2 // 64]].
  	offset = 7 ifTrue: [^client doPop].
  	offset = 8 ifTrue: [^client doDup].
  	offset = 9 ifTrue: [^client pushActiveContext].
+ 	^self unusedBytecode: client at: pc!
- 	^self error: 'unusedBytecode'!

Item was added:
+ ----- Method: InstructionStream>>unusedBytecode:at: (in category 'private') -----
+ unusedBytecode: client at: targetPC
+ 	[client unusedBytecode]
+ 		on: MessageNotUnderstood
+ 		do: [:ex|
+ 			(ex receiver == client
+ 			 and: [ex message selector == #unusedBytecode])
+ 				ifTrue: [self error: 'unusedBytecode']
+ 				ifFalse: [ex pass]]!



More information about the Squeak-dev mailing list