adjuststack

Summary

adjuststack accepts a single integer argument and removes that many elements from the top of the stack.

TracePoint

adjuststack cannot dispatch any TracePoint events.

Usage

x = [true]
x[0] ||= nil
x[0]

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(3,4)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] x@0
# 0000 duparray                               [true]                    (   1)[Li]
# 0002 setlocal_WC_0                          x@0
# 0004 getlocal_WC_0                          x@0                       (   2)[Li]
# 0006 putobject_INT2FIX_0_
# 0007 dupn                                   2
# 0009 opt_aref                               <calldata!mid:[], argc:1, ARGS_SIMPLE>[CcCr]
# 0011 dup
# 0012 branchif                               21
# 0014 pop
# 0015 putnil
# 0016 opt_aset                               <calldata!mid:[]=, argc:2, ARGS_SIMPLE>[CcCr]
# 0018 pop
# 0019 jump                                   23
# 0021 adjuststack                            3
# 0023 getlocal_WC_0                          x@0                       (   3)[Li]
# 0025 putobject_INT2FIX_0_
# 0026 opt_aref                               <calldata!mid:[], argc:1, ARGS_SIMPLE>[CcCr]
# 0028 leave

anytostring

Summary

anytostring ensures that the value on top of the stack is a string.

It pops two values off the stack. If the first value is a string it pushes it back on the stack. If the first value is not a string, it uses Ruby’s built in string coercion to coerce the second value to a string and then pushes that back on the stack.

This is used in conjunction with objtostring as a fallback for when an object’s to_s method does not return a string

TracePoint

anytostring cannot dispatch any TracePoint events

Usage

"#{5}"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,6)> (catch: FALSE)
# 0000 putobject                              ""                        (   1)[Li]
# 0002 putobject                              5
# 0004 dup
# 0005 objtostring                            <calldata!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>
# 0007 anytostring
# 0008 concatstrings                          2
# 0010 leave

branchif

Summary

branchif has one argument: the jump index. It pops one value off the stack: the jump condition.

If the value popped off the stack is true, branchif jumps to the jump index and continues executing there.

TracePoint

branchif does not dispatch any events.

Usage

x = true
x ||= "foo"
puts x

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(3,6)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] x@0
# 0000 putobject                              true                      (   1)[Li]
# 0002 setlocal_WC_0                          x@0
# 0004 getlocal_WC_0                          x@0                       (   2)[Li]
# 0006 dup
# 0007 branchif                               15
# 0009 pop
# 0010 putstring                              "foo"
# 0012 dup
# 0013 setlocal_WC_0                          x@0
# 0015 pop
# 0016 putself                                                          (   3)[Li]
# 0017 getlocal_WC_0                          x@0
# 0019 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0021 leave

branchnil

Summary

branchnil has one argument: the jump index. It pops one value off the stack: the jump condition.

If the value popped off the stack is nil, branchnil jumps to the jump index and continues executing there.

TracePoint

There is no trace point for branchnil.

Usage

x = nil
if x&.to_s
  puts "hi"
end

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(4,3)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] x@0
# 0000 putnil                                                           (   1)[Li]
# 0001 setlocal_WC_0                          x@0
# 0003 getlocal_WC_0                          x@0                       (   2)[Li]
# 0005 dup
# 0006 branchnil                              10
# 0008 opt_send_without_block                 <calldata!mid:to_s, argc:0, ARGS_SIMPLE>
# 0010 branchunless                           18
# 0012 putself                                                          (   3)[Li]
# 0013 putstring                              "hi"
# 0015 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0017 leave
# 0018 putnil
# 0019 leave

branchunless

Summary

branchunless has one argument, the jump index and pops one value off the stack, the jump condition.

If the value popped off the stack is false or nil, branchunless jumps to the jump index and continues executing there.

TracePoint

branchunless does not dispatch any events.

Usage

if 2 + 3
  puts "foo"
end

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(3,3)> (catch: FALSE)
# 0000 putobject                              2                         (   1)[Li]
# 0002 putobject                              3
# 0004 opt_plus                               <calldata!mid:+, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 branchunless                           14
# 0008 putself                                                          (   2)[Li]
# 0009 putstring                              "foo"
# 0011 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0013 leave
# 0014 putnil
# 0015 leave

concatarray

Summary

concatarray concatenates the two Arrays on top of the stack.

It coerces the two objects at the top of the stack into Arrays by calling to_a if necessary, and makes sure to dup the first Array if it was already an Array, to avoid mutating it when concatenating.

TracePoint

concatarray can dispatch the line and call events.

Usage

[1, *2]

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,7)> (catch: FALSE)
# 0000 duparray                               [1]                       (   1)[Li]
# 0002 putobject                              2
# 0004 concatarray
# 0005 leave

concatstrings

Summary

concatstrings just pops a number of strings from the stack joins them together into a single string and pushes that string back on the stack.

This does no coercion and so is always used in conjunction with objtostring and anytostring to ensure the stack contents are always strings

TracePoint

concatstrings can dispatch the line and call events.

Usage

"#{5}"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,6)> (catch: FALSE)
# 0000 putobject                              ""                        (   1)[Li]
# 0002 putobject                              5
# 0004 dup
# 0005 objtostring                            <calldata!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>
# 0007 anytostring
# 0008 concatstrings                          2
# 0010 leave

defined

Summary

defined checks if the top value of the stack is defined. If it is, it pushes its value onto the stack. Otherwise it pushes nil.

TracePoint

defined cannot dispatch any TracePoint events.

Usage

defined?(x)

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,11)> (catch: FALSE)
# 0000 putself                                                          (   1)[Li]
# 0001 defined                                func, :x, "method"
# 0005 leave

definemethod

