diff --git a/gc.c b/gc.c index d06a7250..818eaf1b 100644 --- a/gc.c +++ b/gc.c @@ -177,16 +177,6 @@ int stack_references_pointer_p (sexp ctx, sexp x) { return 0; } -const char* sexp_debug_string(sexp ctx, sexp p) { - static char buf[32]; - if (sexp_pointerp(p)) - return sexp_object_type_name(ctx, p); - else if (sexp_nullp(p)) - return "()"; - sprintf(buf, "%p", p); - return buf; -} - void sexp_conservative_mark (sexp ctx) { sexp_heap h = sexp_context_heap(ctx); sexp p, end; @@ -206,33 +196,11 @@ void sexp_conservative_mark (sexp ctx) { #ifdef SEXP_USE_CONSERVATIVE_GC_PRESERVE_TAG if (sexp_pointer_tag(p) == SEXP_USE_CONSERVATIVE_GC_PRESERVE_TAG) #endif - if (sexp_pairp(p) && sexp_pairp(sexp_car(p)) - && sexp_symbolp(sexp_caar(p)) - && (sexp_caar(p)==(sexp)0x6c7677 - /* || sexp_caar(p)==(sexp)0xffd27 */ - ) - ) { + if (1) { #if SEXP_USE_DEBUG_GC > 3 if (p && sexp_pointerp(p)) { - if (sexp_pairp(p)) { - fprintf(stderr, SEXP_BANNER("MISS: %p (%s . %s): %s"), p, - sexp_debug_string(ctx, sexp_car(p)), - sexp_debug_string(ctx, sexp_cdr(p)), - sexp_pointer_source(p)); - if (sexp_pairp(sexp_car(p))) { - fprintf(stderr, "car: (%s . %s)\n", - sexp_debug_string(ctx, sexp_caar(p)), - sexp_debug_string(ctx, sexp_cdar(p))); - if (sexp_pairp(sexp_cdar(p))) - fprintf(stderr, "cdar: (%s . %s)\n", - sexp_debug_string(ctx, sexp_cadar(p)), - sexp_debug_string(ctx, sexp_cddar(p))); - } - } else { - fprintf(stderr, SEXP_BANNER("MISS: %p: %s"), p, - sexp_pointer_source(p)); - } - sexp_stack_trace(ctx, SEXP_FALSE); + fprintf(stderr, SEXP_BANNER("MISS: %p: %s"), p, + sexp_pointer_source(p)); fflush(stderr); } #endif diff --git a/include/chibi/eval.h b/include/chibi/eval.h index 29db9300..5c5f01d6 100644 --- a/include/chibi/eval.h +++ b/include/chibi/eval.h @@ -136,7 +136,7 @@ SEXP_API sexp sexp_make_eval_context (sexp context, sexp stack, sexp env, sexp_u SEXP_API sexp sexp_make_child_context (sexp context, sexp lambda); SEXP_API sexp sexp_compile_error (sexp ctx, const char *message, sexp obj); SEXP_API sexp sexp_analyze (sexp context, sexp x); -/* SEXP_API void sexp_stack_trace (sexp ctx, sexp out); */ +SEXP_API void sexp_stack_trace (sexp ctx, sexp out); SEXP_API sexp sexp_apply (sexp context, sexp proc, sexp args); SEXP_API sexp sexp_apply1 (sexp ctx, sexp f, sexp x); SEXP_API sexp sexp_free_vars (sexp context, sexp x, sexp fv); @@ -164,9 +164,9 @@ SEXP_API sexp sexp_open_output_file_op(sexp ctx sexp_api_params(self, n), sexp x SEXP_API sexp sexp_close_port_op(sexp ctx sexp_api_params(self, n), sexp x); SEXP_API sexp sexp_env_define (sexp ctx, sexp env, sexp sym, sexp val); SEXP_API sexp sexp_env_cell (sexp env, sexp sym); -/* SEXP_API sexp sexp_env_ref (sexp env, sexp sym, sexp dflt); */ +SEXP_API sexp sexp_env_ref (sexp env, sexp sym, sexp dflt); SEXP_API sexp sexp_env_global_ref (sexp env, sexp sym, sexp dflt); -/* SEXP_API sexp sexp_parameter_ref (sexp ctx, sexp param); */ +SEXP_API sexp sexp_parameter_ref (sexp ctx, sexp param); SEXP_API void sexp_warn_undefs (sexp ctx, sexp from, sexp to); SEXP_API sexp sexp_make_opcode (sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp_proc1); SEXP_API sexp sexp_make_procedure_op (sexp ctx sexp_api_params(self, n), sexp flags, sexp num_args, sexp bc, sexp vars); diff --git a/include/chibi/sexp.h b/include/chibi/sexp.h index ef6824cb..bb7dcf83 100644 --- a/include/chibi/sexp.h +++ b/include/chibi/sexp.h @@ -1150,10 +1150,6 @@ SEXP_API sexp sexp_finalize_c_type (sexp ctx sexp_api_params(self, n), sexp obj) SEXP_ZERO, SEXP_ZERO, SEXP_ZERO, (sexp_proc2)finalizer) #endif -SEXP_API sexp sexp_env_ref (sexp env, sexp sym, sexp dflt); -SEXP_API sexp sexp_parameter_ref (sexp ctx, sexp param); -SEXP_API void sexp_stack_trace (sexp ctx, sexp out); - #define sexp_current_error_port(ctx) sexp_parameter_ref(ctx, sexp_env_ref(sexp_context_env(ctx), sexp_global(ctx,SEXP_G_CUR_ERR_SYMBOL), SEXP_FALSE)) #define sexp_debug(ctx, msg, obj) (sexp_write_string(ctx, msg, sexp_current_error_port(ctx)), sexp_write(ctx, obj, sexp_current_error_port(ctx)), sexp_write_char(ctx, '\n', sexp_current_error_port(ctx))) diff --git a/sexp.c b/sexp.c index 7150867a..84f5f568 100644 --- a/sexp.c +++ b/sexp.c @@ -1044,45 +1044,14 @@ int sstream_read (void *vec, char *dst, int n) { return n; } -#define SEXP_LAST_CONTEXT_CHECK_LIMIT 256 - -#if ! SEXP_USE_BOEHM -static int in_heap_p (sexp_heap h, sexp p) { - for ( ; h; h = h->next) - if (((sexp)h < p) && (p < (sexp)((char*)h + h->size))) - return 1; - return 0; -} -#endif - -static sexp sexp_last_context (sexp ctx, sexp *cstack) { - sexp res=SEXP_FALSE; -#if ! SEXP_USE_BOEHM - sexp p; - sexp_sint_t i; - sexp_heap h = sexp_context_heap(ctx); - for (i=0; i= len) { - newbuf = sexp_make_string(ctx, /* sexp_stream_ctx(vec) */ + newbuf = sexp_make_string(sexp_stream_ctx(vec), sexp_make_fixnum(newpos*2), SEXP_VOID); memcpy(sexp_string_data(newbuf), @@ -1218,12 +1187,8 @@ sexp sexp_buffered_write_char (sexp ctx, int c, sexp p) { sexp sexp_buffered_write_string_n (sexp ctx, const char *str, sexp_uint_t len, sexp p) { int diff; - /* fprintf(stderr, "write %s: off: %ld size: %ld len: %ld\n", */ - /* str, sexp_port_offset(p), sexp_port_size(p), len); */ while (sexp_port_offset(p)+len >= sexp_port_size(p)) { diff = sexp_port_size(p) - sexp_port_offset(p); - /* fprintf(stderr, "write: off: %ld size: %ld len: %ld diff: %ld\n", */ - /* sexp_port_offset(p), sexp_port_size(p), len, diff); */ memcpy(sexp_port_buf(p)+sexp_port_offset(p), str, diff); sexp_buffered_flush(ctx, p); str += diff; @@ -1239,7 +1204,7 @@ sexp sexp_buffered_write_string (sexp ctx, const char *str, sexp p) { } sexp sexp_buffered_flush (sexp ctx, sexp p) { - sexp_gc_var2(tmp, ls); + sexp_gc_var1(tmp); if (! sexp_oportp(p)) return sexp_type_exception(ctx, NULL, SEXP_OPORT, p); if (! sexp_port_openp(p)) @@ -1249,12 +1214,10 @@ sexp sexp_buffered_flush (sexp ctx, sexp p) { fwrite(sexp_port_buf(p), 1, sexp_port_offset(p), sexp_port_stream(p)); fflush(sexp_port_stream(p)); } else if (sexp_port_offset(p) > 0) { - sexp_gc_preserve2(ctx, tmp, ls); - ls = sexp_port_cookie(p); + sexp_gc_preserve1(ctx, tmp); tmp = sexp_c_string(ctx, sexp_port_buf(p), sexp_port_offset(p)); - /* sexp_push(ctx, sexp_port_cookie(p), tmp); */ - sexp_port_cookie(p) = sexp_cons(ctx, tmp, ls); - sexp_gc_release2(ctx); + sexp_push(ctx, sexp_port_cookie(p), tmp); + sexp_gc_release1(ctx); } sexp_port_offset(p) = 0; return SEXP_VOID;