static int32_t compare_break_method( mrb_state *mrb, mrb_debug_breakpoint *bp, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc ) { const char* class_name; const char* method_name; struct RProc* m; struct RClass* sc; const char* sn; mrb_sym ssym; mrb_debug_methodpoint *method_p; mrb_bool is_defined; method_name = mrb_sym2name(mrb, method_sym); method_p = &bp->point.methodpoint; if(strcmp(method_p->method_name, method_name) == 0) { class_name = get_class_name(mrb, class_obj); if(class_name == NULL) { if(method_p->class_name == NULL) { return bp->bpno; } } else if(method_p->class_name != NULL) { m = mrb_method_search_vm(mrb, &class_obj, method_sym); if(m == NULL) { return MRB_DEBUG_OK; } if(MRB_PROC_CFUNC_P(m)) { *isCfunc = TRUE; } is_defined = mrb_class_defined(mrb, method_p->class_name); if(is_defined == FALSE) { return MRB_DEBUG_OK; } sc = mrb_class_get(mrb, method_p->class_name); ssym = mrb_symbol(mrb_check_intern_cstr(mrb, method_p->method_name)); m = mrb_method_search_vm(mrb, &sc, ssym); if(m == NULL) { return MRB_DEBUG_OK; } class_name = get_class_name(mrb, class_obj); sn = get_class_name(mrb, sc); if(strcmp(sn, class_name) == 0) { return bp->bpno; } } } return MRB_DEBUG_OK; }
void mrb_sys_fail(mrb_state *mrb, const char *mesg) { struct RClass *sce; mrb_int no; no = (mrb_int)errno; if (mrb_class_defined(mrb, "SystemCallError")) { sce = mrb_class_get(mrb, "SystemCallError"); if (mesg != NULL) { mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 2, mrb_fixnum_value(no), mrb_str_new_cstr(mrb, mesg)); } else { mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 1, mrb_fixnum_value(no)); } } else { mrb_raise(mrb, E_RUNTIME_ERROR, mesg); } }
static void io_set_process_status(mrb_state *mrb, pid_t pid, int status) { struct RClass *c_process, *c_status; mrb_value v; c_status = NULL; if (mrb_class_defined(mrb, "Process")) { c_process = mrb_module_get(mrb, "Process"); if (mrb_const_defined(mrb, mrb_obj_value(c_process), mrb_intern_cstr(mrb, "Status"))) { c_status = mrb_class_get_under(mrb, c_process, "Status"); } } if (c_status != NULL) { v = mrb_funcall(mrb, mrb_obj_value(c_status), "new", 2, mrb_fixnum_value(pid), mrb_fixnum_value(status)); } else { v = mrb_fixnum_value(WEXITSTATUS(status)); } mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$?"), v); }
static mrb_bool is_safe_migratable_simple_value(mrb_state *mrb, mrb_value v, mrb_state *mrb2) { switch (mrb_type(v)) { case MRB_TT_OBJECT: case MRB_TT_EXCEPTION: { struct RObject *o = mrb_obj_ptr(v); mrb_value path = mrb_class_path(mrb, o->c); if (mrb_nil_p(path) || !mrb_class_defined(mrb2, RSTRING_PTR(path))) { return FALSE; } } break; case MRB_TT_FALSE: case MRB_TT_TRUE: case MRB_TT_FIXNUM: case MRB_TT_SYMBOL: case MRB_TT_FLOAT: case MRB_TT_STRING: break; case MRB_TT_RANGE: { struct RRange *r = mrb_range_ptr(v); if (!is_safe_migratable_simple_value(mrb, r->edges->beg, mrb2) || !is_safe_migratable_simple_value(mrb, r->edges->end, mrb2)) { return FALSE; } } break; case MRB_TT_ARRAY: { struct RArray *a0; int i; a0 = mrb_ary_ptr(v); for (i=0; i<a0->len; i++) { if (!is_safe_migratable_simple_value(mrb, a0->ptr[i], mrb2)) { return FALSE; } } } break; case MRB_TT_HASH: { mrb_value ka; int i, l; ka = mrb_hash_keys(mrb, v); l = RARRAY_LEN(ka); for (i = 0; i < l; i++) { mrb_value k = mrb_ary_entry(ka, i); if (!is_safe_migratable_simple_value(mrb, k, mrb2) || !is_safe_migratable_simple_value(mrb, mrb_hash_get(mrb, v, k), mrb2)) { return FALSE; } } } break; case MRB_TT_DATA: if (!is_safe_migratable_datatype(DATA_TYPE(v))) return FALSE; break; default: return FALSE; break; } return TRUE; }