[ruby-list:39080] Re: Ruby1.8のWIN32OLEで-wのとき

From: nobu.nakada@...
Date: 2004-01-26 00:05:07 UTC
List: ruby-list #39080
なかだです。

At Mon, 26 Jan 2004 01:58:08 +0900,
Takashi Kanai wrote:
> 残る問題は、何でワーニングが出るか、です。

WIN32OLE::ARGVをクラス変数としてアクセスしているのが、そもそも
の間違いです。現在の実装では定数とクラス変数とクラスのインスタ
ンス変数の三つは同じところにあるので、たまたま見えているだけで
す。


Index: ext/win32ole/win32ole.c
===================================================================
RCS file: /cvs/ruby/src/ruby/ext/win32ole/win32ole.c,v
retrieving revision 1.16
diff -u -2 -p -d -r1.16 win32ole.c
--- ext/win32ole/win32ole.c	24 Sep 2003 22:55:33 -0000	1.16
+++ ext/win32ole/win32ole.c	26 Jan 2004 00:01:16 -0000
@@ -1687,4 +1687,20 @@ hash2named_arg(pair, pOp)
 
 static VALUE
+set_argv(realargs, beg, end)
+    VARIANTARG* realargs;
+    unsigned int beg, end;
+{
+    VALUE argv = rb_const_get(cWIN32OLE, rb_intern("ARGV"));
+
+    Check_Type(argv, T_ARRAY);
+    rb_ary_clear(argv);
+    while (--end >= beg) {
+	rb_ary_push(argv, ole_variant2val(&realargs[end]));
+	VariantClear(&realargs[end]);
+    }
+    return argv;
+}
+
+static VALUE
 ole_invoke(argc, argv, self, wFlags)
     int argc;
@@ -1708,5 +1724,4 @@ ole_invoke(argc, argv, self, wFlags)
     EXCEPINFO excepinfo;
     VARIANT result;
-    VALUE args;
     VARIANTARG* realargs = NULL;
     unsigned int argErr = 0;
@@ -1848,11 +1863,5 @@ ole_invoke(argc, argv, self, wFlags)
     /* clear dispatch parameter */
     if(op.dp.cArgs > cNamedArgs) {
-        args = rb_cvar_get(cWIN32OLE, rb_intern("ARGV"));
-        rb_funcall(args, rb_intern("clear"), 0);
-        for(i = cNamedArgs; i < op.dp.cArgs; i++) {
-            n = op.dp.cArgs - i + cNamedArgs - 1;
-            rb_ary_push(args, ole_variant2val(&realargs[n]));
-            VariantClear(&realargs[n]);
-        }
+	set_argv(realargs, cNamedArgs, op.dp.cArgs);
     }
     else {
@@ -2067,10 +2076,5 @@ ole_invoke2(self, dispid, args, types, d
     /* clear dispatch parameter */
     if(dispParams.cArgs > 0) {
-        VALUE argv = rb_cvar_get(cWIN32OLE, rb_intern("ARGV"));
-        rb_funcall(argv, rb_intern("clear"), 0);
-        for(i = dispParams.cArgs - 1; i >= 0; i--) {
-            rb_ary_push(argv, ole_variant2val(&realargs[i]));
-            VariantClear(&realargs[i]);
-        }
+	set_argv(realargs, 0, dispParams.cArgs);
     }
 


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

In This Thread