31#define CALL_MAXARGS 15
56 int karg = (c >> 4) & 0x0f;
57 int have_block = (c >> 8);
66 for(
int i = 0; i < narg; i++ ) {
70 memmove( recv + narg + 1, recv + 2,
sizeof(
mrbc_value) * n_move );
100 r1[1] = r1[karg * 2];
101 memset( r1 + 2, 0,
sizeof(
mrbc_value) * (karg * 2 - 1) );
120 "undefined local variable or method '%s' for %s",
129 for(
int i = narg+1; i != 0; i-- ) {
138 if( !method.
c_func )
goto CALL_RUBY_METHOD;
141 method.
func(vm, recv, narg);
146 if( sym_id ==
MRBC_SYM(call) )
return;
147 if( sym_id ==
MRBC_SYM(
new) )
return;
149 for(
int i = 1; i <= narg + !!karg + have_block; i++ ) {
171 int cnt = irep->
clen;
172 if( cnt == 0 )
return NULL;
176 uint32_t inst = vm->
inst - irep->
inst;
178 for( cnt--; cnt >= 0 ; cnt-- ) {
181 if( (handler->
type == 1) &&
211#if defined(MRBC_DEBUG)
221 .method_id = method_id,
222 .reg_offset = reg_offset,
224 .is_called_super = 0,
225 .is_called_block = 0,
260 mrbc_free(vm, callinfo);
288 memset(vm, 0, vm_total_size);
289#if defined(MRBC_DEBUG)
290 memcpy(vm->obj_mark_,
"VM", 2);
312 int idx = vm_id >> 4;
313 int bit = 1 << (vm_id & 0x0f);
351 for(
int i = 1; i < vm->
regs_size; i++ ) {
365#if defined(MRBC_ABORT_BY_EXCEPTION)
366 MRBC_ABORT_BY_EXCEPTION(vm);
375 for(
int i = 1; i < vm->
regs_size; i++ ) {
381#if defined(MRBC_DEBUG_REGS)
382 mrbc_printf(
"Finally number of registers used was %d in VM %d.\n",
386#if defined(MRBC_ALLOC_VMID)
387 mrbc_global_clear_vm_id();
403 if( vm->
vm_id != 0 ) {
404 int idx = (vm->
vm_id-1) >> 4;
405 int bit = 1 << ((vm->
vm_id-1) & 0x0f);
416#if defined(MRBC_SUPPORT_OP_EXT)
497 int opcode = vm->
inst[-1];
517 int16_t signed_b = (int16_t)b;
830 for(
int i = 0; i < c; i++ ) {
839 if( callinfo == 0 ) {
840 p_val = vm->
regs + b;
863 for(
int i = 0; i < c; i++ ) {
871 if( callinfo == 0 ) {
872 p_val = vm->
regs + b;
938 vm->
inst += (int16_t)a;
952 vm->
inst += (int16_t)b;
967 vm->
inst += (int16_t)b;
982 vm->
inst += (int16_t)b;
996 const uint8_t *jump_inst = vm->
inst + (int16_t)a;
1001 vm->
inst = jump_inst;
1009 vm->
inst = jump_inst;
1337 int narg = b & 0x0f;
1338 int karg = (b >> 4) & 0x0f;
1352 int n_move = (karg ==
CALL_MAXARGS) ? 2 : karg * 2 + 1;
1355 for(
int i = 0; i < narg; i++ ) {
1359 memmove( recv + narg + 1, recv + 2,
sizeof(
mrbc_value) * n_move );
1378 r1[1] = r1[karg * 2];
1379 memset( r1 + 2, 0,
sizeof(
mrbc_value) * (karg * 2 - 1) );
1384 if( callinfo == NULL ) {
1396 "no superclass method '%s' for %s",
1404 method.
func(vm, recv, narg - !!karg);
1405 for(
int i = 1; i <= narg+1; i++ ) {
1433 int m1 = (b >> 11) & 0x1f;
1434 int r = (b >> 10) & 0x01;
1435 int m2 = (b >> 5) & 0x1f;
1436 int d = (b >> 4) & 0x01;
1437 int lv = (b ) & 0x0f;
1453 for(
int i = 1; i < lv; i ++ ) {
1473 for(
int i = 1; i <= m1; i++ ) {
1478 for(
int i = 0; i < rest_len; i++ ) {
1483 int block_reg = m1 + r + m2;
1499 regs[a+1] = reg0[block_reg+1];
1513#define FLAG_REST 0x1000
1514#define FLAG_M2 0x0f80
1515#define FLAG_KW 0x007c
1516#define FLAG_DICT 0x0002
1517#define FLAG_BLOCK 0x0001
1534 int m1 = (a >> 18) & 0x1f;
1535 int o = (a >> 13) & 0x1f;
1553 argc == 1 && m1 > 1 ) {
1557 argc = argary_size > m1 ? argary_size : m1;
1559 for(
int i = argc; i > 0; i-- ) {
1561 if( argary_size >= i ) {
1586 int rest_size = argc - m1 - o;
1587 if( rest_size < 0 ) rest_size = 0;
1590 int rest_reg = m1 + o + 1;
1591 for(
int i = 0; i < rest_size; i++ ) {
1598 for(
int i = argc; i < m1; ) {
1618 for(
int i = argc; i < m1; ) {
1629 int jmp_ofs = argc - m1;
1639 vm->
inst += jmp_ofs * 3;
1959 int m1 = (b >> 11) & 0x1f;
1960 int r = (b >> 10) & 0x01;
1961 int m2 = (b >> 5) & 0x1f;
1962 int d = (b >> 4) & 0x01;
1963 int lv = (b ) & 0x0f;
1970 int offset = m1 + r + d + 1;
1975 blk = regs + offset;
1982 for(
int i = 0; i < lv-1; i++ ) {
2015 regs[a].i += regs[a+1].i;
2030 regs[a].d += regs[a+1].i;
2037 regs[a].d += regs[a+1].d;
2086 regs[a].i -= regs[a+1].i;
2101 regs[a].d -= regs[a+1].i;
2108 regs[a].d -= regs[a+1].d;
2213 regs[a].i *= regs[a+1].i;
2228 regs[a].d *= regs[a+1].i;
2235 regs[a].d *= regs[a+1].d;
2268 if( (mod != 0) && ((v0 ^ v1) < 0) ) ret -= 1;
2285 regs[a].d /= regs[a+1].i;
2292 regs[a].d /= regs[a+1].d;
2419 memset( ®s[a], 0,
sizeof(
mrbc_value) * b );
2439 memset( ®s[b], 0,
sizeof(
mrbc_value) * c );
2459 regs[a] = regs[a+1];
2468 int size_1 = regs[a ].array->n_stored;
2469 int size_2 = regs[a+1].array->n_stored;
2470 int new_size = size_1 + regs[a+1].array->n_stored;
2473 if( regs[a].array->data_size < new_size ) {
2477 for(
int i = 0; i < size_2; i++ ) {
2479 regs[a].array->data[size_1+i] = regs[a+1].array->data[i];
2481 regs[a].array->n_stored = new_size;
2499 memcpy( regs[a].array->data + sz1, ®s[a+1],
sizeof(
mrbc_value) * b );
2500 memset( ®s[a+1], 0,
sizeof(
mrbc_value) * b );
2501 regs[a].array->n_stored = sz1 + b;
2586 if( len > pre + post ) {
2587 int ary_size = len - pre - post;
2591 for(
int i = 0; i < ary_size; i++ ) {
2592 regs[a].array->data[i] = src.
array->
data[pre+i];
2595 regs[a].array->n_stored = ary_size;
2598 assert(!
"Not support this case in op_apost");
2674 if( !method.
c_func )
return;
2676 method.
func( vm, regs + a + 1, 0 );
2700 memset( ®s[a], 0,
sizeof(
mrbc_value) * b );
2724 memcpy( regs[a].hash->data + sz1, ®s[a+1],
sizeof(
mrbc_value) * sz2 );
2725 memset( ®s[a+1], 0,
sizeof(
mrbc_value) * sz2 );
2726 regs[a].hash->n_stored = sz1 + sz2;
2840 super = regs[a+1].cls;
2854 mrbc_raise(vm,
MRBC_CLASS(NotImplementedError),
"Inherit the built-in class is not supported");
2863 outer = regs[a].cls;
2897 outer = regs[a].cls;
2944 for(
int i = 0; i < irep->
rlen; i++ ) {
2959 for( ;method->
next != NULL; method = method->
next ) {
2965 if( del_method->
type ==
'M' ) {
2979 "Adding methods to the %s class is not supported",
2989 .type = (vm->
vm_id == 0) ?
'm' :
'M',
3075 method->
type = (vm->
vm_id == 0) ?
'm' :
'M';
3076 method->
sym_id = sym_id_new;
3109#if !defined(MRBC_SUPPORT_OP_EXT)
3121 "Not support op_ext. Re-compile with MRBC_SUPPORT_OP_EXT");
3147 "Unimplemented opcode (0x%02x) found", *(vm->
inst - 1));
3162#if defined(MRBC_SUPPORT_OP_EXT)
3171 uint8_t op = *vm->
inst++;
3290#if defined(MRBC_SUPPORT_OP_EXT)
3291 case OP_EXT1: ext = 1;
continue;
3292 case OP_EXT2: ext = 2;
continue;
3293 case OP_EXT3: ext = 3;
continue;
3304#if defined(MRBC_SUPPORT_OP_EXT)
3319 uint32_t inst = vm->
inst - irep->
inst;
3320 int cnt = irep->
clen;
3322 for( cnt--; cnt >= 0 ; cnt-- ) {
3323 handler = catch_table + cnt;
void * mrbc_raw_alloc(unsigned int size)
void * mrbc_raw_alloc_no_free(unsigned int size)
void mrbc_raw_free(void *ptr)
static void mrbc_set_nil(mrbc_value *p)
static void mrbc_set_symbol(mrbc_value *p, mrbc_sym sym_id)
#define mrbc_immediate_value(...)
static void mrbc_set_tt(mrbc_value *p, mrbc_vtype type)
static void mrbc_set_bool(mrbc_value *p, int n)
static void mrbc_set_float(mrbc_value *p, mrbc_float_t d)
struct RObject mrbc_value
Value object. Default version.
static void mrbc_set_true(mrbc_value *p)
static void mrbc_set_false(mrbc_value *p)
static void mrbc_set_integer(mrbc_value *p, mrbc_int_t n)
int mrbc_array_push(mrbc_value *ary, mrbc_value *set_val)
int mrbc_array_set(mrbc_value *ary, int idx, mrbc_value *set_val)
mrbc_value mrbc_array_get(const mrbc_value *ary, int idx)
mrbc_value mrbc_array_new(mrbc_vm *vm, int size)
mrbc_value mrbc_array_dup(mrbc_vm *vm, const mrbc_value *ary)
int mrbc_array_resize(mrbc_value *ary, int size)
static int mrbc_array_size(const mrbc_value *ary)
mrbc_value mrbc_hash_dup(mrbc_vm *vm, mrbc_value *src)
mrbc_value mrbc_hash_remove_by_id(mrbc_value *hash, mrbc_sym sym_id)
mrbc_value mrbc_hash_new(mrbc_vm *vm, int size)
void mrbc_hash_delete(mrbc_value *hash)
mrbc_value * mrbc_hash_search_by_id(const mrbc_value *hash, mrbc_sym sym_id)
int mrbc_hash_set(mrbc_value *hash, mrbc_value *key, mrbc_value *val)
static mrbc_value * mrbc_hash_i_next(mrbc_hash_iterator *ite)
static int mrbc_hash_size(const mrbc_value *hash)
static int mrbc_hash_i_has_next(mrbc_hash_iterator *ite)
struct RHashIterator mrbc_hash_iterator
Define Hash iterator.
static mrbc_hash_iterator mrbc_hash_iterator_new(const mrbc_value *v)
mrbc_value mrbc_proc_new(struct VM *vm, void *irep, uint8_t b_or_m)
mrbc_value mrbc_range_new(mrbc_vm *vm, mrbc_value *first, mrbc_value *last, int flag_exclude)
int mrbc_string_append(mrbc_value *s1, const mrbc_value *s2)
mrbc_value mrbc_instance_new(struct VM *vm, mrbc_class *cls, int size)
mrbc_class * mrbc_find_method(mrbc_method *r_method, mrbc_class *cls, mrbc_sym sym_id)
mrbc_class * mrbc_define_module_under(struct VM *vm, const mrbc_class *outer, const char *name)
int mrbc_obj_is_kind_of(const mrbc_value *obj, const mrbc_class *tcls)
mrbc_value mrbc_instance_getiv(mrbc_value *obj, mrbc_sym sym_id)
mrbc_class * mrbc_traverse_class_tree(mrbc_class *cls, mrbc_class *nest_buf[], int *nest_idx)
mrbc_class * mrbc_define_module(struct VM *vm, const char *name)
void mrbc_instance_setiv(mrbc_value *obj, mrbc_sym sym_id, mrbc_value *v)
mrbc_class * mrbc_define_class_under(struct VM *vm, const mrbc_class *outer, const char *name, mrbc_class *super)
mrbc_class *const mrbc_class_tbl[MRBC_TT_MAXVAL+1]
mrbc_class * mrbc_define_class(struct VM *vm, const char *name, mrbc_class *super)
#define MRBC_TRAVERSE_NEST_LEVEL
struct RMethod mrbc_method
Method management structure.
static mrbc_class * find_class_by_object(const mrbc_value *obj)
struct RClass mrbc_class
Class object.
void mrbc_printf(const char *fstr,...)
void mrbc_raise(struct VM *vm, struct RClass *exc_cls, const char *msg)
void mrbc_print_vm_exception(const struct VM *vm)
void mrbc_raisef(struct VM *vm, struct RClass *exc_cls, const char *fstr,...)
#define mrbc_israised(vm)
int mrbc_set_global(mrbc_sym sym_id, mrbc_value *v)
int mrbc_set_class_const(const mrbc_class *cls, mrbc_sym sym_id, mrbc_value *v)
mrbc_value * mrbc_get_const(mrbc_sym sym_id)
mrbc_value * mrbc_get_global(mrbc_sym sym_id)
int mrbc_set_const(mrbc_sym sym_id, mrbc_value *v)
mrbc_value * mrbc_get_class_const(const mrbc_class *cls, mrbc_sym sym_id)
mrbc_value mrbc_irep_pool_value(mrbc_vm *vm, int n)
void mrbc_irep_free(mrbc_irep *irep)
Include at once the necessary header files.
Define operation codes and associated macros.
@ OP_KEY_P
BB R[a] = kdict.key?(Syms[b]).
@ OP_SUBILV
BBB R[a] = R[a]-mrb_int(c); R[b],R[b+1] for method call.
@ OP_DEBUG
BBB print a,b,c.
@ OP_CALL
Z self.call(*, **, &) (But overlay the current call frame; tailcall).
@ 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_RETTRUE
Z return true.
@ OP_GETIDX0
BB R[a] = R[b][0]; a+1 for method call.
@ 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_ARYSPLAT
B R[a] = ary_splat(R[a]).
@ 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_ADDILV
BBB R[a] = R[a]+mrb_int(c); R[b],R[b+1] for method call.
@ 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_SEND0
BB R[a] = R[a].send(Syms[b]) (no args).
@ 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_LOADI8
BB R[a] = mrb_int(b).
@ OP_RETSELF
Z return self.
@ 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_LOADI_1
B R[a] = mrb_int(1).
@ OP_JMPNIL
BS if R[a]==nil pc+=b.
@ OP_RETFALSE
Z return false.
@ 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 (24=n1:m5:o5:r1:m5:k5:d1:b1).
@ 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_LOADFALSE
B R[a] = false.
@ 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_MATCHERR
B raise NoMatchingPatternError unless R[a].
@ OP_STRING
BB R[a] = str_dup(Pool[b]).
@ OP_ERR
B raise(LocalJumpError, Pool[a]).
@ OP_TDEF
BBB target_class.newmethod(Syms[b],Irep[c]); R[a] = Syms[b].
@ 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_SDEF
BBB R[a].singleton_class.newmethod(Syms[b],Irep[c]); R[a] = Syms[b].
@ OP_GT
B R[a] = R[a]>R[a+1].
@ OP_LOADTRUE
B R[a] = true.
@ 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_BLKCALL
BB R[a] = R[a].call(R[a+1],... ,R[a+b]); direct block call.
@ 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_SSEND0
BB R[a] = self.send(Syms[b]) (no args).
@ 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]).
uint8_t is_called_super
flags when called by OP_SUPER.
const mrbc_irep * cur_irep
copy from mrbc_vm.
struct RClass * target_class
copy from mrbc_vm.
mrbc_sym method_id
called method ID.
struct RHash * karg_keep
keyword argument backup for OP_ARGARY.
uint8_t n_args
num of arguments.
struct CALLINFO * prev
previous linked list.
const uint8_t * inst
copy from mrbc_vm.
mrbc_value * cur_regs
copy from mrbc_vm.
struct RClass * own_class
class that owns method.
uint8_t reg_offset
register offset after call.
uint8_t is_called_block
flags when block calls.
uint8_t target[4]
The address to jump to if a match is made.
uint8_t begin[4]
The starting address to match the handler. Includes this.
uint8_t type
enum mrb_catch_type, 1 byte. 0=rescue, 1=ensure
uint8_t end[4]
The endpoint address that matches the handler. Not Includes this.
const uint8_t * inst
pointer to instruction in RITE binary
uint16_t ilen
num of bytes in OpCode
uint16_t ref_count
reference counter
uint16_t rlen
num of child IREP blocks
uint16_t clen
num of catch handlers
uint16_t nregs
num of register variables
uint16_t n_stored
num of stored.
mrbc_value * data
pointer to allocated memory.
struct RMethod * method_link
pointer to method link.
unsigned int flag_alias
is module alias?
struct RClass * super
pointer to super class.
struct RClass * aliased
aliased class or module.
mrbc_sym sym_id
class name's symbol ID
unsigned int flag_nomethod
is built-in no method class? (= 0)
mrbc_sym method_id
raised method, if it is known.
uint16_t n_stored
num of stored.
mrbc_value * data
pointer to allocated memory.
struct RClass * cls
return value for mrbc_find_method.
mrbc_sym sym_id
function names symbol ID
uint8_t type
M:OP_DEF or OP_ALIAS, m:mrblib or define_method().
struct IREP * irep
to IREP for ruby proc.
struct RMethod * next
link to next method.
uint8_t c_func
0:IREP, 1:C Func, 2:C Func (built-in)
mrbc_func_t func
to C function.
struct RException * exception
mrbc_value ret_val
Return value of this block.
struct CALLINFO * callinfo
callinfo when proc was created.
struct CALLINFO * callinfo_self
callinfo of self object. Valid when 'B'.
unsigned int flag_need_memfree
mrbc_sym callee_sym_id
Current called method.
uint16_t regs_size
size of regs[]
const mrbc_irep * cur_irep
IREP currently running.
struct RProc * ret_blk
Return block.
struct RClass * target_class
Target class.
mrbc_callinfo * callinfo_tail
Last point of CALLINFO link.
uint8_t vm_id
vm_id : 1..MAX_VM_COUNT
volatile int8_t flag_preemption
mrbc_value exception
Raised exception or nil.
unsigned int flag_permanence
const uint8_t * inst
Instruction pointer.
mrbc_value * cur_regs
Current register top.
mrbc_irep * top_irep
IREP tree top.
mrbc_value mrbc_symbol_new(struct VM *vm, const char *str)
mrbc_sym mrbc_str_to_symid(const char *str)
void mrbc_separate_nested_symid(mrbc_sym sym_id, mrbc_sym *id1, mrbc_sym *id2)
const char * mrbc_symid_to_str(mrbc_sym sym_id)
static int mrbc_is_nested_symid(mrbc_sym sym_id)
int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2)
static void mrbc_decref(mrbc_value *v)
static void mrbc_decref_empty(mrbc_value *v)
static uint32_t bin_to_uint32(const void *s)
static void mrbc_incref(mrbc_value *v)
int16_t mrbc_sym
mruby/c symbol ID
@ MRBC_TT_FALSE
FalseClass.
@ MRBC_TT_INTEGER
Integer.
@ MRBC_TT_EXCEPTION
Exception.
@ MRBC_TT_OBJECT
General instance.
static void op_send(mrbc_vm *vm, mrbc_value *regs EXT)
static void send_by_name(mrbc_vm *vm, mrbc_sym sym_id, int a, int c)
static void op_loadsym(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_lt(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_getgv(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_mul(mrbc_vm *vm, mrbc_value *regs EXT)
void mrbc_vm_close(mrbc_vm *vm)
static void op_loadi8(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_array(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_move(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_sdef(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadfalse(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_retnil(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_strcat(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_getidx0(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_jmpif(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_send0(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_def(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_stop(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_tdef(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_alias(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_setupvar(mrbc_vm *vm, mrbc_value *regs EXT)
void mrbc_pop_callinfo(mrbc_vm *vm)
static void op_sendb(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_setidx(mrbc_vm *vm, mrbc_value *regs EXT)
mrbc_vm * mrbc_vm_new(int regs_size)
static void op_symbol(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_ssendb(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_getconst(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_matcherr(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_hash(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_jmpnot(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadi_n(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_add(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_except(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_addi(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_ge(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_tclass(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_class(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_unsupported(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_sclass(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_gt(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_div(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_aref(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_module(mrbc_vm *vm, mrbc_value *regs EXT)
static void sub_op_def(mrbc_vm *vm, mrbc_class *cls, mrbc_irep *irep, mrbc_sym sym_id)
static void op_keyend(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_getiv(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_argary(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_super(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_ssend(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_setiv(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_getidx(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_apost(mrbc_vm *vm, mrbc_value *regs EXT)
static void sub_op_return(mrbc_vm *vm, mrbc_value *regs, int a)
static void op_arypush(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_aset(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_nop(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_ext(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_setgv(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_return(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_hashcat(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadi16(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_jmpuw(mrbc_vm *vm, mrbc_value *regs EXT)
static void sub_irep_inc_dec_ref(mrbc_irep *irep, int inc_dec)
static void op_getupvar(mrbc_vm *vm, mrbc_value *regs EXT)
static void sub_newmethod(mrbc_class *cls, mrbc_method *method, mrbc_sym sym_id)
static void op_return_blk(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_karg(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_eq(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_key_p(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_intern(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_rescue(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadineg(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_block(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadl(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_le(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_range_exc(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadtrue(mrbc_vm *vm, mrbc_value *regs EXT)
mrbc_vm * mrbc_vm_open(mrbc_vm *vm)
static void op_subi(mrbc_vm *vm, mrbc_value *regs EXT)
int mrbc_vm_run(mrbc_vm *vm)
static void op_method(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_setconst(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_addilv(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_array2(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_arysplat(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_arycat(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_blkpush(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_enter(mrbc_vm *vm, mrbc_value *regs EXT)
static const mrbc_irep_catch_handler * find_catch_handler_ensure(const mrbc_vm *vm)
void mrbc_vm_end(mrbc_vm *vm)
static void op_loadself(mrbc_vm *vm, mrbc_value *regs EXT)
void mrbc_cleanup_vm(void)
static void op_jmp(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_sub(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_rettrue(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_range_inc(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_jmpnil(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_retself(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_retfalse(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadi32(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_hashadd(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadnil(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_exec(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_subilv(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_getmcnst(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_raiseif(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_break(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_string(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_blkcall(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_ssend0(mrbc_vm *vm, mrbc_value *regs EXT)
void mrbc_vm_begin(mrbc_vm *vm)
static uint16_t free_vm_bitmap[MAX_VM_COUNT/16+1]
for getting the VM ID
static void op_oclass(mrbc_vm *vm, mrbc_value *regs EXT)
mrbc_callinfo * mrbc_push_callinfo(mrbc_vm *vm, mrbc_sym method_id, int reg_offset, int n_args)
static mrbc_value * mrbc_get_self(mrbc_vm *vm, mrbc_value *regs)
#define mrbc_irep_pool_ptr(irep, n)
get a pointer to n'th pool data.
struct CALLINFO mrbc_callinfo
Call information.
#define mrbc_irep_symbol_id(irep, n)
get a n'th symbol id in irep
#define mrbc_irep_child_irep(irep, n)
get a n'th child irep
struct IREP_CATCH_HANDLER mrbc_irep_catch_handler
IREP Catch Handler.
#define mrbc_irep_symbol_cstr(irep, n)
get a n'th symbol string in irep
struct IREP mrbc_irep
IREP Internal REPresentation.
struct VM mrbc_vm
Virtual Machine.
Global configuration of mruby/c VM's.