summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-23 19:18:57 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-23 19:18:57 +0000
commit2e081760e3007505ac821869a15ca2922b88b4f9 (patch)
tree22705ae3d1c5bdce7f92e74913094d317d483d6e /marshal.c
parent55849b02bd0c3caba2bda4e6141a528861ea8526 (diff)
merge revision(s) 50057,50065: [Backport #10991]
* marshal.c (r_symreal): register symbol names as strings first so that r_symlink always returns valid names. [ruby-core:68587] [Bug #10991] * marshal.c (r_ivar, r_object0): now need to intern symbol names. * marshal.c (r_object0): compare with symbol names. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@50632 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/marshal.c b/marshal.c
index bd57b1f6db..ab1ab56408 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1298,11 +1298,18 @@ r_bytes0(long len, struct load_arg *arg)
static int
sym2encidx(VALUE sym, VALUE val)
{
- if (sym == ID2SYM(rb_id_encoding())) {
+ static const char name_encoding[8] = "encoding";
+ const char *p;
+ long l;
+ if (rb_enc_get_index(sym) != ENCINDEX_US_ASCII) return -1;
+ RSTRING_GETMEM(sym, p, l);
+ if (l <= 0) return -1;
+ if (l == sizeof(name_encoding) &&
+ memcmp(p, name_encoding, sizeof(name_encoding)) == 0) {
int idx = rb_enc_find_index(StringValueCStr(val));
return idx;
}
- else if (sym == ID2SYM(rb_intern("E"))) {
+ else if (l == 1 && *p == 'E') {
if (val == Qfalse) return rb_usascii_encindex();
else if (val == Qtrue) return rb_utf8_encindex();
/* bogus ignore */
@@ -1330,7 +1337,8 @@ r_symreal(struct load_arg *arg, int ivar)
int idx = -1;
st_index_t n = arg->symbols->num_entries;
- st_insert(arg->symbols, (st_data_t)n, (st_data_t)0);
+ if (rb_enc_str_asciionly_p(s)) rb_enc_associate_index(s, ENCINDEX_US_ASCII);
+ st_insert(arg->symbols, (st_data_t)n, (st_data_t)s);
if (ivar) {
long num = r_long(arg);
while (num-- > 0) {
@@ -1339,10 +1347,8 @@ r_symreal(struct load_arg *arg, int ivar)
}
}
if (idx > 0) rb_enc_associate_index(s, idx);
- sym = rb_str_intern(s);
- st_insert(arg->symbols, (st_data_t)n, (st_data_t)sym);
- return sym;
+ return s;
}
static VALUE
@@ -1370,7 +1376,7 @@ r_symbol(struct load_arg *arg)
static VALUE
r_unique(struct load_arg *arg)
{
- return rb_sym2str(r_symbol(arg));
+ return r_symbol(arg);
}
static VALUE
@@ -1468,7 +1474,7 @@ r_ivar(VALUE obj, int *has_encoding, struct load_arg *arg)
if (has_encoding) *has_encoding = TRUE;
}
else {
- rb_ivar_set(obj, SYM2ID(sym), val);
+ rb_ivar_set(obj, rb_intern_str(sym), val);
}
} while (--len > 0);
}
@@ -1793,13 +1799,13 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
v = r_entry0(v, idx, arg);
values = rb_ary_new2(len);
for (i=0; i<len; i++) {
+ VALUE n = rb_sym2str(RARRAY_AREF(mem, i));
slot = r_symbol(arg);
- if (RARRAY_AREF(mem, i) != slot) {
+ if (!rb_str_equal(n, slot)) {
rb_raise(rb_eTypeError, "struct %"PRIsVALUE" not compatible (:%"PRIsVALUE" for :%"PRIsVALUE")",
rb_class_name(klass),
- rb_sym2str(slot),
- rb_sym2str(RARRAY_AREF(mem, i)));
+ slot, n);
}
rb_ary_push(values, r_object(arg));
arg->readable -= 2;
@@ -1937,11 +1943,12 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
else {
v = r_symreal(arg, 0);
}
+ v = rb_str_intern(v);
v = r_leave(v, arg);
break;
case TYPE_SYMLINK:
- v = r_symlink(arg);
+ v = rb_str_intern(r_symlink(arg));
break;
default: