~ chicken-core (chicken-5) 79f19cc21497b9d093c5eb4b231e077348b17d16
commit 79f19cc21497b9d093c5eb4b231e077348b17d16 Author: Peter Bex <peter@more-magic.net> AuthorDate: Sat Aug 22 18:01:06 2015 +0200 Commit: Peter Bex <peter@more-magic.net> CommitDate: Sat Aug 22 19:37:26 2015 +0200 added correctly working "base" apply, repaired C_apply once more Conflicts: runtime.c diff --git a/chicken.h b/chicken.h index 5a1d9da8..6f6fda5e 100644 --- a/chicken.h +++ b/chicken.h @@ -1289,6 +1289,7 @@ typedef void (C_ccall *C_proc)(C_word, C_word *) C_noret; #define C_pointer_address(x) ((C_byte *)C_block_item((x), 0)) #define C_block_address(ptr, n, x) C_a_unsigned_int_to_num(ptr, n, x) #define C_offset_pointer(x, y) (C_pointer_address(x) + (y)) +#define C_do_apply(c, av) ((C_proc)(void *)C_block_item((av)[0], 0))((c), (av)) #define C_kontinue(k, r) { C_word avk[ 2 ]; avk[ 0 ] = (k); avk[ 1 ] = (r); ((C_proc)(void *)C_block_item((k),0))(2, avk); } #define C_fetch_byte(x, p) (((unsigned C_byte *)C_data_pointer(x))[ p ]) #define C_poke_integer(x, i, n) (C_set_block_item(x, C_unfix(i), C_num_to_int(n)), C_SCHEME_UNDEFINED) diff --git a/runtime.c b/runtime.c index 984f4ae1..eb398304 100644 --- a/runtime.c +++ b/runtime.c @@ -1872,6 +1872,7 @@ void barf(int code, char *loc, ...) av = C_alloc(c + 4); if(!C_immediatep(err)) { + va_start(v, loc); av[ 0 ] = err; /* No continuation is passed: '##sys#error-hook' may not return: */ av[ 1 ] = C_SCHEME_UNDEFINED; @@ -1888,7 +1889,7 @@ void barf(int code, char *loc, ...) av[ i + 4 ] = va_arg(v, C_word); va_end(v); - C_apply(c + 4, av); + C_do_apply(c + 4, av); } else panic(msg); } @@ -2057,7 +2058,7 @@ C_word C_fcall C_callback(C_word closure, int argc) C_memcpy(av + 2, C_temporary_stack, (argc - 2) * sizeof(C_word)); #ifdef HAVE_SIGSETJMP - if(!C_sigsetjmp(C_restart, 0)) C_apply(argc, av); + if(!C_sigsetjmp(C_restart, 0)) C_do_apply(argc, av); #else if(!C_setjmp(C_restart)) C_do_apply(argc, av); #endif @@ -4081,8 +4082,8 @@ void handle_interrupt(void *trampoline) av[ 0 ] = proc; av[ 1 ] = C_SCHEME_UNDEFINED; av[ 2 ] = reason; - av[ 2 ] = state; - C_apply(3, av); + av[ 3 ] = state; + C_do_apply(4, av); } @@ -7119,17 +7120,26 @@ C_regparm C_word C_fcall C_i_null_pointerp(C_word x) void C_ccall C_apply(C_word c, C_word *av) { - C_word closure = av[ 0 ]; - C_word k = av[ 1 ]; - C_word fn = av[ 2 ]; + C_word + /* closure = av[ 0 ] */ + k = av[ 1 ], + fn = av[ 2 ]; int i, n = c - 3; int m = n; - C_word x, skip; + C_word x, skip, *ptr; if(c < 4) C_bad_min_argc(c, 4); - if(C_immediatep(fn) || C_header_bits(fn) != C_CLOSURE_TYPE) { + if(C_immediatep(fn) || C_header_bits(fn) != C_CLOSURE_TYPE) barf(C_NOT_A_CLOSURE_ERROR, "apply", fn); + + ptr = C_temporary_stack_limit; + *(ptr++) = fn; + *(ptr++) = k; + + if(n > 1) { + C_memcpy(ptr, av + 3, (n - 1) * sizeof(C_word)); + ptr += n - 1; } x = av[ c - 1 ]; @@ -7143,32 +7153,22 @@ void C_ccall C_apply(C_word c, C_word *av) if(C_temporary_stack < C_temporary_stack_limit) barf(C_TOO_MANY_PARAMETERS_ERROR, "apply"); - C_save(x); + *(ptr++) = x; ++m; } - if(c > 4) { - C_temporary_stack -= n - 1; - - if(C_temporary_stack < C_temporary_stack_limit) - barf(C_TOO_MANY_PARAMETERS_ERROR, "apply"); - - C_memcpy(C_temporary_stack, av + 3, n * sizeof(C_word)); - } - - C_save(k); - C_save(fn); - ((C_proc)(void *)C_block_item(fn, 0))(m + 1, C_temporary_stack); + ((C_proc)(void *)C_block_item(fn, 0))(m + 1, C_temporary_stack_limit); } void C_ccall C_call_cc(C_word c, C_word *av) { - C_word closure = av[ 0 ]; - C_word k = av[ 1 ]; - C_word cont = av[ 2 ]; - C_word *a = C_alloc(C_SIZEOF_CLOSURE(2)); - C_word wrapper; + C_word + /* closure = av[ 0 ] */ + k = av[ 1 ], + cont = av[ 2 ], + *a = C_alloc(C_SIZEOF_CLOSURE(2)), + wrapper; void *pr = (void *)C_block_item(cont,0); C_word av2[ 3 ]; @@ -7214,7 +7214,7 @@ void C_ccall call_cc_values_wrapper(C_word c, C_word *av) if(c > 2) --n; else av[ 1 ] = C_SCHEME_UNBOUND; - C_apply(n - 2, av); + C_do_apply(n - 2, av); } @@ -7246,7 +7246,7 @@ void C_ccall C_values(C_word c, C_word *av) if(C_block_item(k, 0) == (C_word)values_continuation) { av[ 0 ] = k; /* reuse av */ av[ 1 ] = C_SCHEME_UNBOUND; /* unbound value marks direct invocation */ - C_apply(n - 2, av); + C_do_apply(n - 2, av); } if(c != 3) { @@ -7287,7 +7287,7 @@ void C_ccall C_apply_values(C_word c, C_word *av) av2[ 0 ] = k; av2[ 1 ] = C_SCHEME_UNBOUND; /* unbound value marks direct invocation */ C_memcpy(av2 + 2, C_temporary_stack, n * sizeof(C_word)); - C_apply(n, av2); + C_do_apply(n, av2); } if(C_immediatep(lst) || (C_block_header(lst) == C_PAIR_TAG && C_u_i_cdr(lst) == C_SCHEME_END_OF_LIST)) { @@ -7325,7 +7325,7 @@ void C_ccall C_call_with_values(C_word c, C_word *av) kk = C_closure(&a, 3, (C_word)values_continuation, kont, k); av[ 0 ] = thunk; /* reuse av */ av[ 1 ] = kk; - C_apply(0, av); + C_do_apply(0, av); } @@ -7342,7 +7342,7 @@ void C_ccall C_u_call_with_values(C_word c, C_word *av) kk = C_closure(&a, 3, (C_word)values_continuation, kont, k); av[ 0 ] = thunk; /* reuse av */ av[ 1 ] = kk; - C_apply(0, av); + C_do_apply(0, av); } @@ -7370,7 +7370,7 @@ void C_ccall values_continuation(C_word c, C_word *av) C_memcpy(av2 + 2, av + 2, (n - 2) * sizeof(C_word)); } - C_apply(n - 2, av2); + C_do_apply(n - 2, av2); } static C_word rat_times_integer(C_word **ptr, C_word rat, C_word i) @@ -12378,7 +12378,7 @@ void C_ccall C_call_with_cthulhu(C_word c, C_word *av) av2[ 1 ] = C_closure(&a, 1, (C_word)termination_continuation); /* k */ av2[ 2 ] = proc; av2[ 3 ] = C_SCHEME_END_OF_LIST; - C_apply(4, av2); + C_do_apply(4, av2); }Trap