Summary

definemethod defines a method on the class of the current value of self. It accepts two arguments. The first is the name of the method being defined. The second is the instruction sequence representing the body of the method.

TracePoint

definemethod does not dispatch any events.

Usage

def value = "value"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,19)> (catch: FALSE)
# 0000 definemethod                           :value, value             (   1)[Li]
# 0003 putobject                              :value
# 0005 leave
# 
# == disasm: #<ISeq:value@<compiled>:1 (1,0)-(1,19)> (catch: FALSE)
# 0000 putstring                              "value"                   (   1)[Ca]
# 0002 leave                                  [Re]

dup

Summary

dup copies the top value of the stack and pushes it onto the stack.

TracePoint

dup does not dispatch any events.

Usage

$global = 5

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,11)> (catch: FALSE)
# 0000 putobject                              5                         (   1)[Li]
# 0002 dup
# 0003 setglobal                              :$global
# 0005 leave

dup_hash

Summary

duphash pushes a hash onto the stack

TracePoint

duphash can dispatch the line event.

Usage

{ a: 1 }

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,8)> (catch: FALSE)
# 0000 duphash                                {:a=>1}                   (   1)[Li]
# 0002 leave

duparray

Summary

duparray copies a literal Array and pushes it onto the stack.

TracePoint

duparray can dispatch the line event.

Usage

[true]

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,6)> (catch: FALSE)
# 0000 duparray                               [true]                    (   1)[Li]
# 0002 leave

dupn

Summary

dupn duplicates the top n stack elements.

TracePoint

dupn does not dispatch any TracePoint events.

Usage

Object::X ||= true

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,18)> (catch: FALSE)
# 0000 opt_getinlinecache                     9, <is:0>                 (   1)[Li]
# 0003 putobject                              true
# 0005 getconstant                            :Object
# 0007 opt_setinlinecache                     <is:0>
# 0009 dup
# 0010 defined                                constant-from, :X, true
# 0014 branchunless                           25
# 0016 dup
# 0017 putobject                              true
# 0019 getconstant                            :X
# 0021 dup
# 0022 branchif                               32
# 0024 pop
# 0025 putobject                              true
# 0027 dupn                                   2
# 0029 swap
# 0030 setconstant                            :X
# 0032 swap
# 0033 pop
# 0034 leave

expandarray

Summary

expandarray looks at the top of the stack, and if the value is an array it replaces it on the stack with num elements of the array, or nil if the elements are missing.

TracePoint

expandarray does not dispatch any events.

Usage

x, = [true, false, nil]

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,23)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] x@0
# 0000 duparray                               [true, false, nil]        (   1)[Li]
# 0002 dup
# 0003 expandarray                            1, 0
# 0006 setlocal_WC_0                          x@0
# 0008 leave

getconstant

Summary

getconstant performs a constant lookup and pushes the value of the constant onto the stack.

TracePoint

getconstant does not dispatch any events.

Usage

Constant

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,8)> (catch: FALSE)
# 0000 opt_getinlinecache                     9, <is:0>                 (   1)[Li]
# 0003 putobject                              true
# 0005 getconstant                            :Constant
# 0007 opt_setinlinecache                     <is:0>
# 0009 leave

getglobal

Summary

getglobal pushes the value of a global variables onto the stack.

TracePoint

getglobal does not dispatch any events.

Usage

$$

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,2)> (catch: FALSE)
# 0000 getglobal                              :$$                       (   1)[Li]
# 0002 leave

getlocal

Summary

getlocal fetches the value of a local variable from a frame determined by the level and index arguments. The level is the number of frames back to look and the index is the index in the local table. It pushes the value it finds onto the stack.

TracePoint

getlocal does not dispatch any events.

Usage

value = 5
tap { tap { value } }

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(2,21)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] value@0
# 0000 putobject                              5                         (   1)[Li]
# 0002 setlocal_WC_0                          value@0
# 0004 putself                                                          (   2)[Li]
# 0005 send                                   <calldata!mid:tap, argc:0, FCALL>, block in <compiled>
# 0008 leave
# 
# == disasm: #<ISeq:block in <compiled>@<compiled>:2 (2,4)-(2,21)> (catch: FALSE)
# 0000 putself                                                          (   2)[LiBc]
# 0001 send                                   <calldata!mid:tap, argc:0, FCALL>, block (2 levels) in <compiled>
# 0004 leave                                  [Br]
# 
# == disasm: #<ISeq:block (2 levels) in <compiled>@<compiled>:2 (2,10)-(2,19)> (catch: FALSE)
# 0000 getlocal                               value@0, 2                (   2)[LiBc]
# 0003 leave                                  [Br]

getlocal_wc_0

Summary

getlocal_WC_0 is a specialized version of the getlocal instruction. It fetches the value of a local variable from the current frame determined by the index given as its only argument.

TracePoint

getlocal_WC_0 does not dispatch any events.

Usage

value = 5
value

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(2,5)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] value@0
# 0000 putobject                              5                         (   1)[Li]
# 0002 setlocal_WC_0                          value@0
# 0004 getlocal_WC_0                          value@0                   (   2)[Li]
# 0006 leave

getlocal_wc_1

Summary

getlocal_WC_1 is a specialized version of the getlocal instruction. It fetches the value of a local variable from the parent frame determined by the index given as its only argument.

TracePoint

getlocal_WC_1 does not dispatch any events.

Usage

value = 5
self.then { value }

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(2,19)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] value@0
# 0000 putobject                              5                         (   1)[Li]
# 0002 setlocal_WC_0                          value@0
# 0004 putself                                                          (   2)[Li]
# 0005 send                                   <calldata!mid:then, argc:0, FCALL>, block in <compiled>
# 0008 leave
# 
# == disasm: #<ISeq:block in <compiled>@<compiled>:2 (2,10)-(2,19)> (catch: FALSE)
# 0000 getlocal_WC_1                          value@0                   (   2)[LiBc]
# 0002 leave                                  [Br]

