From f58eb1e276a2db3ff2062c80a7acf97860aca8ca Mon Sep 17 00:00:00 2001 From: ko1 Date: Sun, 24 Jun 2007 20:33:04 +0000 Subject: [PATCH] * eval.c: remove ruby_current_node and change eval() prototype. fix to use rb_sourcefile/line() instead of ruby_sourcefile/line. * error.c, eval_error.ci, eval_load.c, eval_safe.ci, gc.c, include/ruby/intern.h, parse.y, process.c, ruby.c: ditto. * vm.c: fix spaces. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12608 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++ error.c | 5 +--- eval.c | 59 +++++++------------------------------------ eval_error.ci | 47 ++++++++++++++++++++++++++++------ eval_intern.h | 3 --- eval_load.c | 6 +---- eval_safe.ci | 3 ++- gc.c | 6 ++--- include/ruby/intern.h | 3 +++ parse.y | 1 - process.c | 2 +- ruby.c | 5 ---- vm.c | 1 + 13 files changed, 69 insertions(+), 82 deletions(-) diff --git a/ChangeLog b/ChangeLog index e37a928220..f2f7247e40 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Mon Jun 25 05:27:54 2007 Koichi Sasada + + * eval.c: remove ruby_current_node and change eval() prototype. + fix to use rb_sourcefile/line() instead of ruby_sourcefile/line. + + * error.c, eval_error.ci, eval_load.c, eval_safe.ci, gc.c, + include/ruby/intern.h, parse.y, process.c, ruby.c: ditto. + + * vm.c: fix spaces. + Mon Jun 25 04:20:14 2007 Koichi Sasada * eval_*.h: rename to eval_*.ci. diff --git a/error.c b/error.c index 6b5aac0126..d2b5a0ef71 100644 --- a/error.c +++ b/error.c @@ -26,9 +26,6 @@ extern const char ruby_version[], ruby_release_date[], ruby_platform[]; int ruby_nerrs; -const char *rb_sourcefile(void); -int rb_sourceline(void); - static int err_position_0(char *buf, long len, const char *file, long line) { @@ -52,7 +49,7 @@ err_position(char *buf, long len) static int compile_position(char *buf, long len) { - return err_position_0(buf, len, ruby_sourcefile, ruby_sourceline); + return err_position_0(buf, len, rb_sourcefile(), rb_sourceline()); } static void diff --git a/eval.c b/eval.c index e156c9c263..56a71f22a2 100644 --- a/eval.c +++ b/eval.c @@ -22,8 +22,6 @@ VALUE rb_f_block_given_p(void); ID rb_frame_callee(void); static VALUE rb_frame_self(void); -NODE *ruby_current_node; - static ID removed, singleton_removed, undefined, singleton_undefined; static ID init, eqq, each, aref, aset, match, missing; static ID added, singleton_added; @@ -35,7 +33,7 @@ VALUE rb_eSysStackError; extern int ruby_nerrs; extern VALUE ruby_top_self; -static VALUE eval(VALUE, VALUE, VALUE, char *, int); +static VALUE eval(VALUE, VALUE, VALUE, const char *, int); static inline VALUE rb_yield_0(int argc, VALUE *argv); static VALUE rb_call(VALUE, VALUE, ID, int, const VALUE *, int); @@ -270,15 +268,7 @@ ruby_run(void) VALUE rb_eval_string(const char *str) { - VALUE v; - NODE *oldsrc = ruby_current_node; - - ruby_current_node = 0; - ruby_sourcefile = rb_source_filename("(eval)"); - v = eval(ruby_top_self, rb_str_new2(str), Qnil, 0, 0); - ruby_current_node = oldsrc; - - return v; + return eval(ruby_top_self, rb_str_new2(str), Qnil, "(eval)", 0); } VALUE @@ -324,14 +314,13 @@ rb_eval_cmd(VALUE cmd, VALUE arg, int level) if (OBJ_TAINTED(cmd)) { level = 4; } - if (TYPE(cmd) != T_STRING) { + if (TYPE(cmd) != T_STRING) { PUSH_TAG(); rb_set_safe_level_force(level); if ((state = EXEC_TAG()) == 0) { - val = - rb_funcall2(cmd, rb_intern("call"), RARRAY_LEN(arg), - RARRAY_PTR(arg)); + val = rb_funcall2(cmd, rb_intern("call"), RARRAY_LEN(arg), + RARRAY_PTR(arg)); } POP_TAG(); @@ -712,7 +701,7 @@ rb_longjmp(int tag, VALUE mesg) e = rb_obj_as_string(e); warn_printf("Exception `%s' at %s:%d - %s\n", rb_obj_classname(GET_THREAD()->errinfo), - ruby_sourcefile, ruby_sourceline, RSTRING_PTR(e)); + rb_sourcefile(), rb_sourceline(), RSTRING_PTR(e)); } POP_TAG(); if (status == TAG_FATAL && GET_THREAD()->errinfo == exception_error) { @@ -1295,7 +1284,6 @@ rb_method_missing(int argc, const VALUE *argv, VALUE obj) ID id; VALUE exc = rb_eNoMethodError; char *format = 0; - NODE *cnode = ruby_current_node; rb_thread_t *th = GET_THREAD(); int last_call_status = th->method_missing_reason; if (argc == 0 || !SYMBOL_P(argv[0])) { @@ -1323,7 +1311,6 @@ rb_method_missing(int argc, const VALUE *argv, VALUE obj) format = "undefined method `%s' for %s"; } - ruby_current_node = cnode; { int n = 0; VALUE args[3]; @@ -1667,36 +1654,8 @@ rb_frame_self(void) return GET_THREAD()->cfp->self; } -const char * -rb_sourcefile(void) -{ - rb_thread_t *th = GET_THREAD(); - rb_control_frame_t *cfp = vm_get_ruby_level_cfp(th, th->cfp); - - if (cfp) { - return RSTRING_PTR(cfp->iseq->filename); - } - else { - return ""; - } -} - -int -rb_sourceline(void) -{ - rb_thread_t *th = GET_THREAD(); - rb_control_frame_t *cfp = vm_get_ruby_level_cfp(th, th->cfp); - - if (cfp) { - return vm_get_sourceline(cfp); - } - else { - return 0; - } -} - static VALUE -eval(VALUE self, VALUE src, VALUE scope, char *file, int line) +eval(VALUE self, VALUE src, VALUE scope, const char *file, int line) { int state; VALUE result = Qundef; @@ -1707,8 +1666,8 @@ eval(VALUE self, VALUE src, VALUE scope, char *file, int line) NODE *stored_cref_stack = 0; if (file == 0) { - file = ruby_sourcefile; - line = ruby_sourceline; + file = rb_sourcefile(); + line = rb_sourceline(); } PUSH_TAG(); diff --git a/eval_error.ci b/eval_error.ci index 63428991f3..d719953f2d 100644 --- a/eval_error.ci +++ b/eval_error.ci @@ -2,6 +2,34 @@ * included by eval.c */ +const char * +rb_sourcefile(void) +{ + rb_thread_t *th = GET_THREAD(); + rb_control_frame_t *cfp = vm_get_ruby_level_cfp(th, th->cfp); + + if (cfp) { + return RSTRING_PTR(cfp->iseq->filename); + } + else { + return 0; + } +} + +int +rb_sourceline(void) +{ + rb_thread_t *th = GET_THREAD(); + rb_control_frame_t *cfp = vm_get_ruby_level_cfp(th, th->cfp); + + if (cfp) { + return vm_get_sourceline(cfp); + } + else { + return 0; + } +} + static void warn_printf(const char *fmt, ...) { @@ -20,16 +48,19 @@ warn_printf(const char *fmt, ...) static void error_pos(void) { - if (ruby_sourcefile) { - if (ruby_sourceline == 0) { - warn_printf("%s", ruby_sourcefile); + 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'", ruby_sourcefile, ruby_sourceline, + warn_printf("%s:%d:in `%s'", sourcefile, sourceline, rb_id2name(rb_frame_callee())); } else { - warn_printf("%s:%d", ruby_sourcefile, ruby_sourceline); + warn_printf("%s:%d", sourcefile, sourceline); } } } @@ -72,10 +103,10 @@ error_print(void) if (EXEC_TAG()) goto error; if (NIL_P(errat)) { - if (ruby_sourcefile) - warn_printf("%s:%d", ruby_sourcefile, ruby_sourceline); + if (rb_sourcefile()) + warn_printf("%s:%d", rb_sourcefile(), rb_sourceline()); else - warn_printf("%d", ruby_sourceline); + warn_printf("%d", rb_sourceline()); } else if (RARRAY_LEN(errat) == 0) { error_pos(); diff --git a/eval_intern.h b/eval_intern.h index a18fe59420..11e2255fac 100644 --- a/eval_intern.h +++ b/eval_intern.h @@ -183,9 +183,6 @@ extern VALUE sysstack_error; void rb_thread_cleanup _((void)); void rb_thread_wait_other_threads _((void)); -int rb_sourceline(void); -const char *rb_sourcefile(void); - int thread_set_raised(rb_thread_t *th); int thread_reset_raised(rb_thread_t *th); diff --git a/eval_load.c b/eval_load.c index c71880292c..49a4afaa8c 100644 --- a/eval_load.c +++ b/eval_load.c @@ -423,13 +423,11 @@ rb_require_safe(VALUE fname, int safe) volatile VALUE errinfo = th->errinfo; int state; struct { - NODE *node; int safe; } volatile saved; char *volatile ftptr = 0; PUSH_TAG(); - saved.node = ruby_current_node; saved.safe = rb_safe_level(); if ((state = EXEC_TAG()) == 0) { VALUE path; @@ -452,7 +450,6 @@ rb_require_safe(VALUE fname, int safe) break; case 's': - ruby_current_node = 0; ruby_sourcefile = rb_source_filename(RSTRING_PTR(path)); ruby_sourceline = 0; handle = (long)rb_vm_call_cfunc(ruby_top_self, load_ext, @@ -468,7 +465,6 @@ rb_require_safe(VALUE fname, int safe) POP_TAG(); load_unlock(ftptr); - ruby_current_node = saved.node; rb_set_safe_level_force(saved.safe); if (state) { JUMP_TAG(state); @@ -502,9 +498,9 @@ init_ext_call(VALUE arg) void ruby_init_ext(const char *name, void (*init)(void)) { - ruby_current_node = 0; ruby_sourcefile = rb_source_filename(name); ruby_sourceline = 0; + if (load_lock(name)) { rb_vm_call_cfunc(ruby_top_self, init_ext_call, (VALUE)init, 0, rb_str_new2(name)); rb_provide(name); diff --git a/eval_safe.ci b/eval_safe.ci index aef5767da9..2c8d8de328 100644 --- a/eval_safe.ci +++ b/eval_safe.ci @@ -12,6 +12,8 @@ #define SAFE_LEVEL_MAX 4 +/* $SAFE accessor */ + int rb_safe_level(void) { @@ -24,7 +26,6 @@ rb_set_safe_level_force(int safe) GET_THREAD()->safe_level = safe; } -/* $SAFE accessor */ void rb_set_safe_level(int level) { diff --git a/gc.c b/gc.c index bb37b1ee55..60124b7a02 100644 --- a/gc.c +++ b/gc.c @@ -475,8 +475,8 @@ rb_newobj_from_heap(void) MEMZERO((void*)obj, RVALUE, 1); #ifdef GC_DEBUG - RANY(obj)->file = ruby_sourcefile; - RANY(obj)->line = ruby_sourceline; + RANY(obj)->file = rb_sourcefile(); + RANY(obj)->line = rb_sourceline(); #endif return obj; } @@ -1376,8 +1376,6 @@ garbage_collect(void) init_mark_stack(); - gc_mark((VALUE)ruby_current_node, 0); - th->vm->self ? rb_gc_mark(th->vm->self) : rb_vm_mark(th->vm); if (finalizer_table) { diff --git a/include/ruby/intern.h b/include/ruby/intern.h index 05c7643914..9c597f0f64 100644 --- a/include/ruby/intern.h +++ b/include/ruby/intern.h @@ -173,6 +173,9 @@ NORETURN(void rb_load_fail(const char*)); NORETURN(void rb_error_frozen(const char*)); void rb_check_frozen(VALUE); /* eval.c */ +int rb_sourceline(void); +const char *rb_sourcefile(void); + #if defined(NFDBITS) && defined(HAVE_RB_FD_INIT) typedef struct { int maxfd; diff --git a/parse.y b/parse.y index 0738ed20e0..bc60a39be8 100644 --- a/parse.y +++ b/parse.y @@ -4622,7 +4622,6 @@ yycompile(struct parser_params *parser, const char *f, int line) } kcode_save = rb_get_kcode(); - ruby_current_node = 0; ruby_sourcefile = rb_source_filename(f); ruby_sourceline = line - 1; parser_prepare(parser); diff --git a/process.c b/process.c index 854ab47b9c..5e564611b7 100644 --- a/process.c +++ b/process.c @@ -1295,7 +1295,7 @@ rb_exec(const struct rb_exec_arg *e) #ifndef FD_CLOEXEC preserving_errno({ fprintf(stderr, "%s:%d: command not found: %s\n", - ruby_sourcefile, ruby_sourceline, prog); + rb_sourcefile(), rb_sourceline(), prog); }); #endif return -1; diff --git a/ruby.c b/ruby.c index 449df7a1e3..218be310ee 100644 --- a/ruby.c +++ b/ruby.c @@ -373,14 +373,11 @@ require_libraries(void) save[0] = ruby_eval_tree; save[1] = NEW_BEGIN(0); ruby_eval_tree = 0; - ruby_current_node = 0; Init_ext(); /* should be called here for some reason :-( */ - ruby_current_node = save[1]; req_list_last = 0; while (list) { int state; - ruby_current_node = 0; rb_protect((VALUE (*)(VALUE))rb_require, (VALUE)list->name, &state); if (state) rb_jump_tag(state); @@ -388,12 +385,10 @@ require_libraries(void) free(list->name); free(list); list = tmp; - ruby_current_node = save[1]; } req_list_head.next = 0; ruby_eval_tree = save[0]; rb_gc_force_recycle((VALUE)save[1]); - ruby_current_node = 0; } static void diff --git a/vm.c b/vm.c index d1b9cb79a1..687f30e93a 100644 --- a/vm.c +++ b/vm.c @@ -1501,6 +1501,7 @@ rb_vm_call_cfunc(VALUE recv, VALUE (*func)(VALUE), VALUE arg, rb_block_t *blockp vm_push_frame(th, DATA_PTR(iseq), FRAME_MAGIC_TOP, recv, (VALUE)blockptr, 0, reg_cfp->sp, 0, 1); val = (*func)(arg); + vm_pop_frame(th); return val; }