aboutsummaryrefslogtreecommitdiffstats
path: root/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y20
1 files changed, 18 insertions, 2 deletions
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)
{