mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-03 13:20:26 +02:00
* src/vm_engine.c (VM_NAME): Renamed the variable an\' to
nargs\'.
Removed the variables `a2\' and `a3\'. * src/vm_engine.h (VM_SETUP_ARGS2, VM_SETUP_ARGS3): Setup local variables. (VM_SETUP_ARGS4): Removed. * src/vm_system.c, src/vm_scheme.c, src/vm_number.c: Updated.
This commit is contained in:
parent
12f9da005e
commit
382693febf
5 changed files with 71 additions and 65 deletions
|
@ -72,12 +72,8 @@ VM_NAME (SCM vm, SCM program)
|
||||||
SCM *stack_base = NULL; /* stack base address */
|
SCM *stack_base = NULL; /* stack base address */
|
||||||
SCM *stack_limit = NULL; /* stack limit address */
|
SCM *stack_limit = NULL; /* stack limit address */
|
||||||
|
|
||||||
/* Function arguments */
|
|
||||||
int an = 0;
|
|
||||||
SCM a2 = SCM_PACK (0);
|
|
||||||
SCM a3 = SCM_PACK (0);
|
|
||||||
|
|
||||||
/* Internal variables */
|
/* Internal variables */
|
||||||
|
int nargs = 0; /* the number of arguments */
|
||||||
SCM dynwinds = SCM_EOL;
|
SCM dynwinds = SCM_EOL;
|
||||||
#if VM_USE_HOOK
|
#if VM_USE_HOOK
|
||||||
SCM hook_args = SCM_LIST1 (vm);
|
SCM hook_args = SCM_LIST1 (vm);
|
||||||
|
|
|
@ -203,10 +203,10 @@
|
||||||
X = cell; \
|
X = cell; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VM_SETUP_ARGS2() an = 2; a2 = ac; POP (ac);
|
#define VM_SETUP_ARGS1() SCM a1 = ac;
|
||||||
#define VM_SETUP_ARGS3() an = 3; a3 = ac; POP (a2); POP (ac);
|
#define VM_SETUP_ARGS2() SCM a1, a2; a2 = ac; POP (a1);
|
||||||
#define VM_SETUP_ARGS4() an = 4; a4 = ac; POP (a3); POP (a2); POP (ac);
|
#define VM_SETUP_ARGS3() SCM a1, a2, a3; a3 = ac; POP (a2); POP (a1);
|
||||||
#define VM_SETUP_ARGSN() an = SCM_INUM (FETCH ());
|
#define VM_SETUP_ARGSN() nargs = SCM_INUM (FETCH ());
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -242,26 +242,26 @@
|
||||||
* Frame allocation
|
* Frame allocation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* an = the number of arguments */
|
/* nargs = the number of arguments */
|
||||||
#define VM_FRAME_INIT_ARGS(PROG,NREQS,RESTP) \
|
#define VM_FRAME_INIT_ARGS(PROG,NREQS,RESTP) \
|
||||||
{ \
|
{ \
|
||||||
if (RESTP) \
|
if (RESTP) \
|
||||||
/* have a rest argument */ \
|
/* have a rest argument */ \
|
||||||
{ \
|
{ \
|
||||||
SCM list; \
|
SCM list; \
|
||||||
if (an < NREQS) \
|
if (nargs < NREQS) \
|
||||||
scm_wrong_num_args (PROG); \
|
scm_wrong_num_args (PROG); \
|
||||||
\
|
\
|
||||||
/* Construct the rest argument list */ \
|
/* Construct the rest argument list */ \
|
||||||
an -= NREQS; /* the number of rest arguments */ \
|
nargs -= NREQS; /* the number of rest arguments */ \
|
||||||
list = SCM_EOL; /* list of the rest arguments */ \
|
list = SCM_EOL; /* list of the rest arguments */ \
|
||||||
POP_LIST (an, list); \
|
POP_LIST (nargs, list); \
|
||||||
PUSH (list); \
|
PUSH (list); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
/* not have a rest argument */ \
|
/* not have a rest argument */ \
|
||||||
{ \
|
{ \
|
||||||
if (an != NREQS) \
|
if (nargs != NREQS) \
|
||||||
scm_wrong_num_args (PROG); \
|
scm_wrong_num_args (PROG); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,50 +45,54 @@
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (zero_p, "zero?", "zero?", 1, 0)
|
SCM_DEFINE_VM_FUNCTION (zero_p, "zero?", "zero?", 1, 0)
|
||||||
{
|
{
|
||||||
if (SCM_INUMP (ac))
|
VM_SETUP_ARGS1 ();
|
||||||
RETURN (SCM_BOOL (SCM_EQ_P (ac, SCM_INUM0)));
|
if (SCM_INUMP (a1))
|
||||||
RETURN (scm_zero_p (ac));
|
RETURN (SCM_BOOL (SCM_EQ_P (a1, SCM_INUM0)));
|
||||||
|
RETURN (scm_zero_p (a1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (inc, "1+", "inc", 1, 0)
|
SCM_DEFINE_VM_FUNCTION (inc, "1+", "inc", 1, 0)
|
||||||
{
|
{
|
||||||
if (SCM_INUMP (ac))
|
VM_SETUP_ARGS1 ();
|
||||||
|
if (SCM_INUMP (a1))
|
||||||
{
|
{
|
||||||
int n = SCM_INUM (ac) + 1;
|
int n = SCM_INUM (a1) + 1;
|
||||||
if (SCM_FIXABLE (n))
|
if (SCM_FIXABLE (n))
|
||||||
RETURN (SCM_MAKINUM (n));
|
RETURN (SCM_MAKINUM (n));
|
||||||
}
|
}
|
||||||
RETURN (scm_sum (ac, SCM_MAKINUM (1)));
|
RETURN (scm_sum (a1, SCM_MAKINUM (1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (dec, "1-", "dec", 1, 0)
|
SCM_DEFINE_VM_FUNCTION (dec, "1-", "dec", 1, 0)
|
||||||
{
|
{
|
||||||
if (SCM_INUMP (ac))
|
VM_SETUP_ARGS1 ();
|
||||||
|
if (SCM_INUMP (a1))
|
||||||
{
|
{
|
||||||
int n = SCM_INUM (ac) - 1;
|
int n = SCM_INUM (a1) - 1;
|
||||||
if (SCM_FIXABLE (n))
|
if (SCM_FIXABLE (n))
|
||||||
RETURN (SCM_MAKINUM (n));
|
RETURN (SCM_MAKINUM (n));
|
||||||
}
|
}
|
||||||
RETURN (scm_difference (ac, SCM_MAKINUM (1)));
|
RETURN (scm_difference (a1, SCM_MAKINUM (1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (add, "+", "add", 0, 1)
|
SCM_DEFINE_VM_FUNCTION (add, "+", "add", 0, 1)
|
||||||
{
|
{
|
||||||
VM_SETUP_ARGSN ();
|
VM_SETUP_ARGSN ();
|
||||||
ac = SCM_MAKINUM (0);
|
ac = SCM_MAKINUM (0);
|
||||||
while (an-- > 0)
|
while (nargs-- > 0)
|
||||||
{
|
{
|
||||||
POP (a2);
|
SCM x;
|
||||||
if (SCM_INUMP (ac) && SCM_INUMP (a2))
|
POP (x);
|
||||||
|
if (SCM_INUMP (ac) && SCM_INUMP (x))
|
||||||
{
|
{
|
||||||
int n = SCM_INUM (ac) + SCM_INUM (a2);
|
int n = SCM_INUM (ac) + SCM_INUM (x);
|
||||||
if (SCM_FIXABLE (n))
|
if (SCM_FIXABLE (n))
|
||||||
{
|
{
|
||||||
ac = SCM_MAKINUM (n);
|
ac = SCM_MAKINUM (n);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ac = scm_sum (ac, a2);
|
ac = scm_sum (ac, x);
|
||||||
}
|
}
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
@ -96,71 +100,73 @@ SCM_DEFINE_VM_FUNCTION (add, "+", "add", 0, 1)
|
||||||
SCM_DEFINE_VM_FUNCTION (add2, "+", "add2", 2, 0)
|
SCM_DEFINE_VM_FUNCTION (add2, "+", "add2", 2, 0)
|
||||||
{
|
{
|
||||||
VM_SETUP_ARGS2 ();
|
VM_SETUP_ARGS2 ();
|
||||||
if (SCM_INUMP (ac) && SCM_INUMP (a2))
|
if (SCM_INUMP (a1) && SCM_INUMP (a2))
|
||||||
{
|
{
|
||||||
int n = SCM_INUM (ac) + SCM_INUM (a2);
|
int n = SCM_INUM (a1) + SCM_INUM (a2);
|
||||||
if (SCM_FIXABLE (n))
|
if (SCM_FIXABLE (n))
|
||||||
RETURN (SCM_MAKINUM (n));
|
RETURN (SCM_MAKINUM (n));
|
||||||
}
|
}
|
||||||
RETURN (scm_sum (ac, a2));
|
RETURN (scm_sum (a1, a2));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (sub, "-", "sub", 1, 1)
|
SCM_DEFINE_VM_FUNCTION (sub, "-", "sub", 1, 1)
|
||||||
{
|
{
|
||||||
|
SCM x;
|
||||||
VM_SETUP_ARGSN ();
|
VM_SETUP_ARGSN ();
|
||||||
ac = SCM_MAKINUM (0);
|
ac = SCM_MAKINUM (0);
|
||||||
while (an-- > 1)
|
while (nargs-- > 1)
|
||||||
{
|
{
|
||||||
POP (a2);
|
POP (x);
|
||||||
if (SCM_INUMP (ac) && SCM_INUMP (a2))
|
if (SCM_INUMP (ac) && SCM_INUMP (x))
|
||||||
{
|
{
|
||||||
int n = SCM_INUM (ac) + SCM_INUM (a2);
|
int n = SCM_INUM (ac) + SCM_INUM (x);
|
||||||
if (SCM_FIXABLE (n))
|
if (SCM_FIXABLE (n))
|
||||||
{
|
{
|
||||||
ac = SCM_MAKINUM (n);
|
ac = SCM_MAKINUM (n);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ac = scm_difference (ac, a2);
|
ac = scm_difference (ac, x);
|
||||||
}
|
}
|
||||||
POP (a2);
|
POP (x);
|
||||||
if (SCM_INUMP (ac) && SCM_INUMP (a2))
|
if (SCM_INUMP (ac) && SCM_INUMP (x))
|
||||||
{
|
{
|
||||||
int n = SCM_INUM (a2) - SCM_INUM (ac);
|
int n = SCM_INUM (x) - SCM_INUM (ac);
|
||||||
if (SCM_FIXABLE (n))
|
if (SCM_FIXABLE (n))
|
||||||
RETURN (SCM_MAKINUM (n));
|
RETURN (SCM_MAKINUM (n));
|
||||||
}
|
}
|
||||||
RETURN (scm_difference (a2, ac));
|
RETURN (scm_difference (x, ac));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (sub2, "-", "sub2", 2, 0)
|
SCM_DEFINE_VM_FUNCTION (sub2, "-", "sub2", 2, 0)
|
||||||
{
|
{
|
||||||
VM_SETUP_ARGS2 ();
|
VM_SETUP_ARGS2 ();
|
||||||
if (SCM_INUMP (ac) && SCM_INUMP (a2))
|
if (SCM_INUMP (a1) && SCM_INUMP (a2))
|
||||||
{
|
{
|
||||||
int n = SCM_INUM (ac) - SCM_INUM (a2);
|
int n = SCM_INUM (a1) - SCM_INUM (a2);
|
||||||
if (SCM_FIXABLE (n))
|
if (SCM_FIXABLE (n))
|
||||||
RETURN (SCM_MAKINUM (n));
|
RETURN (SCM_MAKINUM (n));
|
||||||
}
|
}
|
||||||
RETURN (scm_difference (ac, a2));
|
RETURN (scm_difference (a1, a2));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (minus, "-", "minus", 1, 0)
|
SCM_DEFINE_VM_FUNCTION (minus, "-", "minus", 1, 0)
|
||||||
{
|
{
|
||||||
if (SCM_INUMP (ac))
|
VM_SETUP_ARGS1 ();
|
||||||
|
if (SCM_INUMP (a1))
|
||||||
{
|
{
|
||||||
int n = - SCM_INUM (ac);
|
int n = - SCM_INUM (a1);
|
||||||
if (SCM_FIXABLE (n))
|
if (SCM_FIXABLE (n))
|
||||||
RETURN (SCM_MAKINUM (n));
|
RETURN (SCM_MAKINUM (n));
|
||||||
}
|
}
|
||||||
RETURN (scm_difference (ac, SCM_UNDEFINED));
|
RETURN (scm_difference (a1, SCM_UNDEFINED));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define REL2(CREL,SREL) \
|
#define REL2(CREL,SREL) \
|
||||||
VM_SETUP_ARGS2 (); \
|
VM_SETUP_ARGS2 (); \
|
||||||
if (SCM_INUMP (ac) && SCM_INUMP (a2)) \
|
if (SCM_INUMP (a1) && SCM_INUMP (a2)) \
|
||||||
RETURN (SCM_BOOL (SCM_INUM (ac) CREL SCM_INUM (a2))); \
|
RETURN (SCM_BOOL (SCM_INUM (a1) CREL SCM_INUM (a2))); \
|
||||||
RETURN (SREL (ac, a2))
|
RETURN (SREL (a1, a2))
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (lt2, "<", "lt2", 2, 0)
|
SCM_DEFINE_VM_FUNCTION (lt2, "<", "lt2", 2, 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,7 +45,8 @@
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (null_p, "null?", "null?", 1, 0)
|
SCM_DEFINE_VM_FUNCTION (null_p, "null?", "null?", 1, 0)
|
||||||
{
|
{
|
||||||
RETURN (SCM_BOOL (SCM_NULLP (ac)));
|
VM_SETUP_ARGS1 ();
|
||||||
|
RETURN (SCM_BOOL (SCM_NULLP (a1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (cons, "cons", "cons", 2, 0)
|
SCM_DEFINE_VM_FUNCTION (cons, "cons", "cons", 2, 0)
|
||||||
|
@ -59,32 +60,35 @@ SCM_DEFINE_VM_FUNCTION (list, "list", "list", 0, 1)
|
||||||
{
|
{
|
||||||
VM_SETUP_ARGSN ();
|
VM_SETUP_ARGSN ();
|
||||||
ac = SCM_EOL;
|
ac = SCM_EOL;
|
||||||
POP_LIST (an, ac);
|
POP_LIST (nargs, ac);
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (car, "car", "car", 1, 0)
|
SCM_DEFINE_VM_FUNCTION (car, "car", "car", 1, 0)
|
||||||
{
|
{
|
||||||
SCM_VALIDATE_CONS (0, ac);
|
VM_SETUP_ARGS1 ();
|
||||||
RETURN (SCM_CAR (ac));
|
SCM_VALIDATE_CONS (0, a1);
|
||||||
|
RETURN (SCM_CAR (a1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (cdr, "cdr", "cdr", 1, 0)
|
SCM_DEFINE_VM_FUNCTION (cdr, "cdr", "cdr", 1, 0)
|
||||||
{
|
{
|
||||||
SCM_VALIDATE_CONS (0, ac);
|
VM_SETUP_ARGS1 ();
|
||||||
RETURN (SCM_CDR (ac));
|
SCM_VALIDATE_CONS (0, a1);
|
||||||
|
RETURN (SCM_CDR (a1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (not, "not", "not", 1, 0)
|
SCM_DEFINE_VM_FUNCTION (not, "not", "not", 1, 0)
|
||||||
{
|
{
|
||||||
RETURN (SCM_BOOL (SCM_FALSEP (ac)));
|
VM_SETUP_ARGS1 ();
|
||||||
|
RETURN (SCM_BOOL (SCM_FALSEP (a1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE_VM_FUNCTION (append, "append", "append", 0, 1)
|
SCM_DEFINE_VM_FUNCTION (append, "append", "append", 0, 1)
|
||||||
{
|
{
|
||||||
VM_SETUP_ARGSN ();
|
VM_SETUP_ARGSN ();
|
||||||
ac = SCM_EOL;
|
ac = SCM_EOL;
|
||||||
POP_LIST (an, ac);
|
POP_LIST (nargs, ac);
|
||||||
RETURN (scm_append (ac));
|
RETURN (scm_append (ac));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +96,7 @@ SCM_DEFINE_VM_FUNCTION (append_x, "append!", "append!", 0, 1)
|
||||||
{
|
{
|
||||||
VM_SETUP_ARGSN ();
|
VM_SETUP_ARGSN ();
|
||||||
ac = SCM_EOL;
|
ac = SCM_EOL;
|
||||||
POP_LIST (an, ac);
|
POP_LIST (nargs, ac);
|
||||||
RETURN (scm_append_x (ac));
|
RETURN (scm_append_x (ac));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,6 +110,6 @@ SCM_DEFINE_VM_FUNCTION (call_cc, "call-with-current-continuation", "call/cc", 1,
|
||||||
{
|
{
|
||||||
SYNC (); /* must sync all registers */
|
SYNC (); /* must sync all registers */
|
||||||
PUSH (SCM_VM_CAPTURE_CONT (vmp)); /* argument 1 */
|
PUSH (SCM_VM_CAPTURE_CONT (vmp)); /* argument 1 */
|
||||||
an = 1; /* the number of arguments */
|
nargs = 1; /* the number of arguments */
|
||||||
goto vm_call;
|
goto vm_call;
|
||||||
}
|
}
|
||||||
|
|
|
@ -402,7 +402,7 @@ SCM_DEFINE_INSTRUCTION (make_program, "%make-program", INST_CODE)
|
||||||
*/
|
*/
|
||||||
SCM_DEFINE_INSTRUCTION (call, "%call", INST_INUM)
|
SCM_DEFINE_INSTRUCTION (call, "%call", INST_INUM)
|
||||||
{
|
{
|
||||||
an = SCM_INUM (FETCH ()); /* the number of arguments */
|
nargs = SCM_INUM (FETCH ()); /* the number of arguments */
|
||||||
|
|
||||||
vm_call:
|
vm_call:
|
||||||
/*
|
/*
|
||||||
|
@ -412,7 +412,7 @@ SCM_DEFINE_INSTRUCTION (call, "%call", INST_INUM)
|
||||||
{
|
{
|
||||||
/* Create a new frame */
|
/* Create a new frame */
|
||||||
SCM *last_fp = fp;
|
SCM *last_fp = fp;
|
||||||
SCM *last_sp = sp + an;
|
SCM *last_sp = sp + nargs;
|
||||||
VM_NEW_FRAME (fp, ac,
|
VM_NEW_FRAME (fp, ac,
|
||||||
SCM_VM_MAKE_ADDRESS (last_fp),
|
SCM_VM_MAKE_ADDRESS (last_fp),
|
||||||
SCM_VM_MAKE_ADDRESS (last_sp),
|
SCM_VM_MAKE_ADDRESS (last_sp),
|
||||||
|
@ -431,7 +431,7 @@ SCM_DEFINE_INSTRUCTION (call, "%call", INST_INUM)
|
||||||
{
|
{
|
||||||
/* Construct an argument list */
|
/* Construct an argument list */
|
||||||
SCM list = SCM_EOL;
|
SCM list = SCM_EOL;
|
||||||
POP_LIST (an, list);
|
POP_LIST (nargs, list);
|
||||||
RETURN (scm_apply (ac, list, SCM_EOL));
|
RETURN (scm_apply (ac, list, SCM_EOL));
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -441,7 +441,7 @@ SCM_DEFINE_INSTRUCTION (call, "%call", INST_INUM)
|
||||||
{
|
{
|
||||||
vm_call_cc:
|
vm_call_cc:
|
||||||
/* Check the number of arguments */
|
/* Check the number of arguments */
|
||||||
if (an != 1)
|
if (nargs != 1)
|
||||||
scm_wrong_num_args (ac);
|
scm_wrong_num_args (ac);
|
||||||
|
|
||||||
/* Reinstate the continuation */
|
/* Reinstate the continuation */
|
||||||
|
@ -464,7 +464,7 @@ SCM_DEFINE_INSTRUCTION (call, "%call", INST_INUM)
|
||||||
*/
|
*/
|
||||||
SCM_DEFINE_INSTRUCTION (tail_call, "%tail-call", INST_INUM)
|
SCM_DEFINE_INSTRUCTION (tail_call, "%tail-call", INST_INUM)
|
||||||
{
|
{
|
||||||
an = SCM_INUM (FETCH ()); /* the number of arguments */
|
nargs = SCM_INUM (FETCH ()); /* the number of arguments */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Subprogram call
|
* Subprogram call
|
||||||
|
@ -514,7 +514,7 @@ SCM_DEFINE_INSTRUCTION (tail_call, "%tail-call", INST_INUM)
|
||||||
{
|
{
|
||||||
/* Construct an argument list */
|
/* Construct an argument list */
|
||||||
SCM list = SCM_EOL;
|
SCM list = SCM_EOL;
|
||||||
POP_LIST (an, list);
|
POP_LIST (nargs, list);
|
||||||
ac = scm_apply (ac, list, SCM_EOL);
|
ac = scm_apply (ac, list, SCM_EOL);
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue