guile-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

guile/guile-lightning lightning.c


From: Marius Vollmer
Subject: guile/guile-lightning lightning.c
Date: Sun, 08 Apr 2001 20:56:43 -0700

CVSROOT:        /cvs
Module name:    guile
Changes by:     Marius Vollmer <address@hidden> 01/04/08 20:56:43

Modified files:
        guile-lightning: lightning.c 

Log message:
        * lightning.c (nlistify, scm_invoke): Do not use va_lists to get
        at the arguments.
        (nlistify2): Removed.
        (scm_disassemble): Disassemble corresponding codevector when
        passed a code closure.

CVSWeb URLs:
http://subversions.gnu.org/cgi-bin/cvsweb/guile/guile-lightning/lightning.c.diff?r1=1.6&r2=1.7

Patches:
Index: guile/guile-lightning/lightning.c
diff -u guile/guile-lightning/lightning.c:1.6 
guile/guile-lightning/lightning.c:1.7
--- guile/guile-lightning/lightning.c:1.6       Thu Apr  5 17:35:02 2001
+++ guile/guile-lightning/lightning.c   Sun Apr  8 20:56:43 2001
@@ -220,171 +220,131 @@
 }
 
 static SCM
-nlistify (int n, va_list ap)
+nlistify (int n, SCM *ap)
 {
+  int i;
   SCM l = SCM_EOL;
   SCM *t = &l;
-  while (--n >= 0)
+  for (i = 0; i < n; i++)
     {
-      *t = scm_cons (va_arg (ap, SCM), SCM_EOL);
+      *t = scm_cons (ap[i], SCM_EOL);
       t = SCM_CDRLOC (*t);
     }
   return l;
 }
 
-static SCM
-nlistify2 (int n, SCM e1, SCM e2, va_list ap)
-{
-  SCM l = nlistify (n-2, ap);
-  if (n >= 2)
-    l = scm_cons (e2, l);
-  if (n >= 1)
-    l = scm_cons (e1, l);
-  return l;
-}
-
 SCM 
