diff --git a/debug.c b/debug.c index d8e0d32e..d45082b6 100644 --- a/debug.c +++ b/debug.c @@ -45,8 +45,7 @@ void disasm (sexp bc) { break; } fprintf(stderr, "\n"); - if ((! (opcode == OP_RET) || (opcode == OP_DONE)) - && (ip - sexp_bytecode_data(bc) < sexp_bytecode_length(bc))) + if (ip - sexp_bytecode_data(bc) < sexp_bytecode_length(bc)) goto loop; } diff --git a/eval.c b/eval.c index a67b305a..d1c6607b 100644 --- a/eval.c +++ b/eval.c @@ -217,7 +217,7 @@ static sexp sexp_new_context(sexp *stack) { sexp_context_depth(res) = 0; sexp_context_pos(res) = 0; sexp_context_top(res) = 0; - sexp_context_tailp(res) = 1; + sexp_context_tailp(res) = 0; return res; } @@ -480,8 +480,10 @@ static void generate_seq (sexp app, sexp context) { } static void generate_cnd (sexp cnd, sexp context) { - sexp_sint_t label1, label2; + sexp_sint_t label1, label2, tailp=sexp_context_tailp(context); + sexp_context_tailp(context) = 0; generate(sexp_cnd_test(cnd), context); + sexp_context_tailp(context) = tailp; emit(OP_JUMP_UNLESS, context); sexp_context_depth(context)--; label1 = sexp_context_make_label(context); @@ -504,7 +506,7 @@ static void generate_ref (sexp ref, sexp context, int unboxp) { } else { lam = sexp_context_lambda(context); generate_non_global_ref(sexp_ref_name(ref), sexp_ref_cell(ref), lam, - sexp_lambda_fv(lam), context, unboxp); + sexp_lambda_fv(lam), context, unboxp); } } @@ -521,7 +523,8 @@ static void generate_non_global_ref (sexp name, sexp cell, sexp lambda, } else { /* closure ref */ for (i=0; sexp_pairp(fv); fv=sexp_cdr(fv), i++) - if (name == sexp_car(fv) && loc == sexp_cdr(fv)) + if ((name == sexp_ref_name(sexp_car(fv))) + && (loc == sexp_ref_loc(sexp_car(fv)))) break; emit(OP_CLOSURE_REF, context); emit_word(i, context); @@ -669,7 +672,7 @@ static void generate_lambda (sexp lambda, sexp context) { for (k=0; sexp_pairp(fv); fv=sexp_cdr(fv), k++) { ref = sexp_car(fv); generate_non_global_ref(sexp_ref_name(ref), sexp_ref_cell(ref), - prev_lambda, prev_fv, context, 0); + prev_lambda, prev_fv, context, 0); emit_push(sexp_make_integer(k), context); emit(OP_STACK_REF, context); emit_word(3, context); @@ -821,7 +824,7 @@ sexp vm(sexp bc, sexp cp, sexp e, sexp* stack, sexp_sint_t top) { case OP_NOOP: fprintf(stderr, "<<>>\n"); break; - case OP_STACK_REF: + case OP_STACK_REF: /* pick in forth */ fprintf(stderr, "%ld - %ld => %ld", top, (sexp_sint_t) ((sexp*)ip)[0], top - (sexp_sint_t) ((sexp*)ip)[0]); stack[top] = stack[top - (sexp_sint_t) ((sexp*)ip)[0]]; ip += sizeof(sexp); @@ -840,8 +843,8 @@ sexp vm(sexp bc, sexp cp, sexp e, sexp* stack, sexp_sint_t top) { ip += sizeof(sexp); break; case OP_CLOSURE_REF: - fprintf(stderr, "%ld", sexp_unbox_integer(((sexp*)ip)[0])); - _PUSH(sexp_vector_ref(cp, ((sexp*)ip)[0])); + fprintf(stderr, "%ld", (sexp_sint_t) ((sexp*)ip)[0]); + _PUSH(sexp_vector_ref(cp, sexp_make_integer(((sexp*)ip)[0]))); ip += sizeof(sexp); break; case OP_VECTOR_REF: @@ -1041,7 +1044,7 @@ sexp vm(sexp bc, sexp cp, sexp e, sexp* stack, sexp_sint_t top) { /* save frame info */ ip = ((unsigned char*) sexp_unbox_integer(stack[top-i-3])) - sizeof(sexp); cp = stack[top-i-2]; - fp = stack[top-i-2]; + fp = (sexp_sint_t) stack[top-i-2]; /* copy new args into place */ for (k=0; k