~ 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