ref: e4488bb065f2f4f82f25b6f4d3ab9fb1b6150fa9
parent: 27120b0ce4d33ae58a0d3878293c4e3f0aee1d1f
author: JeffBezanson <jeff.bezanson@gmail.com>
date: Wed Apr 22 19:00:13 EDT 2009
some tweaks to the vm
--- a/femtolisp/flisp.c
+++ b/femtolisp/flisp.c
@@ -798,50 +798,49 @@
nargs = i+1;
break;
case OP_LET:
- ip++;
- // last arg is closure environment to use
- nargs--;
- Stack[SP-2] = Stack[SP-1];
- POPN(1);
- pvals = &Stack[SP-1];
- break;
+ ip++;
+ // last arg is closure environment to use
+ nargs--;
+ Stack[SP-2] = Stack[SP-1];
+ POPN(1);
+ pvals = &Stack[SP-1];
+ break;
case OP_NOP: break;
case OP_DUP: v = Stack[SP-1]; PUSH(v); break;
case OP_POP: POPN(1); break;
case OP_TCALL:
case OP_CALL:
- i = code[ip++]; // nargs
+ n = code[ip++]; // nargs
do_call:
s = SP;
- func = Stack[SP-i-1];
+ func = Stack[SP-n-1];
if (isfunction(func)) {
if (op == OP_TCALL) {
- for(s=-1; s < (fixnum_t)i; s++)
- Stack[bp+s] = Stack[SP-i+s];
- SP = bp+i;
- nargs = i;
+ for(s=-1; s < (fixnum_t)n; s++)
+ Stack[bp+s] = Stack[SP-n+s];
+ SP = bp+n;
+ nargs = n;
goto apply_cl_top;
}
else {
- v = apply_cl(i);
+ v = apply_cl(n);
}
}
else if (isbuiltinish(func)) {
op = uintval(func);
if (op > N_BUILTINS) {
- v = ((builtin_t)ptr(func))(&Stack[SP-i], i);
+ v = ((builtin_t)ptr(func))(&Stack[SP-n], n);
}
else {
s = builtin_arg_counts[op];
if (s >= 0)
- argcount(builtin_names[op], i, s);
- else if (s != ANYARGS && (signed)i < -s)
- argcount(builtin_names[op], i, -s);
+ argcount(builtin_names[op], n, s);
+ else if (s != ANYARGS && (signed)n < -s)
+ argcount(builtin_names[op], n, -s);
// remove function arg
- for(s=SP-i-1; s < (int)SP-1; s++)
+ for(s=SP-n-1; s < (int)SP-1; s++)
Stack[s] = Stack[s+1];
SP--;
- n = i;
switch (op) {
case OP_LIST: goto apply_list;
case OP_ADD: goto apply_add;
@@ -857,7 +856,7 @@
else {
type_error("apply", "function", func);
}
- SP = s-i-1;
+ SP = s-n-1;
PUSH(v);
break;
case OP_JMP: ip = (uint32_t)*(uint16_t*)&code[ip]; break;
@@ -953,12 +952,14 @@
Stack[SP-2] = tagptr(c, TAG_CONS);
POPN(1); break;
case OP_CAR:
- c = tocons(Stack[SP-1], "car");
- Stack[SP-1] = c->car;
+ v = Stack[SP-1];
+ if (!iscons(v)) type_error("car", "cons", v);
+ Stack[SP-1] = car_(v);
break;
case OP_CDR:
- c = tocons(Stack[SP-1], "cdr");
- Stack[SP-1] = c->cdr;
+ v = Stack[SP-1];
+ if (!iscons(v)) type_error("cdr", "cons", v);
+ Stack[SP-1] = cdr_(v);
break;
case OP_SETCAR:
car(Stack[SP-2]) = Stack[SP-1];
@@ -967,22 +968,24 @@
cdr(Stack[SP-2]) = Stack[SP-1];
POPN(1); break;
case OP_LIST:
- i = code[ip++];
+ n = code[ip++];
apply_list:
- if (i > 0)
- v = list(&Stack[SP-i], i);
- else
- v = NIL;
- POPN(i);
- PUSH(v);
+ if (n > 0) {
+ v = list(&Stack[SP-n], n);
+ POPN(n);
+ PUSH(v);
+ }
+ else {
+ PUSH(NIL);
+ }
break;
case OP_TAPPLY:
case OP_APPLY:
v = POP(); // arglist
- i = SP;
+ n = SP;
while (iscons(v)) {
- if (SP-i == MAX_ARGS) {
+ if (SP-n == MAX_ARGS) {
PUSH(v);
break;
}
@@ -989,7 +992,7 @@
PUSH(car_(v));
v = cdr_(v);
}
- i = SP-i;
+ n = SP-n;
if (op==OP_TAPPLY) op = OP_TCALL;
goto do_call;
@@ -1278,16 +1281,7 @@
case OP_SETC:
s = code[ip++];
i = code[ip++];
- if (captured) {
- if (nargs > 0) {
- // current frame has been captured
- s++;
- }
- v = Stack[bp];
- }
- else {
- v = Stack[bp+nargs];
- }
+ v = Stack[bp+nargs];
while (s--)
v = vector_elt(v, vector_size(v)-1);
assert(isvector(v));