summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-17 07:26:45 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-17 07:26:45 +0000
commite2fd80b3d3b7f8ca7ffc2e7286fdb59e0c44bc79 (patch)
tree58bc2b44f4aed3cb90f5a1b45ea6ef25aff4ec52 /include
parent18f0a65018dd357a1815941618d3cf9f274e6239 (diff)
* error.c (rb_check_trusted): new function to check an object is
trusted. * struct.c (rb_struct_modify), time.c (time_modify): check by the above function to show proper class names. [Bug #5036] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32569 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'include')
-rw-r--r--include/ruby/intern.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index da1c036740..41a41ea757 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -215,15 +215,24 @@ PRINTF_ARGS(void rb_compile_error_with_enc(const char*, int, void *, const char*
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_error_untrusted(VALUE);
void rb_check_frozen(VALUE);
+void rb_check_trusted(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)
+#define rb_check_trusted_internal(obj) do { \
+ VALUE untrusted_obj = (obj); \
+ if (!OBJ_UNTRUSTED(untrusted_obj)) { \
+ rb_error_untrusted(untrusted_obj); \
+ } \
+ } while (0)
#ifdef __GNUC__
#define rb_check_frozen(obj) __extension__({rb_check_frozen_internal(obj);})
+#define rb_check_trusted(obj) __extension__({rb_check_trusted_internal(obj);})
#else
static inline void
rb_check_frozen_inline(VALUE obj)
@@ -231,6 +240,12 @@ rb_check_frozen_inline(VALUE obj)
rb_check_frozen_internal(obj);
}
#define rb_check_frozen(obj) rb_check_frozen_inline(obj)
+static inline void
+rb_check_trusted_inline(VALUE obj)
+{
+ rb_check_trusted_internal(obj);
+}
+#define rb_check_trusted(obj) rb_check_trusted_inline(obj)
#endif
/* eval.c */