void mrb_init_mrblib(mrb_state *mrb) { int n = mrb_read_irep(mrb, mrblib_irep); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); }
int mrb_read_irep_file(mrb_state *mrb, FILE* fp) { int ret, i; uint32_t len, rlen = 0; unsigned char hex8[8], hcrc[4]; unsigned char *dst, *rite_dst = NULL; rite_binary_header bin_header; RiteFILE ritefp = { 0 }; RiteFILE *rfp; if ((mrb == NULL) || (fp == NULL)) { return MRB_DUMP_INVALID_ARGUMENT; } ritefp.fp = fp; rfp = &ritefp; //Read File Header Section ret = load_rite_header(fp, &bin_header, hcrc); if (ret != MRB_DUMP_OK) return ret; len = sizeof(rite_binary_header) + bin_to_uint32(bin_header.rbds); rite_dst = (unsigned char *)mrb_malloc(mrb, len); if (rite_dst == NULL) return MRB_DUMP_GENERAL_FAILURE; dst = rite_dst; memset(dst, 0x00, len); *(rite_binary_header *)dst = bin_header; dst += sizeof(rite_binary_header); dst += hex_to_bin16(dst, hcrc); //Read Binary Data Section len = bin_to_uint16(bin_header.nirep); for (i=0; i<len; i++) { rite_fgets(rfp, hex8, sizeof(hex8), TRUE); //record len dst += hex_to_bin32(dst, hex8); ret = load_rite_irep_record(mrb, rfp, dst, &rlen); if (ret != MRB_DUMP_OK) //irep info goto error_exit; dst += rlen; } rite_fgets(rfp, hex8, sizeof(hex8), TRUE); //dummy record len hex_to_bin32(dst, hex8); /* dst += hex_to_bin32(dst, hex8); */ if (0 != hex_to_uint32(hex8)) { ret = MRB_DUMP_INVALID_IREP; goto error_exit; } if (ret == MRB_DUMP_OK) ret = mrb_read_irep(mrb, (char*)rite_dst); error_exit: mrb_free(mrb, rite_dst); return ret; }
int main(void) { mrb_state *mrb; mrb = mrb_open(); int n = mrb_read_irep(mrb, fizzbuzz); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); mrb_close(mrb); return 0; }
mrb_value mrb_load_irep(mrb_state *mrb, const char *bin) { int n = mrb_read_irep(mrb, bin); if (n < 0) { irep_error(mrb, n); return mrb_nil_value(); } return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); }
void mrb_init_mrubybin(mrb_state *mrb) { int n = mrb_read_irep(mrb, mrubybin); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); exit(0); } }
mrb_value mrb_load_irep(mrb_state *mrb, const uint8_t *bin) { int32_t n; n = mrb_read_irep(mrb, bin); if (n < 0) { irep_error(mrb, n); return mrb_nil_value(); } return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb), 0); }
void* cfunc_rubyvm_open(void *args) { struct cfunc_rubyvm_data *data = args; mrb_state *mrb = mrb_open(); data->state = mrb; #ifdef DISABLE_GEMS init_cfunc_module(mrb); #endif int n = mrb_read_irep(mrb, data->mrb_data); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); if (mrb->exc) { return NULL; } while(true) { pthread_mutex_lock(&data->queue_mutex); while(data->queue->length == 0) { pthread_cond_wait(&data->queue_cond, &data->queue_mutex); } struct queue_task *task = vector_dequeue(data->queue); task->status = queue_task_running; mrb_sym taskname = mrb_intern(mrb, task->name); int args_len = task->args_len; mrb_value *args = mrb_malloc(mrb, sizeof(struct task_arg) * task->args_len); int i; for(i=0; i<task->args_len; ++i) { args[i] = task_arg_to_mrb_value(data->state, task->args[i]); } pthread_mutex_unlock(&data->queue_mutex); mrb_value result = mrb_funcall_argv(mrb, mrb_top_self(data->state), taskname, args_len, args); task->result = mrb_value_to_task_arg(mrb, result); task->status = queue_task_finished; pthread_cond_signal(&task->sync_cond); mrb_free(mrb, args); free_queue_task(mrb, task); } return NULL; }
MRB_API mrb_value mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) { mrb_irep *irep = mrb_read_irep(mrb, bin); struct RProc *proc; if (!irep) { irep_error(mrb); return mrb_nil_value(); } proc = mrb_proc_new(mrb, irep); mrb_irep_decref(mrb, irep); if (c && c->no_exec) return mrb_obj_value(proc); return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0); }
int main(int argc, char **argv) { mrb_state *mrb = mrb_open(); int n = -1; int ret; if (mrb == NULL) { fprintf(stderr, "Invalid mrb_state, exiting mruby"); return EXIT_FAILURE; } mrb_init_kernel_require(mrb); /* initialize this library */ n = mrb_read_irep(mrb, data_main); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); ret = check_result(mrb); mrb_close(mrb); return ret; }
static void mrb_load_irep_data(mrb_state* mrb, const uint8_t* data) { int ai = mrb_gc_arena_save(mrb); mrb_irep *irep = mrb_read_irep(mrb,data); mrb_gc_arena_restore(mrb,ai); if (irep) { int ai; struct RProc *proc; replace_stop_with_return(mrb, irep); proc = mrb_proc_new(mrb, irep); proc->target_class = mrb->object_class; ai = mrb_gc_arena_save(mrb); mrb_yield_with_class(mrb, mrb_obj_value(proc), 0, NULL, mrb_top_self(mrb), mrb->object_class); mrb_gc_arena_restore(mrb, ai); } else if (mrb->exc) { // fail to load longjmp(*(jmp_buf*)mrb->jmp, 1); } }
MRB_API mrb_value mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) { return load_irep(mrb, mrb_read_irep(mrb, bin), c); }