summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-06 07:25:47 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-06 07:25:47 +0000
commit4b4ac8ac64ffaa6de94ac254ce1c6aea2b743269 (patch)
tree79e3a39aaa9c62c351cc73036d865e1f85176e73
parent473f3eed13690987a2437623c6837a0f965f95f1 (diff)
merge revision(s) 23096:
* eval.c (rb_eval): checks for interrupt, stack and finalizers too. [ruby-dev:38208], [Bug #1329] * eval.c (eval): replaces the message if frozen. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@23972 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--eval.c34
-rw-r--r--version.h8
3 files changed, 36 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 7c42bd8b87..9f73a79404 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Jul 6 16:01:38 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (rb_eval): checks for interrupt, stack and finalizers too.
+ [ruby-dev:38208], [Bug #1329]
+
+ * eval.c (eval): replaces the message if frozen.
+
Sun Jul 5 03:50:52 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/test/unit.rb: use Kernel.exit to get rid of using
diff --git a/eval.c b/eval.c
index 55e34c21ae..6bb34f3857 100644
--- a/eval.c
+++ b/eval.c
@@ -233,6 +233,7 @@ static VALUE rb_f_binding _((VALUE));
static void rb_f_END _((void));
static VALUE rb_f_block_given_p _((void));
static VALUE block_pass _((VALUE,NODE*));
+static void eval_check_tick _((void));
VALUE rb_cMethod;
static VALUE method_call _((int, VALUE*, VALUE));
@@ -2962,6 +2963,7 @@ rb_eval(self, n)
goto finish; \
} while (0)
+ eval_check_tick();
again:
if (!node) RETURN(Qnil);
@@ -5612,6 +5614,17 @@ stack_check()
}
}
+static void
+eval_check_tick()
+{
+ static int tick;
+ if ((++tick & 0xff) == 0) {
+ CHECK_INTS; /* better than nothing */
+ stack_check();
+ rb_gc_finalize_deferred();
+ }
+}
+
static int last_call_status;
#define CSTAT_PRIV 1
@@ -5843,7 +5856,6 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
NODE *b2; /* OK */
volatile VALUE result = Qnil;
int itr;
- static int tick;
TMP_PROTECT;
volatile int safe = -1;
@@ -5862,11 +5874,7 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
break;
}
- if ((++tick & 0xff) == 0) {
- CHECK_INTS; /* better than nothing */
- stack_check();
- rb_gc_finalize_deferred();
- }
+ eval_check_tick();
if (argc < 0) {
VALUE tmp;
VALUE *nargv;
@@ -6601,14 +6609,22 @@ eval(self, src, scope, file, line)
if (state == TAG_RAISE) {
if (strcmp(file, "(eval)") == 0) {
VALUE mesg, errat, bt2;
+ ID id_mesg;
+ id_mesg = rb_intern("mesg");
errat = get_backtrace(ruby_errinfo);
- mesg = rb_attr_get(ruby_errinfo, rb_intern("mesg"));
+ mesg = rb_attr_get(ruby_errinfo, id_mesg);
if (!NIL_P(errat) && TYPE(errat) == T_ARRAY &&
(bt2 = backtrace(-2), RARRAY_LEN(bt2) > 0)) {
if (!NIL_P(mesg) && TYPE(mesg) == T_STRING) {
- rb_str_update(mesg, 0, 0, rb_str_new2(": "));
- rb_str_update(mesg, 0, 0, RARRAY_PTR(errat)[0]);
+ if (OBJ_FROZEN(mesg)) {
+ VALUE m = rb_str_cat(rb_str_dup(RARRAY_PTR(errat)[0]), ": ", 2);
+ rb_ivar_set(ruby_errinfo, id_mesg, rb_str_append(m, mesg));
+ }
+ else {
+ rb_str_update(mesg, 0, 0, rb_str_new2(": "));
+ rb_str_update(mesg, 0, 0, RARRAY_PTR(errat)[0]);
+ }
}
RARRAY_PTR(errat)[0] = RARRAY_PTR(bt2)[0];
}
diff --git a/version.h b/version.h
index f4e28ee446..6f152bf4a3 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
#define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2009-07-05"
+#define RUBY_RELEASE_DATE "2009-07-06"
#define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20090705
-#define RUBY_PATCHLEVEL 178
+#define RUBY_RELEASE_CODE 20090706
+#define RUBY_PATCHLEVEL 179
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 8
#define RUBY_VERSION_TEENY 7
#define RUBY_RELEASE_YEAR 2009
#define RUBY_RELEASE_MONTH 7
-#define RUBY_RELEASE_DAY 5
+#define RUBY_RELEASE_DAY 6
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];