intern

Summary

intern converts top element from stack to a symbol.

TracePoint

There is no trace point for intern.

Usage

:"#{"foo"}"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,11)> (catch: FALSE)
# 0000 putstring                              "foo"                     (   1)[Li]
# 0002 intern
# 0003 leave

invokeblock

Summary

invokeblock invokes the block passed to a method during a yield.

TracePoint

Usage

def foo; yield; end

# == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,19)> (catch: FALSE)
# 0000 definemethod                           :foo, foo                 (   1)[Li]
# 0003 putobject                              :foo
# 0005 leave
#
# == disasm: #<ISeq:foo@-e:1 (1,0)-(1,19)> (catch: FALSE)
# 0000 invokeblock                            <calldata!argc:0, ARGS_SIMPLE>(   1)[LiCa]
# 0002 leave                                  [Re]
# ~~~

## jump

### Summary

`jump` has one argument, the jump index, which it uses to set the next
instruction to execute.

### TracePoint

There is no trace point for `jump`.

### Usage

~~~ruby
y = 0
if y == 0
  puts "0"
else
  puts "2"
end

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(6,3)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] y@0
# 0000 putobject_INT2FIX_0_                                             (   1)[Li]
# 0001 setlocal_WC_0                          y@0
# 0003 getlocal_WC_0                          y@0                       (   2)[Li]
# 0005 putobject_INT2FIX_0_
# 0006 opt_eq                                 <calldata!mid:==, argc:1, ARGS_SIMPLE>[CcCr]
# 0008 branchunless                           16
# 0010 putself                                                          (   3)[Li]
# 0011 putstring                              "0"
# 0013 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0015 leave                                                            (   5)
# 0016 putself                                [Li]
# 0017 putstring                              "2"
# 0019 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0021 leave

leave

Summary

leave exits the current frame.

TracePoint

leave does not dispatch any events.

Usage

;;

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,2)> (catch: FALSE)
# 0000 putnil                                                           (   1)
# 0001 leave

newarray

Summary

newarray puts a new array initialized with size values from the stack.

TracePoint

newarray dispatches a line event.

Usage

["string"]

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,10)> (catch: FALSE)
# 0000 putstring                              "string"                  (   1)[Li]
# 0002 newarray                               1
# 0004 leave

newhash

Summary

newhash puts a new hash onto the stack, using num elements from the stack. num needs to be even.

TracePoint

newhash does not dispatch any events.

Usage

def foo(key, value)
  { key => value }
end

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(3,3)> (catch: FALSE)
# 0000 definemethod                           :foo, foo                 (   1)[Li]
# 0003 putobject                              :foo
# 0005 leave
# 
# == disasm: #<ISeq:foo@<compiled>:1 (1,0)-(3,3)> (catch: FALSE)
# local table (size: 2, argc: 2 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 2] key@0<Arg> [ 1] value@1<Arg>
# 0000 getlocal_WC_0                          key@0                     (   2)[LiCa]
# 0002 getlocal_WC_0                          value@1
# 0004 newhash                                2
# 0006 leave                                                            (   3)[Re]

newrange

Summary

newrange creates a Range. It takes one arguments, which is 0 if the end is included or 1 if the end value is excluded.

TracePoint

newrange does not dispatch any events.

Usage

x = 0
y = 1
p (x..y), (x...y)

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(3,17)> (catch: FALSE)
# local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 2] x@0        [ 1] y@1
# 0000 putobject_INT2FIX_0_                                             (   1)[Li]
# 0001 setlocal_WC_0                          x@0
# 0003 putobject_INT2FIX_1_                                             (   2)[Li]
# 0004 setlocal_WC_0                          y@1
# 0006 putself                                                          (   3)[Li]
# 0007 getlocal_WC_0                          x@0
# 0009 getlocal_WC_0                          y@1
# 0011 newrange                               0
# 0013 getlocal_WC_0                          x@0
# 0015 getlocal_WC_0                          y@1
# 0017 newrange                               1
# 0019 opt_send_without_block                 <calldata!mid:p, argc:2, FCALL|ARGS_SIMPLE>
# 0021 leave

nop

Summary

nop is a no-operation instruction. It is used to pad the instruction sequence so there is a place for other instructions to jump to.

TracePoint

nop does not dispatch any events.

Usage

raise rescue true

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,17)> (catch: TRUE)
# == catch table
# | catch type: rescue st: 0000 ed: 0003 sp: 0000 cont: 0004
# | == disasm: #<ISeq:rescue in <compiled>@<compiled>:1 (1,6)-(1,17)> (catch: TRUE)
# | local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# | [ 1] $!@0
# | 0000 getlocal_WC_0                          $!@0                      (   1)
# | 0002 putobject                              StandardError
# | 0004 checkmatch                             3
# | 0006 branchunless                           11
# | 0008 putobject                              true
# | 0010 leave
# | 0011 getlocal_WC_0                          $!@0
# | 0013 throw                                  0
# | catch type: retry  st: 0003 ed: 0004 sp: 0000 cont: 0000
# |------------------------------------------------------------------------
# 0000 putself                                                          (   1)[Li]
# 0001 opt_send_without_block                 <calldata!mid:raise, argc:0, FCALL|VCALL|ARGS_SIMPLE>
# 0003 nop
# 0004 leave

objtostring

Summary

objtostring pops a value from the stack, calls to_s on that value and then pushes the result back to the stack.