-scm_invoke (SCM proc, int _n, void *retaddress,
-           SCM arg1, SCM arg2, ...)
+scm_invoke (SCM proc, int n, SCM *args)
 {
-  // We MUST not change `n' and `retaddress', they are used by the
-  // caller.
-
-  int n;
-
   SCM_ASRTGO (SCM_NIMP (proc), badproc);
 
-  n = _n / sizeof(SCM);
+  n = n / sizeof(SCM);
 
  tail:
   switch (SCM_TYP7 (proc))
     {
     case scm_tc7_subr_2o:
-      return (SCM_SUBRF (proc) (arg1, (n > 1)? arg2 : SCM_UNDEFINED));
+      return (SCM_SUBRF (proc) ((n > 0)? args[0] : SCM_UNDEFINED,
+                               (n > 1)? args[1] : SCM_UNDEFINED));
     case scm_tc7_subr_2:
       SCM_ASRTGO (n == 2, wrongnumargs);
-      return (SCM_SUBRF (proc) (arg1, arg2));
+      return (SCM_SUBRF (proc) (args[0], args[1]));
     case scm_tc7_subr_0:
       SCM_ASRTGO (n == 0, wrongnumargs);
       return (SCM_SUBRF (proc) ());
     case scm_tc7_subr_1:
       SCM_ASRTGO (n == 1, wrongnumargs);
-      return (SCM_SUBRF (proc) (arg1));
+      return (SCM_SUBRF (proc) (args[0]));
     case scm_tc7_subr_1o:
       SCM_ASRTGO (n <= 1, wrongnumargs);
-      return (SCM_SUBRF (proc) ((n < 1)? SCM_UNDEFINED : arg1));
+      return (SCM_SUBRF (proc) ((n < 1)? SCM_UNDEFINED : args[0]));
     case scm_tc7_cxr:
       SCM_ASRTGO (n == 1, wrongnumargs);
       if (SCM_SUBRF (proc))
        {
-         if (SCM_INUMP (arg1))
+         if (SCM_INUMP (args[0]))
            {
              return 
-               (scm_make_real (SCM_DSUBRF (proc) ((double) SCM_INUM (arg1))));
+               (scm_make_real (SCM_DSUBRF(proc)((double)SCM_INUM (args[0]))));
            }
-         SCM_ASRTGO (SCM_NIMP (arg1), floerr);
-         if (SCM_REALP (arg1))
+         SCM_ASRTGO (SCM_NIMP (args[0]), floerr);
+         if (SCM_REALP (args[0]))
            {
              return 
-               (scm_make_real (SCM_DSUBRF (proc) (SCM_REAL_VALUE (arg1))));
+               (scm_make_real (SCM_DSUBRF (proc) (SCM_REAL_VALUE (args[0]))));
            }
 #ifdef SCM_BIGDIG
-         if (SCM_BIGP (arg1))
-           return (scm_make_real (SCM_DSUBRF (proc) (scm_big2dbl (arg1))));
+         if (SCM_BIGP (args[0]))
+           return (scm_make_real (SCM_DSUBRF (proc) (scm_big2dbl (args[0]))));
 #endif
        floerr:
-         SCM_WTA_DISPATCH_1 (*SCM_SUBR_GENERIC (proc), arg1,
+         SCM_WTA_DISPATCH_1 (*SCM_SUBR_GENERIC (proc), args[0],
                              SCM_ARG1, SCM_SYMBOL_CHARS (SCM_SNAME (proc)));
        }
       proc = SCM_SNAME (proc);
       {
        char *chrs = SCM_SYMBOL_CHARS (proc) + SCM_SYMBOL_LENGTH (proc) - 1;
+       SCM x = args[0];
        while ('c' != *--chrs)
          {
-           SCM_ASSERT (SCM_CONSP (arg1),
-                   arg1, SCM_ARG1, SCM_SYMBOL_CHARS (proc));
-           arg1 = ('a' == *chrs) ? SCM_CAR (arg1) : SCM_CDR (arg1);
+           SCM_ASSERT (SCM_CONSP (args[0]),
+                   args[0], SCM_ARG1, SCM_SYMBOL_CHARS (proc));
+           x = ('a' == *chrs) ? SCM_CAR (x) : SCM_CDR (x);
          }
-       return (arg1);
+       return (x);
       }
     case scm_tc7_subr_3:
       {
-       va_list ap;
-       SCM arg3;
        SCM_ASRTGO (n == 3, wrongnumargs);
-       va_start (ap, arg2);
-       arg3 = va_arg (ap, SCM);
-       va_end (ap);
-       return (SCM_SUBRF (proc) (arg1, arg2, arg3));
+       return (SCM_SUBRF (proc) (args[0], args[1], args[2]));
       }
     case scm_tc7_lsubr:
       {
-       va_list ap;
-       SCM x;
-       va_start (ap, arg2);
-       x = nlistify2 (n, arg1, arg2, ap);
-       va_end (ap);
-       return (SCM_SUBRF (proc) (x));
+       return (SCM_SUBRF (proc) (nlistify (n, args)));
       }
     case scm_tc7_lsubr_2:
       {
-       va_list ap;
-       SCM x;
        SCM_ASRTGO (n >= 2, wrongnumargs);
-       va_start (ap, arg2);
-       x = nlistify (n-2, ap);
-       va_end (ap);
-       return (SCM_SUBRF (proc) (arg1, arg2, x));
+       return (SCM_SUBRF (proc) (args[0], args[1], nlistify (n-2, args+2)));
       }
     case scm_tc7_asubr:
       {
-       va_list ap;
        SCM x;
+       int i;
        if (n == 0)
          return (SCM_SUBRF (proc) (SCM_UNDEFINED, SCM_UNDEFINED));
        if (n == 1)
-         return (SCM_SUBRF (proc) (arg1, SCM_UNDEFINED));
-       x = SCM_SUBRF (proc) (arg1, arg2);
-       va_start (ap, arg2);
-       while (n > 2)
-         {
-           x = SCM_SUBRF (proc) (x, va_arg (ap, SCM));
-           n--;
-         }
-       va_end (ap);
+         return (SCM_SUBRF (proc) (args[0], SCM_UNDEFINED));
+       x = SCM_SUBRF (proc) (args[0], args[1]);
+       i = 2;
+       for (i = 2; i < n; i++)
+         x = SCM_SUBRF (proc) (x, args[i]);
        return x;
       }
     case scm_tc7_rpsubr:
       {
-       va_list ap;
        SCM x;
+       int i;
        if (n <= 1)
          return (SCM_BOOL_T);
-       if (SCM_FALSEP (SCM_SUBRF (proc) (arg1, arg2)))
+       if (SCM_FALSEP (SCM_SUBRF (proc) (args[0], args[1])))
          return SCM_BOOL_F;
        if (n == 2)
          return SCM_BOOL_T;
-       va_start (ap, arg2);
-       x = arg2;
-       while (n > 2)
+       x = args[1];
+       for (i = 2; i < n; i++)
          {
-           SCM y = va_arg (ap, SCM);
+           SCM y = args[i];
            if (SCM_FALSEP (SCM_SUBRF (proc) (x, y)))
-             {
-               va_end (ap);
-               return (SCM_BOOL_F);
-             }
+             return (SCM_BOOL_F);
            x = y;
-           n--;
          }
-       va_end (ap);
        return (SCM_BOOL_T);
       }
     case scm_tcs_closures:
       {
-       scm_misc_error ("invoke", 
-                       "can't invoke interpreted code"
-                       " from compiled code yet.", SCM_EOL);
+       /* XXX - this chickens out to scm_apply */
+       return scm_apply (proc, nlistify (n, args), SCM_EOL);
       }
     case scm_tc7_smob:
       {
@@ -393,29 +353,18 @@
        if (n == 0)
          return (SCM_SMOB_APPLY_0 (proc));
        else if (n == 1)
-         return (SCM_SMOB_APPLY_1 (proc, arg1));
+         return (SCM_SMOB_APPLY_1 (proc, args[0]));
        else if (n == 2)
-         return (SCM_SMOB_APPLY_2 (proc, arg1, arg2));
+         return (SCM_SMOB_APPLY_2 (proc, args[0], args[1]));
        else
-         {
-           va_list ap;
-           SCM x;
-           va_start (ap, arg2);
-           x = nlistify (n-2, ap);
-           va_end (ap);
-           return (SCM_SMOB_APPLY_3 (proc, arg1, arg2, x));
-         }
+         return (SCM_SMOB_APPLY_3 (proc, args[0], args[1],
+                                   nlistify (n-2, args+2)));
       }
     case scm_tc7_cclo:
       {
        /* XXX - this chickens out to scm_apply */
-       va_list ap;
-       SCM args;
-       va_start (ap, arg2);
-       args = nlistify2 (n, arg1, arg2, ap);
-       va_end (ap);
-       args = scm_cons (proc, args);
-       return scm_apply (SCM_CCLO_SUBR (proc), args, SCM_EOL);
+       SCM x = scm_cons (proc, nlistify (n, args));
+       return scm_apply (SCM_CCLO_SUBR (proc), x, SCM_EOL);
       }
     case scm_tc7_pws:
       {
@@ -426,29 +375,20 @@
       {
        if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
          {
-           va_list ap;
-           SCM x;
-           va_start (ap, arg2);
-           x = nlistify2 (n, arg1, arg2, ap);
-           va_end (ap);
-           return (scm_apply_generic (proc, x));
+           return (scm_apply_generic (proc, nlistify (n, args)));
          }
        else if (!SCM_I_OPERATORP (proc))
          goto badproc;
        else
          {
            /* XXX - this chickens out to scm_apply */
-           va_list ap;
-           SCM args;
-           va_start (ap, arg2);
-           args = nlistify2 (n, arg1, arg2, ap);
-           va_end (ap);
-           args = scm_cons (proc, args);
+           SCM x;
+           x = scm_cons (proc, nlistify (n, args));
            proc = (SCM_I_ENTITYP (proc)
                    ? SCM_ENTITY_PROCEDURE (proc)
                    : SCM_OPERATOR_PROCEDURE (proc));
            if (SCM_NIMP (proc))
-             return scm_apply (proc, args, SCM_EOL);
+             return scm_apply (proc, x, SCM_EOL);
            else
              goto badproc;
          }
@@ -458,7 +398,7 @@
     default:
     badproc:
       scm_wrong_type_arg ("invoke", SCM_ARG1, proc);
-      return (arg1);
+      return (args[0]);
     }
 }
 
@@ -778,6 +718,9 @@
 #define FUNC_NAME s_scm_disassemble
 {
   struct codevector *c;
+
+  if (CODE_P (codevector))
+    return scm_disassemble (CODE_VEC (codevector));
 
   SCM_VALIDATE_SMOB (SCM_ARG1, codevector, codevector);
   c = CODEVECTOR_DATA (codevector);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]