[Vm-dev] VM Maker: BytecodeSets.spur-eem.15.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Sep 30 22:54:54 UTC 2014


Eliot Miranda uploaded a new version of BytecodeSets to project VM Maker:
http://source.squeak.org/VMMaker/BytecodeSets.spur-eem.15.mcz

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

Name: BytecodeSets.spur-eem.15
Author: eem
Time: 30 September 2014, 3:54:47.356 pm
UUID: 9baec05d-42fa-4382-90ad-48df531f2651
Ancestors: BytecodeSets.spur-eem.14

Fix a bug in EncoderForNewsqueakV4's
selectorToSendOrItselfFor:in:at:.  Implement
selectorToSendOrItselfFor:in:at: for SistaV1.

=============== Diff against BytecodeSets.spur-eem.14 ===============

Item was changed:
  ----- Method: EncoderForNewsqueakV4 class>>selectorToSendOrItselfFor:in:at: (in category 'instruction stream support') -----
  selectorToSendOrItselfFor: anInstructionStream in: method at: pc
  	"If anInstructionStream is at a send bytecode then answer the send's selector,
  	 otherwise answer anInstructionStream itself.  The rationale for answering
  	 anInstructionStream instead of, say, nil, is that potentially any existing object
  	 can be used as a selector, but since anInstructionStream postdates the method,
  	 it can't be one of them.
  
  	 The compilcation is that for convenience we assume the pc could be
  	 pointing to the raw send bytecode after its extensions, or at the extension
  	 preceeding the raw send bytecode.
  	80-95		0101 i i i i		Send Arithmetic Message #iiii
  	96-111		0110 i i i i		Send Special Message #iiii
  	112-127	0111 i i i i		Send Literal Selector #iiii With 0 Arguments
  	128-143	1000 i i i i		Send Literal Selector #iiii With 1 Argument
  	144-159	1001 i i i i		Send Literal Selector #iiii With 2 Arguments
  	160-175	1010 i i i i		Send To Absent Implicit Receiver Literal Selector #iiii With 0 Arguments
  	224		11100000	aaaaaaaa	Extend A (Ext A = Ext A prev * 256 + Ext A)
  	225		11100001	sbbbbbbb	Extend B (Ext B = Ext B prev * 256 + Ext B)
  	238		11101110	i i i i i j j j	Send Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments
  	239		11101111	i i i i i j j j	Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments
  	240		11110000	i i i i i j j j	Send To Absent Implicit Receiver Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments
  	241		11110001	i i i i i j j j	Send To Absent Dynamic Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments"
  
  	| byte |
  	byte := method at: pc.
  	byte < 80 ifTrue:
  		[^anInstructionStream].
  	byte <= 175 ifTrue: 
  		["special byte or short send"
  		 ^byte >= 112
  			ifTrue: [method literalAt: (byte bitAnd: 15) + 1]
  			ifFalse: [Smalltalk specialSelectorAt: byte - 79]].
  	byte < 238 ifTrue:
  		[(byte >= 224 and: [byte <= 225]) ifTrue:
  			[^self extensionsAt: pc in: method into:
+ 				[:extA :extB :nExtBytes| | byteAfter index |
+ 				byteAfter := method at: pc + nExtBytes.
- 				[:extA :extB :delta| | byteAfter index |
- 				byteAfter := method at: pc + delta.
  				(byteAfter >= 238 and: [byteAfter <= 241])
  					ifTrue:
+ 						[index := ((method at: pc + nExtBytes + 1) bitShift: -3) + (extA bitShift: 5).
- 						[index := ((method at: pc + delta + 1) bitShift: -3) + (extA bitShift: 5).
  						 method literalAt: index + 1]
  					ifFalse: [anInstructionStream]]].
  		^anInstructionStream].
  	byte > 241 ifTrue:
  		[^anInstructionStream].
  	"they could be extended..."
  	^self extensionsAt: pc in: method into:
+ 		[:extA :extB :nExtBytes| | index |
- 		[:extA :extB| | index |
  		 index := ((method at: pc + 1) bitShift: -3) + (extA bitShift: 5).
  		 method literalAt: index + 1]!

Item was added:
+ ----- Method: EncoderForSistaV1 class>>selectorToSendOrItselfFor:in:at: (in category 'instruction stream support') -----
+ selectorToSendOrItselfFor: anInstructionStream in: method at: pc
+ 	"If anInstructionStream is at a send bytecode then answer the send's selector,
+ 	 otherwise answer anInstructionStream itself.  The rationale for answering
+ 	 anInstructionStream instead of, say, nil, is that potentially any existing object
+ 	 can be used as a selector, but since anInstructionStream postdates the method,
+ 	 it can't be one of them.
+ 
+ 	 The compilcation is that for convenience we assume the pc could be
+ 	 pointing to the raw send bytecode after its extensions, or at the extension
+ 	 preceeding the raw send bytecode.
+ 		96-111		0110 iiii			Send Arithmetic Message #iiii #(#+ #- #< #> #'<=' #'>=' #= #'~=' #* #/ #'\\' #@ #bitShift: #'//' #bitAnd: #bitOr:)
+ 		112-119	01110 iii			Send Special Message #iii #(#at: #at:put: #size #next #nextPut: #atEnd #'==' class)
+ 		120		01111000			UNASSIGNED (was: blockCopy:)
+ 		121		01111001			Send Special Message #value
+ 		122-123	0111101 i			Send Special Message #i #(#value: #do:)
+ 		124-127	011111 ii			Send Special Message #ii #(#new #new: #x #y))
+ 		128-143	1000 iiii			Send Literal Selector #iiii With 0 Argument
+ 		144-159	1001 iiii			Send Literal Selector #iiii With 1 Arguments
+ 		160-175	1010 iiii			Send Literal Selector #iiii With 2 Arguments
+ 	*	224		11100000	aaaaaaaa	Extend A (Ext A = Ext A prev * 256 + Ext A)
+ 	*	225		11100001	bbbbbbbb	Extend B (Ext B = Ext B prev * 256 + Ext B)
+ 	**	234		11101010	iiiiijjj		Send Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments
+ 	**	235		11101011	iiiiijjj		Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments"
+ 
+ 	| byte |
+ 	byte := method at: pc.
+ 	byte < 96 ifTrue:
+ 		[^anInstructionStream].
+ 	byte <= 175 ifTrue: 
+ 		["special byte or short send"
+ 		 ^byte >= 128
+ 			ifTrue: [method literalAt: (byte bitAnd: 15) + 1]
+ 			ifFalse: [Smalltalk specialSelectorAt: byte - 79]].
+ 	byte < 234 ifTrue: "need to check for either extension cuz order of extensions is not restricted. so extB could preceed extA"
+ 		[(byte >= 224 and: [byte <= 225]) ifTrue:
+ 			[^self extensionsAt: pc in: method into:
+ 				[:extA :extB :nExtBytes| | byteAfter index |
+ 				byteAfter := method at: pc + nExtBytes.
+ 				(byteAfter >= 234 and: [byteAfter <= 235])
+ 					ifTrue:
+ 						[index := ((method at: pc + nExtBytes + 1) bitShift: -3) + (extA bitShift: 5).
+ 						 method literalAt: index + 1]
+ 					ifFalse: [anInstructionStream]]].
+ 		^anInstructionStream].
+ 	byte > 235 ifTrue:
+ 		[^anInstructionStream].
+ 	^method literalAt: ((method at: pc + 1) bitShift: -3) + 1!



More information about the Vm-dev mailing list