[#14922] alias $gvar — Koji Arai <JCA02266@...>

新井です。

19 messages 2001/10/14

[#15006] Re: eval.c (rb_stack_check): prohibit recursive raising error — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2001/10/26
[#15008] Re: eval.c (rb_stack_check): prohibit recursive raising error — Shugo Maeda <shugo@...> 2001/10/26

前田です。

[ruby-dev:14844] Re: custom marshal

From: nobu.nakada@...
Date: 2001-10-02 12:27:14 UTC
List: ruby-dev #14844
なかだです。

At Tue, 2 Oct 2001 19:28:43 +0900,
Tanaka Akira <akr@m17n.org> wrote:
> えぇと、ruby-dev:14835 のなかださんのパッチをあてる前には
> ArgumentError であったであろうことには同意します。すでに環境がないので
> 確認したわけではありませんが。
> 
> ruby-dev:14837 で core を吐くと述べたのは、ruby-dev:14835 のなかださ
> んのパッチをあてた後、marshal.c:1.45 でのはなしです。
> 
> marshal.c:1.45 でも core を吐きませんか?

 落ちました。そうか、Hash < Objectだからあれじゃダメか。あそこ
でチェックすべきなのは継承関係じゃなくて、むしろ内部的な整合性
を保っているかどうか、じゃないとまずいのかな。しかし、cのインス
タンスが具体的に何(T_*)になるかって作ってみなけりゃ分からないし、
どうしたものやら。

# 汚ひ…。


Index: marshal.c
===================================================================
RCS file: /cvs/ruby/src/ruby/marshal.c,v
retrieving revision 1.45
diff -u -2 -p -r1.45 marshal.c
--- marshal.c	2001/10/01 23:28:57	1.45
+++ marshal.c	2001/10/02 12:25:11
@@ -771,4 +771,42 @@ r_ivar(obj, arg)
 }
 
+static int
+match_type(c, v)
+    VALUE c, v;
+{
+    static VALUE c2t[T_MASK+1];
+    static ID eqq, le;
+    const VALUE *p;
+
+    if (!eqq) {
+	eqq = rb_intern("===");
+	le = rb_intern("<=");
+    }
+    if (BUILTIN_TYPE(v) != T_OBJECT || RTEST(rb_funcall(rb_cStruct, eqq, 1, v))) {
+	return RTEST(rb_funcall(c, '<', 1, RBASIC(v)->klass));
+    }
+
+    if (!c2t[0]) {
+	int i = 0;
+	c2t[i++] = rb_cClass;
+	c2t[i++] = rb_cClass;
+	c2t[i++] = rb_cModule;
+	c2t[i++] = rb_cFloat;
+	c2t[i++] = rb_cString;
+	c2t[i++] = rb_cRegexp;
+	c2t[i++] = rb_cHash;
+	c2t[i++] = rb_cStruct;
+	c2t[i++] = rb_cBignum;
+	c2t[i++] = rb_cIO;
+	c2t[i++] = rb_cData;
+	c2t[i++] = rb_const_get(0, rb_intern("MatchData"));
+    }
+    for (p = c2t; *p; ++p) {
+	if (RTEST(rb_funcall(c, le, 1, *p)))
+	    return Qfalse;
+    }
+    return Qtrue;
+}
+
 static VALUE
 r_object(arg)
@@ -798,6 +836,5 @@ r_object(arg)
 	    VALUE c = rb_path2class(r_unique(arg));
 	    v = r_object(arg);
-	    if (rb_special_const_p(v) ||
-		!RTEST(rb_funcall(c, '<', 1, RBASIC(v)->klass))) {
+	    if (rb_special_const_p(v) || !match_type(c, v)) {
 		rb_raise(rb_eArgError, "dump format error (user class)");
 	    }


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread