From 9eab58ee0381ac804aa1b761a088424bbfc248ad Mon Sep 17 00:00:00 2001 From: akr Date: Fri, 4 Jan 2008 17:21:53 +0000 Subject: [PATCH] * include/ruby/ruby.h (rb_intern): memorize interned ID for constant string, using gcc's __builtin_constant_p and statement expression. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14888 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ include/ruby/ruby.h | 14 ++++++++++++++ parse.y | 1 + 3 files changed, 20 insertions(+) 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 + + * 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 * 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) {