diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-24 08:05:55 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-24 08:05:55 +0000 |
commit | 58d3597e743967bb4c486b108e7dcd0db5c3efca (patch) | |
tree | 7b4d73bd0d9206ffdd2c658d926ddb760d285b3c | |
parent | 5383964f98659ea0cd371d77b9ed97f46702e591 (diff) |
* include/ruby/intern.h (rb_check_frozen): optimize.
[ruby-core:32878]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29582 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | error.c | 3 | ||||
-rw-r--r-- | include/ruby/intern.h | 17 |
3 files changed, 24 insertions, 1 deletions
@@ -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. @@ -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); |