15#ifndef MRBC_SRC_OPCODE_H_
16#define MRBC_SRC_OPCODE_H_
27#define FETCH_Z() (void)0
29#if defined(MRBC_SUPPORT_OP_EXT)
32 a = *vm->inst++; if( ext & 1 ) a = a << 8 | *vm->inst++; \
37 a = *vm->inst++; if( ext & 1 ) a = a << 8 | *vm->inst++; \
38 b = *vm->inst++; if( ext & 2 ) b = b << 8 | *vm->inst++; \
42 unsigned int a, b, c; \
43 a = *vm->inst++; if( ext & 1 ) a = a << 8 | *vm->inst++; \
44 b = *vm->inst++; if( ext & 2 ) b = b << 8 | *vm->inst++; \
46 (void)a, (void)b, (void)c
50 a = *vm->inst++; if( ext & 1 ) a = a << 8 | *vm->inst++; \
51 b = *vm->inst++; b = b << 8 | *vm->inst++; \
55 unsigned int a, b, c; \
56 a = *vm->inst++; if( ext & 1 ) a = a << 8 | *vm->inst++; \
57 b = *vm->inst++; b = b << 8 | *vm->inst++; \
58 c = *vm->inst++; c = c << 8 | *vm->inst++; \
59 (void)a, (void)b, (void)c
74 unsigned int a, b, c; \
78 (void)a, (void)b, (void)c
83 b = *vm->inst++; b = b << 8 | *vm->inst++; \
87 unsigned int a, b, c; \
89 b = *vm->inst++; b = b << 8 | *vm->inst++; \
90 c = *vm->inst++; c = c << 8 | *vm->inst++; \
91 (void)a, (void)b, (void)c
97 a = *vm->inst++; a = a << 8 | *vm->inst++; \
102 a = *vm->inst++; a = a << 8 | *vm->inst++; a = a << 8 | *vm->inst++; \
@ OP_KEY_P
BB R[a] = kdict.key?(Syms[b])
@ OP_DEBUG
BBB print a,b,c.
@ OP_CALL
Z R[0] = self.call(frame.argc, frame.argv)
@ OP_EXT2
Z make 2nd operand (b) 16bit.
@ OP_EXEC
BB R[a] = blockexec(R[a],Irep[b])
@ OP_SSENDB
BBB R[a] = self.send(Syms[b],R[a+1]..,R[a+n+1]:R[a+n+2]..,&R[a+n+2k+1])
@ OP_EQ
B R[a] = R[a]==R[a+1].
@ OP_SETIDX
B R[a][R[a+1]] = R[a+2].
@ OP_LOADI__1
B R[a] = mrb_int(-1)
@ OP_MODULE
BB R[a] = newmodule(R[a],Syms[b])
@ OP_RANGE_INC
B R[a] = range_new(R[a],R[a+1],FALSE)
@ OP_EXT1
Z make 1st operand (a) 16bit.
@ OP_CLASS
BB R[a] = newclass(R[a],Syms[b],R[a+1])
@ OP_LOADSELF
B R[a] = self.
@ OP_BLKPUSH
BS R[a] = block (16=m5:r1:m5:d1:lv4)
@ OP_LOADI_3
B R[a] = mrb_int(3)
@ OP_GE
B R[a] = R[a]>=R[a+1].
@ OP_LOADI_4
B R[a] = mrb_int(4)
@ OP_EXT3
Z make 1st and 2nd operands 16bit.
@ OP_SETIV
BB ivset(Syms[b],R[a])
@ OP_SUBI
BB R[a] = R[a]-mrb_int(b)
@ OP_TCLASS
B R[a] = target_class.
@ OP_AREF
BBB R[a] = R[b][c].
@ OP_APOST
BBB *R[a],R[a+1]..R[a+c] = R[a][b..].
@ OP_RETURN_BLK
B return R[a] (in-block return)
@ OP_LOADI_6
B R[a] = mrb_int(6)
@ OP_ALIAS
BB alias_method(target_class,Syms[a],Syms[b])
@ OP_SSEND
BBB R[a] = self.send(Syms[b],R[a+1]..,R[a+n+1]:R[a+n+2]..) (c=n|k<<4)
@ OP_SETCONST
BB constset(Syms[b],R[a])
@ OP_LOADSYM
BB R[a] = Syms[b].
@ OP_ARYCAT
B ary_cat(R[a],R[a+1])
@ OP_LAMBDA
BB R[a] = lambda(Irep[b],L_LAMBDA)
@ OP_RANGE_EXC
B R[a] = range_new(R[a],R[a+1],TRUE)
@ OP_LOADI_5
B R[a] = mrb_int(5)
@ OP_LOADI_7
B R[a] = mrb_int(7)
@ OP_LOADNIL
B R[a] = nil.
@ OP_SETGV
BB setglobal(Syms[b], R[a])
@ OP_STRCAT
B str_cat(R[a],R[a+1])
@ OP_LOADI
BB R[a] = mrb_int(b)
@ OP_SEND
BBB R[a] = R[a].send(Syms[b],R[a+1]..,R[a+n+1]:R[a+n+2]..) (c=n|k<<4)
@ OP_GETIDX
B R[a] = R[a][R[a+1]].
@ OP_SUB
B R[a] = R[a]-R[a+1].
@ OP_GETSV
BB R[a] = Special[Syms[b]].
@ OP_DIV
B R[a] = R[a]/R[a+1].
@ OP_ASET
BBB R[b][c] = R[a].
@ OP_RAISEIF
B raise(R[a]) if R[a].
@ OP_GETUPVAR
BBB R[a] = uvget(b,c)
@ OP_ARRAY2
BBB R[a] = ary_new(R[b],R[b+1]..R[b+c])
@ OP_ARYDUP
B R[a] = ary_dup(R[a])
@ OP_LOADI_1
B R[a] = mrb_int(1)
@ OP_JMPNIL
BS if R[a]==nil pc+=b.
@ OP_LT
B R[a] = R[a]<R[a+1].
@ OP_JMPUW
S unwind_and_jump_to(a)
@ OP_INTERN
B R[a] = intern(R[a])
@ OP_SETUPVAR
BBB uvset(b,c,R[a])
@ OP_ENTER
W arg setup according to flags (23=m5:o5:r1:m5:k5:d1:b1)
@ OP_LOADF
B R[a] = false.
@ OP_UNDEF
B undef_method(target_class,Syms[a])
@ OP_KARG
BB R[a] = kdict[Syms[b]]; kdict.delete(Syms[b])
@ OP_GETCV
BB R[a] = cvget(Syms[b])
@ OP_HASHADD
BB hash_push(R[a],R[a+1]..R[a+b*2])
@ OP_ARGARY
BS R[a] = argument array (16=m5:r1:m5:d1:lv4)
@ OP_METHOD
BB R[a] = lambda(Irep[b],L_METHOD)
@ OP_ARYPUSH
BB ary_push(R[a],R[a+1]..R[a+b])
@ OP_ADD
B R[a] = R[a]+R[a+1].
@ OP_OCLASS
B R[a] = Object.
@ OP_SYMBOL
BB R[a] = intern(Pool[b])
@ OP_MUL
B R[a] = R[a]*R[a+1].
@ OP_STRING
BB R[a] = str_dup(Pool[b])
@ OP_ERR
B raise(LocalJumpError, Pool[a])
@ OP_RESCUE
BB R[b] = R[a].isa?(R[b])
@ OP_GETIV
BB R[a] = ivget(Syms[b])
@ OP_LOADI32
BSS R[a] = mrb_int((b<<16)+c)
@ OP_LOADINEG
BB R[a] = mrb_int(-b)
@ OP_JMPNOT
BS if !R[a] pc+=b.
@ OP_HASHCAT
B R[a] = hash_cat(R[a],R[a+1])
@ OP_DEF
BB R[a].newmethod(Syms[b],R[a+1]); R[a] = Syms[b].
@ OP_LOADI_2
B R[a] = mrb_int(2)
@ OP_SETCV
BB cvset(Syms[b],R[a])
@ OP_GT
B R[a] = R[a]>R[a+1].
@ OP_KEYEND
Z raise unless kdict.empty?
@ OP_LOADI_0
B R[a] = mrb_int(0)
@ OP_LE
B R[a] = R[a]<=R[a+1].
@ OP_GETGV
BB R[a] = getglobal(Syms[b])
@ OP_RETURN
B return R[a] (normal)
@ OP_SETSV
BB Special[Syms[b]] = R[a].
@ OP_ARRAY
BB R[a] = ary_new(R[a],R[a+1]..R[a+b])
@ OP_ADDI
BB R[a] = R[a]+mrb_int(b)
@ OP_SCLASS
B R[a] = R[a].singleton_class.
@ OP_SUPER
BB R[a] = super(R[a+1],... ,R[a+b+1])
@ OP_LOADL
BB R[a] = Pool[b].
@ OP_GETCONST
BB R[a] = constget(Syms[b])
@ OP_SETMCNST
BB R[a+1]Syms[b] = R[a].
@ OP_SENDB
BBB R[a] = R[a].send(Syms[b],R[a+1]..,R[a+n+1]:R[a+n+2]..,&R[a+n+2k+1])
@ OP_BLOCK
BB R[a] = lambda(Irep[b],L_BLOCK)
@ OP_GETMCNST
BB R[a] = R[a]Syms[b].
@ OP_LOADI16
BS R[a] = mrb_int(b)
@ OP_JMPIF
BS if R[a] pc+=b.
@ OP_HASH
BB R[a] = hash_new(R[a],R[a+1]..R[a+b*2-1])