From f323e7f6df2f47a9cccc30d43c9d91c95ff8a453 Mon Sep 17 00:00:00 2001 From: Herwin Date: Sun, 23 Jun 2024 19:09:48 +0200 Subject: [PATCH 1/2] Refres specs of language/for --- spec/language/for_spec.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spec/language/for_spec.rb b/spec/language/for_spec.rb index 5fc8a21cf..ad5f5527e 100644 --- a/spec/language/for_spec.rb +++ b/spec/language/for_spec.rb @@ -104,6 +104,18 @@ class OFor end end + it "allows a global variable as an iterator name" do + old_global_var = $var + m = [1,2,3] + n = 0 + for $var in m + n += 1 + end + $var.should == 3 + n.should == 3 + $var = old_global_var + end + # 1.9 behaviour verified by nobu in # http://redmine.ruby-lang.org/issues/show/2053 it "yields only as many values as there are arguments" do From ae5ea1933a3e6120838ed9436a86f56906f03e76 Mon Sep 17 00:00:00 2001 From: Herwin Date: Sun, 23 Jun 2024 19:12:17 +0200 Subject: [PATCH 2/2] Support global variable target in for loop --- lib/natalie/compiler/args.rb | 7 +++++++ lib/natalie/compiler/pass1.rb | 1 + 2 files changed, 8 insertions(+) diff --git a/lib/natalie/compiler/args.rb b/lib/natalie/compiler/args.rb index 5574451e4..c492564d8 100644 --- a/lib/natalie/compiler/args.rb +++ b/lib/natalie/compiler/args.rb @@ -50,6 +50,8 @@ def transform_arg(arg) transform_instance_variable_arg(arg) when ::Prism::ClassVariableTargetNode transform_class_variable_arg(arg) + when ::Prism::GlobalVariableTargetNode + transform_global_variable_arg(arg) when ::Prism::ConstantTargetNode transform_constant_arg(arg) when ::Prism::RequiredParameterNode @@ -174,6 +176,11 @@ def transform_class_variable_arg(arg) @instructions << ClassVariableSetInstruction.new(arg.name) end + def transform_global_variable_arg(arg) + @instructions << ArrayShiftInstruction.new + @instructions << GlobalVariableSetInstruction.new(arg.name) + end + def transform_constant_arg(arg) @instructions << ArrayShiftInstruction.new @instructions << PushSelfInstruction.new diff --git a/lib/natalie/compiler/pass1.rb b/lib/natalie/compiler/pass1.rb index 94dfbb73e..38deb3b4c 100644 --- a/lib/natalie/compiler/pass1.rb +++ b/lib/natalie/compiler/pass1.rb @@ -2671,6 +2671,7 @@ def maximum_arg_count(args) %i[ class_variable_target_node constant_target_node + global_variable_target_node instance_variable_target_node local_variable_target_node multi_target_node