It has fast paths for String, Symbol, Module, Class, Nil, True, False & Number. For everything else it calls to_s

TracePoint

objtostring cannot dispatch any TracePoint events.

Usage

"#{5}"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,6)> (catch: FALSE)
# 0000 putobject                              ""                        (   1)[Li]
# 0002 putobject                              5
# 0004 dup
# 0005 objtostring                            <calldata!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>
# 0007 anytostring
# 0008 concatstrings                          2
# 0010 leave

opt_and

Summary

opt_and is a specialization of the opt_send_without_block instruction that occurs when the & operator is used. In CRuby, there are fast paths for if both operands are integers.

TracePoint

opt_and can dispatch both the c_call and c_return events.

Usage

2 & 3

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              2                         (   1)[Li]
# 0002 putobject                              3
# 0004 opt_and                                <calldata!mid:&, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_aref

Summary

opt_aref is a specialization of the opt_send_without_block instruction that occurs when the [] operator is used. In CRuby, there are fast paths if the receiver is an integer, array, or hash.

TracePoint

opt_aref can dispatch both the c_call and c_return events.

Usage

7[2]

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,4)> (catch: FALSE)
# 0000 putobject                              7                         (   1)[Li]
# 0002 putobject                              2
# 0004 opt_aref                               <calldata!mid:[], argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_aref_with

Summary

opt_aref_with is a specialization of the opt_aref instruction that occurs when the [] operator is used with a string argument known at compile time. In CRuby, there are fast paths if the receiver is a hash.

TracePoint

opt_aref_with does not dispatch any events.

Usage

{ 'test' => true }['test']

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,26)> (catch: FALSE)
# 0000 duphash                                {"test"=>true}            (   1)[Li]
# 0002 opt_aref_with                          "test", <calldata!mid:[], argc:1, ARGS_SIMPLE>
# 0005 leave

opt_aset

Summary

opt_aset is an instruction for setting the hash value by the key in recv[obj] = set format

TracePoint

There is no trace point for opt_aset.

Usage

{}[:key] = value

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,16)> (catch: FALSE)
# 0000 putnil                                                           (   1)[Li]
# 0001 newhash                                0
# 0003 putobject                              :key
# 0005 putself
# 0006 opt_send_without_block                 <calldata!mid:value, argc:0, FCALL|VCALL|ARGS_SIMPLE>
# 0008 setn                                   3
# 0010 opt_aset                               <calldata!mid:[]=, argc:2, ARGS_SIMPLE>[CcCr]
# 0012 pop
# 0013 leave

opt_aset_with

Summary

opt_aset_with is an instruction for setting the hash value by the known string key in the recv[obj] = set format.

TracePoint

There is no trace point for opt_aset_with.

Usage

{}["key"] = value

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,17)> (catch: FALSE)
# 0000 newhash                                0                         (   1)[Li]
# 0002 putself
# 0003 opt_send_without_block                 <calldata!mid:value, argc:0, FCALL|VCALL|ARGS_SIMPLE>
# 0005 swap
# 0006 topn                                   1
# 0008 opt_aset_with                          "key", <calldata!mid:[]=, argc:2, ARGS_SIMPLE>
# 0011 pop
# 0012 leave

opt_case_dispatch

Summary

opt_case_dispatch is a branch instruction that moves the control flow for case statements.

It has two arguments: the cdhash and an else_offset index. It pops one value off the stack: a hash key. opt_case_dispatch looks up the key in the cdhash and jumps to the corresponding index value, if there is one. If there is no value in the cdhash, opt_case_dispatch jumps to the else_offset index.

The cdhash is a Ruby hash used for handling optimized case statements. The keys are the conditions of when clauses in the case statement, and the values are the labels to which to jump. This optimization can be applied only when the keys can be directly compared.

TracePoint

There is no trace point for opt_case_dispatch.

Usage

case 1
when 1
  puts "foo"
else
  puts "bar"
end

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,49)> (catch: FALSE)
# 0000 putobject_INT2FIX_0_                                             (   1)[Li]
# 0001 dup
# 0002 opt_case_dispatch                      <cdhash>, 12
# 0005 putobject_INT2FIX_1_
# 0006 topn                                   1
# 0008 opt_send_without_block                 <calldata!mid:===, argc:1, FCALL|ARGS_SIMPLE>
# 0010 branchif                               19
# 0012 pop
# 0013 putself
# 0014 putstring                              "bar"
# 0016 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0018 leave
# 0019 pop
# 0020 putself
# 0021 putstring                              "foo"
# 0023 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0025 leave

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(6,3)> (catch: FALSE)
# 0000 putobject_INT2FIX_1_                                             (   1)[Li]
# 0001 dup
# 0002 opt_case_dispatch                      <cdhash>, 12
# 0005 putobject_INT2FIX_1_                                             (   2)
# 0006 topn                                   1
# 0008 opt_send_without_block                 <calldata!mid:===, argc:1, FCALL|ARGS_SIMPLE>
# 0010 branchif                               19
# 0012 pop                                                              (   5)
# 0013 putself                                [Li]
# 0014 putstring                              "bar"
# 0016 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0018 leave
# 0019 pop                                                              (   2)
# 0020 putself                                                          (   3)[Li]
# 0021 putstring                              "foo"
# 0023 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0025 leave                                                            (   5)

opt_div

Summary

opt_div is a specialization of the opt_send_without_block instruction that occurs when the / operator is used. In CRuby, there are fast paths for if both operands are integers, or if both operands are floats.

TracePoint

opt_div can dispatch both the c_call and c_return events.

Usage

2 / 3

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              2                         (   1)[Li]
# 0002 putobject                              3
# 0004 opt_div                                <calldata!mid:/, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_empty_p

Summary

