[squeak-dev] The Trunk: Compiler-nice.471.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Mar 10 09:06:17 UTC 2022

Nicolas Cellier uploaded a new version of Compiler to project The Trunk:

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

Name: Compiler-nice.471
Author: nice
Time: 10 March 2022, 10:06:12.445899 am
UUID: ebc43c86-7bbc-764d-9bbb-6c9ecfb21a10
Ancestors: Compiler-mt.470

Workaround VM bug https://github.com/OpenSmalltalk/opensmalltalk-vm/issues/618

We avoid using extend B bytecode (225) + push character bytecode (233) when character value > 16r7FFF.

In this case, the character literal will be accessed thru traditional genPushLiteral: bytecode.

=============== Diff against Compiler-mt.470 ===============

Item was changed:
  ----- Method: EncoderForSistaV1>>genPushCharacter: (in category 'bytecode generation') -----
  genPushCharacter: aCharacterOrCode
  	"233		11101001	i i i i i i i i	Push Character #iiiiiiii (+ Extend B * 256)"
  	"Why restrict the range to 16 bits when we could encode arbitrarily 32-bit Characters?
  	 Well, 16 bits requires 4 bytes (extB + byte, 78 + byte) and so beyond this range we
  	 lose space verses a single-byte pushLiteral and a 4 byte Character literal on 32-bits.
  	 And generating the same bytecode on 64-bit and 32-bit is important if we want to be
  	 able to load binary code from one to the other (e.g. via Fuel)."
  	| code |
  	code := aCharacterOrCode isInteger ifTrue: [aCharacterOrCode] ifFalse: [aCharacterOrCode asInteger].
+ 	"Note: due to a bug at VM side, Character above 16r8000 are reconstructed with a negative value.
+ 	This is because extend B is interpreted as signed integer.
+ 	See https://github.com/OpenSmalltalk/opensmalltalk-vm/issues/618
+ 	For compatibility with old VM, we restrict usage of push character bytecode to safe cases extB < 16r80."
+ 	(code < 0 or: [code > 16r7FFF]) ifTrue:
+ 		[^self outOfRangeError: 'character' index: code range: 0 to: 16r7FFF].
- 	(code < 0 or: [code > 65535]) ifTrue:
- 		[^self outOfRangeError: 'character' index: code range: 0 to: 65535].
  	(code > 255) ifTrue:
  		[self genUnsignedSingleExtendB: (code bitShift: -8)].
  		nextPut: 233;
  		nextPut: (code bitAnd: 255)!

Item was changed:
  ----- Method: EncoderForSistaV1>>isSpecialLiteralForPush: (in category 'special literal encodings') -----
  isSpecialLiteralForPush: literal
  	^literal isInteger
  			[literal isCharacter
  					[false == literal
  					 or: [true == literal
  					 or: [nil == literal]]]
+ 					["Restrict character range due to VM bug at character value reconstruction
+ 					See https://github.com/OpenSmalltalk/opensmalltalk-vm/issues/618"
+ 					literal asInteger between: 0 and: 16r7FFF]]
- 					[literal asInteger between: 0 and: 65535]]
  			[literal between: -32768 and: 32767]!

More information about the Squeak-dev mailing list