[前][次][番号順一覧][スレッド一覧]

ruby-changes:26118

From: nobu <ko1@a...>
Date: Tue, 4 Dec 2012 16:23:39 +0900 (JST)
Subject: [ruby-changes:26118] nobu:r38175 (trunk): marshal.c: rb_check_funcall

nobu	2012-12-04 16:23:25 +0900 (Tue, 04 Dec 2012)

  New Revision: 38175

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=38175

  Log:
    marshal.c: rb_check_funcall
    
    * marshal.c (w_object, marshal_dump, marshal_load): use
      rb_check_funcall if possible.

  Modified files:
    trunk/ChangeLog
    trunk/marshal.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 38174)
+++ ChangeLog	(revision 38175)
@@ -1,5 +1,8 @@
-Tue Dec  4 16:23:12 2012  Nobuyoshi Nakada  <nobu@r...>
+Tue Dec  4 16:23:23 2012  Nobuyoshi Nakada  <nobu@r...>
 
+	* marshal.c (w_object, marshal_dump, marshal_load): use
+	  rb_check_funcall if possible.
+
 	* marshal.c (w_object, marshal_dump, r_object0, marshal_load): use
 	  RB_GC_GUARD() (directly or indirectly) instead of volatile.
 
Index: marshal.c
===================================================================
--- marshal.c	(revision 38174)
+++ marshal.c	(revision 38175)
@@ -642,11 +642,11 @@
 	w_float(RFLOAT_VALUE(obj), arg);
     }
     else {
+	VALUE v;
+
 	arg->infection |= (int)FL_TEST(obj, MARSHAL_INFECTION);
 
 	if (rb_obj_respond_to(obj, s_mdump, TRUE)) {
-	    VALUE v;
-
             st_add_direct(arg->data, obj, arg->data->num_entries);
 
 	    v = rb_funcall2(obj, s_mdump, 0, 0);
@@ -658,13 +658,12 @@
 	    if (hasiv) w_ivar(obj, ivtbl, &c_arg);
 	    return;
 	}
-	if (rb_obj_respond_to(obj, s_dump, TRUE)) {
-	    VALUE v;
+	v = INT2NUM(limit);
+	v = rb_check_funcall(obj, s_dump, 1, &v);
+	if (v != Qundef) {
             st_table *ivtbl2 = 0;
             int hasiv2;
 
-	    v = INT2NUM(limit);
-	    v = rb_funcall2(obj, s_dump, 1, &v);
 	    check_dump_arg(arg, s_dump);
 	    if (!RB_TYPE_P(v, T_STRING)) {
 		rb_raise(rb_eTypeError, "_dump() must return string");
@@ -834,12 +833,12 @@
 	    {
 		VALUE v;
 
-		if (!rb_obj_respond_to(obj, s_dump_data, TRUE)) {
+		v = rb_check_funcall(obj, s_dump_data, 0, 0);
+		if (v == Qundef) {
 		    rb_raise(rb_eTypeError,
 			     "no _dump_data is defined for class %s",
 			     rb_obj_classname(obj));
 		}
-		v = rb_funcall2(obj, s_dump_data, 0, 0);
 		check_dump_arg(arg, s_dump_data);
 		w_class(TYPE_DATA, obj, arg, TRUE);
 		w_object(v, arg, limit);
@@ -948,8 +947,7 @@
 	    io_needed();
 	}
 	arg->dest = port;
-	if (rb_respond_to(port, s_binmode)) {
-	    rb_funcall2(port, s_binmode, 0, 0);
+	if (rb_check_funcall(port, s_binmode, 0, 0) != Qundef) {
 	    check_dump_arg(arg, s_binmode);
 	}
     }
@@ -1904,9 +1902,7 @@
 	port = v;
     }
     else if (rb_respond_to(port, s_getbyte) && rb_respond_to(port, s_read)) {
-	if (rb_respond_to(port, s_binmode)) {
-	    rb_funcall2(port, s_binmode, 0, 0);
-	}
+	rb_check_funcall(port, s_binmode, 0, 0);
 	infection = (int)(FL_TAINT | FL_TEST(port, FL_UNTRUSTED));
     }
     else {

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]