opt_empty_p is an optimization applied when the method empty? is called on a String, Array or a Hash. This optimization can be applied because Ruby knows how to calculate the length of these objects using internal C macros.

TracePoint

opt_empty_p can dispatch c_call and c_return events.

Usage

"".empty?

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,9)> (catch: FALSE)
# 0000 putstring                              ""                        (   1)[Li]
# 0002 opt_empty_p                            <calldata!mid:empty?, argc:0, ARGS_SIMPLE>[CcCr]
# 0004 leave

opt_eq

Summary

opt_eq is a specialization of the opt_send_without_block instruction that occurs when the == operator is used. Fast paths exist within CRuby when both operands are integers, floats, symbols or strings.

TracePoint

opt_eq can dispatch both the c_call and c_return events.

Usage

2 == 2

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,6)> (catch: FALSE)
# 0000 putobject                              2                         (   1)[Li]
# 0002 putobject                              2
# 0004 opt_eq                                 <calldata!mid:==, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_ge

Summary

opt_ge is a specialization of the opt_send_without_block instruction that occurs when the >= operator is used. Fast paths exist within CRuby when both operands are integers or floats.

TracePoint

opt_ge can dispatch both the c_call and c_return events.

Usage

4 >= 3

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,6)> (catch: FALSE)
# 0000 putobject                              4                         (   1)[Li]
# 0002 putobject                              3
# 0004 opt_ge                                 <calldata!mid:>=, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_getinlinecache

Summary

opt_getinlinecache is a wrapper around a series of getconstant instructions that allows skipping past them if the inline cache is currently set.

TracePoint

opt_getinlinecache does not dispatch any events.

Usage

Constant

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,8)> (catch: FALSE)
# 0000 opt_getinlinecache                     9, <is:0>                 (   1)[Li]
# 0003 putobject                              true
# 0005 getconstant                            :Constant
# 0007 opt_setinlinecache                     <is:0>
# 0009 leave

opt_gt

Summary

opt_gt is a specialization of the opt_send_without_block instruction that occurs when the > operator is used. Fast paths exist within CRuby when both operands are integers or floats.

TracePoint

opt_gt can dispatch both the c_call and c_return events.

Usage

4 > 3

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              4                         (   1)[Li]
# 0002 putobject                              3
# 0004 opt_gt                                 <calldata!mid:>, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_le

Summary

opt_le is a specialization of the opt_send_without_block instruction that occurs when the <= operator is used. Fast paths exist within CRuby when both operands are integers or floats.

TracePoint

opt_le can dispatch both the c_call and c_return events.

Usage

3 <= 4

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,6)> (catch: FALSE)
# 0000 putobject                              3                         (   1)[Li]
# 0002 putobject                              4
# 0004 opt_le                                 <calldata!mid:<=, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_length

Summary

opt_length is a specialization of opt_send_without_block, when the length method is called on a Ruby type with a known size. In CRuby there are fast paths when the receiver is either a String, Hash or Array.

TracePoint

opt_length can dispatch c_call and c_return events.

Usage

"".length

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,9)> (catch: FALSE)
# 0000 putstring                              ""                        (   1)[Li]
# 0002 opt_length                             <calldata!mid:length, argc:0, ARGS_SIMPLE>[CcCr]
# 0004 leave

opt_lt

Summary

opt_lt is a specialization of the opt_send_without_block instruction that occurs when the < operator is used. Fast paths exist within CRuby when both operands are integers or floats.

TracePoint

opt_lt can dispatch both the c_call and c_return events.

Usage

3 < 4

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              3                         (   1)[Li]
# 0002 putobject                              4
# 0004 opt_lt                                 <calldata!mid:<, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_ltlt

Summary

opt_ltlt is a specialization of the opt_send_without_block instruction that occurs when the << operator is used. Fast paths exists when the receiver is either a String or an Array

TracePoint

opt_ltlt can dispatch both the c_call and c_return events.

Usage

"" << 2

# == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,7)> (catch: FALSE)
# 0000 putstring                              ""                        (   1)[Li]
# 0002 putobject                              2
# 0004 opt_ltlt                               <calldata!mid:<<, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,7)> (catch: FALSE)
# 0000 putstring                              ""                        (   1)[Li]
# 0002 putobject                              2
# 0004 opt_ltlt                               <calldata!mid:<<, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_minus

Summary

opt_minus is a specialization of the opt_send_without_block instruction that occurs when the - operator is used. In CRuby, there are fast paths for if both operands are integers or both operands are floats.

TracePoint

opt_minus can dispatch both the c_call and c_return events.

Usage

3 - 2

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              3                         (   1)[Li]
# 0002 putobject                              2
# 0004 opt_minus                              <calldata!mid:-, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_mod

Summary

opt_mod is a specialization of the opt_send_without_block instruction that occurs when the % operator is used. In CRuby, there are fast paths for if both operands are integers or both operands are floats.

TracePoint

opt_eq can dispatch both the c_call and c_return events.

Usage

4 % 2

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              4                         (   1)[Li]
# 0002 putobject                              2
# 0004 opt_mod                                <calldata!mid:%, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_mult

Summary

opt_mult is a specialization of the opt_send_without_block instruction that occurs when the * operator is used. In CRuby, there are fast paths for if both operands are integers or floats.

TracePoint

opt_mult can dispatch both the c_call and c_return events.

Usage

3 * 2

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              3                         (   1)[Li]
# 0002 putobject                              2
# 0004 opt_mult                               <calldata!mid:*, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_neq

Summary

opt_neq is an optimisation that tests whether two values at the top of the stack are not equal by testing their equality and performing a logical NOT on the result.

This allows opt_neq to use the fast paths optimized in opt_eq when both operands are Integers, Floats, Symbols or Strings.

