mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* eval.c (eval): do not re-raise exception to avoid unnecessary
exception copying, instead modify exception and internal information to adjust eval(). * eval.c (backtrace): can return the current frame information only if lev < -1. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4962 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
abbffef10c
commit
8eb537a88a
3 changed files with 79 additions and 51 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
Sun Nov 16 04:41:33 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* eval.c (eval): do not re-raise exception to avoid unnecessary
|
||||||
|
exception copying, instead modify exception and internal
|
||||||
|
information to adjust eval().
|
||||||
|
|
||||||
|
* eval.c (backtrace): can return the current frame information
|
||||||
|
only if lev < -1.
|
||||||
|
|
||||||
Sat Nov 15 22:16:42 2003 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
Sat Nov 15 22:16:42 2003 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
||||||
|
|
||||||
* /ext/openssl/ossl_x509ext.c (ossl_x509extfactory_create_ext):
|
* /ext/openssl/ossl_x509ext.c (ossl_x509extfactory_create_ext):
|
||||||
|
|
3
error.c
3
error.c
|
@ -479,8 +479,9 @@ name_err_initialize(argc, argv, self)
|
||||||
VALUE *argv;
|
VALUE *argv;
|
||||||
VALUE self;
|
VALUE self;
|
||||||
{
|
{
|
||||||
VALUE name = (argc > 1) ? argv[--argc] : Qnil;
|
VALUE name;
|
||||||
|
|
||||||
|
name = (argc > 1) ? argv[--argc] : Qnil;
|
||||||
exc_initialize(argc, argv, self);
|
exc_initialize(argc, argv, self);
|
||||||
rb_iv_set(self, "name", name);
|
rb_iv_set(self, "name", name);
|
||||||
return self;
|
return self;
|
||||||
|
|
118
eval.c
118
eval.c
|
@ -1328,7 +1328,6 @@ void rb_exec_end_proc _((void));
|
||||||
static void
|
static void
|
||||||
ruby_finalize_0()
|
ruby_finalize_0()
|
||||||
{
|
{
|
||||||
ruby_errinfo = 0;
|
|
||||||
PUSH_TAG(PROT_NONE);
|
PUSH_TAG(PROT_NONE);
|
||||||
if (EXEC_TAG() == 0) {
|
if (EXEC_TAG() == 0) {
|
||||||
rb_trap_exit();
|
rb_trap_exit();
|
||||||
|
@ -4719,6 +4718,58 @@ static int last_call_status;
|
||||||
#define CSTAT_VCALL 4
|
#define CSTAT_VCALL 4
|
||||||
#define CSTAT_SUPER 8
|
#define CSTAT_SUPER 8
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
name_err_to_s(exc)
|
||||||
|
VALUE exc;
|
||||||
|
{
|
||||||
|
VALUE mesg = rb_attr_get(exc, rb_intern("mesg"));
|
||||||
|
ID id_recv = rb_intern("recv");
|
||||||
|
|
||||||
|
if (NIL_P(mesg)) return rb_class_path(CLASS_OF(exc));
|
||||||
|
if (rb_ivar_defined(exc, id_recv)) {
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
char *desc = "";
|
||||||
|
volatile VALUE d = 0;
|
||||||
|
int noclass;
|
||||||
|
VALUE obj = rb_ivar_get(exc, id_recv);
|
||||||
|
int state;
|
||||||
|
|
||||||
|
switch (TYPE(obj)) {
|
||||||
|
case T_NIL:
|
||||||
|
desc = "nil";
|
||||||
|
break;
|
||||||
|
case T_TRUE:
|
||||||
|
desc = "true";
|
||||||
|
break;
|
||||||
|
case T_FALSE:
|
||||||
|
desc = "false";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PUSH_TAG(PROT_NONE);
|
||||||
|
if ((state = EXEC_TAG()) == 0) {
|
||||||
|
d = rb_inspect(obj);
|
||||||
|
}
|
||||||
|
POP_TAG();
|
||||||
|
if (!d || RSTRING(d)->len > 65) {
|
||||||
|
d = rb_any_to_s(obj);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (d) {
|
||||||
|
desc = RSTRING(d)->ptr;
|
||||||
|
}
|
||||||
|
noclass = (!desc || desc[0]=='#');
|
||||||
|
snprintf(buf, BUFSIZ, RSTRING(mesg)->ptr, desc,
|
||||||
|
noclass ? "" : ":",
|
||||||
|
noclass ? "" : rb_obj_classname(obj));
|
||||||
|
mesg = rb_str_new2(buf);
|
||||||
|
rb_iv_set(exc, "mesg", mesg);
|
||||||
|
st_delete(ROBJECT(exc)->iv_tbl, (st_data_t*)&id_recv, 0);
|
||||||
|
}
|
||||||
|
if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
|
||||||
|
return mesg;
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
rb_method_missing(argc, argv, obj)
|
rb_method_missing(argc, argv, obj)
|
||||||
int argc;
|
int argc;
|
||||||
|
@ -4727,11 +4778,8 @@ rb_method_missing(argc, argv, obj)
|
||||||
{
|
{
|
||||||
ID id;
|
ID id;
|
||||||
VALUE exc = rb_eNoMethodError;
|
VALUE exc = rb_eNoMethodError;
|
||||||
volatile VALUE d = 0;
|
|
||||||
char *format = 0;
|
char *format = 0;
|
||||||
char *desc = "";
|
|
||||||
NODE *cnode = ruby_current_node;
|
NODE *cnode = ruby_current_node;
|
||||||
int state;
|
|
||||||
|
|
||||||
if (argc == 0 || !SYMBOL_P(argv[0])) {
|
if (argc == 0 || !SYMBOL_P(argv[0])) {
|
||||||
rb_raise(rb_eArgError, "no id given");
|
rb_raise(rb_eArgError, "no id given");
|
||||||
|
@ -4741,64 +4789,37 @@ rb_method_missing(argc, argv, obj)
|
||||||
|
|
||||||
id = SYM2ID(argv[0]);
|
id = SYM2ID(argv[0]);
|
||||||
|
|
||||||
switch (TYPE(obj)) {
|
|
||||||
case T_NIL:
|
|
||||||
desc = "nil";
|
|
||||||
break;
|
|
||||||
case T_TRUE:
|
|
||||||
desc = "true";
|
|
||||||
break;
|
|
||||||
case T_FALSE:
|
|
||||||
desc = "false";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
PUSH_TAG(PROT_NONE);
|
|
||||||
if ((state = EXEC_TAG()) == 0) {
|
|
||||||
d = rb_inspect(obj);
|
|
||||||
}
|
|
||||||
POP_TAG();
|
|
||||||
if (!d || RSTRING(d)->len > 65) {
|
|
||||||
d = rb_any_to_s(obj);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (d) {
|
|
||||||
desc = RSTRING(d)->ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (last_call_status & CSTAT_PRIV) {
|
if (last_call_status & CSTAT_PRIV) {
|
||||||
format = "private method `%s' called for %s%s%s";
|
format = "private method `%s' called for %%s%%s%%s";
|
||||||
}
|
}
|
||||||
else if (last_call_status & CSTAT_PROT) {
|
else if (last_call_status & CSTAT_PROT) {
|
||||||
format = "protected method `%s' called for %s%s%s";
|
format = "protected method `%s' called for %%s%%s%%s";
|
||||||
}
|
}
|
||||||
else if (last_call_status & CSTAT_VCALL) {
|
else if (last_call_status & CSTAT_VCALL) {
|
||||||
format = "undefined local variable or method `%s' for %s%s%s";
|
format = "undefined local variable or method `%s' for %%s%%s%%s";
|
||||||
exc = rb_eNameError;
|
exc = rb_eNameError;
|
||||||
}
|
}
|
||||||
else if (last_call_status & CSTAT_SUPER) {
|
else if (last_call_status & CSTAT_SUPER) {
|
||||||
format = "super: no superclass method `%s'";
|
format = "super: no superclass method `%s'";
|
||||||
}
|
}
|
||||||
if (!format) {
|
if (!format) {
|
||||||
format = "undefined method `%s' for %s%s%s";
|
format = "undefined method `%s' for %%s%%s%%s";
|
||||||
}
|
}
|
||||||
|
|
||||||
ruby_current_node = cnode;
|
ruby_current_node = cnode;
|
||||||
{
|
{
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
int noclass = (!desc || desc[0]=='#');
|
|
||||||
int n = 0;
|
int n = 0;
|
||||||
VALUE args[3];
|
VALUE args[3];
|
||||||
|
|
||||||
snprintf(buf, BUFSIZ, format, rb_id2name(id),
|
snprintf(buf, BUFSIZ, format, rb_id2name(id));
|
||||||
desc, noclass ? "" : ":",
|
|
||||||
noclass ? "" : rb_obj_classname(obj));
|
|
||||||
args[n++] = rb_str_new2(buf);
|
args[n++] = rb_str_new2(buf);
|
||||||
args[n++] = argv[0];
|
args[n++] = argv[0];
|
||||||
if (exc == rb_eNoMethodError) {
|
if (exc == rb_eNoMethodError) {
|
||||||
args[n++] = rb_ary_new4(argc-1, argv+1);
|
args[n++] = rb_ary_new4(argc-1, argv+1);
|
||||||
}
|
}
|
||||||
exc = rb_class_new_instance(n, args, exc);
|
exc = rb_class_new_instance(n, args, exc);
|
||||||
|
rb_iv_set(exc, "recv", obj);
|
||||||
ruby_frame = ruby_frame->prev; /* pop frame for "method_missing" */
|
ruby_frame = ruby_frame->prev; /* pop frame for "method_missing" */
|
||||||
rb_exc_raise(exc);
|
rb_exc_raise(exc);
|
||||||
}
|
}
|
||||||
|
@ -5357,6 +5378,7 @@ backtrace(lev)
|
||||||
snprintf(buf, BUFSIZ, "%s:%d", ruby_sourcefile, ruby_sourceline);
|
snprintf(buf, BUFSIZ, "%s:%d", ruby_sourcefile, ruby_sourceline);
|
||||||
}
|
}
|
||||||
rb_ary_push(ary, rb_str_new2(buf));
|
rb_ary_push(ary, rb_str_new2(buf));
|
||||||
|
if (lev < -1) return ary;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
while (lev-- > 0) {
|
while (lev-- > 0) {
|
||||||
|
@ -5557,20 +5579,13 @@ eval(self, src, scope, file, line)
|
||||||
ruby_set_current_source();
|
ruby_set_current_source();
|
||||||
if (state) {
|
if (state) {
|
||||||
if (state == TAG_RAISE) {
|
if (state == TAG_RAISE) {
|
||||||
VALUE err, errat, mesg;
|
|
||||||
|
|
||||||
mesg = rb_obj_as_string(ruby_errinfo);
|
|
||||||
if (strcmp(file, "(eval)") == 0) {
|
if (strcmp(file, "(eval)") == 0) {
|
||||||
if (ruby_sourceline > 1) {
|
VALUE mesg, errat;
|
||||||
errat = get_backtrace(ruby_errinfo);
|
|
||||||
err = rb_str_dup(RARRAY(errat)->ptr[0]);
|
errat = get_backtrace(ruby_errinfo);
|
||||||
rb_str_cat2(err, ": ");
|
mesg = rb_obj_as_string(ruby_errinfo);
|
||||||
rb_str_append(err, mesg);
|
rb_str_update(mesg, 0, 0, RARRAY(errat)->ptr[0]);
|
||||||
}
|
RARRAY(errat)->ptr[0] = RARRAY(backtrace(-2))->ptr[0];
|
||||||
else {
|
|
||||||
err = mesg;
|
|
||||||
}
|
|
||||||
rb_exc_raise(rb_funcall(ruby_errinfo, rb_intern("exception"), 1, err));
|
|
||||||
}
|
}
|
||||||
rb_exc_raise(ruby_errinfo);
|
rb_exc_raise(ruby_errinfo);
|
||||||
}
|
}
|
||||||
|
@ -6757,6 +6772,9 @@ Init_load()
|
||||||
|
|
||||||
ruby_dln_librefs = rb_ary_new();
|
ruby_dln_librefs = rb_ary_new();
|
||||||
rb_global_variable(&ruby_dln_librefs);
|
rb_global_variable(&ruby_dln_librefs);
|
||||||
|
|
||||||
|
/* not really a right place */
|
||||||
|
rb_define_method(rb_eNameError, "to_s", name_err_to_s, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue