~ chicken-core (chicken-5) ef5fdefb8068d558bd1308d0a43804c55677238f
commit ef5fdefb8068d558bd1308d0a43804c55677238f Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Jul 30 13:45:52 2010 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Jul 30 13:45:52 2010 +0200 manually inlined mark/remark diff --git a/runtime.c b/runtime.c index eefdf51c..cc43cff7 100644 --- a/runtime.c +++ b/runtime.c @@ -470,7 +470,7 @@ static void horror(C_char *msg) C_noret; static void C_fcall initial_trampoline(void *proc) C_regparm C_noret; static C_ccall void termination_continuation(C_word c, C_word self, C_word result) C_noret; static void C_fcall mark_system_globals(void) C_regparm; -static void C_fcall mark(C_word *x) C_regparm; +static void C_fcall really_mark(C_word *x) C_regparm; static WEAK_TABLE_ENTRY *C_fcall lookup_weak_table_entry(C_word item, C_word container) C_regparm; static C_ccall void values_continuation(C_word c, C_word closure, C_word dummy, ...) C_noret; static C_word add_symbol(C_word **ptr, C_word key, C_word string, C_SYMBOL_TABLE *stable); @@ -481,7 +481,7 @@ static C_word C_fcall convert_string_to_number(C_char *str, int radix, C_word *f static long C_fcall milliseconds(void); static long C_fcall cpu_milliseconds(void); static void C_fcall remark_system_globals(void) C_regparm; -static void C_fcall remark(C_word *x) C_regparm; +static void C_fcall really_remark(C_word *x) C_regparm; static C_word C_fcall intern0(C_char *name) C_regparm; static void C_fcall update_locative_table(int mode) C_regparm; static LF_LIST *find_module_handle(C_char *name); @@ -2608,6 +2608,13 @@ void C_save_and_reclaim(void *trampoline, void *proc, int n, ...) } +#define mark(x) \ + C_cblock \ + C_word *_x = (x), _val = *_x; \ + if(!C_immediatep(_val)) really_mark(_x); \ + C_cblockend + + C_regparm void C_fcall C_reclaim(void *trampoline, void *proc) { int i, j, n, fcount, weakn; @@ -2933,7 +2940,7 @@ C_regparm void C_fcall mark_system_globals(void) } -C_regparm void C_fcall mark(C_word *x) +C_regparm void C_fcall really_mark(C_word *x) { C_word val, item; C_uword n, bytes; @@ -2943,8 +2950,6 @@ C_regparm void C_fcall mark(C_word *x) val = *x; - if(C_immediatep(val)) return; - p = (C_SCHEME_BLOCK *)val; /* not in stack and not in heap? */ @@ -3066,6 +3071,13 @@ C_regparm void C_fcall mark(C_word *x) } +#define remark(x) \ + C_cblock \ + C_word *_x = (x), _val = *_x; \ + if(!C_immediatep(_val)) really_remark(_x); \ + C_cblockend + + /* Do a major GC into a freshly allocated heap: */ C_regparm void C_fcall C_rereclaim2(C_uword size, int double_plus) @@ -3240,7 +3252,7 @@ C_regparm void C_fcall remark_system_globals(void) } -C_regparm void C_fcall remark(C_word *x) +C_regparm void C_fcall really_remark(C_word *x) { C_word val, item; C_uword n, bytes; @@ -3250,8 +3262,6 @@ C_regparm void C_fcall remark(C_word *x) val = *x; - if(C_immediatep(val)) return; - p = (C_SCHEME_BLOCK *)val; /* not in stack and not in heap? */ @@ -7388,7 +7398,7 @@ void C_ccall C_number_to_string(C_word c, C_word closure, C_word k, C_word num, #endif #ifdef HAVE_GCVT - C_gcvt(f, flonum_print_precision, buffer); + p = C_gcvt(f, flonum_print_precision, buffer); /* p unused, but we want to avoid stupid warnings */ #else C_sprintf(buffer, C_text("%.*g"), flonum_print_precision, f); #endifTrap