diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-11-29 06:09:40 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-11-29 06:09:40 +0000 |
commit | 83cb605d69f20be5fe842a913e51d017f61cdc44 (patch) | |
tree | b227250a931f8465854064c4860265d76a1974c9 /eval.c | |
parent | 6e221605373ff89fd52d08d5df86cfb0bd805de7 (diff) | |
download | ruby-83cb605d69f20be5fe842a913e51d017f61cdc44.tar.gz |
* object.c (convert_type): [ruby-core:03845]
* eval.c (rb_funcall_rescue): new function.
* object.c (rb_Array): avoid using rb_respond_to().
* object.c (rb_Integer): ditto.
* eval.c (get_backtrace): no conversion for nil.
* parse.y (reduce_nodes): empty body should return nil.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7413 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 69 |
1 files changed, 57 insertions, 12 deletions
@@ -1079,7 +1079,9 @@ get_backtrace(info) VALUE info; { if (NIL_P(info)) return Qnil; - return rb_check_array_type(rb_funcall(info, rb_intern("backtrace"), 0)); + info = rb_funcall(info, rb_intern("backtrace"), 0); + if (NIL_P(info)) return Qnil; + return rb_check_array_type(info); } static void @@ -5799,18 +5801,13 @@ rb_f_send(argc, argv, recv) return vid; } -VALUE -#ifdef HAVE_STDARG_PROTOTYPES -rb_funcall(VALUE recv, ID mid, int n, ...) -#else -rb_funcall(recv, mid, n, va_alist) +static VALUE +vafuncall(recv, mid, n, ar) VALUE recv; ID mid; int n; - va_dcl -#endif + va_list *ar; { - va_list ar; VALUE *argv; if (n > 0) { @@ -5818,11 +5815,10 @@ rb_funcall(recv, mid, n, va_alist) argv = ALLOCA_N(VALUE, n); - va_init_list(ar, n); for (i=0;i<n;i++) { - argv[i] = va_arg(ar, VALUE); + argv[i] = va_arg(*ar, VALUE); } - va_end(ar); + va_end(*ar); } else { argv = 0; @@ -5832,6 +5828,55 @@ rb_funcall(recv, mid, n, va_alist) } VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_funcall(VALUE recv, ID mid, int n, ...) +#else +rb_funcall(recv, mid, n, va_alist) + VALUE recv; + ID mid; + int n; + va_dcl +#endif +{ + va_list ar; + va_init_list(ar, n); + + return vafuncall(recv, mid, n, &ar); +} + +VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_funcall_rescue(VALUE recv, ID mid, int n, ...) +#else +rb_funcall_rescue(recv, mid, n, va_alist) + VALUE recv; + ID mid; + int n; + va_dcl +#endif +{ + VALUE result = Qnil; /* OK */ + int status; + va_list ar; + + va_init_list(ar, n); + + PUSH_TAG(PROT_NONE); + if ((status = EXEC_TAG()) == 0) { + result = vafuncall(recv, mid, n, &ar); + } + POP_TAG(); + switch (status) { + case 0: + return result; + case TAG_RAISE: + return Qundef; + default: + JUMP_TAG(status); + } +} + +VALUE rb_funcall2(recv, mid, argc, argv) VALUE recv; ID mid; |