summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-09-21 08:12:12 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-09-21 08:12:12 +0000
commitf331b5584edbf106ab85f4663ddbe55031176b3a (patch)
tree78722938bfbba9b6f78af757d2d05c7402eb6325 /vm.c
parent3a7c1e25c4f88d6cdfc6c9978aa6811dc548119b (diff)
* proc.c (proc_binding): allow proc from method. [ruby-core:25589]
* vm.c (collect_local_variables_in_env): block iseq can be NULL. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25015 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/vm.c b/vm.c
index 4254fd94bb..5866f63a1d 100644
--- a/vm.c
+++ b/vm.c
@@ -381,19 +381,26 @@ vm_make_env_each(rb_thread_t * const th, rb_control_frame_t * const cfp,
}
static int
-collect_local_variables_in_env(rb_env_t * const env, const VALUE ary)
+collect_local_variables_in_iseq(rb_iseq_t *iseq, const VALUE ary)
{
int i;
- for (i = 0; i < env->block.iseq->local_table_size; i++) {
- ID lid = env->block.iseq->local_table[i];
+ if (!iseq) return 0;
+ for (i = 0; i < iseq->local_table_size; i++) {
+ ID lid = iseq->local_table[i];
if (rb_is_local_id(lid)) {
rb_ary_push(ary, ID2SYM(lid));
}
}
- if (env->prev_envval) {
- rb_env_t *prevenv;
- GetEnvPtr(env->prev_envval, prevenv);
- collect_local_variables_in_env(prevenv, ary);
+ return 1;
+}
+
+static int
+collect_local_variables_in_env(rb_env_t * env, const VALUE ary)
+{
+
+ while (collect_local_variables_in_iseq(env->block.iseq, ary),
+ env->prev_envval) {
+ GetEnvPtr(env->prev_envval, env);
}
return 0;
}