From 671b498070c0fa33fa6afaf4f4672441ae61661a Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 19 Oct 2010 03:25:29 +0000 Subject: Commit miss. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29534 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- array.c | 2 +- ext/readline/readline.c | 131 ------------------------------------------------ gc.c | 4 +- hash.c | 2 +- misc/ruby-mode.el | 8 +-- object.c | 16 ++++-- string.c | 14 ++++-- struct.c | 2 +- transcode.c | 4 +- variable.c | 19 +++++-- vm.c | 5 +- vm_insnhelper.c | 5 +- vm_method.c | 7 ++- 13 files changed, 59 insertions(+), 160 deletions(-) diff --git a/array.c b/array.c index e3c331c833..bbf4c1d4c7 100644 --- a/array.c +++ b/array.c @@ -242,7 +242,7 @@ rb_ary_set_shared(VALUE ary, VALUE shared) static inline void rb_ary_modify_check(VALUE ary) { - rb_check_frozen(ary); + if (OBJ_FROZEN(ary)) rb_error_frozen("array"); if (!OBJ_UNTRUSTED(ary) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't modify array"); } diff --git a/ext/readline/readline.c b/ext/readline/readline.c index 80358debe4..ac88c84f59 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -43,20 +43,10 @@ static VALUE mReadline; #define EDIT_LINE_LIBRARY_VERSION "EditLine wrapper" -#ifndef USE_INSERT_IGNORE_ESCAPE -# ifndef HAVE_EDITLINE_READLINE_H -# define USE_INSERT_IGNORE_ESCAPE 1 -# else -# define USE_INSERT_IGNORE_ESCAPE 0 -# endif -#endif #define COMPLETION_PROC "completion_proc" #define COMPLETION_CASE_FOLD "completion_case_fold" static ID completion_proc, completion_case_fold; -#if USE_INSERT_IGNORE_ESCAPE -static ID id_orig_prompt, id_last_prompt, id_ignore_escape; -#endif #ifndef HAVE_RL_FILENAME_COMPLETION_FUNCTION # define rl_filename_completion_function filename_completion_function @@ -155,81 +145,6 @@ readline_event(void) } #endif -#if USE_INSERT_IGNORE_ESCAPE -static VALUE -insert_ignore_escape(VALUE self, VALUE prompt) -{ - VALUE last_prompt, orig_prompt = rb_attr_get(self, id_orig_prompt); - int ignoring = 0; - const char *s0, *s, *e; - long len; - static const char ignore_code[2] = {RL_PROMPT_START_IGNORE, RL_PROMPT_END_IGNORE}; - - prompt = rb_str_new_shared(prompt); - last_prompt = rb_attr_get(self, id_last_prompt); - if (orig_prompt == prompt) return last_prompt; - len = RSTRING_LEN(prompt); - if (NIL_P(last_prompt)) { - last_prompt = rb_str_tmp_new(len); - } - - s = s0 = RSTRING_PTR(prompt); - e = s0 + len; - rb_str_set_len(last_prompt, 0); - while (s < e && *s) { - switch (*s) { - case RL_PROMPT_START_IGNORE: - ignoring = -1; - rb_str_cat(last_prompt, s0, ++s - s0); - s0 = s; - break; - case RL_PROMPT_END_IGNORE: - ignoring = 0; - rb_str_cat(last_prompt, s0, ++s - s0); - s0 = s; - break; - case '\033': - if (++s < e && *s == '[') { - rb_str_cat(last_prompt, s0, s - s0 - 1); - s0 = s - 1; - while (++s < e && *s) { - if (ISALPHA(*s)) { - if (!ignoring) { - ignoring = 1; - rb_str_cat(last_prompt, ignore_code+0, 1); - } - rb_str_cat(last_prompt, s0, ++s - s0); - s0 = s; - break; - } - else if (!('0' <= *s && *s <= '9' || *s == ';')) { - break; - } - } - } - break; - default: - if (ignoring > 0) { - ignoring = 0; - rb_str_cat(last_prompt, ignore_code+1, 1); - } - s++; - break; - } - } - if (ignoring > 0) { - ignoring = 0; - rb_str_cat(last_prompt, ignore_code+1, 1); - } - rb_str_cat(last_prompt, s0, s - s0); - - rb_ivar_set(self, id_orig_prompt, prompt); - rb_ivar_set(self, id_last_prompt, last_prompt); - - return last_prompt; -} -#endif - static VALUE readline_get(VALUE prompt) { @@ -329,18 +244,10 @@ readline_readline(int argc, VALUE *argv, VALUE self) char *prompt = NULL; char *buff; int status; - int ignore_escape = 0; rb_secure(4); if (rb_scan_args(argc, argv, "02", &tmp, &add_hist) > 0) { OutputStringValue(tmp); -#if USE_INSERT_IGNORE_ESCAPE - ignore_escape = RTEST(rb_attr_get(mReadline, id_ignore_escape)); - if (ignore_escape) { - tmp = insert_ignore_escape(self, tmp); - rb_str_locktmp(tmp); - } -#endif prompt = RSTRING_PTR(tmp); } @@ -350,11 +257,6 @@ readline_readline(int argc, VALUE *argv, VALUE self) rl_prep_terminal(1); #endif buff = (char*)rb_protect(readline_get, (VALUE)prompt, &status); -#if USE_INSERT_IGNORE_ESCAPE - if (prompt && ignore_escape) { - rb_str_unlocktmp(tmp); - } -#endif if (status) { #if defined HAVE_RL_CLEANUP_AFTER_SIGNAL /* restore terminal mode and signal handler*/ @@ -1410,27 +1312,6 @@ username_completion_proc_call(VALUE self, VALUE str) return result; } -static VALUE -readline_s_ignore_escape(VALUE self) -{ -#if USE_INSERT_IGNORE_ESCAPE - return RTEST(rb_attr_get(mReadline, id_ignore_escape)) ? Qtrue : Qfalse; -#elif defined HAVE_EDITLINE_READLINE_H - return Qtrue; -#else - return Qfalse; -#endif -} - -static VALUE -readline_s_ignore_escape_set(VALUE self, VALUE flag) -{ -#if USE_INSERT_IGNORE_ESCAPE - rb_ivar_set(mReadline, id_ignore_escape, RTEST(flag) ? Qtrue : Qfalse); -#endif - return flag; -} - void Init_readline() { @@ -1502,18 +1383,6 @@ Init_readline() rb_define_singleton_method(mReadline, "refresh_line", readline_s_refresh_line, 0); -#if USE_INSERT_IGNORE_ESCAPE - rb_define_singleton_method(mReadline, "ignore_escape", - readline_s_ignore_escape, 0); - rb_define_singleton_method(mReadline, "ignore_escape=", - readline_s_ignore_escape_set, 1); - - CONST_ID(id_orig_prompt, "orig_prompt"); - CONST_ID(id_last_prompt, "last_prompt"); - CONST_ID(id_ignore_escape, "ignore_escape"); - rb_ivar_set(mReadline, id_ignore_escape, Qtrue); -#endif - history = rb_obj_alloc(rb_cObject); rb_extend_object(history, rb_mEnumerable); rb_define_singleton_method(history,"to_s", hist_to_s, 0); diff --git a/gc.c b/gc.c index 99aacdb3d5..b011f4a1c3 100644 --- a/gc.c +++ b/gc.c @@ -2677,7 +2677,7 @@ static VALUE undefine_final(VALUE os, VALUE obj) { rb_objspace_t *objspace = &rb_objspace; - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) rb_error_frozen("object"); if (finalizer_table) { st_data_t data = obj; st_delete(finalizer_table, &data, 0); @@ -2703,7 +2703,7 @@ define_final(int argc, VALUE *argv, VALUE os) st_data_t data; rb_scan_args(argc, argv, "11", &obj, &block); - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) rb_error_frozen("object"); if (argc == 1) { block = rb_block_proc(); } diff --git a/hash.c b/hash.c index 873219a433..0d1898313b 100644 --- a/hash.c +++ b/hash.c @@ -248,7 +248,7 @@ rb_hash_dup(VALUE hash) static void rb_hash_modify_check(VALUE hash) { - rb_check_frozen(hash); + if (OBJ_FROZEN(hash)) rb_error_frozen("hash"); if (!OBJ_UNTRUSTED(hash) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't modify hash"); } diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el index 9a21c485a9..0072f1e0d5 100644 --- a/misc/ruby-mode.el +++ b/misc/ruby-mode.el @@ -451,12 +451,8 @@ The variable ruby-indent-level controls the amount of indentation. (or (eq (char-syntax (char-before (point))) ?w) (ruby-special-char-p)))) nil) - ((and (progn (goto-char start) (eq option 'heredoc)) - (progn (forward-word -1) - (not (and (or (bolp) (not (eq (char-before (point)) ?_))) - (looking-at "class<<"))))) - t) - ((or (progn (goto-char start) (looking-at ruby-operator-re)) + ((and (eq option 'heredoc) (< space 0)) t) + ((or (looking-at ruby-operator-re) (looking-at "[\\[({,;]") (and (looking-at "[!?]") (or (not (eq option 'modifier)) diff --git a/object.c b/object.c index 7eecf49bfc..5ad5680d88 100644 --- a/object.c +++ b/object.c @@ -712,7 +712,9 @@ rb_obj_taint(VALUE obj) { rb_secure(4); if (!OBJ_TAINTED(obj)) { - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) { + rb_error_frozen("object"); + } OBJ_TAINT(obj); } return obj; @@ -731,7 +733,9 @@ rb_obj_untaint(VALUE obj) { rb_secure(3); if (OBJ_TAINTED(obj)) { - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) { + rb_error_frozen("object"); + } FL_UNSET(obj, FL_TAINT); } return obj; @@ -764,7 +768,9 @@ rb_obj_untrust(VALUE obj) { rb_secure(4); if (!OBJ_UNTRUSTED(obj)) { - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) { + rb_error_frozen("object"); + } OBJ_UNTRUST(obj); } return obj; @@ -783,7 +789,9 @@ rb_obj_trust(VALUE obj) { rb_secure(3); if (OBJ_UNTRUSTED(obj)) { - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) { + rb_error_frozen("object"); + } FL_UNSET(obj, FL_UNTRUSTED); } return obj; diff --git a/string.c b/string.c index daabb97a46..efb0481937 100644 --- a/string.c +++ b/string.c @@ -350,6 +350,14 @@ str_mod_check(VALUE s, const char *p, long len) } } +static inline void +str_frozen_check(VALUE s) +{ + if (OBJ_FROZEN(s)) { + rb_raise(rb_eRuntimeError, "string frozen"); + } +} + size_t rb_str_capacity(VALUE str) { @@ -1242,7 +1250,7 @@ str_modifiable(VALUE str) if (FL_TEST(str, STR_TMPLOCK)) { rb_raise(rb_eRuntimeError, "can't modify string; temporarily locked"); } - rb_check_frozen(str); + if (OBJ_FROZEN(str)) rb_error_frozen("string"); if (!OBJ_UNTRUSTED(str) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't modify string"); } @@ -1327,7 +1335,7 @@ void rb_str_associate(VALUE str, VALUE add) { /* sanity check */ - rb_check_frozen(str); + if (OBJ_FROZEN(str)) rb_error_frozen("string"); if (STR_ASSOC_P(str)) { /* already associated */ rb_ary_concat(RSTRING(str)->as.heap.aux.shared, add); @@ -3538,7 +3546,7 @@ rb_str_sub_bang(int argc, VALUE *argv, VALUE str) repl = rb_obj_as_string(repl); } str_mod_check(str, p, len); - rb_check_frozen(str); + str_frozen_check(str); } else { repl = rb_reg_regsub(repl, str, regs, pat); diff --git a/struct.c b/struct.c index 78f836f8f5..f0a377c211 100644 --- a/struct.c +++ b/struct.c @@ -151,7 +151,7 @@ static VALUE (*const ref_func[])(VALUE) = { static void rb_struct_modify(VALUE s) { - rb_check_frozen(s); + if (OBJ_FROZEN(s)) rb_error_frozen("Struct"); if (!OBJ_UNTRUSTED(s) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't modify Struct"); } diff --git a/transcode.c b/transcode.c index cd4829f291..17bad37e27 100644 --- a/transcode.c +++ b/transcode.c @@ -2711,7 +2711,9 @@ str_encode_bang(int argc, VALUE *argv, VALUE str) VALUE newstr; int encidx; - rb_check_frozen(str); + if (OBJ_FROZEN(str)) { /* in future, may use str_frozen_check from string.c, but that's currently static */ + rb_raise(rb_eRuntimeError, "string frozen"); + } newstr = str; encidx = str_transcode(argc, argv, &newstr); diff --git a/variable.c b/variable.c index 46717e73c4..ce5c2b8258 100644 --- a/variable.c +++ b/variable.c @@ -1043,7 +1043,7 @@ rb_ivar_set(VALUE obj, ID id, VALUE val) if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) rb_error_frozen("object"); switch (TYPE(obj)) { case T_OBJECT: iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj); @@ -1305,7 +1305,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name) if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) rb_error_frozen("object"); if (!rb_is_instance_id(id)) { rb_name_error(id, "`%s' is not allowed as an instance variable name", rb_id2name(id)); } @@ -1653,7 +1653,8 @@ rb_const_remove(VALUE mod, ID id) if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't remove constant"); - rb_check_frozen(mod); + if (OBJ_FROZEN(mod)) rb_error_frozen("class/module"); + if (!RCLASS_IV_TBL(mod) || !st_delete(RCLASS_IV_TBL(mod), &n, &v)) { if (rb_const_defined_at(mod, id)) { rb_name_error(id, "cannot remove %s::%s", @@ -1818,7 +1819,14 @@ mod_av_set(VALUE klass, ID id, VALUE val, int isconst) if (!OBJ_UNTRUSTED(klass) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest); - rb_check_frozen(klass); + if (OBJ_FROZEN(klass)) { + if (BUILTIN_TYPE(klass) == T_MODULE) { + rb_error_frozen("module"); + } + else { + rb_error_frozen("class"); + } + } if (!RCLASS_IV_TBL(klass)) { RCLASS_IV_TBL(klass) = st_init_numtable(); } @@ -2067,7 +2075,8 @@ rb_mod_remove_cvar(VALUE mod, VALUE name) } if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't remove class variable"); - rb_check_frozen(mod); + if (OBJ_FROZEN(mod)) rb_error_frozen("class/module"); + if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), &n, &val)) { return (VALUE)val; } diff --git a/vm.c b/vm.c index 27185f6786..084c30964a 100644 --- a/vm.c +++ b/vm.c @@ -1858,7 +1858,10 @@ vm_define_method(rb_thread_t *th, VALUE obj, ID id, VALUE iseqval, rb_id2name(id), rb_obj_classname(obj)); } - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) { + rb_error_frozen("object"); + } + klass = rb_singleton_class(obj); noex = NOEX_PUBLIC; } diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 236b3fd3f5..75e0f91b36 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1298,8 +1298,9 @@ vm_setivar(VALUE obj, ID id, VALUE val, IC ic) if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4) { rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); } - - rb_check_frozen(obj); + if (OBJ_FROZEN(obj)) { + rb_error_frozen("object"); + } if (TYPE(obj) == T_OBJECT) { VALUE klass = RBASIC(obj)->klass; diff --git a/vm_method.c b/vm_method.c index 41c53a5b47..a76277c81d 100644 --- a/vm_method.c +++ b/vm_method.c @@ -211,8 +211,10 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type, rb_class2name(rb_ivar_get(klass, attached))); mid = ID_ALLOCATOR; } + if (OBJ_FROZEN(klass)) { + rb_error_frozen("class/module"); + } - rb_check_frozen(klass); mtbl = RCLASS_M_TBL(klass); /* check re-definition */ @@ -461,7 +463,8 @@ remove_method(VALUE klass, ID mid) if (rb_safe_level() >= 4 && !OBJ_UNTRUSTED(klass)) { rb_raise(rb_eSecurityError, "Insecure: can't remove method"); } - rb_check_frozen(klass); + if (OBJ_FROZEN(klass)) + rb_error_frozen("class/module"); if (mid == object_id || mid == id__send__ || mid == idInitialize) { rb_warn("removing `%s' may cause serious problems", rb_id2name(mid)); } -- cgit v1.2.3