diff --git a/debug.c b/debug.c index 4ff6d2cd..8e0936fa 100644 --- a/debug.c +++ b/debug.c @@ -5,7 +5,8 @@ static const char* reverse_opcode_names[] = {"NOOP", "ERROR", "RESUMECC", "CALLCC", "APPLY1", "TAIL-CALL", "CALL", "FCALL0", "FCALL1", "FCALL2", "FCALL3", "FCALL4", "EVAL", "JUMP-UNLESS", - "JUMP", "PUSH", "DROP", "STACK-REF", "LOCAL-REF", "LOCAL-SET", + "JUMP", "PUSH", "DROP", "GLOBAL-REF", "GLOBAL-KNOWN-REF", "STACK-REF", + "LOCAL-REF", "LOCAL-SET", "CLOSURE-REF", "VECTOR-REF", "VECTOR-SET", "VECTOR-LENGTH", "STRING-REF", "STRING-SET", "STRING-LENGTH", "MAKE-PROCEDURE", "MAKE-VECTOR", "AND", "NULL?", "FIXNUM?", "SYMBOL?", "CHAR?", @@ -45,6 +46,8 @@ static sexp sexp_disasm (sexp bc, sexp out) { sexp_printf(out, "%ld", (sexp_sint_t) ((sexp*)ip)[0]); ip += sizeof(sexp); break; + case OP_GLOBAL_REF: + case OP_GLOBAL_KNOWN_REF: case OP_TAIL_CALL: case OP_CALL: case OP_PUSH: @@ -55,7 +58,7 @@ static sexp sexp_disasm (sexp bc, sexp out) { sexp_write_char('\n', out); if (ip - sexp_bytecode_data(bc) < sexp_bytecode_length(bc)) goto loop; - return SEXP_UNDEF; + return SEXP_VOID; } static void print_bytecode (sexp bc) { diff --git a/eval.c b/eval.c index 3e664860..f3bbfe2a 100644 --- a/eval.c +++ b/eval.c @@ -307,7 +307,7 @@ static sexp analyze_app (sexp x, sexp context) { static sexp analyze_seq (sexp ls, sexp context) { sexp res, tmp; if (sexp_nullp(ls)) - res = SEXP_UNDEF; + res = SEXP_VOID; else if (sexp_nullp(sexp_cdr(ls))) res = analyze(sexp_car(ls), context); else { @@ -369,7 +369,7 @@ static sexp analyze_lambda (sexp x, sexp context) { tmp = sexp_car(ls); if (sexp_pairp(sexp_cadr(tmp))) { name = sexp_caadr(tmp); - value = analyze_lambda(sexp_cons(SEXP_UNDEF, sexp_cons(sexp_cdadr(tmp), + value = analyze_lambda(sexp_cons(SEXP_VOID, sexp_cons(sexp_cdadr(tmp), sexp_cddr(tmp))), context); } else { @@ -395,7 +395,7 @@ static sexp analyze_if (sexp x, sexp context) { sexp test, pass, fail, fail_expr; analyze_bind(test, sexp_cadr(x), context); analyze_bind(pass, sexp_caddr(x), context); - fail_expr = sexp_pairp(sexp_cdddr(x)) ? sexp_cadddr(x) : SEXP_UNDEF; + fail_expr = sexp_pairp(sexp_cdddr(x)) ? sexp_cadddr(x) : SEXP_VOID; analyze_bind(fail, fail_expr, context); return sexp_make_cnd(test, pass, fail); } @@ -409,12 +409,12 @@ static sexp analyze_define (sexp x, sexp context) { sexp_push(sexp_lambda_sv(sexp_env_lambda(env)), name); sexp_push(sexp_lambda_locals(sexp_env_lambda(env)), name); sexp_push(sexp_lambda_defs(sexp_env_lambda(env)), x); - return SEXP_UNDEF; + return SEXP_VOID; } else { - env_cell_create(env, name, SEXP_DEF); + env_cell_create(env, name, SEXP_VOID); } if (sexp_pairp(sexp_cadr(x))) - value = analyze_lambda(sexp_cons(SEXP_UNDEF, + value = analyze_lambda(sexp_cons(SEXP_VOID, sexp_cons(sexp_cdadr(x), sexp_cddr(x))), context); else @@ -431,9 +431,9 @@ static sexp analyze_define_syntax (sexp x, sexp context) { return sexp_compile_error("non-top-level define-syntax", sexp_list1(x)); proc = eval_in_context(sexp_caddr(x), context); analyze_check_exception(proc); - cell = env_cell_create(sexp_context_env(context), name, SEXP_UNDEF); + cell = env_cell_create(sexp_context_env(context), name, SEXP_VOID); sexp_cdr(cell) = sexp_make_macro(proc, sexp_context_env(context)); - return SEXP_UNDEF; + return SEXP_VOID; } static sexp analyze_bind_syntax (sexp ls, sexp eval_ctx, sexp bind_ctx) { @@ -445,7 +445,7 @@ static sexp analyze_bind_syntax (sexp ls, sexp eval_ctx, sexp bind_ctx) { sexp_cons(sexp_caar(ls), sexp_make_macro(proc, sexp_context_env(eval_ctx)))); } - return SEXP_UNDEF; + return SEXP_VOID; } static sexp analyze_let_syntax (sexp x, sexp context) { @@ -623,9 +623,13 @@ static void generate_ref (sexp ref, sexp context, int unboxp) { sexp lam; if (! sexp_lambdap(sexp_ref_loc(ref))) { /* global ref */ - emit_push(sexp_ref_cell(ref), context); - if (unboxp) - emit(OP_CDR, context); + if (unboxp) { + emit((sexp_cdr(sexp_ref_cell(ref)) == SEXP_UNDEF) + ? OP_GLOBAL_REF : OP_GLOBAL_KNOWN_REF, + context); + emit_word((sexp_uint_t)sexp_ref_cell(ref), context); + } else + emit_push(sexp_ref_cell(ref), context); } else { lam = sexp_context_lambda(context); generate_non_global_ref(sexp_ref_name(ref), sexp_ref_cell(ref), lam, @@ -769,7 +773,7 @@ static void generate_lambda (sexp lambda, sexp context) { sexp_context_lambda(ctx) = lambda; /* allocate space for local vars */ for (ls=sexp_lambda_locals(lambda); sexp_pairp(ls); ls=sexp_cdr(ls)) - emit_push(SEXP_UNDEF, ctx); + emit_push(SEXP_VOID, ctx); /* box mutable vars */ for (ls=sexp_lambda_sv(lambda); sexp_pairp(ls); ls=sexp_cdr(ls)) { k = sexp_param_index(lambda, sexp_car(ls)); @@ -790,11 +794,11 @@ static void generate_lambda (sexp lambda, sexp context) { bc = finalize_bytecode(ctx); if (sexp_nullp(fv)) { /* shortcut, no free vars */ - vec = sexp_make_vector(sexp_make_integer(0), SEXP_UNDEF); + vec = sexp_make_vector(sexp_make_integer(0), SEXP_VOID); generate_lit(sexp_make_procedure(flags, len, bc, vec), context); } else { /* push the closed vars */ - emit_push(SEXP_UNDEF, context); + emit_push(SEXP_VOID, context); emit_push(sexp_length(fv), context); emit(OP_MAKE_VECTOR, context); sexp_context_depth(context)--; @@ -934,7 +938,7 @@ static sexp make_opcode_procedure (sexp op, sexp_uint_t i, sexp env, res = sexp_make_procedure(sexp_make_integer(0), sexp_make_integer(i), bc, - SEXP_UNDEF); + SEXP_VOID); if (i == sexp_opcode_num_args(op)) sexp_opcode_proc(op) = res; return res; @@ -945,7 +949,7 @@ static sexp make_opcode_procedure (sexp op, sexp_uint_t i, sexp env, static sexp sexp_save_stack(sexp *stack, sexp_uint_t to) { sexp res, *data; sexp_uint_t i; - res = sexp_make_vector(sexp_make_integer(to), SEXP_UNDEF); + res = sexp_make_vector(sexp_make_integer(to), SEXP_VOID); data = sexp_vector_data(res); for (i=0; i=", 0, NULL), _OP(OPC_ARITHMETIC_CMP, OP_EQN, 0, 1, SEXP_FIXNUM, 0, 0, "=", 0, NULL), _OP(OPC_PREDICATE, OP_EQ, 2, 0, 0, 0, 0, "eq?", 0, NULL), _OP(OPC_CONSTRUCTOR, OP_CONS, 2, 0, 0, 0, 0, "cons", 0, NULL), -_OP(OPC_CONSTRUCTOR, OP_MAKE_VECTOR, 1, 1, SEXP_FIXNUM, 0, 0, "make-vector", SEXP_UNDEF, NULL), +_OP(OPC_CONSTRUCTOR, OP_MAKE_VECTOR, 1, 1, SEXP_FIXNUM, 0, 0, "make-vector", SEXP_VOID, NULL), _OP(OPC_CONSTRUCTOR, OP_MAKE_PROCEDURE, 4, 0, 0, 0, 0, "make-procedure", 0, NULL), _OP(OPC_TYPE_PREDICATE, OP_NULLP, 1, 0, 0, 0, 0, "null?", 0, NULL), _OP(OPC_TYPE_PREDICATE, OP_EOFP, 1, 0, 0, 0, 0, "eof-object?", 0, NULL), diff --git a/sexp.c b/sexp.c index 1599c089..75c8e512 100644 --- a/sexp.c +++ b/sexp.c @@ -147,7 +147,7 @@ sexp sexp_print_exception (sexp exn, sexp out) { } else { sexp_write_string("\n", out); } - return SEXP_UNDEF; + return SEXP_VOID; } static sexp sexp_read_error (char *message, sexp irritants, sexp port) { @@ -296,7 +296,7 @@ sexp sexp_make_string(sexp len, sexp ch) { sexp sexp_c_string(char *str) { sexp_uint_t len = strlen(str); - sexp s = sexp_make_string(sexp_make_integer(len), SEXP_UNDEF); + sexp s = sexp_make_string(sexp_make_integer(len), SEXP_VOID); memcpy(sexp_string_data(s), str, len); return s; } @@ -318,7 +318,7 @@ sexp sexp_substring (sexp str, sexp start, sexp end) { || (end < start)) return sexp_range_exception(str, start, end); res = sexp_make_string(sexp_fx_sub(end, start), - SEXP_UNDEF); + SEXP_VOID); memcpy(sexp_string_data(res), sexp_string_data(str)+sexp_unbox_integer(start), sexp_string_length(res)); @@ -393,7 +393,7 @@ sexp sexp_make_vector(sexp len, sexp dflt) { } sexp sexp_list_to_vector(sexp ls) { - sexp x, vec = sexp_make_vector(sexp_length(ls), SEXP_UNDEF); + sexp x, vec = sexp_make_vector(sexp_length(ls), SEXP_VOID); sexp *elts = sexp_vector_data(vec); int i; for (i=0, x=ls; sexp_pairp(x); i++, x=sexp_cdr(x)) @@ -402,7 +402,7 @@ sexp sexp_list_to_vector(sexp ls) { } sexp sexp_vector(int count, ...) { - sexp vec = sexp_make_vector(sexp_make_integer(count), SEXP_UNDEF); + sexp vec = sexp_make_vector(sexp_make_integer(count), SEXP_VOID); sexp *elts = sexp_vector_data(vec); va_list ap; int i; @@ -443,7 +443,7 @@ int sstream_write (void *vec, const char *src, int n) { pos = sexp_unbox_integer(sexp_stream_pos(vec)); newpos = pos+n; if (newpos > len) { - newbuf = sexp_make_string(sexp_make_integer(len*2), SEXP_UNDEF); + newbuf = sexp_make_string(sexp_make_integer(len*2), SEXP_VOID); memcpy(sexp_string_data(newbuf), sexp_string_data(sexp_stream_buf(vec)), pos); @@ -483,7 +483,7 @@ sexp sexp_make_output_string_port () { FILE *out; sexp res, size, cookie; size = sexp_make_integer(SEXP_INIT_STRING_PORT_SIZE); - cookie = sexp_vector(3, sexp_make_string(size, SEXP_UNDEF), + cookie = sexp_vector(3, sexp_make_string(size, SEXP_VOID), size, sexp_make_integer(0)); out = funopen(cookie, NULL, &sstream_write, &sstream_seek, NULL); res = sexp_make_output_port(out); @@ -708,8 +708,8 @@ void sexp_write (sexp obj, sexp out) { sexp_write_string("#f", out); break; case (sexp_uint_t) SEXP_EOF: sexp_write_string("#", out); break; - case (sexp_uint_t) SEXP_DEF: case (sexp_uint_t) SEXP_UNDEF: + case (sexp_uint_t) SEXP_VOID: sexp_write_string("#", out); break; case (sexp_uint_t) SEXP_ERROR: sexp_write_string("#", out); break; diff --git a/sexp.h b/sexp.h index 5c70840b..4dc7cd9a 100644 --- a/sexp.h +++ b/sexp.h @@ -177,9 +177,9 @@ struct sexp_struct { #define SEXP_FALSE SEXP_MAKE_IMMEDIATE(1) #define SEXP_TRUE SEXP_MAKE_IMMEDIATE(2) #define SEXP_EOF SEXP_MAKE_IMMEDIATE(3) -#define SEXP_UNDEF SEXP_MAKE_IMMEDIATE(4) -#define SEXP_ERROR SEXP_MAKE_IMMEDIATE(5) /* exceptions are preferred */ -#define SEXP_DEF SEXP_MAKE_IMMEDIATE(6) /* internal use */ +#define SEXP_VOID SEXP_MAKE_IMMEDIATE(4) +#define SEXP_ERROR SEXP_MAKE_IMMEDIATE(5) /* internal use */ +#define SEXP_UNDEF SEXP_MAKE_IMMEDIATE(6) /* internal use */ #define SEXP_CLOSE SEXP_MAKE_IMMEDIATE(7) /* internal use */ #define SEXP_RAWDOT SEXP_MAKE_IMMEDIATE(8) /* internal use */