30#define CALL_MAXARGS 15
55 int karg = (c >> 4) & 0x0f;
56 int have_block = (c >> 8);
65 for(
int i = 0; i < narg; i++ ) {
69 memmove( recv + narg + 1, recv + 2,
sizeof(
mrbc_value) * n_move );
79 if( !hval.
hash )
return;
85 r1[2] = r1[karg * 2 + 1];
86 memset( r1 + 3, 0,
sizeof(
mrbc_value) * (karg * 2 - 1) );
104 "undefined local variable or method '%s' for %s",
113 for(
int i = narg+1; i != 0; i-- ) {
122 if( !method.
c_func )
goto CALL_RUBY_METHOD;
124 method.
func(vm, recv, narg);
129 if( sym_id ==
MRBC_SYM(call) )
return;
130 if( sym_id ==
MRBC_SYM(
new) )
return;
132 for(
int i = 1; i <= narg + !!karg + have_block; i++ ) {
154 int cnt = irep->
clen;
155 if( cnt == 0 )
return NULL;
159 uint32_t inst = vm->
inst - irep->
inst;
161 for( cnt--; cnt >= 0 ; cnt-- ) {
164 if( (handler->
type == 1) &&
194 uint8_t rb = vm->
inst[-2];
211 uint8_t rb = vm->
inst[-2];
222 if( !callinfo )
return callinfo;
233 callinfo->
n_args = n_args;
269 mrbc_free(vm, callinfo);
297 if( !vm )
return NULL;
299 memset(vm, 0, vm_total_size);
300#if defined(MRBC_DEBUG)
301 memcpy(vm->obj_mark_,
"VM", 2);
319 if( !vm )
return NULL;
324 int idx = vm_id >> 4;
325 int bit = 1 << (vm_id & 0x0f);
364 for(
int i = 1; i < vm->
regs_size; i++ ) {
378#if defined(MRBC_ABORT_BY_EXCEPTION)
379 MRBC_ABORT_BY_EXCEPTION(vm);
388 for(
int i = 1; i < vm->
regs_size; i++ ) {
394#if defined(MRBC_DEBUG_REGS)
395 mrbc_printf(
"Finally number of registers used was %d in VM %d.\n",
399#if defined(MRBC_ALLOC_VMID)
400 mrbc_global_clear_vm_id();
416 if( vm->
vm_id != 0 ) {
417 int idx = (vm->
vm_id-1) >> 4;
418 int bit = 1 << ((vm->
vm_id-1) & 0x0f);
429#if defined(MRBC_SUPPORT_OP_EXT)
510 int opcode = vm->
inst[-1];
530 int16_t signed_b = (int16_t)b;
737 cls = crit_cls->
super;
834 for(
int i = 0; i < c; i++ ) {
843 if( callinfo == 0 ) {
844 p_val = vm->
regs + b;
867 for(
int i = 0; i < c; i++ ) {
875 if( callinfo == 0 ) {
876 p_val = vm->
regs + b;
922 vm->
inst += (int16_t)a;
936 vm->
inst += (int16_t)b;
951 vm->
inst += (int16_t)b;
966 vm->
inst += (int16_t)b;
980 const uint8_t *jump_inst = vm->
inst + (int16_t)a;
985 vm->
inst = jump_inst;
993 vm->
inst = jump_inst;
1261 int narg = b & 0x0f;
1262 int karg = (b >> 4) & 0x0f;
1282 int n_move = (karg ==
CALL_MAXARGS) ? 2 : karg * 2 + 1;
1284 for(
int i = 0; i < narg; i++ ) {
1288 memmove( recv + narg + 1, recv + 2,
sizeof(
mrbc_value) * n_move );
1298 if( !hval.
hash )
return;
1304 r1[2] = r1[karg * 2 + 1];
1305 memset( r1 + 3, 0,
sizeof(
mrbc_value) * (karg * 2 - 1) );
1318 "no superclass method '%s' for %s",
1326 method.
func(vm, recv, narg - !!karg);
1327 for(
int i = 1; i <= narg+1; i++ ) {
1355 int m1 = (b >> 11) & 0x3f;
1356 int d = (b >> 4) & 0x01;
1378 for(
int i = 1; i < lv; i ++ ) {
1389 int array_size = m1 + d;
1391 if( !argary.
array )
return;
1393 for(
int i = 1; i <= m1; i++ ) {
1411 regs[a+1] = reg0[array_size+1];
1425#define FLAG_REST 0x1000
1426#define FLAG_M2 0x0f80
1427#define FLAG_KW 0x007c
1428#define FLAG_DICT 0x0002
1429#define FLAG_BLOCK 0x0001
1446 int m1 = (a >> 18) & 0x1f;
1447 int o = (a >> 13) & 0x1f;
1464 argc == 1 && m1 > 1 ) {
1468 argc = argary_size > m1 ? argary_size : m1;
1470 for(
int i = argc; i > 0; i-- ) {
1472 if( argary_size >= i ) {
1487 if( (argc - m1) > 0 && regs[argc].tt ==
MRBC_TT_HASH ) {
1497 int rest_size = argc - m1 - o;
1498 if( rest_size < 0 ) rest_size = 0;
1500 if( !rest.
array )
return;
1502 int rest_reg = m1 + o + 1;
1503 for(
int i = 0; i < rest_size; i++ ) {
1510 for(
int i = argc; i < m1; ) {
1530 for(
int i = argc; i < m1; ) {
1541 int jmp_ofs = argc - m1;
1551 vm->
inst += jmp_ofs * 3;
1799 int m1 = (b >> 11) & 0x3f;
1800 int r = (b >> 10) & 0x01;
1801 int m2 = (b >> 5) & 0x1f;
1802 int d = (b >> 4) & 0x01;
1803 int lv = (b ) & 0x0f;
1810 int offset = m1 + r + d + 1;
1815 blk = regs + offset;
1822 for(
int i = 0; i < lv-1; i++ ) {
1854 regs[a].i += regs[a+1].i;
1867 regs[a].d += regs[a+1].i;
1873 regs[a].d += regs[a+1].d;
1921 regs[a].i -= regs[a+1].i;
1934 regs[a].d -= regs[a+1].i;
1940 regs[a].d -= regs[a+1].d;
1988 regs[a].i *= regs[a+1].i;
2001 regs[a].d *= regs[a+1].i;
2007 regs[a].d *= regs[a+1].d;
2039 if( (mod != 0) && ((v0 ^ v1) < 0) ) ret -= 1;
2054 regs[a].d /= regs[a+1].i;
2060 regs[a].d /= regs[a+1].d;
2185 if( ret.
array == NULL )
return;
2188 memset( ®s[a], 0,
sizeof(
mrbc_value) * b );
2206 if( ret.
array == NULL )
return;
2209 memset( ®s[b], 0,
sizeof(
mrbc_value) * c );
2229 regs[a] = regs[a+1];
2238 int size_1 = regs[a ].array->n_stored;
2239 int size_2 = regs[a+1].array->n_stored;
2240 int new_size = size_1 + regs[a+1].array->n_stored;
2243 if( regs[a].array->data_size < new_size ) {
2247 for(
int i = 0; i < size_2; i++ ) {
2249 regs[a].array->data[size_1+i] = regs[a+1].array->data[i];
2251 regs[a].array->n_stored = new_size;
2267 if( ret != 0 )
return;
2270 memcpy( regs[a].array->data + sz1, ®s[a+1],
sizeof(
mrbc_value) * b );
2271 memset( ®s[a+1], 0,
sizeof(
mrbc_value) * b );
2272 regs[a].array->n_stored = sz1 + b;
2357 if( len > pre + post ) {
2358 int ary_size = len - pre - post;
2362 for(
int i = 0; i < ary_size; i++ ) {
2363 regs[a].array->data[i] = src.
array->
data[pre+i];
2366 regs[a].array->n_stored = ary_size;
2369 assert(!
"Not support this case in op_apost");
2445 if( !method.
c_func )
return;
2447 method.
func( vm, regs + a + 1, 0 );
2467 if( value.
hash == NULL )
return;
2472 memset( ®s[a], 0,
sizeof(
mrbc_value) * b );
2493 if( ret != 0 )
return;
2497 memcpy( regs[a].hash->data + sz1, ®s[a+1],
sizeof(
mrbc_value) * sz2 );
2498 memset( ®s[a+1], 0,
sizeof(
mrbc_value) * sz2 );
2499 regs[a].hash->n_stored = sz1 + sz2;
2533 if( !ret.
proc )
return;
2550 if( !ret.
proc )
return;
2613 switch( regs[a+1].tt ) {
2615 super = regs[a+1].cls;
2629 mrbc_raise(vm,
MRBC_CLASS(NotImplementedError),
"Inherit the built-in class is not supported");
2638 outer = regs[a].cls;
2672 outer = regs[a].cls;
2719 for(
int i = 0; i < irep->
rlen; i++ ) {
2734 for( ;method->
next != NULL; method = method->
next ) {
2740 if( del_method->
type ==
'M' ) {
2768 if( !method )
return;
2770 method->
type = (vm->
vm_id == 0) ?
'm' :
'M';
2795 if( !method )
return;
2804 method->
type = (vm->
vm_id == 0) ?
'm' :
'M';
2805 method->
sym_id = sym_id_new;
2838#if !defined(MRBC_SUPPORT_OP_EXT)
2850 "Not support op_ext. Re-compile with MRBC_SUPPORT_OP_EXT");
2876 "Unimplemented opcode (0x%02x) found", *(vm->
inst - 1));
2891#if defined(MRBC_SUPPORT_OP_EXT)
2900 uint8_t op = *vm->
inst++;
3005#if defined(MRBC_SUPPORT_OP_EXT)
3006 case OP_EXT1: ext = 1;
continue;
3007 case OP_EXT2: ext = 2;
continue;
3008 case OP_EXT3: ext = 3;
continue;
3019#if defined(MRBC_SUPPORT_OP_EXT)
3034 uint32_t inst = vm->
inst - irep->
inst;
3035 int cnt = irep->
clen;
3037 for( cnt--; cnt >= 0 ; cnt-- ) {
3038 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)
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(struct VM *vm, int size)
int mrbc_array_resize(mrbc_value *ary, int size)
mrbc_value mrbc_array_dup(struct VM *vm, const mrbc_value *ary)
static int mrbc_array_size(const mrbc_value *ary)
mrbc_value mrbc_hash_remove_by_id(mrbc_value *hash, mrbc_sym sym_id)
void mrbc_hash_delete(mrbc_value *hash)
mrbc_value * mrbc_hash_search_by_id(const mrbc_value *hash, mrbc_sym sym_id)
mrbc_value mrbc_hash_dup(struct VM *vm, mrbc_value *src)
int mrbc_hash_set(mrbc_value *hash, mrbc_value *key, mrbc_value *val)
mrbc_value mrbc_hash_new(struct VM *vm, int size)
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)
struct RProc mrbc_proc
Proc object.
mrbc_value mrbc_range_new(struct 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_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_define_module(struct VM *vm, const char *name)
void mrbc_instance_setiv(mrbc_value *obj, mrbc_sym sym_id, mrbc_value *v)
mrbc_method * mrbc_find_method(mrbc_method *r_method, mrbc_class *cls, mrbc_sym sym_id)
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)
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)
mrbc_value * mrbc_get_class_const(const struct RClass *cls, mrbc_sym sym_id)
int mrbc_set_global(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_class_const(const struct RClass *cls, mrbc_sym sym_id, mrbc_value *v)
int mrbc_set_const(mrbc_sym sym_id, mrbc_value *v)
mrbc_value mrbc_irep_pool_value(struct VM *vm, int n)
void mrbc_irep_free(struct 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_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])
uint8_t is_called_super
this is called by op_super.
const mrbc_irep * cur_irep
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.
mrbc_class * target_class
copy from mrbc_vm.
struct CALLINFO * prev
previous linked list.
mrbc_class * own_class
class that owns method.
const uint8_t * inst
copy from mrbc_vm.
mrbc_value * cur_regs
copy from mrbc_vm.
uint8_t reg_offset
register offset after call.
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.
struct RClass * super
pointer to super class.
mrbc_sym sym_id
class name's symbol ID
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
struct RInstance * instance
struct CALLINFO * callinfo
struct CALLINFO * callinfo_self
mrbc_class * target_class
Target class.
unsigned int flag_need_memfree
uint16_t regs_size
size of regs[]
const mrbc_irep * cur_irep
IREP currently running.
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_proc * ret_blk
Return block.
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)
#define mrbc_set_false(p)
#define mrbc_symbol_value(n)
static void mrbc_incref(mrbc_value *v)
#define mrbc_set_bool(p, n)
#define mrbc_set_integer(p, n)
#define mrbc_set_float(p, n)
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.
struct RObject mrbc_value
#define mrbc_set_symbol(p, n)
#define mrbc_integer_value(n)
static void op_send(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_loadsym(mrbc_vm *vm, mrbc_value *regs EXT)
mrbc_callinfo * mrbc_push_callinfo(struct VM *vm, mrbc_sym method_id, int reg_offset, int n_args)
static void op_loadt(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)
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_strcat(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_jmpif(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_return__sub(mrbc_vm *vm, mrbc_value *regs, int a)
static void op_def(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_stop(mrbc_vm *vm, mrbc_value *regs EXT)
static void sub_irep_incref(mrbc_irep *irep, int inc_dec)
static void op_alias(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_setupvar(mrbc_vm *vm, mrbc_value *regs EXT)
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 const mrbc_irep_catch_handler * find_catch_handler_ensure(const struct VM *vm)
static void op_getconst(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)
void mrbc_vm_end(struct VM *vm)
static void op_except(mrbc_vm *vm, mrbc_value *regs EXT)
void mrbc_pop_callinfo(struct VM *vm)
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_arydup(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)
mrbc_vm * mrbc_vm_open(struct VM *vm)
static void op_keyend(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_getiv(mrbc_vm *vm, mrbc_value *regs EXT)
static void sub_def_alias(mrbc_class *cls, mrbc_method *method, mrbc_sym sym_id)
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 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)
mrbc_sym mrbc_get_callee_symid(struct VM *vm)
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 op_getupvar(mrbc_vm *vm, mrbc_value *regs EXT)
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_subi(mrbc_vm *vm, mrbc_value *regs EXT)
void mrbc_vm_begin(struct 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_array2(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 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 send_by_name(struct VM *vm, mrbc_sym sym_id, int a, int c)
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_loadi(mrbc_vm *vm, mrbc_value *regs EXT)
int mrbc_vm_run(struct VM *vm)
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_getmcnst(mrbc_vm *vm, mrbc_value *regs EXT)
static void op_raiseif(mrbc_vm *vm, mrbc_value *regs EXT)
const char * mrbc_get_callee_name(struct VM *vm)
static void op_loadf(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)
void mrbc_vm_close(struct 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)
#define mrbc_irep_pool_ptr(irep, n)
get a pointer to n'th pool data.
static mrbc_value * mrbc_get_self(struct VM *vm, mrbc_value *regs)
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.