From 4316e4d99b856fcd16a2aa0f08cb6285dcab24af Mon Sep 17 00:00:00 2001 From: ko1 Date: Mon, 19 Jan 2009 00:13:44 +0000 Subject: * eval.c, vm_eval.c (rb_f_local_variables): move definition from eval.c to vm_eval.c because vm_collect_local_variables_in_heap() should be static function. * vm.c (vm_collect_local_variables_in_heap): make it static. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ eval.c | 59 ----------------------------------------------------------- vm.c | 5 ++--- vm_eval.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 62 deletions(-) diff --git a/ChangeLog b/ChangeLog index 996b9c6bf5..4593b2adbf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Mon Jan 19 08:56:53 2009 Koichi Sasada + + * eval.c, vm_eval.c (rb_f_local_variables): move definition from eval.c + to vm_eval.c because vm_collect_local_variables_in_heap() should + be static function. + + * vm.c (vm_collect_local_variables_in_heap): make it static. + Mon Jan 19 04:06:10 2009 Nobuyoshi Nakada * iseq.c (rb_iseq_load): renamed from ruby_iseq_load, since it is diff --git a/eval.c b/eval.c index 5c0ede4786..0cd873d0ee 100644 --- a/eval.c +++ b/eval.c @@ -1040,64 +1040,6 @@ errat_setter(VALUE val, ID id, VALUE *var) set_backtrace(err, val); } -int vm_collect_local_variables_in_heap(rb_thread_t *th, VALUE *dfp, VALUE ary); - -/* - * call-seq: - * local_variables => array - * - * Returns the names of the current local variables. - * - * fred = 1 - * for i in 1..10 - * # ... - * end - * local_variables #=> ["fred", "i"] - */ - -static VALUE -rb_f_local_variables(void) -{ - VALUE ary = rb_ary_new(); - rb_thread_t *th = GET_THREAD(); - rb_control_frame_t *cfp = - vm_get_ruby_level_caller_cfp(th, RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp)); - int i; - - while (cfp) { - if (cfp->iseq) { - for (i = 0; i < cfp->iseq->local_table_size; i++) { - ID lid = cfp->iseq->local_table[i]; - if (lid) { - const char *vname = rb_id2name(lid); - /* should skip temporary variable */ - if (vname) { - rb_ary_push(ary, ID2SYM(lid)); - } - } - } - } - if (cfp->lfp != cfp->dfp) { - /* block */ - VALUE *dfp = GC_GUARDED_PTR_REF(cfp->dfp[0]); - - if (vm_collect_local_variables_in_heap(th, dfp, ary)) { - break; - } - else { - while (cfp->dfp != dfp) { - cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp); - } - } - } - else { - break; - } - } - return ary; -} - - /* * call-seq: * __method__ => symbol @@ -1134,7 +1076,6 @@ Init_eval(void) rb_define_global_function("fail", rb_f_raise, -1); rb_define_global_function("global_variables", rb_f_global_variables, 0); /* in variable.c */ - rb_define_global_function("local_variables", rb_f_local_variables, 0); rb_define_global_function("__method__", rb_f_method_name, 0); rb_define_global_function("__callee__", rb_f_method_name, 0); diff --git a/vm.c b/vm.c index 8f33a8952a..55a2c84b4a 100644 --- a/vm.c +++ b/vm.c @@ -373,9 +373,8 @@ collect_local_variables_in_env(rb_env_t * const env, const VALUE ary) return 0; } -int -vm_collect_local_variables_in_heap(rb_thread_t * const th, - VALUE * const dfp, const VALUE ary) +static int +vm_collect_local_variables_in_heap(rb_thread_t *th, VALUE *dfp, VALUE ary) { if (ENV_IN_HEAP_P(th, dfp)) { rb_env_t *env; diff --git a/vm_eval.c b/vm_eval.c index 449e097797..53ec3ac18d 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -19,6 +19,7 @@ static inline VALUE vm_backtrace(rb_thread_t *th, int lev); static NODE *vm_cref_push(rb_thread_t *th, VALUE klass, int noex); static VALUE vm_exec(rb_thread_t *th); static void vm_set_eval_stack(rb_thread_t * th, VALUE iseqval, const NODE *cref); +static int vm_collect_local_variables_in_heap(rb_thread_t *th, VALUE *dfp, VALUE ary); static inline VALUE vm_call0(rb_thread_t * th, VALUE klass, VALUE recv, VALUE id, ID oid, @@ -1322,10 +1323,67 @@ rb_make_backtrace(void) return vm_backtrace(GET_THREAD(), -1); } +/* + * call-seq: + * local_variables => array + * + * Returns the names of the current local variables. + * + * fred = 1 + * for i in 1..10 + * # ... + * end + * local_variables #=> ["fred", "i"] + */ + +static VALUE +rb_f_local_variables(void) +{ + VALUE ary = rb_ary_new(); + rb_thread_t *th = GET_THREAD(); + rb_control_frame_t *cfp = + vm_get_ruby_level_caller_cfp(th, RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp)); + int i; + + while (cfp) { + if (cfp->iseq) { + for (i = 0; i < cfp->iseq->local_table_size; i++) { + ID lid = cfp->iseq->local_table[i]; + if (lid) { + const char *vname = rb_id2name(lid); + /* should skip temporary variable */ + if (vname) { + rb_ary_push(ary, ID2SYM(lid)); + } + } + } + } + if (cfp->lfp != cfp->dfp) { + /* block */ + VALUE *dfp = GC_GUARDED_PTR_REF(cfp->dfp[0]); + + if (vm_collect_local_variables_in_heap(th, dfp, ary)) { + break; + } + else { + while (cfp->dfp != dfp) { + cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp); + } + } + } + else { + break; + } + } + return ary; +} + void Init_vm_eval(void) { rb_define_global_function("eval", rb_f_eval, -1); + rb_define_global_function("local_variables", rb_f_local_variables, 0); + rb_define_global_function("catch", rb_f_catch, -1); rb_define_global_function("throw", rb_f_throw, -1); -- cgit v1.2.3