summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2025-02-13 17:53:11 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2025-02-13 17:53:11 -0800
commit698f808cc78b01bc23ff893eaabcc09a454b56ee (patch)
tree5a419b1d9f1282558052bc8437bcad3f3db39fb8
parent82f7cb794109794f6ffa95ffb3be8e5149dd74bd (diff)
merge revision(s) 5fec9308320e8b377681ef19b0cd46d53f94e8ac, 1a06bee027d5c5b65ed0aaee76ee0040554d4efd: [Backport #20992]
[Bug #20992] Test for local variable name encodings Do not intern invalid symbols in eval parse When the inner code cannot represent the name of the locals in the outer code, do not bother putting them into the constant pool as they will not be referenced. Fixes [Bug #20992] Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
-rw-r--r--test/ruby/test_variable.rb7
-rw-r--r--version.h2
-rw-r--r--vm_eval.c10
3 files changed, 18 insertions, 1 deletions
diff --git a/test/ruby/test_variable.rb b/test/ruby/test_variable.rb
index 86f2e4bb84..49fec2d40e 100644
--- a/test/ruby/test_variable.rb
+++ b/test/ruby/test_variable.rb
@@ -425,6 +425,13 @@ class TestVariable < Test::Unit::TestCase
end
end
+ def test_local_variables_encoding
+ α = 1
+ b = binding
+ b.eval("".encode("us-ascii"))
+ assert_equal(%i[α b], b.local_variables)
+ end
+
private
def with_kwargs_11(v1:, v2:, v3:, v4:, v5:, v6:, v7:, v8:, v9:, v10:, v11:)
local_variables
diff --git a/version.h b/version.h
index c7e4308eb8..00e4d7f43f 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 1
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 6
+#define RUBY_PATCHLEVEL 7
#include "ruby/version.h"
#include "ruby/internal/abi.h"
diff --git a/vm_eval.c b/vm_eval.c
index eaf59f41a3..a8c12707ec 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -1690,6 +1690,8 @@ pm_eval_make_iseq(VALUE src, VALUE fname, int line,
// scopes array refer to root nodes on the tree, and higher indexes are the
// leaf nodes.
iseq = parent;
+ rb_encoding *encoding = rb_enc_get(src);
+
for (int scopes_index = 0; scopes_index < scopes_count; scopes_index++) {
VALUE iseq_value = (VALUE)iseq;
int locals_count = ISEQ_BODY(iseq)->local_table_size;
@@ -1711,6 +1713,14 @@ pm_eval_make_iseq(VALUE src, VALUE fname, int line,
continue;
}
+ // Check here if this local can be represented validly in the
+ // encoding of the source string. If it _cannot_, then it should
+ // not be added to the constant pool as it would not be able to
+ // be referenced anyway.
+ if (rb_enc_str_coderange_scan(name_obj, encoding) == ENC_CODERANGE_BROKEN) {
+ continue;
+ }
+
/* We need to duplicate the string because the Ruby string may
* be embedded so compaction could move the string and the pointer
* will change. */