aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--include/ruby/ruby.h14
-rw-r--r--parse.y1
3 files changed, 20 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 7a03a3cd45..4a5d0bbfe9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Jan 5 02:21:10 2008 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/ruby.h (rb_intern): memorize interned ID for constant
+ string, using gcc's __builtin_constant_p and statement expression.
+
Sat Jan 5 02:14:45 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* string.c (trnext): should enable backslash escape.
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 3f28837281..ecc9bfd923 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -719,6 +719,20 @@ const char *rb_id2name(ID);
ID rb_to_id(VALUE);
VALUE rb_id2str(ID);
+#ifdef __GNUC__
+/* __builtin_constant_p and statement expression is available
+ * since gcc-2.7.2.3 at least. */
+#define rb_intern(str) \
+ (__builtin_constant_p(str) ? \
+ ({ \
+ static ID rb_intern_id_cache; \
+ if (!rb_intern_id_cache) \
+ rb_intern_id_cache = rb_intern(str); \
+ rb_intern_id_cache; \
+ }) : \
+ rb_intern(str))
+#endif
+
char *rb_class2name(VALUE);
char *rb_obj_classname(VALUE);
diff --git a/parse.y b/parse.y
index 3ccebbc328..767ffbf1ad 100644
--- a/parse.y
+++ b/parse.y
@@ -9001,6 +9001,7 @@ rb_intern2(const char *name, long len)
return rb_intern3(name, len, rb_enc_from_index(0));
}
+#undef rb_intern
ID
rb_intern(const char *name)
{