TracePoint

opt_neq can dispatch both the c_call and c_return events.

Usage

2 != 2

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,6)> (catch: FALSE)
# 0000 putobject                              2                         (   1)[Li]
# 0002 putobject                              2
# 0004 opt_neq                                <calldata!mid:==, argc:1, ARGS_SIMPLE>, <calldata!mid:!=, argc:1, ARGS_SIMPLE>[CcCr]
# 0007 leave

opt_newarray_max

Summary

opt_newarray_max is an instruction that represents calling max on an array literal. It is used to optimize quick comparisons of array elements.

TracePoint

opt_newarray_max does not dispatch any events.

Usage

[1, x = 2].max

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,14)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] x@0
# 0000 putobject_INT2FIX_1_                                             (   1)[Li]
# 0001 putobject                              2
# 0003 dup
# 0004 setlocal_WC_0                          x@0
# 0006 opt_newarray_max                       2
# 0008 leave

opt_newarray_min

Summary

opt_newarray_min is an instruction that represents calling min on an array literal. It is used to optimize quick comparisons of array elements.

TracePoint

opt_newarray_min does not dispatch any events.

Usage

[1, x = 2].min

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,14)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] x@0
# 0000 putobject_INT2FIX_1_                                             (   1)[Li]
# 0001 putobject                              2
# 0003 dup
# 0004 setlocal_WC_0                          x@0
# 0006 opt_newarray_min                       2
# 0008 leave

opt_nil_p

Summary

opt_nil_p is an optimization applied when the method nil? is called. It returns true immediately when the receiver is nil and defers to the nil? method in other cases

TracePoint

opt_nil_p can dispatch c_call and c_return events.

Usage

"".nil?

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,7)> (catch: FALSE)
# 0000 putstring                              ""                        (   1)[Li]
# 0002 opt_nil_p                              <calldata!mid:nil?, argc:0, ARGS_SIMPLE>[CcCr]
# 0004 leave

opt_not

Summary

opt_not negates the value on top of the stack.

TracePoint

opt_not can dispatch both the c_call and c_return events.

Usage

!true

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              true                      (   1)[Li]
# 0002 opt_not                                <calldata!mid:!, argc:0, ARGS_SIMPLE>[CcCr]
# 0004 leave

opt_or

Summary

opt_or is a specialization of the opt_send_without_block instruction that occurs when the | operator is used. In CRuby, there are fast paths for if both operands are integers.

TracePoint

opt_or can dispatch both the c_call and c_return events.

Usage

2 | 3

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              2                         (   1)[Li]
# 0002 putobject                              3
# 0004 opt_or                                 <calldata!mid:|, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_plus

Summary

opt_plus is a specialization of the opt_send_without_block instruction that occurs when the + operator is used. In CRuby, there are fast paths for if both operands are integers, floats, strings, or arrays.

TracePoint

opt_plus can dispatch both the c_call and c_return events.

Usage

2 + 3

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putobject                              2                         (   1)[Li]
# 0002 putobject                              3
# 0004 opt_plus                               <calldata!mid:+, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_regexpmatch2

Summary

opt_regexpmatch2 is a specialization of the opt_send_without_block instruction that occurs when the =~ operator is used.

TracePoint

opt_regexpmatch2 can dispatch both the c_call and c_return events.

Usage

/a/ =~ "a"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,10)> (catch: FALSE)
# 0000 putobject                              /a/                       (   1)[Li]
# 0002 putstring                              "a"
# 0004 opt_regexpmatch2                       <calldata!mid:=~, argc:1, ARGS_SIMPLE>[CcCr]
# 0006 leave

opt_send_without_block

Summary

opt_send_without_block is a specialization of the send instruction that occurs when a method is being called without a block.

TracePoint

opt_send_without_block does not dispatch any events.

Usage

puts "Hello, world!"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,20)> (catch: FALSE)
# 0000 putself                                                          (   1)[Li]
# 0001 putstring                              "Hello, world!"
# 0003 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0005 leave

opt_setinlinecache

Summary

opt_setinlinecache is the final instruction after a series of getconstant instructions that populates the inline cache associated with an opt_getinlinecache instruction.

TracePoint

opt_setinlinecache does not dispatch any events.

Usage

Constant

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,8)> (catch: FALSE)
# 0000 opt_getinlinecache                     9, <is:0>                 (   1)[Li]
# 0003 putobject                              true
# 0005 getconstant                            :Constant
# 0007 opt_setinlinecache                     <is:0>
# 0009 leave

opt_size

Summary

opt_size is a specialization of opt_send_without_block, when the size method is called on a Ruby type with a known size. In CRuby there are fast paths when the receiver is either a String, Hash or Array.

TracePoint

opt_size can dispatch c_call and c_return events.

Usage

"".size

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,7)> (catch: FALSE)
# 0000 putstring                              ""                        (   1)[Li]
# 0002 opt_size                               <calldata!mid:size, argc:0, ARGS_SIMPLE>[CcCr]
# 0004 leave

opt_str_freeze

Summary

opt_str_freeze pushes a frozen known string value with no interpolation onto the stack.

TracePoint

opt_str_freeze does not dispatch any events.

Usage

"hello".freeze

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,14)> (catch: FALSE)
# 0000 opt_str_freeze                         "hello", <calldata!mid:freeze, argc:0, ARGS_SIMPLE>(   1)[Li]
# 0003 leave

opt_str_uminus

Summary

opt_str_uminus pushes a frozen known string value with no interpolation onto the stack.

TracePoint

opt_str_uminus does not dispatch any events.

Usage

