aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--symbol.c3
-rw-r--r--symbol.h9
2 files changed, 10 insertions, 2 deletions
diff --git a/symbol.c b/symbol.c
index b9d41efda9..6512344441 100644
--- a/symbol.c
+++ b/symbol.c
@@ -24,9 +24,7 @@
#define SYMBOL_PINNED_P(sym) (RSYMBOL(sym)->id&~ID_SCOPE_MASK)
-#define DYNAMIC_ID_P(id) (!(id&ID_STATIC_SYM)&&id>tLAST_OP_ID)
#define STATIC_SYM2ID(sym) RSHIFT((unsigned long)(sym), RUBY_SPECIAL_SHIFT)
-#define STATIC_ID2SYM(id) (((VALUE)(id)<<RUBY_SPECIAL_SHIFT)|SYMBOL_FLAG)
static ID register_static_symid(ID, const char *, long, rb_encoding *);
static ID register_static_symid_str(ID, VALUE);
@@ -748,6 +746,7 @@ rb_sym2id(VALUE sym)
return id;
}
+#undef rb_id2sym
VALUE
rb_id2sym(ID x)
{
diff --git a/symbol.h b/symbol.h
index d624a46d20..3e14e02bdb 100644
--- a/symbol.h
+++ b/symbol.h
@@ -14,6 +14,15 @@
#include "id.h"
+#define DYNAMIC_ID_P(id) (!(id&ID_STATIC_SYM)&&id>tLAST_OP_ID)
+#define STATIC_ID2SYM(id) (((VALUE)(id)<<RUBY_SPECIAL_SHIFT)|SYMBOL_FLAG)
+
+#ifdef __GNUC__
+#define rb_id2sym(id) \
+ __extension__(__builtin_constant_p(id) && !DYNAMIC_ID_P(id) ? \
+ STATIC_ID2SYM(id) : rb_id2sym(id))
+#endif
+
struct RSymbol {
struct RBasic basic;
VALUE fstr;