diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-02-05 11:56:35 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-02-05 11:56:35 +0000 |
commit | b2b5a5db0925f94220897813a552aa7d4ec2fd11 (patch) | |
tree | 9911a7cd10125ca0d9fcafc9d0c2c7e444abcc4a /parse.y | |
parent | 5ba39a12d9273d37b0da9af7a388d0792e3894ef (diff) | |
download | ruby-b2b5a5db0925f94220897813a552aa7d4ec2fd11.tar.gz |
pack.c: hide associated objects
* 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.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44840 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 20 |
1 files changed, 18 insertions, 2 deletions
@@ -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) { |