diff --git a/kernel/compiler/local.rb b/kernel/compiler/local.rb
index 5fb6394..2c605f4 100644
@@ -11,6 +11,7 @@ class Compiler
@names = []
@locals = Hash.new { |h,k| h[k] = Local.new(@scope, k) }
@from_eval = false
+ @skip = false
end
attr_accessor :from_eval
@@ -66,6 +67,14 @@ class Compiler
return tup
end
+ def skip?
+ @skip
+ end
+
+ def skip!
+ @skip = true
+ end
+
attr_reader :locals
attr_accessor :scope
end
diff --git a/kernel/compiler/nodes.rb b/kernel/compiler/nodes.rb
index 05a72bc..e17043e 100644
@@ -634,7 +634,7 @@ raise "no"
dep = 0
@block_scope.reverse_each do |scope|
- if scope.key?(name)
+ if !scope.skip? && scope.key?(name)
if scope.from_eval
depth = dep + 1
else
@@ -655,14 +655,20 @@ raise "no"
return nil
else
# This not found. create it.
- in_scope = @block_scope.last
+ depth = 0
+ in_scope = @top_scope
+ @block_scope.reverse_each do |scope|
+ if !scope.skip?
+ in_scope = scope
+ break
+ end
+ depth += 1
+ end
idx = in_scope.size
lcl = in_scope[name]
lcl.created_in_block!(idx)
if in_scope.from_eval
- depth = 1
- else
- depth = 0
+ depth += 1
end
end
end
@@ -687,6 +693,10 @@ raise "no"
def module_body?
false
end
+
+ def skip!
+ @block_scope.last.skip!
+ end
end
# Example: m(1, *a)
@@ -1170,6 +1180,8 @@ raise "no"
set(:iter) do
@locals = get(:scope).new_block_scope do
+ get(:scope).skip!
+
set(:iter_args) do
sexp[1] = convert(s(:iter_args, sexp[1])) # local var assignment
end
diff --git a/spec/tags/frozen/language/for_tags.txt b/spec/tags/frozen/language/for_tags.txt
index 060b4f9..c033480 100644
@@ -1,3 +1 @@
-fails:The for expression executes code in containing variable scope
-fails:The for expression executes code in containing variable scope with 'do'
fails:The for expression repeats the loop from the beginning with 'retry'