aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--internal.h1
-rw-r--r--marshal.c2
-rw-r--r--pack.c2
-rw-r--r--parse.y20
-rw-r--r--test/ruby/test_marshal.rb5
6 files changed, 36 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 3cd217118c..685299c348 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Wed Feb 5 20:56:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (to_be_skipped_id): ignore anonymous attributes.
+
+ * pack.c (Init_pack): use anonymous ID so that associated objects
+ do not appear in the packed result.
+
+ * parse.y (rb_make_internal_id): return an anonymous ID for
+ internal use.
+
Wed Feb 5 14:41:56 2014 Koichi Sasada <ko1@atdot.net>
* vsnprintf.c: remove duplicated def of `UNINITIALIZED_VAR()'.
diff --git a/internal.h b/internal.h
index a057b20ab0..c27ebb7da4 100644
--- a/internal.h
+++ b/internal.h
@@ -642,6 +642,7 @@ int rb_is_method_name(VALUE name);
int rb_is_junk_name(VALUE name);
void rb_gc_mark_parser(void);
void rb_gc_mark_symbols(int full_mark);
+ID rb_make_internal_id(void);
/* proc.c */
VALUE rb_proc_location(VALUE self);
diff --git a/marshal.c b/marshal.c
index 239c29aa9e..4a1b55e873 100644
--- a/marshal.c
+++ b/marshal.c
@@ -513,7 +513,7 @@ w_uclass(VALUE obj, VALUE super, struct dump_arg *arg)
}
}
-#define to_be_skipped_id(id) (id == rb_id_encoding() || id == rb_intern("E"))
+#define to_be_skipped_id(id) (id == rb_id_encoding() || id == rb_intern("E") || !rb_id2str(id))
static int
w_obj_each(st_data_t key, st_data_t val, st_data_t a)
diff --git a/pack.c b/pack.c
index 6e515b2140..82ef4f1c71 100644
--- a/pack.c
+++ b/pack.c
@@ -2046,5 +2046,5 @@ Init_pack(void)
rb_define_method(rb_cArray, "pack", pack_pack, 1);
rb_define_method(rb_cString, "unpack", pack_unpack, 1);
- id_associated = rb_intern_const("__pack_associated__");
+ id_associated = rb_make_internal_id();
}
diff --git a/parse.y b/parse.y
index 54b4c07da2..f03f62147e 100644
--- a/parse.y
+++ b/parse.y
@@ -10408,6 +10408,15 @@ rb_intern3(const char *name, long len, rb_encoding *enc)
}
static ID
+next_id_base(void)
+{
+ if (global_symbols.last_id >= ~(ID)0 >> (ID_SCOPE_SHIFT+RUBY_SPECIAL_SHIFT)) {
+ return (ID)-1;
+ }
+ return ++global_symbols.last_id << ID_SCOPE_SHIFT;
+}
+
+static ID
intern_str(VALUE str)
{
const char *name, *m, *e;
@@ -10415,6 +10424,7 @@ intern_str(VALUE str)
rb_encoding *enc, *symenc;
unsigned char c;
ID id;
+ ID nid;
int mb;
RSTRING_GETMEM(str, name, len);
@@ -10505,7 +10515,7 @@ intern_str(VALUE str)
if (sym_check_asciionly(str)) symenc = rb_usascii_encoding();
new_id:
if (symenc != enc) rb_enc_associate(str, symenc);
- if (global_symbols.last_id >= ~(ID)0 >> (ID_SCOPE_SHIFT+RUBY_SPECIAL_SHIFT)) {
+ if ((nid = next_id_base()) == (ID)-1) {
if (len > 20) {
rb_raise(rb_eRuntimeError, "symbol table overflow (symbol %.20s...)",
name);
@@ -10515,7 +10525,7 @@ intern_str(VALUE str)
(int)len, name);
}
}
- id |= ++global_symbols.last_id << ID_SCOPE_SHIFT;
+ id |= nid;
id_register:
return register_symid_str(id, str);
}
@@ -10622,6 +10632,12 @@ rb_id2name(ID id)
return RSTRING_PTR(str);
}
+ID
+rb_make_internal_id(void)
+{
+ return next_id_base() | ID_INTERNAL;
+}
+
static int
symbols_i(VALUE sym, ID value, VALUE ary)
{
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 126efc8ae6..2c5b2aa765 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -595,4 +595,9 @@ class TestMarshal < Test::Unit::TestCase
Marshal.dump(TestForRespondToFalse.new)
end
end
+
+ def test_packed_string
+ packed = ["foo"].pack("p")
+ assert_equal(Marshal.dump(""+packed), Marshal.dump(packed))
+ end
end