-"string"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,9)> (catch: FALSE)
# 0000 opt_str_uminus                         "string", <calldata!mid:-@, argc:0, ARGS_SIMPLE>(   1)[Li]
# 0003 leave

opt_succ

Summary

opt_succ is a specialization of the opt_send_without_block instruction when the method being called is succ. Fast paths exist within CRuby when the receiver is either a String or a Fixnum.

TracePoint

opt_succ can dispatch c_call and c_return events.

Usage

"".succ

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,7)> (catch: FALSE)
# 0000 putstring                              ""                        (   1)[Li]
# 0002 opt_succ                               <calldata!mid:succ, argc:0, ARGS_SIMPLE>[CcCr]
# 0004 leave

pop

Summary

pop pops the top value off the stack.

TracePoint

pop does not dispatch any events.

Usage

a ||= 2

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,7)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] a@0
# 0000 getlocal_WC_0                          a@0                       (   1)[Li]
# 0002 dup
# 0003 branchif                               11
# 0005 pop
# 0006 putobject                              2
# 0008 dup
# 0009 setlocal_WC_0                          a@0
# 0011 leave

putnil

Summary

putnil pushes a global nil object onto the stack.

TracePoint

putnil can dispatch the line event.

Usage

nil

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,3)> (catch: FALSE)
# 0000 putnil                                                           (   1)[Li]
# 0001 leave

putobject

Summary

putobject pushes a known value onto the stack.

TracePoint

putobject can dispatch the line event.

Usage

5

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,1)> (catch: FALSE)
# 0000 putobject                              5                         (   1)[Li]
# 0002 leave

putobject_int2fix_0

Summary

putobject_INT2FIX_0_ pushes 0 on the stack. It is a specialized instruction resulting from the operand unification optimization. It is the equivalent to putobject 0.

TracePoint

putobject can dispatch the line event.

Usage

0

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,1)> (catch: FALSE)
# 0000 putobject_INT2FIX_0_                                             (   1)[Li]
# 0001 leave

putobject_int2fix_1

Summary

putobject_INT2FIX_1_ pushes 1 on the stack. It is a specialized instruction resulting from the operand unification optimization. It is the equivalent to putobject 1.

TracePoint

putobject can dispatch the line event.

Usage

1

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,1)> (catch: FALSE)
# 0000 putobject_INT2FIX_1_                                             (   1)[Li]
# 0001 leave

putself

Summary

putself pushes the current value of self onto the stack.

TracePoint

putself can dispatch the line event.

Usage

puts "Hello, world!"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,20)> (catch: FALSE)
# 0000 putself                                                          (   1)[Li]
# 0001 putstring                              "Hello, world!"
# 0003 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0005 leave

putstring

Summary

putstring pushes a string literal onto the stack.

TracePoint

putstring can dispatch the line event.

Usage

"foo"

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,5)> (catch: FALSE)
# 0000 putstring                              "foo"                     (   1)[Li]
# 0002 leave

send

Summary

send invokes a method with a block.

TracePoint

send does not dispatch any events.

Usage

"hello".tap { |i| p i }

# == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,23)> (catch: FALSE)
# 0000 putstring                              "hello"                   (   1)[Li]
# 0002 send                                   <calldata!mid:tap, argc:0>, block in <main>
# 0005 leave
#
# == disasm: #<ISeq:block in <main>@-e:1 (1,12)-(1,23)> (catch: FALSE)
# local table (size: 1, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] i@0<Arg>
# 0000 putself                                                          (   1)[LiBc]
# 0001 getlocal_WC_0                          i@0
# 0003 opt_send_without_block                 <calldata!mid:p, argc:1, FCALL|ARGS_SIMPLE>
# 0005 leave                                  [Br]

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,23)> (catch: FALSE)
# 0000 putstring                              "hello"                   (   1)[Li]
# 0002 send                                   <calldata!mid:tap, argc:0>, block in <compiled>
# 0005 leave
# 
# == disasm: #<ISeq:block in <compiled>@<compiled>:1 (1,12)-(1,23)> (catch: FALSE)
# local table (size: 1, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] i@0<Arg>
# 0000 putself                                                          (   1)[LiBc]
# 0001 getlocal_WC_0                          i@0
# 0003 opt_send_without_block                 <calldata!mid:p, argc:1, FCALL|ARGS_SIMPLE>
# 0005 leave                                  [Br]

setglobal

Summary

setglobal sets the value of a global variable.

TracePoint

setglobal does not dispatch any events.

Usage

$global = 5

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,11)> (catch: FALSE)
# 0000 putobject                              5                         (   1)[Li]
# 0002 dup
# 0003 setglobal                              :$global
# 0005 leave

setlocal

Summary

setlocal sets the value of a local variable on a frame determined by the level and index arguments. The level is the number of frames back to look and the index is the index in the local table. It pops the value it is setting off the stack.

TracePoint

setlocal does not dispatch any events.

Usage

value = 5
tap { tap { value = 10 } }

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(2,26)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] value@0
# 0000 putobject                              5                         (   1)[Li]
# 0002 setlocal_WC_0                          value@0
# 0004 putself                                                          (   2)[Li]
# 0005 send                                   <calldata!mid:tap, argc:0, FCALL>, block in <compiled>
# 0008 leave
# 
# == disasm: #<ISeq:block in <compiled>@<compiled>:2 (2,4)-(2,26)> (catch: FALSE)
# 0000 putself                                                          (   2)[LiBc]
# 0001 send                                   <calldata!mid:tap, argc:0, FCALL>, block (2 levels) in <compiled>
# 0004 leave                                  [Br]
# 
# == disasm: #<ISeq:block (2 levels) in <compiled>@<compiled>:2 (2,10)-(2,24)> (catch: FALSE)
# 0000 putobject                              10                        (   2)[LiBc]
# 0002 dup
# 0003 setlocal                               value@0, 2
# 0006 leave                                  [Br]

