~ chicken-core (chicken-5) a1763b87d5d1f56998d5a005c3bd903969c358fd


commit a1763b87d5d1f56998d5a005c3bd903969c358fd
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Sep 15 09:06:22 2010 -0400
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Sep 15 09:06:22 2010 -0400

    added pv-length and tests

diff --git a/lolevel.import.scm b/lolevel.import.scm
index a61d5ae7..9e9ae290 100644
--- a/lolevel.import.scm
+++ b/lolevel.import.scm
@@ -44,6 +44,7 @@
    locative?
    make-locative
    make-record-instance
+   make-pointer-vector
    make-weak-locative
    move-memory!
    mutate-procedure
@@ -75,6 +76,11 @@
    pointer-s32-set!
    pointer-s8-ref
    pointer-s8-set!
+   pointer-vector
+   pointer-vector?
+   pointer-vector-length
+   pointer-vector-ref
+   pointer-vector-set!
    pointer-tag
    pointer-u16-ref
    pointer-u16-set!
diff --git a/lolevel.scm b/lolevel.scm
index acff3cd3..8c02cc81 100644
--- a/lolevel.scm
+++ b/lolevel.scm
@@ -712,3 +712,7 @@ EOF
      (pv-buf-ref (##sys#slot pv 2) i))	; buf
    pointer-vector-set!
    "(pointer-vector-ref pv i)"))
+
+(define (pointer-vector-length pv)
+  (##sys#check-structure pv 'pointer-vector 'pointer-vector-length)
+  (##sys#slot pv 1))
diff --git a/tests/lolevel-tests.scm b/tests/lolevel-tests.scm
index a1ed0f93..82095073 100644
--- a/tests/lolevel-tests.scm
+++ b/tests/lolevel-tests.scm
@@ -273,3 +273,16 @@
 (assert (not (eq? foo new-foo)))
 
 (assert (equal? '(hello 1 2) (foo 1 2)))
+
+; pointer vectors
+
+(define pv (make-pointer-vector 42 #f))
+(assert (= 42 (pointer-vector-length pv)))
+(pointer-vector-set! pv 1 (address->pointer 999))
+(set! (pointer-vector-ref pv 40) (address->pointer 777))
+(assert (not (pointer-vector-ref pv 0)))
+(assert (not (pointer-vector-ref pv 41)))
+(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)))
diff --git a/types.db b/types.db
index 459a111f..61e39bb0 100644
--- a/types.db
+++ b/types.db
@@ -614,6 +614,7 @@
 (pointer-vector (procedure pointer-vector (#!rest pointer-vector) boolean))
 (pointer-vector? (procedure pointer-vector? (*) boolean))
 (pointer-vector-fill! (procedure pointer-vector-fill! (pointer-vector pointer) undefined))
+(pointer-vector-length (procedure pointer-vector-length (pointer-vector) fixnum))
 (pointer-vector-ref (procedure pointer-vector-ref (pointer-vector fixnum) pointer))
 (pointer-vector-set! (procedure pointer-vector-set! (pointer-vector fixnum pointer) pointer))
 (pointer-s16-ref (procedure pointer-s16-ref (pointer) fixnum))
Trap