summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c10
1 files changed, 10 insertions, 0 deletions
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. */