~ chicken-core (chicken-5) fe1325920d875c1fd7322aa42d09164a067369c9
commit fe1325920d875c1fd7322aa42d09164a067369c9
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Jan 17 16:25:35 2011 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jan 17 16:25:35 2011 +0100
fixed broken integer64 check (thanks to Sven Hartrumpf)
diff --git a/library.scm b/library.scm
index df45376b..ec341757 100644
--- a/library.scm
+++ b/library.scm
@@ -1062,7 +1062,7 @@ EOF
(##sys#check-integer n2 'lcm)
(loop
(cons
- (##sys#lcm head (##sys#slot next 0))
+ (##sys#lcm head n2)
(##sys#slot next 1)) #f) ) ) ) ) ) )
(define (##sys#string->number str #!optional (radix 10))
diff --git a/runtime.c b/runtime.c
index 6e6821bb..45107fa6 100644
--- a/runtime.c
+++ b/runtime.c
@@ -5679,10 +5679,8 @@ C_regparm C_word C_fcall C_i_foreign_integer64_argumentp(C_word x)
{
double m;
- if((x & C_FIXNUM_BIT) != 0) return x;
-
- if(!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG)
- return C_flonum_magnitude(x);
+ if((x & C_FIXNUM_BIT) != 0 || (!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG))
+ return x;
barf(C_BAD_ARGUMENT_TYPE_NO_INTEGER_ERROR, NULL, x);
return C_SCHEME_UNDEFINED;
@@ -5695,8 +5693,11 @@ C_regparm C_word C_fcall C_i_foreign_unsigned_integer_argumentp(C_word x)
if((x & C_FIXNUM_BIT) != 0) return x;
- if(!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG)
- return C_flonum_magnitude(x);
+ if(!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG) {
+ m = C_flonum_magnitude(x);
+
+ if(m >= 0 && m <= C_UWORD_MAX) return x;
+ }
barf(C_BAD_ARGUMENT_TYPE_NO_UINTEGER_ERROR, NULL, x);
return C_SCHEME_UNDEFINED;
@@ -5709,11 +5710,8 @@ C_regparm C_word C_fcall C_i_foreign_unsigned_integer64_argumentp(C_word x)
if((x & C_FIXNUM_BIT) != 0) return x;
- if(!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG) {
- m = C_flonum_magnitude(x);
-
- if(m >= 0 && m <= C_UWORD64_MAX) return x;
- }
+ if(!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG)
+ return C_flonum_magnitude(x);
barf(C_BAD_ARGUMENT_TYPE_NO_UINTEGER_ERROR, NULL, x);
return C_SCHEME_UNDEFINED;
diff --git a/tests/embedded3.c b/tests/embedded3.c
new file mode 100644
index 00000000..c5672be3
--- /dev/null
+++ b/tests/embedded3.c
@@ -0,0 +1,44 @@
+/* embedded3-c.c */
+
+#include <chicken.h>
+#include <assert.h>
+
+extern double baz(int);
+
+int main() {
+ char buffer[ 256 ];
+ int status;
+ C_word val = C_SCHEME_UNDEFINED;
+ C_word *data[ 1 ];
+
+ data[ 0 ] = &val;
+
+ CHICKEN_run(C_toplevel);
+
+ status = CHICKEN_read("(bar 99)", &val);
+ assert(status);
+
+ C_gc_protect(data, 1);
+
+ printf("data: %08x\n", val);
+
+ status = CHICKEN_eval_string_to_string("(bar)", buffer, 255);
+ assert(!status);
+
+ CHICKEN_get_error_message(buffer, 255);
+ printf("ouch: %s\n", buffer);
+
+ status = CHICKEN_eval_string_to_string("(bar 23)", buffer, 255);
+ assert(status);
+
+ printf("-> %s\n", buffer);
+ printf("data: %08x\n", val);
+
+ status = CHICKEN_eval_to_string(val, buffer, 255);
+ assert(status);
+ printf("-> %s\n", buffer);
+
+ printf("->` %g\n", baz(22));
+
+ return 0;
+}
diff --git a/tests/embedded4.scm b/tests/embedded4.scm
new file mode 100644
index 00000000..cb188116
--- /dev/null
+++ b/tests/embedded4.scm
@@ -0,0 +1,8 @@
+;;; x.scm
+
+(define (bar x) (gc) (* x x))
+
+(define-external (baz (int i)) double
+ (sqrt i))
+
+(return-to-host)
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 61a8c61d..09f95a05 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -273,6 +273,10 @@ echo "======================================== embedding (2) ..."
$compile -e embedded2.scm
./a.out
+echo "======================================== embedding (3) ..."
+$compile -e embedded3.c embedded4.scm
+./a.out
+
echo "======================================== private repository test ..."
mkdir -p tmp
$compile private-repository-test.scm -private-repository -o tmp/xxx
Trap