<div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000;text-align: left" dir="ltr">
                                        Hi Eliot, hi all --<div class="mb_sig"></div>
                                        <div><br></div><div>What's the current use of this Inbox proposal? We have ImplicitLiteralInstructionClientHook in Trunk at the moment.</div><div><br></div><div>Should we merge BytecodeSets.spur-eem.81 ?</div><div><br></div><div>Best,</div><div>Marcel</div><blockquote class="history_container" type="cite" style="border-left-style: solid;border-width: 1px;margin-top: 20px;margin-left: 0px;padding-left: 10px;min-width: 500px">
                        <p style="color: #AAAAAA; margin-top: 10px;">Am 13.09.2021 07:20:42 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p><div style="font-family:Arial,Helvetica,sans-serif"> <br>Eliot Miranda uploaded a new version of BytecodeSets to project VM Maker Inbox:<br>http://source.squeak.org/VMMakerInbox/BytecodeSets.spur-eem.81.mcz<br><br>==================== Summary ====================<br><br>Name: BytecodeSets.spur-eem.81<br>Author: eem<br>Time: 12 September 2021, 10:20:31.001161 pm<br>UUID: d4391f21-0790-4132-9ae4-97941c8e3809<br>Ancestors: BytecodeSets.spur-eem.80<br><br>Proposed fix for CompiledCode>>#allLiteralsDo: by adding pushSpecialConstant:/sendSpecial:numArgs:.<br><br>=============== Diff against BytecodeSets.spur-eem.80 ===============<br><br>Item was changed:<br>  ----- Method: InstructionStream>>interpretNSV4ExtendedPush:for: (in category '*BytecodeSets-NewsqueakV4-decoding') -----<br>  interpretNSV4ExtendedPush: extB for: client<br>    "Implement the extended push for non-zero extensions."<br>      "77                        01001101                                Push false [* 1:true, 2:nil, 3:thisContext, ..., -N: pushExplicitOuter: N, N = Extend B]"<br>        extB < 0 ifTrue:<br>           [^client pushExplicitOuter: extB negated].<br>    extB < 2 ifTrue:<br>+          [^client pushSpecialConstant: extB = 1].<br>-             [^client pushConstant: extB = 1].<br>     extB = 2 ifTrue:<br>+             [^client pushSpecialConstant: nil].<br>-          [^client pushConstant: nil].<br>          extB = 3 ifTrue:<br>              [^client pushActiveContext].<br>          self error: 'undefined extended push'!<br><br>Item was changed:<br>  ----- Method: InstructionStream>>interpretNext2ByteNSV4Instruction:for:extA:extB:startPC: (in category '*BytecodeSets-NewsqueakV4-decoding') -----<br>  interpretNext2ByteNSV4Instruction: bytecode for: client extA: extA extB: extB startPC: startPC<br>     "Send to the argument, client, a message that specifies the next instruction.<br>     This method handles the two-byte codes.<br>       For a table of the bytecode set, see EncoderForNewsqueakV4's class comment."<br>  <br>        | byte method |<br>       method := self method.<br>        byte := self method at: pc.<br>   pc := pc + 1.<br>         "We do an inline quasi-binary search on bytecode"<br>   bytecode < 235 ifTrue:<br>             [bytecode < 231 ifTrue:<br>                    [bytecode < 229 ifTrue:<br>                            [| literal |<br>                                   bytecode = 226 ifTrue:<br>                                       [^client pushReceiverVariable: (extA bitShift: 8) + byte].<br>                             literal := method literalAt: (extA bitShift: 8) + byte + 1.<br>                                   bytecode = 227 ifTrue:<br>                                       [^client pushLiteralVariable: literal].<br>                                ^client pushConstant: literal].<br>                      bytecode = 229 ifTrue:<br>+                               [^client pushSpecialConstant: (extB bitShift: 8) + byte].<br>-                            [^client pushConstant: (extB bitShift: 8) + byte].<br>                    ^client pushTemporaryVariable: byte].<br>                 bytecode = 231 ifTrue:<br>                        [^byte < 128<br>                               ifTrue: [client pushNewArrayOfSize: byte]<br>                             ifFalse: [client pushConsArrayWithElements: byte - 128]].<br>             bytecode = 232 ifTrue:<br>                        [^client storeIntoReceiverVariable: (extA bitShift: 8) + byte].<br>               bytecode = 233 ifTrue:<br>                        [^client storeIntoLiteralVariable: (method literalAt: (extA bitShift: 8) + byte + 1)].<br>                ^client storeIntoTemporaryVariable: byte].<br>    bytecode < 238 ifTrue:<br>             [bytecode = 235 ifTrue:<br>                       [^client popIntoReceiverVariable: (extA bitShift: 8) + byte].<br>                  bytecode = 236 ifTrue:<br>                       [^client popIntoLiteralVariable: (method literalAt: (extA bitShift: 8) + byte + 1)].<br>                   ^client popIntoTemporaryVariable: byte].<br>     bytecode < 242 ifTrue:<br>             [| selector numArgs |<br>                  selector := method literalAt: (extA bitShift: 5) + (byte // 8) + 1.<br>                   numArgs := (extB bitShift: 3) + (byte \\ 8).<br>                  bytecode = 238 ifTrue:<br>                       [^client send: selector super: false numArgs: numArgs].<br>                bytecode = 239 ifTrue:<br>                       [^client send: selector super: true numArgs: numArgs].<br>                 bytecode = 240 ifTrue:<br>                       [^client sendToAbsentImplicitReceiver: selector numArgs: numArgs].<br>             ^client sendToAbsentDynamicSuperclass: selector numArgs: numArgs].<br>   bytecode < 245 ifTrue:<br>             [bytecode = 242 ifTrue:<br>                       [^client jump: (extB bitShift: 8) + byte].<br>             ^client jump: (extB bitShift: 8) + byte if: bytecode = 243].<br>         bytecode = 245 ifTrue:<br>                [| selector numArgs |<br>                  selector := method literalAt: (extA bitShift: 5) + (byte // 8) + 1.<br>                   numArgs := (extB bitShift: 3) + (byte \\ 8).<br>                  ^client sendToAbsentSelf: selector numArgs: numArgs].<br>        "246-247   1111011 i       xxxxxxxx        UNASSIGNED<br>     248-249        1111100 i       xxxxxxxx        UNASSIGNED"<br>      ^self unusedBytecode: client at: startPC!<br><br>Item was changed:<br>  ----- Method: InstructionStream>>interpretNextNSV3InstructionFor: (in category '*BytecodeSets-NewsqueakV3-decoding') -----<br>  interpretNextNSV3InstructionFor: client <br>        "Send to the argument, client, a message that specifies the type of the <br>          next instruction."<br>  <br>          | byte type offset method |<br>   method := self method.  <br>      byte := method at: pc.<br>        type := byte // 16.  <br>         offset := byte \\ 16.  <br>       pc := pc+1.<br>   "We do an inline binary search on each of the possible 16 values of type."<br>          type < 8 ifTrue:<br>           [type < 4 ifTrue:<br>                          [type < 2 ifTrue:<br>                                  [type = 0 ifTrue:<br>                                     [^ client pushReceiverVariable: offset].<br>                              ^ client pushTemporaryVariable: offset].                                "type = 1"<br>                          type = 2 ifTrue: <br>                             [^ client pushConstant: (method literalAt: offset + 1)].<br>                      ^ client pushConstant: (method literalAt: offset + 17)].                "type = 3"<br>                  type < 6 ifTrue:<br>                   [type = 4 ifTrue:<br>                             [^ client pushLiteralVariable: (method literalAt: offset + 1)].<br>                       ^ client pushLiteralVariable: (method literalAt: offset + 17)]."type = 5"<br>           type = 6 ifTrue:<br>                      [offset < 8 ifTrue:<br>                                [^ client popIntoReceiverVariable: offset].<br>                   ^ client popIntoTemporaryVariable: offset - 8].<br>               "type = 7"<br>                  offset = 0 ifTrue: [^ client pushReceiver].<br>+          offset < 8 ifTrue: [^ client pushSpecialConstant: (SpecialConstants at: offset)].<br>-                 offset < 8 ifTrue: [^ client pushConstant: (SpecialConstants at: offset)].<br>                 offset = 8 ifTrue: [^ client methodReturnReceiver].<br>           offset < 12 ifTrue: [^ client methodReturnConstant: (SpecialConstants at: offset - 8)].<br>            offset = 12 ifTrue: [^ client methodReturnTop].<br>               offset = 13 ifTrue: [^ client blockReturnTop].<br>                offset = 14 ifTrue:<br>                   [| byte2 |<br>                    byte := method at: pc.<br>                        pc := pc+1.<br>                   byte2 := method at: pc.<br>                       pc := pc+1.<br>                   ^ client sendToDynamicSuperclass: (method literalAt: byte2 + 1) numArgs: byte].<br>                "offset = 15"<br>              byte := method at: pc.<br>                pc := pc+1.<br>           ^ client pushImplicitReceiverForMessage: (method literalAt: byte + 1)].<br>       type < 12 ifTrue:<br>                  [type < 10 ifTrue:<br>                         [type = 8 ifTrue:<br>                             [^ self<br>                                       interpretNSV3Extension: offset<br>                                        in: method<br>                                    for: client].<br>                         "type = 9 (short jumps)"<br>                    offset < 8 ifTrue: [^ client jump: offset + 1].<br>                    ^ client jump: offset - 8 + 1 if: false].<br>             type = 10 ifTrue: "(long jumps)"<br>                    [byte := method at: pc.<br>                       pc := pc + 1.<br>                         offset < 8 ifTrue: [^ client jump: offset - 4 * 256 + byte].<br>                       ^ client jump: (offset bitAnd: 3) * 256 + byte if: offset < 12].<br>           "type = 11; arithmetic special selector sends"<br>              ^ client<br>+                     sendSpecial: (Smalltalk specialSelectorAt: offset + 1)<br>-                       send: (Smalltalk specialSelectorAt: offset + 1)<br>-                      super: false<br>                          numArgs: (Smalltalk specialNargsAt: offset + 1)].<br>             type = 12 ifTrue: "non-arithmetic special selector sends"<br>                   [^ client<br>+                            sendSpecial: (Smalltalk specialSelectorAt: offset + 17)<br>-                              send: (Smalltalk specialSelectorAt: offset + 17)<br>-                             super: false<br>                                  numArgs: (Smalltalk specialNargsAt: offset + 17)].<br>    "type = 13, 14 or 15"<br>       ^ client<br>              send: (method literalAt: offset + 1)<br>                  super: false<br>                  numArgs: type - 13 "0, 1 & 2"!<br><br>Item was changed:<br>  ----- Method: InstructionStream>>interpretNextNSV4InstructionFor: (in category '*BytecodeSets-NewsqueakV4-decoding') -----<br>  interpretNextNSV4InstructionFor: client<br>      "Send to the argument, client, a message that specifies the next instruction."<br>  <br>          | byte div16 offset method extA extB savedPC |<br>        method := self method.<br>        "For a table of the bytecode set, see EncoderForNewsqueakV4's class comment."<br>       "consume and compute any extensions first."<br>         extA := extB := 0.<br>    savedPC := pc.<br>        [byte := self method at: pc.<br>           pc := pc + 1.<br>         byte >= 224 and: [byte <= 225]] whileTrue:<br>             [| extByte |<br>                   extByte := self method at: pc.<br>                pc := pc + 1.<br>                 byte = 224<br>                   ifTrue:<br>                               [extA := (extA bitShift: 8) + extByte]<br>                        ifFalse:<br>                              [extB := (extB = 0 and: [extByte > 127])<br>                                                   ifTrue: [extByte - 256]<br>                                                       ifFalse: [(extB bitShift: 8) + extByte]]].<br>    div16 := byte // 16.<br>          offset := byte \\ 16.<br>         "We do an inline quasi-binary search on each of the possible 16 values of div16"<br>    div16 < 12 ifTrue:<br>                 [div16 < 4 ifTrue:<br>                         [div16 < 2 ifTrue:<br>                                 [div16 = 0 ifTrue:<br>                                     [^client pushReceiverVariable: offset].<br>                              ^client pushLiteralVariable: (method literalAt: offset + 1)]. "div16 = 1"<br>                    ^client pushConstant: (method literalAt: byte \\ 32 + 1)].<br>            div16 = 4 ifTrue:<br>                    [offset < 12 ifTrue:<br>                               [^client pushTemporaryVariable: offset].<br>                       offset < 14 ifTrue:<br>                               [offset = 12 ifTrue:<br>                                          [^client pushReceiver].<br>                                extB = 0 ifTrue:<br>+                                    [^client pushSpecialConstant: false].<br>-                                        [^client pushConstant: false].<br>                                 ^self interpretNSV4ExtendedPush: extB for: client].<br>+                          ^client pushSpecialConstant: offset - 14]. "0 & 1"<br>-                     ^client pushConstant: offset - 14]. "0 & 1"<br>            "short sends"<br>               div16 < 7 ifTrue: "special selector sends"<br>                       [div16 = 5 ifTrue:<br>                            [^client<br>+                                     sendSpecial: (Smalltalk specialSelectorAt: offset + 1)<br>-                                       send: (Smalltalk specialSelectorAt: offset + 1)<br>-                                      super: false<br>                                          numArgs: (Smalltalk specialNargsAt: offset + 1)].<br>                      ^client<br>+                             sendSpecial: (Smalltalk specialSelectorAt: offset + 17)<br>-                              send: (Smalltalk specialSelectorAt: offset + 17)<br>-                             super: false<br>                                  numArgs: (Smalltalk specialNargsAt: offset + 17)].<br>            div16 < 10 ifTrue: "vanilla sends, div16 = 7, 8 & 9"<br>                         [^client<br>                              send: (method literalAt: offset + 1)<br>                                  super: false<br>                                  numArgs: div16 - 7].<br>                  "implicit receiver send, div16 = 10"<br>                 div16 = 10 ifTrue:<br>                   [^client<br>                              sendToAbsentImplicitReceiver: (method literalAt: offset + 1)<br>                                  numArgs: 0].<br>                  "short store pops"<br>                  offset < 8 ifTrue:<br>                         [^client popIntoReceiverVariable: offset].<br>            ^client popIntoTemporaryVariable: offset - 8].<br>        "div16 >= 12"<br>    div16 < 14 ifTrue:<br>                 [div16 = 12 ifTrue:<br>                   [offset < 8 ifTrue:<br>                                [^client jump: offset + 1].<br>                    ^client jump: offset - 7 if: true].<br>                   offset < 8 ifTrue:<br>                        [^client jump: offset + 1 if: false].<br>                  offset < 11 ifTrue:<br>                       [offset = 8 ifTrue: [^client methodReturnReceiver].<br>                    offset = 9 ifTrue: [^client methodReturnTop].<br>                         extA > 0 ifTrue:<br>                                  [^client blockReturnTopFromLevel: extA].<br>                       ^client blockReturnTop].<br>              offset = 11 ifTrue:<br>                          [^client doDup].<br>               offset = 12 ifTrue:<br>                          [^client doPop].<br>               offset = 13 ifTrue:<br>                          [^client doNop].<br>              "222               11011110                break ?  could have blockCopy: send break, but need a receiver and a pop result"<br>                 "223               11011111                UNASSIGNED"<br>              ^self unusedBytecode: client at: savedPC].<br>    "2 byte and 3 byte codes"<br>   byte < 249 ifTrue:<br>                 [^self interpretNext2ByteNSV4Instruction: byte for: client extA: extA extB: extB startPC: savedPC].<br>   ^self interpretNext3ByteNSV4Instruction: byte for: client extA: extA extB: extB startPC: savedPC!<br><br></div></blockquote></div>