Skip to content
  • Randy Stauner's avatar
    acbb8d4f
    Expand opt_newarray_send to support Array#pack with buffer keyword arg · acbb8d4f
    Randy Stauner authored
    Use an enum for the method arg instead of needing to add an id
    that doesn't map to an actual method name.
    
    $ ruby --dump=insns -e 'b = "x"; [v].pack("E*", buffer: b)'
    
    before:
    
    ```
    == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,34)>
    local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
    [ 1] b@0
    0000 putchilledstring                       "x"                       (   1)[Li]
    0002 setlocal_WC_0                          b@0
    0004 putself
    0005 opt_send_without_block                 <calldata!mid:v, argc:0, FCALL|VCALL|ARGS_SIMPLE>
    0007 newarray                               1
    0009 putchilledstring                       "E*"
    0011 getlocal_WC_0                          b@0
    0013 opt_send_without_block                 <calldata!mid:pack, argc:2, kw:[#<Symbol:0x000000000023110c>], KWARG>
    0015 leave
    ```
    
    after:
    
    ```
    == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,34)>
    local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
    [ 1] b@0
    0000 putchilledstring                       "x"                       (   1)[Li]
    0002 setlocal_WC_0                          b@0
    0004 putself
    0005 opt_send_without_block                 <calldata!mid:v, argc:0, FCALL|VCALL|ARGS_SIMPLE>
    0007 putchilledstring                       "E*"
    0009 getlocal                               b@0, 0
    0012 opt_newarray_send                      3, 5
    0015 leave
    ```
    acbb8d4f
    Expand opt_newarray_send to support Array#pack with buffer keyword arg
    Randy Stauner authored
    Use an enum for the method arg instead of needing to add an id
    that doesn't map to an actual method name.
    
    $ ruby --dump=insns -e 'b = "x"; [v].pack("E*", buffer: b)'
    
    before:
    
    ```
    == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,34)>
    local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
    [ 1] b@0
    0000 putchilledstring                       "x"                       (   1)[Li]
    0002 setlocal_WC_0                          b@0
    0004 putself
    0005 opt_send_without_block                 <calldata!mid:v, argc:0, FCALL|VCALL|ARGS_SIMPLE>
    0007 newarray                               1
    0009 putchilledstring                       "E*"
    0011 getlocal_WC_0                          b@0
    0013 opt_send_without_block                 <calldata!mid:pack, argc:2, kw:[#<Symbol:0x000000000023110c>], KWARG>
    0015 leave
    ```
    
    after:
    
    ```
    == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,34)>
    local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
    [ 1] b@0
    0000 putchilledstring                       "x"                       (   1)[Li]
    0002 setlocal_WC_0                          b@0
    0004 putself
    0005 opt_send_without_block                 <calldata!mid:v, argc:0, FCALL|VCALL|ARGS_SIMPLE>
    0007 putchilledstring                       "E*"
    0009 getlocal                               b@0, 0
    0012 opt_newarray_send                      3, 5
    0015 leave
    ```
Loading