зеркало из https://github.com/github/ruby.git
* 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:
Родитель
b96f428e48
Коммит
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>
|
||||
|
||||
* 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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
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 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);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче