* eval.c: $! should not be writable.
* eval.c (rb_rubylevel_errinfo): added. rb_errinfo() returns rb_threa_t#errinfo. rb_rubylevel_errinfo() returns $! value. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13091 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2e83c555d8
commit
42cf6ee753
@ -1,3 +1,10 @@
|
|||||||
|
Sat Aug 18 13:23:01 2007 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* eval.c: $! should not be writable.
|
||||||
|
|
||||||
|
* eval.c (rb_rubylevel_errinfo): added. rb_errinfo() returns
|
||||||
|
rb_threa_t#errinfo. rb_rubylevel_errinfo() returns $! value.
|
||||||
|
|
||||||
Sat Aug 18 13:14:40 2007 Koichi Sasada <ko1@atdot.net>
|
Sat Aug 18 13:14:40 2007 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* insnhelper.ci (vm_callee_setup_arg): fix to check arguments
|
* insnhelper.ci (vm_callee_setup_arg): fix to check arguments
|
||||||
|
58
eval.c
58
eval.c
@ -2465,8 +2465,8 @@ top_include(int argc, VALUE *argv, VALUE self)
|
|||||||
VALUE rb_f_trace_var();
|
VALUE rb_f_trace_var();
|
||||||
VALUE rb_f_untrace_var();
|
VALUE rb_f_untrace_var();
|
||||||
|
|
||||||
static VALUE
|
static VALUE *
|
||||||
get_errinfo(void)
|
errinfo_place(void)
|
||||||
{
|
{
|
||||||
rb_thread_t *th = GET_THREAD();
|
rb_thread_t *th = GET_THREAD();
|
||||||
rb_control_frame_t *cfp = th->cfp;
|
rb_control_frame_t *cfp = th->cfp;
|
||||||
@ -2475,16 +2475,28 @@ get_errinfo(void)
|
|||||||
while (RUBY_VM_VALID_CONTROL_FRAME_P(cfp, end_cfp)) {
|
while (RUBY_VM_VALID_CONTROL_FRAME_P(cfp, end_cfp)) {
|
||||||
if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
||||||
if (cfp->iseq->type == ISEQ_TYPE_RESCUE) {
|
if (cfp->iseq->type == ISEQ_TYPE_RESCUE) {
|
||||||
return cfp->dfp[-1];
|
return &cfp->dfp[-1];
|
||||||
}
|
}
|
||||||
else if (cfp->iseq->type == ISEQ_TYPE_ENSURE &&
|
else if (cfp->iseq->type == ISEQ_TYPE_ENSURE &&
|
||||||
TYPE(cfp->dfp[-1]) != T_NODE) {
|
TYPE(cfp->dfp[-1]) != T_NODE) {
|
||||||
return cfp->dfp[-1];
|
return &cfp->dfp[-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
||||||
}
|
}
|
||||||
return Qnil;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
get_errinfo(void)
|
||||||
|
{
|
||||||
|
VALUE *ptr = errinfo_place();
|
||||||
|
if (ptr) {
|
||||||
|
return *ptr;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return Qnil;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
@ -2493,12 +2505,7 @@ errinfo_getter(ID id)
|
|||||||
return get_errinfo();
|
return get_errinfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
#if 0
|
||||||
rb_errinfo(void)
|
|
||||||
{
|
|
||||||
return get_errinfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
errinfo_setter(VALUE val, ID id, VALUE *var)
|
errinfo_setter(VALUE val, ID id, VALUE *var)
|
||||||
{
|
{
|
||||||
@ -2506,14 +2513,37 @@ errinfo_setter(VALUE val, ID id, VALUE *var)
|
|||||||
rb_raise(rb_eTypeError, "assigning non-exception to $!");
|
rb_raise(rb_eTypeError, "assigning non-exception to $!");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GET_THREAD()->errinfo = val;
|
VALUE *ptr = errinfo_place();
|
||||||
|
if (ptr) {
|
||||||
|
*ptr = val;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rb_raise(rb_eRuntimeError, "errinfo_setter: not in rescue clause.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
VALUE
|
||||||
|
rb_errinfo(void)
|
||||||
|
{
|
||||||
|
rb_thread_t *th = GET_THREAD();
|
||||||
|
return th->errinfo;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_set_errinfo(VALUE err)
|
rb_set_errinfo(VALUE err)
|
||||||
{
|
{
|
||||||
errinfo_setter(err, 0, 0);
|
if (!NIL_P(err) && !rb_obj_is_kind_of(err, rb_eException)) {
|
||||||
|
rb_raise(rb_eTypeError, "assigning non-exception to $!");
|
||||||
|
}
|
||||||
|
GET_THREAD()->errinfo = err;
|
||||||
|
}
|
||||||
|
|
||||||
|
VALUE
|
||||||
|
rb_rubylevel_errinfo(void)
|
||||||
|
{
|
||||||
|
return get_errinfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
@ -2673,7 +2703,7 @@ Init_eval(void)
|
|||||||
__send_bang = rb_intern("__send!");
|
__send_bang = rb_intern("__send!");
|
||||||
|
|
||||||
rb_define_virtual_variable("$@", errat_getter, errat_setter);
|
rb_define_virtual_variable("$@", errat_getter, errat_setter);
|
||||||
rb_define_virtual_variable("$!", errinfo_getter, errinfo_setter);
|
rb_define_virtual_variable("$!", errinfo_getter, 0);
|
||||||
|
|
||||||
rb_define_global_function("eval", rb_f_eval, -1);
|
rb_define_global_function("eval", rb_f_eval, -1);
|
||||||
rb_define_global_function("iterator?", rb_f_block_given_p, 0);
|
rb_define_global_function("iterator?", rb_f_block_given_p, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user