diff options
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 10 |
1 files changed, 10 insertions, 0 deletions
@@ -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. */ |