[squeak-dev] The Trunk: Compiler-eem.376.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Mar 14 20:07:37 UTC 2018


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

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

Name: Compiler-eem.376
Author: eem
Time: 14 March 2018, 1:07:25.770492 pm
UUID: 5a1a43dc-5467-4e83-86f3-d6ba1cba0765
Ancestors: Compiler-eem.375

Fix some bugs in the new machinery thown up by tests for false positives.

=============== Diff against Compiler-eem.375 ===============

Item was changed:
  ----- Method: EncoderForSistaV1 class>>scanBlockOrNilForLiteral: (in category 'scanning') -----
  scanBlockOrNilForLiteral: aLiteral
  	"Answer a block argument for CompiledMethod>>#scanFor: that answers
  	 if the method refers to the literal implicitly via a special bytecode.
  	 If the literal is not accessible via a special bytecode, answer nil."
+ 	| value hi lo unextended |
+ 
- 	| value hi lo |
  	"96-111	0110 iiii			Send Arithmetic Message #iiii (+ - < > <= >= = ~= * / \\ @ bitShift: // bitAnd: bitOr:)
  	 112-119	01110 iii			Send Special Message #iii + 0 (at: at:put: size next nextPut: atEnd == class)"
  	aLiteral isSymbol ifTrue:
  		[value := 96 + ((Smalltalk specialSelectors indexOf: aLiteral ifAbsent: [^nil]) // 2).
  		 ^[:byte| byte = value]].
+ 
+ 	"80			01010000			Push 0
+ 	 81			01010001			Push 1
+ 	 232		11101000	iiiiiiii	Push Integer #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, d=0, s=1)"
- 	"232		11101000	iiiiiiii	Push Integer #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, d=0, s=1)"
  	aLiteral isInteger ifTrue:
+ 		[aLiteral >= 0 ifTrue:
+ 			[aLiteral <= 1 ifTrue:
+ 				[value := aLiteral + 80.
+ 				 ^[:byte| byte = value]].
+ 			 aLiteral <= 255 ifTrue:
+ 				[unextended := true. "Don't be fooled by extended cases with the same least significant byte!!"
+ 				 ^[:b1 :b2| | found |
+ 					found := b1 = 232 and: [b2 = aLiteral and: [unextended]].
+ 					unextended := b1 ~= 16rE1.
+ 					found]]].
+ 		 (aLiteral between: -32768 and: 32767) ifFalse: [^nil].
- 		[(aLiteral between: -32768 and: 32767) ifFalse: [^nil].
- 		 (aLiteral between: 0 and: 255) ifTrue:
- 			[^[:b1 :b2| b1 = 232 and: [b2 = aLiteral]]].
  		 lo := aLiteral bitAnd: 255.
  		 hi := (aLiteral bitShift: -8) bitAnd: 255.
  		 ^[:b1 :b2 :b3 :b4| b1 = 16rE1 and: [b2 = hi and: [b3 = 232 and: [b4 = lo]]]]].
+ 
  	"233		11101001	iiiiiiii	Push Character #iiiiiiii (+ Extend B * 256)"
  	aLiteral isCharacter ifTrue:
+ 		[(value := aLiteral asInteger) <= 255 ifTrue:
+ 			[unextended := true. "Don't be fooled by extended cases with the same least significant byte!!"
+ 			 ^[:b1 :b2| | found |
+ 				found := b1 = 233 and: [b2 = value and: [unextended]].
+ 				unextended := b1 ~= 16rE1.
+ 				found]].
+ 		 ^value <= 65535 ifTrue:
+ 			[lo := value bitAnd: 255.
+ 			 hi := (value bitShift: -8) bitAnd: 255.
+ 			 [:b1 :b2 :b3 :b4| b1 = 16rE1 and: [b2 = hi and: [b3 = 233 and: [b4 = lo]]]]]].
- 		[((value := aLiteral asInteger) > 65535) ifTrue: [^nil].
- 		 (aLiteral between: 0 and: 255) ifTrue:
- 			[^[:b1 :b2| b1 = 233 and: [b2 = value]]].
- 		 lo := value bitAnd: 255.
- 		 hi := (value bitShift: -8) bitAnd: 255.
- 		 ^[:b1 :b2 :b3 :b4| b1 = 16rE1 and: [b2 = hi and: [b3 = 233 and: [b4 = lo]]]]].
  
  	"77			01001101			Push true
  	 78			01001110			Push false
  	 79			01001111			Push nil
  	 88-91		010110 ii			Return Receiver/true/false/nil
  	 93			01011101			BlockReturn nil"
  	aLiteral == true ifTrue:
  		[^[:byte| byte = 77 or: [byte = 89]]].
  	aLiteral == false ifTrue:
  		[^[:byte| byte = 78 or: [byte = 90]]].
  	aLiteral == nil ifTrue:
  		[^[:byte| byte = 79 or: [byte = 91 or: [byte = 93]]]].
  	^nil!

Item was changed:
  ----- Method: EncoderForV3 class>>scanBlockOrNilForLiteral: (in category 'scanning') -----
  scanBlockOrNilForLiteral: aLiteral
  	"Answer a block argument for CompiledMethod>>#scanFor: that answers
  	 if the method refers to the literal implicitly via a special bytecode.
  	 If the literal is not accessible via a special bytecode, answer nil."
  	| value |
  	"176-191 	1011iiii 	Send Arithmetic Message #iiii
  	 192-207 	1100iiii 	Send Special Message #iiii"
  	(aLiteral isSymbol or: [aLiteral isInteger]) ifTrue:
  		[value := aLiteral isSymbol
  					ifTrue: [176 + ((Smalltalk specialSelectors indexOf: aLiteral ifAbsent: [^nil]) // 2)]
  					ifFalse: [(aLiteral between: -1 and: 2) ifFalse: [^nil].
  							aLiteral + 117].
  		 ^[:byte| byte = value]].
  	"112-119 	01110iii 	Push (receiver, true, false, nil, -1, 0, 1, 2) [iii]
  	 120-123 	011110ii 	Return (receiver, true, false, nil) [ii] From Message"
- 	aLiteral == nil ifTrue:
- 		[^[:byte| byte = 115 or: [byte = 123]]].
  	aLiteral == true ifTrue:
+ 		[^[:byte| byte = 113 or: [byte = 121]]].
- 		[^[:byte| byte = 116 or: [byte = 124]]].
  	aLiteral == false ifTrue:
+ 		[^[:byte| byte = 114 or: [byte = 122]]].
+ 	aLiteral == nil ifTrue:
+ 		[^[:byte| byte = 115 or: [byte = 123]]].
- 		[^[:byte| byte = 117 or: [byte = 125]]].
  	^nil!



More information about the Squeak-dev mailing list