Nicolas Cellier uploaded a new version of VMMaker to project VM Maker Inbox: http://source.squeak.org/VMMakerInbox/VMMaker.oscog-nice.3174.mcz ==================== Summary ==================== Name: VMMaker.oscog-nice.3174 Author: nice Time: 9 March 2022, 1:04:51.911686 pm UUID: af4f8704-18fa-564c-ac59-27c6f6364c59 Ancestors: VMMaker.oscog-eem.3173 Workaround : literal characters should have unsigned values Currently in SistaV1, characters in range 16r100 16rFFFF are encoded as push literal character (bytecode 233) with signed extended B. This lead to negative character values in the range 16r8000 to 16rFFFF. The workaround consist in bit-oring extB with 16rFF so as to re-interpret it as unsigned char. BEWARE: this assumes that a single extB will be used rather than multiple consecutive extB. It works by now, because it's currently the case that image side only use 1 extB for encoding literal character - see EncoderForSistaV1>>#genPushCharacter: - above 16rFFFF, a literal index is consumed. An alternative would be to use extA rather than extB. But it would require a careful recompilation of CompiledMethod at image side. Similar fix is required at image side in InstructionStream>>#interpretNext2ByteSistaV1Instruction:for:extA:extB:startPC: =============== Diff against VMMaker.oscog-eem.3173 =============== Item was changed: ----- Method: SimpleStackBasedCogit>>genExtPushCharacterBytecode (in category 'bytecode generators') ----- genExtPushCharacterBytecode "SistaV1: 233 11101001 iiiiiiii Push Character #iiiiiiii (+ Extend B * 256)" | value | + value := byte1 + ((extB bitAnd: 16rFF) << 8). - value := byte1 + (extB << 8). extB := 0. numExtB := 0. ^self genPushLiteral: (objectMemory characterObjectOf: value)! Item was changed: ----- Method: StackInterpreter>>extPushCharacterBytecode (in category 'stack bytecodes') ----- extPushCharacterBytecode "SistaV1: * 233 11101001 iiiiiiii Push Character #iiiiiiii (+ Extend B * 256)" | value | + value := self fetchByte + ((extB bitAnd: 16rFF) << 8). - value := self fetchByte + (extB << 8). self fetchNextBytecode. self internalPush: (objectMemory characterObjectOf: value). numExtB := extB := 0!