~ chicken-core (chicken-5) f11bdbcc9ac7fa85276dac5b622852b87d2e7c38
commit f11bdbcc9ac7fa85276dac5b622852b87d2e7c38 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Jul 16 01:17:18 2010 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Jul 16 01:17:18 2010 +0200 added compiler re-writes and C implementations of safe caar and cdar diff --git a/c-platform.scm b/c-platform.scm index a1d0c5f7..f992f05c 100644 --- a/c-platform.scm +++ b/c-platform.scm @@ -566,6 +566,8 @@ (rewrite 'cdddar 2 1 "C_u_i_cdddar" #f) (rewrite 'cddddr 2 1 "C_u_i_cddddr" #f) +(rewrite 'caar 2 1 "C_i_caar" #t) +(rewrite 'cdar 2 1 "C_i_cdar" #t) (rewrite 'cddr 2 1 "C_i_cddr" #t) (rewrite 'cdddr 2 1 "C_i_cdddr" #t) (rewrite 'cddddr 2 1 "C_i_cddddr" #t) diff --git a/chicken.h b/chicken.h index 6f673062..7e698629 100644 --- a/chicken.h +++ b/chicken.h @@ -920,6 +920,8 @@ extern double round(double); extern double trunc(double); # endif #else +/* provide this file and define C_PROVIDE_LIBC_STUBS if you want to use + your own libc-replacements or -wrappers */ # include "chicken-libc-stubs.h" #endif @@ -1722,7 +1724,9 @@ C_fctexport C_word C_fcall C_i_negativep(C_word x) C_regparm; C_fctexport C_word C_fcall C_u_i_negativep(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_car(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_cdr(C_word x) C_regparm; +C_fctexport C_word C_fcall C_i_caar(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_cadr(C_word x) C_regparm; +C_fctexport C_word C_fcall C_i_cdar(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_cddr(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_caddr(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_cdddr(C_word x) C_regparm; diff --git a/runtime.c b/runtime.c index 4de9bdd2..cd17c989 100644 --- a/runtime.c +++ b/runtime.c @@ -3606,17 +3606,7 @@ C_regparm void C_fcall C_trace(C_char *name) /* DEPRECATED: throw out at some stage: */ C_regparm C_word C_fcall C_emit_trace_info(C_word x, C_word y, C_word t) { - if(trace_buffer_top >= trace_buffer_limit) { - trace_buffer_top = trace_buffer; - trace_buffer_full = 1; - } - - trace_buffer_top->raw = "<eval>"; - trace_buffer_top->cooked1 = x; - trace_buffer_top->cooked2 = y; - trace_buffer_top->thread = t; - ++trace_buffer_top; - return x; + return C_emit_trace_info2("<eval>", x, y, t); } @@ -4647,6 +4637,21 @@ C_regparm C_word C_fcall C_i_cdr(C_word x) } +C_regparm C_word C_fcall C_i_caar(C_word x) +{ + if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) { + bad: + barf(C_BAD_ARGUMENT_TYPE_ERROR, "caar", x); + } + + x = C_u_i_car(x); + + if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) goto bad; + + return C_u_i_car(x); +} + + C_regparm C_word C_fcall C_i_cadr(C_word x) { if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) { @@ -4655,12 +4660,28 @@ C_regparm C_word C_fcall C_i_cadr(C_word x) } x = C_u_i_cdr(x); + if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) goto bad; return C_u_i_car(x); } +C_regparm C_word C_fcall C_i_cdar(C_word x) +{ + if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) { + bad: + barf(C_BAD_ARGUMENT_TYPE_ERROR, "cdar", x); + } + + x = C_u_i_car(x); + + if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) goto bad; + + return C_u_i_cdr(x); +} + + C_regparm C_word C_fcall C_i_cddr(C_word x) { if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) {Trap