summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-29 06:13:52 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-29 06:13:52 +0000
commitf6348ca0eac1eb3fd89f1bce233204b096de3e98 (patch)
treecb8bf5f5497b32eea8882dc159a4b8b41a85ecea /eval.c
parentc56fa330b24863f5e946caf7846a1a8b44674e48 (diff)
* 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. * lib/cgi/session.rb (CGI::Session::initialize): [ruby-core:03832] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7414 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c69
1 files changed, 57 insertions, 12 deletions
diff --git a/eval.c b/eval.c
index a0c8e7b5fc..0e7059c39a 100644
--- a/eval.c
+++ b/eval.c
@@ -1077,7 +1077,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
@@ -5789,18 +5791,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) {
@@ -5808,11 +5805,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;
@@ -5822,6 +5818,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;