~ chicken-core (chicken-5) 887df892c58462824a917f8f606d8ab3c5b64b5c
commit 887df892c58462824a917f8f606d8ab3c5b64b5c Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Sep 16 04:24:55 2010 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Sep 16 04:24:55 2010 -0400 fixes to pointer-vector ops diff --git a/c-platform.scm b/c-platform.scm index 7056809f..7fee8b53 100644 --- a/c-platform.scm +++ b/c-platform.scm @@ -169,7 +169,7 @@ ##sys#bytevector? ##sys#make-vector ##sys#setter ##sys#car ##sys#cdr ##sys#pair? ##sys#eq? ##sys#list? ##sys#vector? ##sys#eqv? ##sys#get-keyword ##sys#foreign-char-argument ##sys#foreign-fixnum-argument ##sys#foreign-flonum-argument - ##sys#foreign-block-argument ##sys#foreign-number-vector-argument + ##sys#foreign-block-argument ##sys#foreign-struct-wrapper-argument ##sys#foreign-string-argument ##sys#foreign-pointer-argument ##sys#void ##sys#foreign-integer-argument ##sys#foreign-unsigned-integer-argument ##sys#double->number ##sys#peek-fixnum ##sys#setislot ##sys#poke-integer ##sys#permanent? ##sys#values ##sys#poke-double @@ -953,7 +953,7 @@ (rewrite '##sys#foreign-char-argument 17 1 "C_i_foreign_char_argumentp") (rewrite '##sys#foreign-flonum-argument 17 1 "C_i_foreign_flonum_argumentp") (rewrite '##sys#foreign-block-argument 17 1 "C_i_foreign_block_argumentp") -(rewrite '##sys#foreign-number-vector-argument 17 2 "C_i_foreign_number_vector_argumentp") +(rewrite '##sys#foreign-struct-wrapper-argument 17 2 "C_i_foreign_struct_wrapper_argumentp") (rewrite '##sys#foreign-string-argument 17 1 "C_i_foreign_string_argumentp") (rewrite '##sys#foreign-pointer-argument 17 1 "C_i_foreign_pointer_argumentp") (rewrite '##sys#foreign-integer-argument 17 1 "C_i_foreign_integer_argumentp") diff --git a/chicken.h b/chicken.h index dde32f07..0b7e2579 100644 --- a/chicken.h +++ b/chicken.h @@ -1829,7 +1829,8 @@ C_fctexport C_word C_fcall C_i_foreign_char_argumentp(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_foreign_fixnum_argumentp(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_foreign_flonum_argumentp(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_foreign_block_argumentp(C_word x) C_regparm; -C_fctexport C_word C_fcall C_i_foreign_number_vector_argumentp(C_word t, C_word x) C_regparm; +C_fctexport C_word C_fcall C_i_foreign_number_vector_argumentp(C_word t, C_word x) C_regparm; /* OBSOLETE */ +C_fctexport C_word C_fcall C_i_foreign_struct_wrapper_argumentp(C_word t, C_word x) C_regparm; C_fctexport C_word C_fcall C_i_foreign_string_argumentp(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_foreign_symbol_argumentp(C_word x) C_regparm; C_fctexport C_word C_fcall C_i_foreign_tagged_pointer_argumentp(C_word x, C_word t) C_regparm; @@ -2036,7 +2037,7 @@ C_inline void *C_srfi_4_vector_or_null(C_word x) C_inline void *C_c_pointer_vector_or_null(C_word x) { - return C_truep(x) ? C_data_pointer(C_block_item(x, 1)) : NULL; + return C_truep(x) ? C_data_pointer(C_block_item(x, 2)) : NULL; } diff --git a/library.scm b/library.scm index d0bb6dd5..84807ec4 100644 --- a/library.scm +++ b/library.scm @@ -3902,7 +3902,11 @@ EOF (define (##sys#foreign-fixnum-argument x) (##core#inline "C_i_foreign_fixnum_argumentp" x)) (define (##sys#foreign-flonum-argument x) (##core#inline "C_i_foreign_flonum_argumentp" x)) (define (##sys#foreign-block-argument x) (##core#inline "C_i_foreign_block_argumentp" x)) -(define (##sys#foreign-number-vector-argument t x) (##core#inline "C_i_foreign_number_vector_argumentp" t x)) + +(define (##sys#foreign-struct-wrapper-argument t x) + (##core#inline "C_i_foreign_struct_wrapper_argumentp" t x)) + +(define ##sys#foreign-number-vector-argument ##sys#foreign-struct-wrapper-argument) ;OBSOLETE (define (##sys#foreign-string-argument x) (##core#inline "C_i_foreign_string_argumentp" x)) (define (##sys#foreign-symbol-argument x) (##core#inline "C_i_foreign_symbol_argumentp" x)) (define (##sys#foreign-pointer-argument x) (##core#inline "C_i_foreign_pointer_argumentp" x)) @@ -3910,10 +3914,6 @@ EOF (define (##sys#foreign-integer-argument x) (##core#inline "C_i_foreign_integer_argumentp" x)) (define (##sys#foreign-unsigned-integer-argument x) (##core#inline "C_i_foreign_unsigned_integer_argumentp" x)) -(define (##sys#foreign-pointer-vector-argument x) ; not optimized yet - (##sys#check-structure x 'pointer-vector) - x) - ;;; Low-level threading interface: diff --git a/lolevel.scm b/lolevel.scm index 8c02cc81..7c0d745c 100644 --- a/lolevel.scm +++ b/lolevel.scm @@ -656,15 +656,15 @@ EOF (let ((unset (list 'unset))) (lambda (n #!optional (init unset)) (##sys#check-exact n 'make-pointer-vector) - (let* ((mul (if (##sys#fudge 3) 8 4)) ; 64-bit? + (let* ((mul (##sys#fudge 7)) ; wordsize (size (fx* n mul)) (buf (##sys#make-blob size))) (unless (eq? init unset) (when init - (##sys#check-pointer init 'make-pointer-vector) - (do ((i 0 (fx+ i 1))) - ((fx>= i n)) - (pv-buf-set! buf i init)))) + (##sys#check-pointer init 'make-pointer-vector)) + (do ((i 0 (fx+ i 1))) + ((fx>= i n)) + (pv-buf-set! buf i init))) (##sys#make-structure 'pointer-vector n buf))))) (define (pointer-vector? x) @@ -677,7 +677,9 @@ EOF (do ((ptrs ptrs (cdr ptrs)) (i 0 (fx+ i 1))) ((null? ptrs) pv) - (pv-buf-set! buf i (car ptrs))))) + (let ((ptr (car ptrs))) + (##sys#check-pointer ptr 'pointer-vector) + (pv-buf-set! buf i ptr))))) (define (pointer-vector-fill! pv ptr) (##sys#check-structure pv 'pointer-vector 'pointer-vector-fill!) @@ -690,11 +692,11 @@ EOF (define pv-buf-ref (foreign-lambda* c-pointer ((scheme-object buf) (unsigned-int i)) - "C_return(*(C_data_pointer(buf) + i));")) + "C_return(*((void **)C_data_pointer(buf) + i));")) (define pv-buf-set! (foreign-lambda* void ((scheme-object buf) (unsigned-int i) (c-pointer ptr)) - "*(C_data_pointer(buf) + i) = ptr;")) + "*((void **)C_data_pointer(buf) + i) = ptr;")) (define (pointer-vector-set! pv i ptr) (##sys#check-structure pv 'pointer-vector 'pointer-vector-ref) diff --git a/runtime.c b/runtime.c index f3e50097..1a115058 100644 --- a/runtime.c +++ b/runtime.c @@ -5570,6 +5570,7 @@ C_regparm C_word C_fcall C_i_foreign_block_argumentp(C_word x) } +/* OBSOLETE */ C_regparm C_word C_fcall C_i_foreign_number_vector_argumentp(C_word t, C_word x) { if(C_immediatep(x) || C_header_bits(x) != C_STRUCTURE_TYPE || C_block_item(x, 0) != t) @@ -5579,6 +5580,15 @@ C_regparm C_word C_fcall C_i_foreign_number_vector_argumentp(C_word t, C_word x) } +C_regparm C_word C_fcall C_i_foreign_struct_wrapper_argumentp(C_word t, C_word x) +{ + if(C_immediatep(x) || C_header_bits(x) != C_STRUCTURE_TYPE || C_block_item(x, 0) != t) + barf(C_BAD_ARGUMENT_TYPE_BAD_STRUCT_ERROR, NULL, t, x); + + return x; +} + + C_regparm C_word C_fcall C_i_foreign_string_argumentp(C_word x) { if(C_immediatep(x) || C_header_bits(x) != C_STRING_TYPE) diff --git a/support.scm b/support.scm index a52fefea..d8431392 100644 --- a/support.scm +++ b/support.scm @@ -932,25 +932,25 @@ (if ,tmp ,(if unsafe tmp - `(##sys#foreign-pointer-vector-argument ,tmp) ) + `(##sys#foreign-struct-wrapper-argument 'pointer-vector ,tmp) ) '#f) ) ) ) ((nonnull-pointer-vector) (if unsafe param - `(##sys#foreign-pointer-vector-argument ,param) ) ] + `(##sys#foreign-struct-wrapper-argument 'pointer-vector ,param) ) ) [(u8vector u16vector s8vector s16vector u32vector s32vector f32vector f64vector) (let ([tmp (gensym)]) `(let ([,tmp ,param]) (if ,tmp ,(if unsafe tmp - `(##sys#foreign-number-vector-argument ',t ,tmp) ) + `(##sys#foreign-struct-wrapper-argument ',t ,tmp) ) '#f) ) ) ] [(nonnull-u8vector nonnull-u16vector nonnull-s8vector nonnull-s16vector nonnull-u32vector nonnull-s32vector nonnull-f32vector nonnull-f64vector) (if unsafe param - `(##sys#foreign-number-vector-argument + `(##sys#foreign-struct-wrapper-argument ',(##sys#slot (assq t tmap) 1) ,param) ) ] [(integer long integer32) (if unsafe param `(##sys#foreign-integer-argument ,param))] diff --git a/tests/lolevel-tests.scm b/tests/lolevel-tests.scm index 71d18acf..713e5c52 100644 --- a/tests/lolevel-tests.scm +++ b/tests/lolevel-tests.scm @@ -278,6 +278,7 @@ (define pv (make-pointer-vector 42 #f)) (assert (= 42 (pointer-vector-length pv))) +(assert (not (pointer-vector-ref pv 0))) (pointer-vector-set! pv 1 (address->pointer 999)) (set! (pointer-vector-ref pv 40) (address->pointer 777)) (assert (not (pointer-vector-ref pv 0))) @@ -285,19 +286,18 @@ (assert (= (pointer->address (pointer-vector-ref pv 1)) 999)) (assert (= (pointer->address (pointer-vector-ref pv 40)) 777)) (pointer-vector-fill! pv (address->pointer 1)) -(assert (= 1 (pointer-vector-ref pv 0))) - -(define pv1 - (foreign-lambda* scheme-object ((pointer-vector pv)) - "C_return(C_mk_bool(pv == NULL));")) - -(define pv2 - (foreign-lambda* c-pointer ((pointer-vector pv) (bool f)) - "static void *xx;" - "if(!f) C_return(xx[ 0 ]);" - "else pv[ 0 ] = xx;" - "C_return(xx);")) - -(assert (eq? #t (pv1 #f))) -(define p (pv2 #t)) -(assert (pointer=? p (pv2 #f))) +(assert (= 1 (pointer->address (pointer-vector-ref pv 0)))) + +#+(not csi) +(begin + (define pv1 + (foreign-lambda* bool ((pointer-vector pv)) + "C_return(pv == NULL);")) + (define pv2 + (foreign-lambda* c-pointer ((pointer-vector pv) (bool f)) + "static void *xx = (void *)123;" + "if(f) pv[ 0 ] = xx;" + "C_return(xx);")) + (assert (eq? #t (pv1 #f))) + (define p (pv2 pv #t)) + (assert (pointer=? p (pv2 pv #f)))) diff --git a/tests/runtests.sh b/tests/runtests.sh index a17184fc..9be2f8e8 100644 --- a/tests/runtests.sh +++ b/tests/runtests.sh @@ -104,6 +104,11 @@ diff -bu dwindtst.expected dwindtst.out echo "*** Skipping \"feeley-dynwind\" for now ***" # $interpret -s feeley-dynwind.scm +echo "======================================== lolevel tests ..." +$interpret -s lolevel-tests.scm +$compile lolevel-tests.scm +./a.out + echo "======================================== syntax tests ..." $interpret -s syntax-tests.scm @@ -198,9 +203,6 @@ $interpret -bnq ec.so ec-tests.scm echo "======================================== hash-table tests ..." $interpret -s hash-table-tests.scm -echo "======================================== lolevel tests ..." -$interpret -s lolevel-tests.scm - echo "======================================== port tests ..." $interpret -s port-tests.scmTrap