setlocal_wc_0

Summary

setlocal_WC_0 is a specialized version of the setlocal instruction. It sets the value of a local variable on the current frame to the value at the top of the stack as determined by the index given as its only argument.

TracePoint

setlocal_WC_0 does not dispatch any events.

Usage

value = 5

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,9)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] value@0
# 0000 putobject                              5                         (   1)[Li]
# 0002 dup
# 0003 setlocal_WC_0                          value@0
# 0005 leave

setlocal_wc_1

Summary

setlocal_WC_1 is a specialized version of the setlocal instruction. It sets the value of a local variable on the parent frame to the value at the top of the stack as determined by the index given as its only argument.

TracePoint

setlocal_WC_1 does not dispatch any events.

Usage

value = 5
self.then { value = 10 }

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(2,24)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] value@0
# 0000 putobject                              5                         (   1)[Li]
# 0002 setlocal_WC_0                          value@0
# 0004 putself                                                          (   2)[Li]
# 0005 send                                   <calldata!mid:then, argc:0, FCALL>, block in <compiled>
# 0008 leave
# 
# == disasm: #<ISeq:block in <compiled>@<compiled>:2 (2,10)-(2,24)> (catch: FALSE)
# 0000 putobject                              10                        (   2)[LiBc]
# 0002 dup
# 0003 setlocal_WC_1                          value@0
# 0005 leave                                  [Br]

setn

Summary

setn is an instruction for set Nth stack entry to stack top

TracePoint

# setn does not dispatch any events.

Usage

{}[:key] = 'val'

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,16)> (catch: FALSE)
# 0000 putnil                                                           (   1)[Li]
# 0001 newhash                                0
# 0003 putobject                              :key
# 0005 putstring                              "val"
# 0007 setn                                   3
# 0009 opt_aset                               <calldata!mid:[]=, argc:2, ARGS_SIMPLE>[CcCr]
# 0011 pop
# 0012 leave

splatarray

Summary

splatarray calls to_a on an array to splat.

It coerces the array object at the top of the stack into Array by calling to_a. It pushes a duplicate of the array if there is a flag, and the original array, if there isn’t one.

TracePoint

splayarray does not dispatch any events.

Usage

x = *(5)

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,8)> (catch: FALSE)
# local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] x@0
# 0000 putobject                              5                         (   1)[Li]
# 0002 splatarray                             true
# 0004 dup
# 0005 setlocal_WC_0                          x@0
# 0007 leave

swap

Summary

swap swaps the top two elements in the stack.

TracePoint

swap does not dispatch any events.

Usage

!!defined?([[]])

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,16)> (catch: TRUE)
# == catch table
# | catch type: rescue st: 0001 ed: 0003 sp: 0000 cont: 0005
# | == disasm: #<ISeq:defined guard in <compiled>@<compiled>:0 (0,0)-(-1,-1)> (catch: FALSE)
# | local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# | [ 1] $!@0
# | 0000 putnil
# | 0001 leave
# |------------------------------------------------------------------------
# 0000 putnil                                                           (   1)[Li]
# 0001 putobject                              "expression"
# 0003 swap
# 0004 pop
# 0005 opt_not                                <calldata!mid:!, argc:0, ARGS_SIMPLE>[CcCr]
# 0007 opt_not                                <calldata!mid:!, argc:0, ARGS_SIMPLE>[CcCr]
# 0009 leave

topn

Summary

topn has one argument: n. It gets the nth element from the top of the stack and pushes it on the stack.

TracePoint

topn does not dispatch any events.

Usage

case 3
when 1..5
  puts "foo"
end

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,36)> (catch: FALSE)
# 0000 putobject                              3                         (   1)[Li]
# 0002 putobject                              1..5
# 0004 topn                                   1
# 0006 opt_send_without_block                 <calldata!mid:===, argc:1, FCALL|ARGS_SIMPLE>
# 0008 branchif                               13
# 0010 pop
# 0011 putnil
# 0012 leave
# 0013 pop
# 0014 putself
# 0015 putstring                              "foo"
# 0017 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0019 leave

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(4,3)> (catch: FALSE)
# 0000 putobject                              3                         (   1)[Li]
# 0002 putobject                              1..5                      (   2)
# 0004 topn                                   1
# 0006 opt_send_without_block                 <calldata!mid:===, argc:1, FCALL|ARGS_SIMPLE>
# 0008 branchif                               13
# 0010 pop                                                              (   1)
# 0011 putnil
# 0012 leave                                                            (   3)
# 0013 pop                                                              (   2)
# 0014 putself                                                          (   3)[Li]
# 0015 putstring                              "foo"
# 0017 opt_send_without_block                 <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
# 0019 leave

toregexp

Summary

toregexp is generated when string interpolation is used inside a regex literal //. It pops a defined number of values from the stack, combines them into a single string and coerces that string into a Regexp object, which it pushes back onto the stack

TracePoint

toregexp cannot dispatch any TracePoint events.

Usage

"/#{true}/"

# == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,9)> (catch: FALSE)
# 0000 putobject                              ""                        (   1)[Li]
# 0002 putobject                              true
# 0004 dup
# 0005 objtostring                            <calldata!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>
# 0007 anytostring
# 0008 toregexp                               0, 2
# 0011 leave

# == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,11)> (catch: FALSE)
# 0000 putobject                              "/"                       (   1)[Li]
# 0002 putobject                              true
# 0004 dup
# 0005 objtostring                            <calldata!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>
# 0007 anytostring
# 0008 putobject                              "/"
# 0010 concatstrings                          3
# 0012 leave