summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--error.c3
-rw-r--r--include/ruby/intern.h17
3 files changed, 24 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 29bfefb8e0..41bd9c2d7e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Oct 24 17:05:51 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/intern.h (rb_check_frozen): optimize.
+ [ruby-core:32878]
+
Sun Oct 24 15:16:30 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/test/unit.rb (Test::Unit::Mini#run): abort if interrupted.
diff --git a/error.c b/error.c
index 3863fb798c..b355cf890c 100644
--- a/error.c
+++ b/error.c
@@ -1589,10 +1589,11 @@ rb_error_frozen(const char *what)
rb_raise(rb_eRuntimeError, "can't modify frozen %s", what);
}
+#undef rb_check_frozen
void
rb_check_frozen(VALUE obj)
{
- if (OBJ_FROZEN(obj)) rb_error_frozen(rb_obj_classname(obj));
+ rb_check_frozen_internal(obj);
}
void
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 3f6f4a2743..b18a1f542b 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -213,6 +213,23 @@ PRINTF_ARGS(void rb_compile_error_append(const char*, ...), 1, 2);
NORETURN(void rb_load_fail(const char*));
NORETURN(void rb_error_frozen(const char*));
void rb_check_frozen(VALUE);
+#define rb_check_frozen_internal(obj) do { \
+ VALUE frozen_obj = (obj); \
+ if (OBJ_FROZEN(frozen_obj)) { \
+ rb_error_frozen(rb_obj_classname(frozen_obj)); \
+ } \
+ } while (0)
+#ifdef __GNUC__
+#define rb_check_frozen(obj) __extension__({rb_check_frozen_internal(obj);})
+#else
+static inline void
+rb_check_frozen_inline(VALUE obj)
+{
+ rb_check_frozen_internal(obj);
+}
+#define rb_check_frozen(obj) rb_check_frozen_inline(obj)
+#endif
+
/* eval.c */
int rb_sourceline(void);
const char *rb_sourcefile(void);