diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-11-07 02:45:08 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-11-07 02:45:08 +0000 |
commit | 1e2dcdbd19005e147a754dcd72d1d27dcbeed1ce (patch) | |
tree | 40dc7c4116dac01ea25ed295ec7194e791fc5e7e /eval.c | |
parent | 35da6fdcf1103df9f0dcdd57cb2f913f4c593740 (diff) | |
download | ruby-1e2dcdbd19005e147a754dcd72d1d27dcbeed1ce.tar.gz |
* vm_insnhelper.c (vm_push_frame): add CHECK_STACK_OVERFLOW.
[ruby-dev:39592]
* eval.c (rb_longjmp): add 1 level backtrace for sysstack_error
without calling any method to prevent further stack overflow.
* eval.c (make_exception): don't call #exception for
sysstack_error to prevent stack overflow.
* proc.c (Init_Proc): don't freeze sysstack_error.
* eval.c (rb_longjmp): move reentrant check after exception
preparation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25680 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 31 |
1 files changed, 19 insertions, 12 deletions
@@ -358,12 +358,6 @@ rb_longjmp(int tag, volatile VALUE mesg) const char *file; volatile int line = 0; - if (rb_threadptr_set_raised(th)) { - th->errinfo = exception_error; - rb_threadptr_reset_raised(th); - JUMP_TAG(TAG_FATAL); - } - if (NIL_P(mesg)) mesg = th->errinfo; if (NIL_P(mesg)) { @@ -373,13 +367,19 @@ rb_longjmp(int tag, volatile VALUE mesg) file = rb_sourcefile(); if (file) line = rb_sourceline(); if (file && !NIL_P(mesg)) { - at = get_backtrace(mesg); - if (NIL_P(at)) { - at = rb_make_backtrace(); - if (OBJ_FROZEN(mesg)) { - mesg = rb_obj_dup(mesg); + if (mesg == sysstack_error) { + at = rb_enc_sprintf(rb_usascii_encoding(), "%s:%d", file, line); + rb_iv_set(mesg, "bt", at); + } + else { + at = get_backtrace(mesg); + if (NIL_P(at)) { + at = rb_make_backtrace(); + if (OBJ_FROZEN(mesg)) { + mesg = rb_obj_dup(mesg); + } + set_backtrace(mesg, at); } - set_backtrace(mesg, at); } } if (!NIL_P(mesg)) { @@ -414,6 +414,12 @@ rb_longjmp(int tag, volatile VALUE mesg) } } + if (rb_threadptr_set_raised(th)) { + th->errinfo = exception_error; + rb_threadptr_reset_raised(th); + JUMP_TAG(TAG_FATAL); + } + rb_trap_restore_mask(); if (tag != TAG_FATAL) { @@ -520,6 +526,7 @@ make_exception(int argc, VALUE *argv, int isstr) case 3: n = 1; exception_call: + if (argv[0] == sysstack_error) return argv[0]; CONST_ID(exception, "exception"); mesg = rb_check_funcall(argv[0], exception, n, argv+1); if (mesg == Qundef) { |