* 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
This commit is contained in:
parent
b96f428e48
commit
4316e4d99b
@ -1,3 +1,11 @@
|
|||||||
|
Mon Jan 19 08:56:53 2009 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* 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 <nobu@ruby-lang.org>
|
Mon Jan 19 04:06:10 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* iseq.c (rb_iseq_load): renamed from ruby_iseq_load, since it is
|
* iseq.c (rb_iseq_load): renamed from ruby_iseq_load, since it is
|
||||||
|
59
eval.c
59
eval.c
@ -1040,64 +1040,6 @@ errat_setter(VALUE val, ID id, VALUE *var)
|
|||||||
set_backtrace(err, val);
|
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:
|
* call-seq:
|
||||||
* __method__ => symbol
|
* __method__ => symbol
|
||||||
@ -1134,7 +1076,6 @@ Init_eval(void)
|
|||||||
rb_define_global_function("fail", rb_f_raise, -1);
|
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("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("__method__", rb_f_method_name, 0);
|
||||||
rb_define_global_function("__callee__", rb_f_method_name, 0);
|
rb_define_global_function("__callee__", rb_f_method_name, 0);
|
||||||
|
5
vm.c
5
vm.c
@ -373,9 +373,8 @@ collect_local_variables_in_env(rb_env_t * const env, const VALUE ary)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static int
|
||||||
vm_collect_local_variables_in_heap(rb_thread_t * const th,
|
vm_collect_local_variables_in_heap(rb_thread_t *th, VALUE *dfp, VALUE ary)
|
||||||
VALUE * const dfp, const VALUE ary)
|
|
||||||
{
|
{
|
||||||
if (ENV_IN_HEAP_P(th, dfp)) {
|
if (ENV_IN_HEAP_P(th, dfp)) {
|
||||||
rb_env_t *env;
|
rb_env_t *env;
|
||||||
|
58
vm_eval.c
58
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 NODE *vm_cref_push(rb_thread_t *th, VALUE klass, int noex);
|
||||||
static VALUE vm_exec(rb_thread_t *th);
|
static VALUE vm_exec(rb_thread_t *th);
|
||||||
static void vm_set_eval_stack(rb_thread_t * th, VALUE iseqval, const NODE *cref);
|
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
|
static inline VALUE
|
||||||
vm_call0(rb_thread_t * th, VALUE klass, VALUE recv, VALUE id, ID oid,
|
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);
|
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
|
void
|
||||||
Init_vm_eval(void)
|
Init_vm_eval(void)
|
||||||
{
|
{
|
||||||
rb_define_global_function("eval", rb_f_eval, -1);
|
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("catch", rb_f_catch, -1);
|
||||||
rb_define_global_function("throw", rb_f_throw, -1);
|
rb_define_global_function("throw", rb_f_throw, -1);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user