summaryrefslogtreecommitdiff
path: root/include/ruby
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-09 09:25:32 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-09 09:25:32 +0000
commit5a647a3f5fd011f8558c7f9e90cd65e70e73eb40 (patch)
tree294dcb47e83e5480b1fa992aba8a4b4025c8a626 /include/ruby
parent250dd0702111d5c2086f007b1b31ecc1e36ade40 (diff)
* include/ruby/ruby.h (CONST_ID): constant ID cache for non-gcc.
* *.c: no cache in init functions. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17053 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'include/ruby')
-rw-r--r--include/ruby/ruby.h16
1 files changed, 10 insertions, 6 deletions
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 614a6145b3..99321f1933 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -764,17 +764,21 @@ const char *rb_id2name(ID);
ID rb_to_id(VALUE);
VALUE rb_id2str(ID);
+#define CONST_ID_CACHE(result, str) \
+ ({ \
+ static ID rb_intern_id_cache; \
+ if (!rb_intern_id_cache) \
+ rb_intern_id_cache = (rb_intern)(str); \
+ result rb_intern_id_cache; \
+ })
+#define CONST_ID(var, str) \
+ do {CONST_ID_CACHE(var =, str);} while (0)
#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; \
- }) : \
+ CONST_ID_CACHE(/**/, str) : \
rb_intern(str))
#endif