summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--error.c2
-rw-r--r--include/ruby/intern.h6
3 files changed, 12 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 5f6305cf6a..e869d9a8ec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Mon Jun 1 10:41:41 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/intern.h (rb_exc_new2): optimization for literal.
+
Mon Jun 1 07:20:02 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/bigdecimal/bigdecimal.c (BigDecimal_to_f): returns Inf if
diff --git a/error.c b/error.c
index 07a72a9a94..bfa3a950db 100644
--- a/error.c
+++ b/error.c
@@ -348,6 +348,8 @@ VALUE rb_eSystemCallError;
VALUE rb_mErrno;
static VALUE rb_eNOERROR;
+#undef rb_exc_new2
+
VALUE
rb_exc_new(VALUE etype, const char *ptr, long len)
{
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index ec6527fc3a..08229f589d 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -693,6 +693,12 @@ size_t rb_str_capacity(VALUE);
rb_str_cat(str, ptr, strlen(ptr)) : \
rb_str_cat2(str, ptr); \
})
+#define rb_exc_new2(klass, ptr) __extension__ ( \
+{ \
+ (__builtin_constant_p(ptr)) ? \
+ rb_exc_new(klass, ptr, strlen(ptr)) : \
+ rb_exc_new2(klass, ptr); \
+})
#endif
#define rb_str_new2 rb_str_new_cstr
#define rb_str_new3 rb_str_new_shared