зеркало из https://github.com/github/ruby.git
vm_eval.c: exclude hidden variables
* vm_eval.c (rb_f_local_variables): exclude variables hidden by shadowing. [ruby-core:60501] [Bug #9486] * vm.c (collect_local_variables_in_iseq): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45850 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
c8dbc43de6
Коммит
11eb870136
|
@ -1,3 +1,10 @@
|
|||
Wed May 7 11:25:41 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* vm_eval.c (rb_f_local_variables): exclude variables hidden by
|
||||
shadowing. [ruby-core:60501] [Bug #9486]
|
||||
|
||||
* vm.c (collect_local_variables_in_iseq): ditto.
|
||||
|
||||
Tue May 6 23:29:05 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* parse.y (new_bv_gen): no duplicated names, if already added in
|
||||
|
|
|
@ -86,13 +86,13 @@ class TestVariable < Test::Unit::TestCase
|
|||
def test_shadowing_local_variables
|
||||
bug9486 = '[ruby-core:60501] [Bug #9486]'
|
||||
x = tap {|x| break local_variables}
|
||||
assert_equal([:x, :bug9486, :x], x)
|
||||
assert_equal([:x, :bug9486], x)
|
||||
end
|
||||
|
||||
def test_shadowing_block_local_variables
|
||||
bug9486 = '[ruby-core:60501] [Bug #9486]'
|
||||
x = tap {|;x| break local_variables}
|
||||
assert_equal([:x, :bug9486, :x], x)
|
||||
assert_equal([:x, :bug9486], x)
|
||||
end
|
||||
|
||||
def local_variables_of(bind)
|
||||
|
|
2
vm.c
2
vm.c
|
@ -523,7 +523,7 @@ collect_local_variables_in_iseq(rb_iseq_t *iseq, const VALUE vars)
|
|||
for (i = 0; i < iseq->local_table_size; i++) {
|
||||
ID lid = iseq->local_table[i];
|
||||
if (rb_is_local_id(lid)) {
|
||||
rb_ary_push(vars, ID2SYM(lid));
|
||||
rb_hash_aset(vars, ID2SYM(lid), Qtrue);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
|
|
@ -1886,7 +1886,7 @@ rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, int *stateptr)
|
|||
static VALUE
|
||||
rb_f_local_variables(void)
|
||||
{
|
||||
VALUE vars = rb_ary_new();
|
||||
VALUE vars = rb_hash_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));
|
||||
|
@ -1900,7 +1900,7 @@ rb_f_local_variables(void)
|
|||
const char *vname = rb_id2name(lid);
|
||||
/* should skip temporary variable */
|
||||
if (vname) {
|
||||
rb_ary_push(vars, ID2SYM(lid));
|
||||
rb_hash_aset(vars, ID2SYM(lid), Qtrue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1922,7 +1922,9 @@ rb_f_local_variables(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
return vars;
|
||||
/* TODO: rb_hash_keys() directly, or something not to depend on
|
||||
* the order of st_table */
|
||||
return rb_funcallv(vars, rb_intern("keys"), 0, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче