[Gauche-devel-jp] 多値の個数について

アーカイブの一覧に戻る

MIURA Yasuyuki kokos****@gmail*****
2008年 6月 21日 (土) 01:55:31 JST


こんにちは。Gaucheを読んで学習している三浦です。

多値の個数の限界はコメントを見る限りでは 20 (SCM_VM_MAX_VALUES) となっていますが、
実際に values に与えることができる値の限界は19個になっています。
他にもそのようになっているところがありました。

そこで多値の個数の限界が SCM_VM_MAX_VALUES になるようにしてみました。
変数と何番目の要素扱いであるかは以下のイメージで行いましたがあっていたでしょうか。
 変数 : val0, vals[0], vals[1], ... vals[18]
 順番 :     0,        1,         2,            19

Subversion の trunk に変更を加え、テストをしたところ全て通ってはいます。
パッチは SVN の trunk のところで svn diff したものです。
よろしくお願いします。

Index: src/vm.c
===================================================================
--- src/vm.c	(revision 6265)
+++ src/vm.c	(working copy)
@@ -189,7 +189,7 @@
     v->pc = PC_TO_RETURN;
     v->base = NULL;
     v->val0 = SCM_UNDEFINED;
-    for (i=0; i<SCM_VM_MAX_VALUES; i++) v->vals[i] = SCM_UNDEFINED;
+    for (i=0; i<SCM_VM_MAX_VALUES-1; i++) v->vals[i] = SCM_UNDEFINED;
     v->numVals = 1;

     v->handlers = SCM_NIL;
@@ -1705,8 +1705,8 @@
                 INCR_PC;

                 for (i=0; i<nargs; i++) {
-                    if (i >= SCM_VM_MAX_VALUES-1) {
-                        PUSH_ARG(vm->vals[SCM_VM_MAX_VALUES-1]);
+                    if (i >= SCM_VM_MAX_VALUES-2) {
+                        PUSH_ARG(vm->vals[SCM_VM_MAX_VALUES-2]);
                         break;
                     }
                     PUSH_ARG(vm->vals[i]);
@@ -1723,10 +1723,10 @@
             }
             CASE(SCM_VM_VALUES) {
                 int nargs = SCM_VM_INSN_ARG(code), i;
-                if (nargs >= SCM_VM_MAX_VALUES)
+                if (nargs > SCM_VM_MAX_VALUES)
                     VM_ERR(("values got too many args"));
                 VM_ASSERT(nargs -1 <= SP - vm->stackBase);
-                if (nargs > 0) {
+                if (nargs > 1) {
                     for (i = nargs-1; i>0; i--) {
                         vm->vals[i-1] = VAL0;
                         POP_ARG(VAL0);
@@ -1740,10 +1740,10 @@
                 int nvals;
                 VM_ASSERT(ENV);
                 nvals = (int)ENV->size;
-                SCM_ASSERT(nvals < SCM_VM_MAX_VALUES);
+                SCM_ASSERT(nvals <= SCM_VM_MAX_VALUES);
                 vm->numVals = nvals;
                 for (; nvals > 1; nvals--) {
-                    POP_ARG(vm->vals[nvals-1]);
+                    POP_ARG(vm->vals[nvals-2]);
                 }
                 POP_ARG(VAL0);
                 NEXT;
@@ -2791,8 +2791,9 @@

     vm->val0 = proc;
     for (i=0; i<nargs; i++) {
-        if (i == SCM_VM_MAX_VALUES-1) {
+        if (i == SCM_VM_MAX_VALUES-2) {
             vm->vals[i] = args;
+            break;
         }
         vm->vals[i] = SCM_CAR(args);
         args = SCM_CDR(args);
@@ -3106,7 +3107,7 @@
     if (ep) {
         /* There's an escape point defined by with-error-handler. */
         ScmObj target, current;
-        ScmObj result = SCM_FALSE, rvals[SCM_VM_MAX_VALUES];
+        ScmObj result = SCM_FALSE, rvals[SCM_VM_MAX_VALUES-1];
         int numVals = 0, i;

         /* To conform SRFI-34, the error handler (clauses in 'guard' form)
@@ -3161,7 +3162,7 @@
         SCM_END_PROTECT;

         /* Install the continuation */
-        for (i=0; i<numVals; i++) vm->vals[i] = rvals[i];
+        for (i=0; i<numVals-1; i++) vm->vals[i] = rvals[i];
         vm->numVals = numVals;
         vm->val0 = result;
         vm->cont = ep->cont;
@@ -3410,7 +3411,7 @@
         return SCM_CAR(args);
     } else if (nargs < 1) {
         return SCM_UNDEFINED;
-    } else if (nargs >= SCM_VM_MAX_VALUES) {
+    } else if (nargs > SCM_VM_MAX_VALUES) {
         Scm_Error("too many values passed to the continuation");
     }

@@ -3521,7 +3522,7 @@
     nvals = 1;
     SCM_FOR_EACH(cp, SCM_CDR(args)) {
         vm->vals[nvals-1] = SCM_CAR(cp);
-        if (nvals++ >= SCM_VM_MAX_VALUES) {
+        if (nvals++ >= SCM_VM_MAX_VALUES-1) {
             Scm_Error("too many values: %S", args);
         }
     }
Index: src/gauche/vm.h
===================================================================
--- src/gauche/vm.h	(revision 6265)
+++ src/gauche/vm.h	(working copy)
@@ -386,7 +386,7 @@
                                    being accumulated.  This is a part of
                                    continuation.                             */
     ScmObj val0;                /* Value register.                           */
-    ScmObj vals[SCM_VM_MAX_VALUES]; /* Value register for multiple values */
+    ScmObj vals[SCM_VM_MAX_VALUES-1]; /* Value register for multiple values */
     int    numVals;             /* # of values */

     ScmObj handlers;            /* chain of active dynamic handlers          */

----
三浦 康幸
ココサブ @ http://wiki.monaos.org/pukiwiki.php?Reading%20Gauche
-------------- next part --------------
文字コード指定の無い添付文書を保管しました...
名前: patch.txt
ダウンロード 


Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る