From e52da919872f8cf71c90a27b470cef724204eece Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 12 Feb 2009 10:42:36 +0000 Subject: * compile.c (compile_array_, defined_expr, iseq_compile_each): hide and freeze internal literal objects, to prevent from modifying. [ruby-dev:37959] * iseq.c (insn_operand_intern): copy internal literal objects. * insns.def (putstring, duparray): ditto. * string.c (rb_str_replace): exported. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22255 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- iseq.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'iseq.c') diff --git a/iseq.c b/iseq.c index 967b142425..de0bae7234 100644 --- a/iseq.c +++ b/iseq.c @@ -21,6 +21,8 @@ VALUE rb_cISeq; +#define hidden_obj_p(obj) (!SPECIAL_CONST_P(obj) && !RBASIC(obj)->klass) + static void compile_data_free(struct iseq_compile_data *compile_data) { @@ -699,6 +701,16 @@ insn_operand_intern(rb_iseq_t *iseq, op = ID2SYM(op); case TS_VALUE: /* VALUE */ + if (hidden_obj_p(op)) { + switch (BUILTIN_TYPE(op)) { + case T_STRING: + op = rb_str_replace(rb_str_new(0, 0), op); + break; + case T_ARRAY: + op = rb_ary_replace(rb_ary_new2(0), op); + break; + } + } ret = rb_inspect(op); if (CLASS_OF(op) == rb_cISeq) { rb_ary_push(child, op); -- cgit v1.2.3