static VALUE rb_f_load(int argc, VALUE *argv) { VALUE fname, wrap, path, orig_fname; rb_scan_args(argc, argv, "11", &fname, &wrap); if (RUBY_DTRACE_LOAD_ENTRY_ENABLED()) { RUBY_DTRACE_LOAD_ENTRY(StringValuePtr(fname), rb_sourcefile(), rb_sourceline()); } orig_fname = FilePathValue(fname); fname = rb_str_encode_ospath(orig_fname); path = rb_find_file(fname); if (!path) { if (!rb_file_load_ok(RSTRING_PTR(fname))) load_failed(orig_fname); path = fname; } rb_load_internal(path, RTEST(wrap)); if (RUBY_DTRACE_LOAD_RETURN_ENABLED()) { RUBY_DTRACE_LOAD_RETURN(StringValuePtr(fname), rb_sourcefile(), rb_sourceline()); } return Qtrue; }
rb_io_trace_event_hook(rb_event_flag_t event, NODE *node, VALUE self, ID mid, VALUE klass) #endif { if(RUBY_LINE_ENABLED()){ #ifdef RUBY_VM if (strncmp(rb_sourcefile(), "<internal:lib/", 13) != 0) #endif RUBY_LINE((char*)rb_sourcefile(), (int)rb_sourceline()); } }
static int err_position(char *buf, long len) { ruby_set_current_source(); if (!rb_sourcefile()) { return 0; } else if (rb_sourceline() == 0) { return snprintf(buf, len, "%s: ", rb_sourcefile()); } else { return snprintf(buf, len, "%s:%d: ", rb_sourcefile(), rb_sourceline()); } }
static void call_trace_func(rb_event_flag_t event, VALUE proc, VALUE self, ID id, VALUE klass) { const char *srcfile = rb_sourcefile(); VALUE eventname = rb_str_new2(get_event_name(event)); VALUE filename = srcfile ? rb_str_new2(srcfile) : Qnil; VALUE argv[6]; int line = rb_sourceline(); rb_thread_t *th = GET_THREAD(); if (!klass) { rb_thread_method_id_and_class(th, &id, &klass); } if (klass) { if (RB_TYPE_P(klass, T_ICLASS)) { klass = RBASIC(klass)->klass; } else if (FL_TEST(klass, FL_SINGLETON)) { klass = rb_iv_get(klass, "__attached__"); } } argv[0] = eventname; argv[1] = filename; argv[2] = INT2FIX(line); argv[3] = id ? ID2SYM(id) : Qnil; argv[4] = (self && srcfile) ? rb_binding_new() : Qnil; argv[5] = klass ? klass : Qnil; rb_proc_call_with_block(proc, 6, argv, Qnil); }
static void debug_event_hook(rb_event_flag_t event, VALUE data, VALUE self, ID mid, VALUE klass) { #ifdef PRINT_EVENTS char *file = (char*)rb_sourcefile(); int line = rb_sourceline(); fprintf(stderr, "%s:%d [%s] %s\n", file, line, get_event_name(event), rb_id2name(mid)); #endif }
void rb_bug(const char *fmt, ...) { va_list args; va_start(args, fmt); report_bug(rb_sourcefile(), rb_sourceline(), fmt, args); va_end(args); abort(); }
void rb_bug_context(const void *ctx, const char *fmt, ...) { const char *file = NULL; int line = 0; if (GET_THREAD()) { file = rb_sourcefile(); line = rb_sourceline(); } report_bug(file, line, fmt, ctx); die(); }
void rb_bug(const char *fmt, ...) { const char *file = NULL; int line = 0; if (GET_THREAD()) { file = rb_sourcefile(); line = rb_sourceline(); } report_bug(file, line, fmt, NULL); die(); }
void rb_bug(const char *fmt, ...) { va_list args; va_start(args, fmt); report_bug(rb_sourcefile(), rb_sourceline(), fmt, args); va_end(args); #if defined(_WIN32) && defined(RT_VER) && RT_VER >= 80 _set_abort_behavior( 0, _CALL_REPORTFAULT); #endif abort(); }
static void trace_line_handler_ext(VALUE rb_event_flag_t, VALUE data, VALUE self, ID id, VALUE klass) { VALUE currentCoverbandBase = rb_funcall(rb_path2class("Coverband::Base"), rb_intern("instance"), 0); const char *srcfile = rb_sourcefile(); VALUE proj_dir = rb_iv_get(currentCoverbandBase, "@project_directory"); const char * c_str_proj_dir = StringValueCStr(proj_dir); if((strstr(srcfile, "gems") == NULL) && (strstr(srcfile, "internal:prelude") == NULL) && (strstr(srcfile, c_str_proj_dir) != NULL) && (!any_ignore_patterns( rb_iv_get(currentCoverbandBase, "@ignore_patterns"), srcfile)) ) { rb_funcall(currentCoverbandBase, rb_intern("add_file_without_checks"), 2, rb_str_new2(srcfile), INT2NUM(rb_sourceline())); } }
/** * line_trace_callback * Callback function for thread line event tracing. It checks Tracer#breakpoints_cache * for any breakpoints trigger on current line called. Then trigger evaluation * procedure if found matching breakpoints. It also skip breakpoints that are * already marked completed. */ static void line_trace_callback(rb_event_flag_t event, VALUE data, VALUE obj, ID mid, VALUE klass) { VALUE self = data; VALUE trace_path; int c_trace_lineno; const char *c_trace_path; VALUE trace_binding; VALUE call_stack_bindings; ID callers_id; ID breakpoints_hit_id; VALUE matching_result; c_trace_path = rb_sourcefile(); // Ensure C_trace_path is absolute path trace_path = rb_str_new_cstr(c_trace_path); trace_path = rb_file_expand_path(trace_path, Qnil); if(!RTEST(trace_path)) { return; } c_trace_path = rb_string_value_cstr(&trace_path); c_trace_lineno = rb_sourceline(); matching_result = match_breakpoints(self, c_trace_path, c_trace_lineno); CONST_ID(callers_id, "callers"); CONST_ID(breakpoints_hit_id, "breakpoints_hit"); // If matching result isn't an array, it means we're in completely wrong file, // or not on the right line. Turn line tracing off if we're in wrong file. if (!RB_TYPE_P(matching_result, T_ARRAY)) { if (!RTEST(matching_result)) { disable_line_trace_for_thread(Qnil); } return; } trace_binding = rb_binding_new(); call_stack_bindings = rb_funcall(trace_binding, callers_id, 0); rb_funcall(self, breakpoints_hit_id, 2, matching_result, call_stack_bindings); return; }
void rb_clear_method_cache_by_class(VALUE klass) { if (klass && klass != Qundef) { int global = klass == rb_cBasicObject || klass == rb_cObject || klass == rb_mKernel; if (RUBY_DTRACE_METHOD_CACHE_CLEAR_ENABLED()) { RUBY_DTRACE_METHOD_CACHE_CLEAR(global ? "global" : rb_class2name(klass), rb_sourcefile(), rb_sourceline()); } if (global) { INC_GLOBAL_METHOD_STATE(); } else { rb_class_clear_method_cache(klass, Qnil); } } }
static void error_pos(void) { const char *sourcefile = rb_sourcefile(); int sourceline = rb_sourceline(); if (sourcefile) { if (sourceline == 0) { warn_printf("%s", sourcefile); } else if (rb_frame_callee()) { warn_printf("%s:%d:in `%s'", sourcefile, sourceline, rb_id2name(rb_frame_callee())); } else { warn_printf("%s:%d", sourcefile, sourceline); } } }
void rb_bug(const char *fmt, ...) { va_list args; const char *file = NULL; int line = 0; if (GET_THREAD()) { file = rb_sourcefile(); line = rb_sourceline(); } va_start(args, fmt); report_bug(file, line, fmt, args); va_end(args); #if defined(_WIN32) && defined(RT_VER) && RT_VER >= 80 _set_abort_behavior( 0, _CALL_REPORTFAULT); #endif abort(); }
/* * returns * 0: if already loaded (false) * 1: successfully loaded (true) * <0: not found (LoadError) * >1: exception */ int rb_require_internal(VALUE fname, int safe) { volatile int result = -1; rb_thread_t *th = GET_THREAD(); volatile VALUE errinfo = th->errinfo; int state; struct { int safe; } volatile saved; char *volatile ftptr = 0; if (RUBY_DTRACE_REQUIRE_ENTRY_ENABLED()) { RUBY_DTRACE_REQUIRE_ENTRY(StringValuePtr(fname), rb_sourcefile(), rb_sourceline()); } TH_PUSH_TAG(th); saved.safe = rb_safe_level(); if ((state = EXEC_TAG()) == 0) { VALUE path; long handle; int found; rb_set_safe_level_force(safe); FilePathValue(fname); rb_set_safe_level_force(0); if (RUBY_DTRACE_FIND_REQUIRE_ENTRY_ENABLED()) { RUBY_DTRACE_FIND_REQUIRE_ENTRY(StringValuePtr(fname), rb_sourcefile(), rb_sourceline()); } path = rb_str_encode_ospath(fname); found = search_required(path, &path, safe); if (RUBY_DTRACE_FIND_REQUIRE_RETURN_ENABLED()) { RUBY_DTRACE_FIND_REQUIRE_RETURN(StringValuePtr(fname), rb_sourcefile(), rb_sourceline()); } if (found) { if (!path || !(ftptr = load_lock(RSTRING_PTR(path)))) { result = 0; } else if (!*ftptr) { rb_provide_feature(path); result = TAG_RETURN; } else { switch (found) { case 'r': rb_load_internal(path, 0); break; case 's': handle = (long)rb_vm_call_cfunc(rb_vm_top_self(), load_ext, path, 0, path); rb_ary_push(ruby_dln_librefs, LONG2NUM(handle)); break; } rb_provide_feature(path); result = TAG_RETURN; } } } TH_POP_TAG(); load_unlock(ftptr, !state); rb_set_safe_level_force(saved.safe); if (state) { /* never TAG_RETURN */ return state; } th->errinfo = errinfo; if (RUBY_DTRACE_REQUIRE_RETURN_ENABLED()) { RUBY_DTRACE_REQUIRE_RETURN(StringValuePtr(fname), rb_sourcefile(), rb_sourceline()); } return result; }
static void error_print(void) { volatile VALUE errat = Qundef; rb_thread_t *th = GET_THREAD(); VALUE errinfo = th->errinfo; int raised_flag = th->raised_flag; volatile VALUE eclass = Qundef, e = Qundef; const char *volatile einfo; volatile long elen; if (NIL_P(errinfo)) return; rb_thread_raised_clear(th); TH_PUSH_TAG(th); if (TH_EXEC_TAG() == 0) { errat = get_backtrace(errinfo); } else if (errat == Qundef) { errat = Qnil; } else if (eclass == Qundef || e != Qundef) { goto error; } else { goto no_message; } if (NIL_P(errat)) { const char *file = rb_sourcefile(); int line = rb_sourceline(); if (!file) warn_printf("%d", line); else if (!line) warn_printf("%s", file); else warn_printf("%s:%d", file, line); } else if (RARRAY_LEN(errat) == 0) { error_pos(); } else { VALUE mesg = RARRAY_AREF(errat, 0); if (NIL_P(mesg)) error_pos(); else { warn_print_str(mesg); } } eclass = CLASS_OF(errinfo); if (eclass != Qundef && (e = rb_check_funcall(errinfo, rb_intern("message"), 0, 0)) != Qundef && (RB_TYPE_P(e, T_STRING) || !NIL_P(e = rb_check_string_type(e)))) { einfo = RSTRING_PTR(e); elen = RSTRING_LEN(e); } else { no_message: einfo = ""; elen = 0; } if (eclass == rb_eRuntimeError && elen == 0) { warn_print(": unhandled exception\n"); } else { VALUE epath; epath = rb_class_name(eclass); if (elen == 0) { warn_print(": "); warn_print_str(epath); warn_print("\n"); } else { char *tail = 0; long len = elen; if (RSTRING_PTR(epath)[0] == '#') epath = 0; if ((tail = memchr(einfo, '\n', elen)) != 0) { len = tail - einfo; tail++; /* skip newline */ } warn_print(": "); warn_print2(einfo, len); if (epath) { warn_print(" ("); warn_print_str(epath); warn_print(")\n"); } if (tail) { warn_print2(tail, elen - len - 1); if (einfo[elen-1] != '\n') warn_print2("\n", 1); } } } if (!NIL_P(errat)) { long i; long len = RARRAY_LEN(errat); int skip = eclass == rb_eSysStackError; #define TRACE_MAX (TRACE_HEAD+TRACE_TAIL+5) #define TRACE_HEAD 8 #define TRACE_TAIL 5 for (i = 1; i < len; i++) { VALUE line = RARRAY_AREF(errat, i); if (RB_TYPE_P(line, T_STRING)) { warn_printf("\tfrom %"PRIsVALUE"\n", line); } if (skip && i == TRACE_HEAD && len > TRACE_MAX) { warn_printf("\t ... %ld levels...\n", len - TRACE_HEAD - TRACE_TAIL); i = len - TRACE_TAIL; } } } error: TH_POP_TAG(); th->errinfo = errinfo; rb_thread_raised_set(th, raised_flag); }
/*RHO static*/ VALUE eval_string_with_cref(VALUE self, VALUE src, VALUE scope, NODE *cref, const char *file, int line) { int state; VALUE result = Qundef; VALUE envval; rb_binding_t *bind = 0; rb_thread_t *th = GET_THREAD(); rb_env_t *env = NULL; rb_block_t block; volatile int parse_in_eval; volatile int mild_compile_error; if (file == 0) { file = rb_sourcefile(); line = rb_sourceline(); } parse_in_eval = th->parse_in_eval; mild_compile_error = th->mild_compile_error; PUSH_TAG(); if ((state = EXEC_TAG()) == 0) { rb_iseq_t *iseq; volatile VALUE iseqval; if (scope != Qnil) { if (rb_obj_is_kind_of(scope, rb_cBinding)) { GetBindingPtr(scope, bind); envval = bind->env; } else { rb_raise(rb_eTypeError, "wrong argument type %s (expected Binding)", rb_obj_classname(scope)); } GetEnvPtr(envval, env); th->base_block = &env->block; } else { rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp); if (cfp != 0) { block = *RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp); th->base_block = █ th->base_block->self = self; th->base_block->iseq = cfp->iseq; /* TODO */ } else { rb_raise(rb_eRuntimeError, "Can't eval on top of Fiber or Thread"); } } //RHO if ( TYPE(src) != T_STRING ){ iseqval = src; }else //RHO { /* make eval iseq */ th->parse_in_eval++; th->mild_compile_error++; iseqval = rb_iseq_compile(src, rb_str_new2(file), INT2FIX(line)); th->mild_compile_error--; th->parse_in_eval--; } vm_set_eval_stack(th, iseqval, cref); th->base_block = 0; if (0) { /* for debug */ printf("%s\n", RSTRING_PTR(rb_iseq_disasm(iseqval))); } /* save new env */ GetISeqPtr(iseqval, iseq); if (bind && iseq->local_size > 0) { bind->env = rb_vm_make_env_object(th, th->cfp); } /* kick */ CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max); result = vm_exec(th); } POP_TAG(); th->mild_compile_error = mild_compile_error; th->parse_in_eval = parse_in_eval; if (state) { if (state == TAG_RAISE) { VALUE errinfo = th->errinfo; if (strcmp(file, "(eval)") == 0) { VALUE mesg, errat, bt2; extern VALUE rb_get_backtrace(VALUE info); ID id_mesg; CONST_ID(id_mesg, "mesg"); errat = rb_get_backtrace(errinfo); mesg = rb_attr_get(errinfo, id_mesg); if (!NIL_P(errat) && TYPE(errat) == T_ARRAY && (bt2 = vm_backtrace(th, -2), RARRAY_LEN(bt2) > 0)) { if (!NIL_P(mesg) && TYPE(mesg) == T_STRING && !RSTRING_LEN(mesg)) { if (OBJ_FROZEN(mesg)) { VALUE m = rb_str_cat(rb_str_dup(RARRAY_PTR(errat)[0]), ": ", 2); rb_ivar_set(errinfo, id_mesg, rb_str_append(m, mesg)); } else { rb_str_update(mesg, 0, 0, rb_str_new2(": ")); rb_str_update(mesg, 0, 0, RARRAY_PTR(errat)[0]); } } RARRAY_PTR(errat)[0] = RARRAY_PTR(bt2)[0]; } } rb_exc_raise(errinfo); } JUMP_TAG(state); } return result; }
static int err_position(char *buf, long len) { return err_position_0(buf, len, rb_sourcefile(), rb_sourceline()); }
static void error_print(void) { volatile VALUE errat = Qnil; /* OK */ VALUE errinfo = GET_THREAD()->errinfo; volatile VALUE eclass, e; const char *volatile einfo; volatile long elen; if (NIL_P(errinfo)) return; PUSH_TAG(); if (EXEC_TAG() == 0) { errat = get_backtrace(errinfo); } else { errat = Qnil; } if (EXEC_TAG()) goto error; if (NIL_P(errat)) { const char *file = rb_sourcefile(); int line = rb_sourceline(); if (!file) warn_printf("%d", line); else if (!line) warn_printf("%s", file); else warn_printf("%s:%d", file, line); } else if (RARRAY_LEN(errat) == 0) { error_pos(); } else { VALUE mesg = RARRAY_PTR(errat)[0]; if (NIL_P(mesg)) error_pos(); else { warn_print2(RSTRING_PTR(mesg), RSTRING_LEN(mesg)); } } eclass = CLASS_OF(errinfo); if (EXEC_TAG() == 0) { e = rb_funcall(errinfo, rb_intern("message"), 0, 0); StringValue(e); einfo = RSTRING_PTR(e); elen = RSTRING_LEN(e); } else { einfo = ""; elen = 0; } if (EXEC_TAG()) goto error; if (eclass == rb_eRuntimeError && elen == 0) { warn_print(": unhandled exception\n"); } else { VALUE epath; epath = rb_class_name(eclass); if (elen == 0) { warn_print(": "); warn_print2(RSTRING_PTR(epath), RSTRING_LEN(epath)); warn_print("\n"); } else { char *tail = 0; long len = elen; if (RSTRING_PTR(epath)[0] == '#') epath = 0; if ((tail = memchr(einfo, '\n', elen)) != 0) { len = tail - einfo; tail++; /* skip newline */ } warn_print(": "); warn_print2(einfo, len); if (epath) { warn_print(" ("); warn_print2(RSTRING_PTR(epath), RSTRING_LEN(epath)); warn_print(")\n"); } if (tail) { warn_print2(tail, elen - len - 1); if (einfo[elen-1] != '\n') warn_print2("\n", 1); } } } if (!NIL_P(errat)) { long i; long len = RARRAY_LEN(errat); VALUE *ptr = RARRAY_PTR(errat); int skip = eclass == rb_eSysStackError; #define TRACE_MAX (TRACE_HEAD+TRACE_TAIL+5) #define TRACE_HEAD 8 #define TRACE_TAIL 5 for (i = 1; i < len; i++) { if (TYPE(ptr[i]) == T_STRING) { warn_printf("\tfrom %s\n", RSTRING_PTR(ptr[i])); } if (skip && i == TRACE_HEAD && len > TRACE_MAX) { warn_printf("\t ... %ld levels...\n", len - TRACE_HEAD - TRACE_TAIL); i = len - TRACE_TAIL; } } } error: POP_TAG(); }
static VALUE util_spec_rb_sourcefile(VALUE self) { return rb_str_new2(rb_sourcefile()); }
static int profiler_source_location(const char **p_srcfile, long *p_line) { #if 0 VALUE thval = rb_thread_current(); rb_thread_t *th = DATA_PTR(thval); rb_control_frame_t *cfp = th->cfp; rb_iseq_t *iseq; const char *srcfile; long line = -1, i, pc; /* find cfp */ while (!RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) { if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) { break; } cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp); } if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) { return 0; } iseq = cfp->iseq; /* find sourcefile */ srcfile = RSTRING_PTR(iseq->filename); if (!srcfile) { return 0; } /* find line */ if (iseq->insn_info_size <= 0) { return 0; } pc = cfp->pc - iseq->iseq_encoded; for (i = 0; i < iseq->insn_info_size; i++) { if (iseq->insn_info_table[i].position == pc) { line = iseq->insn_info_table[i - 1].line_no; break; } } if (line < 0) { line = iseq->insn_info_table[i - 1].line_no; } if (line < 0) { rb_bug("pline_callback_info: should not be reached"); } #else const char *srcfile; long line; srcfile = rb_sourcefile(); if (!srcfile) { return 0; } line = rb_sourceline(); if (line < 0) { return 0; } #endif *p_srcfile = srcfile; *p_line = line; return 1; }