[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Chicken-hackers] [PATCH 1/3] Move memory-related procedures to new chic
From: |
Evan Hanson |
Subject: |
[Chicken-hackers] [PATCH 1/3] Move memory-related procedures to new chicken.memory module |
Date: |
Sat, 4 Jun 2016 00:03:23 +1200 |
---
README | 7 +-
c-platform.scm | 102 +++++++++++-----------
chicken-install.scm | 1 +
defaults.make | 2 +-
distribution/manifest | 2 +
lolevel.scm | 215 ++++++++++++++++++++++++----------------------
manual/Unit lolevel | 16 +++-
rules.make | 4 +-
tests/lolevel-tests.scm | 2 +-
tests/typematch-tests.scm | 2 +-
types.db | 135 ++++++++++++++---------------
11 files changed, 253 insertions(+), 235 deletions(-)
diff --git a/README b/README
index e997947..2a92808 100644
--- a/README
+++ b/README
@@ -296,12 +296,13 @@
| | |-- chicken.foreign.import.so
| | |-- chicken.format.import.so
| | |-- chicken.gc.import.so
- | | |-- chicken.keyword.import.so
- | | |-- chicken.locative.import.so
- | | |-- chicken.lolevel.import.so
| | |-- chicken.internal.import.so
| | |-- chicken.io.import.so
| | |-- chicken.irregex.import.so
+ | | |-- chicken.keyword.import.so
+ | | |-- chicken.locative.import.so
+ | | |-- chicken.lolevel.import.so
+ | | |-- chicken.memory.import.so
| | |-- chicken.pathname.import.so
| | |-- chicken.ports.import.so
| | |-- chicken.posix.import.so
diff --git a/c-platform.scm b/c-platform.scm
index f95a238..acd0b53 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -181,31 +181,31 @@
srfi-4#blob->u32vector/shared srfi-4#blob->s32vector/shared
srfi-4#blob->u64vector/shared srfi-4#blob->s64vector/shared
srfi-4#blob->f32vector/shared srfi-4#blob->f64vector/shared
- chicken.lolevel#make-record-instance
+ chicken.lolevel#number-of-slots chicken.lolevel#make-record-instance
chicken.lolevel#block-ref chicken.lolevel#block-set!
- chicken.lolevel#u8vector-ref chicken.lolevel#s8vector-ref
- chicken.lolevel#u16vector-ref chicken.lolevel#s16vector-ref
- chicken.lolevel#u32vector-ref chicken.lolevel#s32vector-ref
- chicken.lolevel#u64vector-ref chicken.lolevel#s64vector-ref
- chicken.lolevel#f32vector-ref chicken.lolevel#f64vector-ref
- chicken.lolevel#f32vector-set! chicken.lolevel#f64vector-set!
- chicken.lolevel#u8vector-set! chicken.lolevel#s8vector-set!
- chicken.lolevel#u16vector-set! chicken.lolevel#s16vector-set!
- chicken.lolevel#u32vector-set! chicken.lolevel#s32vector-set!
- chicken.lolevel#u64vector-set! chicken.lolevel#s64vector-set!
+ chicken.memory#u8vector-ref chicken.memory#s8vector-ref
+ chicken.memory#u16vector-ref chicken.memory#s16vector-ref
+ chicken.memory#u32vector-ref chicken.memory#s32vector-ref
+ chicken.memory#u64vector-ref chicken.memory#s64vector-ref
+ chicken.memory#f32vector-ref chicken.memory#f64vector-ref
+ chicken.memory#f32vector-set! chicken.memory#f64vector-set!
+ chicken.memory#u8vector-set! chicken.memory#s8vector-set!
+ chicken.memory#u16vector-set! chicken.memory#s16vector-set!
+ chicken.memory#u32vector-set! chicken.memory#s32vector-set!
+ chicken.memory#u64vector-set! chicken.memory#s64vector-set!
chicken.locative#locative-ref chicken.locative#locative-set!
chicken.locative#locative->object chicken.locative#locative?
- chicken.lolevel#pointer->object chicken.lolevel#pointer+
- chicken.lolevel#address->pointer chicken.lolevel#pointer->address
- chicken.lolevel#pointer=? chicken.lolevel#number-of-slots
- chicken.lolevel#pointer-u8-ref chicken.lolevel#pointer-s8-ref
- chicken.lolevel#pointer-u16-ref chicken.lolevel#pointer-s16-ref
- chicken.lolevel#pointer-u32-ref chicken.lolevel#pointer-s32-ref
- chicken.lolevel#pointer-f32-ref chicken.lolevel#pointer-f64-ref
- chicken.lolevel#pointer-u8-set! chicken.lolevel#pointer-s8-set!
- chicken.lolevel#pointer-u16-set! chicken.lolevel#pointer-s16-set!
- chicken.lolevel#pointer-u32-set! chicken.lolevel#pointer-s32-set!
- chicken.lolevel#pointer-f32-set! chicken.lolevel#pointer-f64-set!
+ chicken.memory#pointer+ chicken.memory#pointer=?
+ chicken.memory#address->pointer chicken.memory#pointer->address
+ chicken.memory#pointer->object chicken.memory#object->pointer
+ chicken.memory#pointer-u8-ref chicken.memory#pointer-s8-ref
+ chicken.memory#pointer-u16-ref chicken.memory#pointer-s16-ref
+ chicken.memory#pointer-u32-ref chicken.memory#pointer-s32-ref
+ chicken.memory#pointer-f32-ref chicken.memory#pointer-f64-ref
+ chicken.memory#pointer-u8-set! chicken.memory#pointer-s8-set!
+ chicken.memory#pointer-u16-set! chicken.memory#pointer-s16-set!
+ chicken.memory#pointer-u32-set! chicken.memory#pointer-s32-set!
+ chicken.memory#pointer-f32-set! chicken.memory#pointer-f64-set!
chicken.data-structures#o
chicken.data-structures#substring-index
chicken.data-structures#substring-index-ci
@@ -745,28 +745,28 @@
(rewrite '##sys#vector 16 #f "C_a_i_vector" #t #t)
(rewrite '##sys#make-structure 16 #f "C_a_i_record" #t #t #t)
(rewrite 'string 16 #f "C_a_i_string" #t #t) ; the last #t is actually too
much, but we don't care
-(rewrite 'chicken.lolevel#address->pointer 16 1 "C_a_i_address_to_pointer" #f
2)
-(rewrite 'chicken.lolevel#pointer->address 16 1 "C_a_i_pointer_to_address" #f
words-per-flonum)
-(rewrite 'chicken.lolevel#pointer+ 16 2 "C_a_u_i_pointer_inc" #f 2)
+(rewrite 'chicken.memory#address->pointer 16 1 "C_a_i_address_to_pointer" #f 2)
+(rewrite 'chicken.memory#pointer->address 16 1 "C_a_i_pointer_to_address" #f
words-per-flonum)
+(rewrite 'chicken.memory#pointer+ 16 2 "C_a_u_i_pointer_inc" #f 2)
(rewrite 'chicken.locative#locative-ref 16 1 "C_a_i_locative_ref" #t 6)
-(rewrite 'chicken.lolevel#pointer-u8-ref 2 1 "C_u_i_pointer_u8_ref" #f)
-(rewrite 'chicken.lolevel#pointer-s8-ref 2 1 "C_u_i_pointer_s8_ref" #f)
-(rewrite 'chicken.lolevel#pointer-u16-ref 2 1 "C_u_i_pointer_u16_ref" #f)
-(rewrite 'chicken.lolevel#pointer-s16-ref 2 1 "C_u_i_pointer_s16_ref" #f)
-(rewrite 'chicken.lolevel#pointer-u8-set! 2 2 "C_u_i_pointer_u8_set" #f)
-(rewrite 'chicken.lolevel#pointer-s8-set! 2 2 "C_u_i_pointer_s8_set" #f)
-(rewrite 'chicken.lolevel#pointer-u16-set! 2 2 "C_u_i_pointer_u16_set" #f)
-(rewrite 'chicken.lolevel#pointer-s16-set! 2 2 "C_u_i_pointer_s16_set" #f)
-(rewrite 'chicken.lolevel#pointer-u32-set! 2 2 "C_u_i_pointer_u32_set" #f)
-(rewrite 'chicken.lolevel#pointer-s32-set! 2 2 "C_u_i_pointer_s32_set" #f)
-(rewrite 'chicken.lolevel#pointer-f32-set! 2 2 "C_u_i_pointer_f32_set" #f)
-(rewrite 'chicken.lolevel#pointer-f64-set! 2 2 "C_u_i_pointer_f64_set" #f)
-
-(rewrite 'chicken.lolevel#pointer-u32-ref 16 1 "C_a_u_i_pointer_u32_ref" #f
words-per-flonum)
-(rewrite 'chicken.lolevel#pointer-s32-ref 16 1 "C_a_u_i_pointer_s32_ref" #f
words-per-flonum)
-(rewrite 'chicken.lolevel#pointer-f32-ref 16 1 "C_a_u_i_pointer_f32_ref" #f
words-per-flonum)
-(rewrite 'chicken.lolevel#pointer-f64-ref 16 1 "C_a_u_i_pointer_f64_ref" #f
words-per-flonum)
+(rewrite 'chicken.memory#pointer-u8-ref 2 1 "C_u_i_pointer_u8_ref" #f)
+(rewrite 'chicken.memory#pointer-s8-ref 2 1 "C_u_i_pointer_s8_ref" #f)
+(rewrite 'chicken.memory#pointer-u16-ref 2 1 "C_u_i_pointer_u16_ref" #f)
+(rewrite 'chicken.memory#pointer-s16-ref 2 1 "C_u_i_pointer_s16_ref" #f)
+(rewrite 'chicken.memory#pointer-u8-set! 2 2 "C_u_i_pointer_u8_set" #f)
+(rewrite 'chicken.memory#pointer-s8-set! 2 2 "C_u_i_pointer_s8_set" #f)
+(rewrite 'chicken.memory#pointer-u16-set! 2 2 "C_u_i_pointer_u16_set" #f)
+(rewrite 'chicken.memory#pointer-s16-set! 2 2 "C_u_i_pointer_s16_set" #f)
+(rewrite 'chicken.memory#pointer-u32-set! 2 2 "C_u_i_pointer_u32_set" #f)
+(rewrite 'chicken.memory#pointer-s32-set! 2 2 "C_u_i_pointer_s32_set" #f)
+(rewrite 'chicken.memory#pointer-f32-set! 2 2 "C_u_i_pointer_f32_set" #f)
+(rewrite 'chicken.memory#pointer-f64-set! 2 2 "C_u_i_pointer_f64_set" #f)
+
+(rewrite 'chicken.memory#pointer-u32-ref 16 1 "C_a_u_i_pointer_u32_ref" #f
words-per-flonum)
+(rewrite 'chicken.memory#pointer-s32-ref 16 1 "C_a_u_i_pointer_s32_ref" #f
words-per-flonum)
+(rewrite 'chicken.memory#pointer-f32-ref 16 1 "C_a_u_i_pointer_f32_ref" #f
words-per-flonum)
+(rewrite 'chicken.memory#pointer-f64-ref 16 1 "C_a_u_i_pointer_f64_ref" #f
words-per-flonum)
(rewrite
'##sys#setslot 8
@@ -836,7 +836,7 @@
(rewrite '##sys#setbyte 17 3 "C_setbyte")
(rewrite '##sys#peek-fixnum 17 2 "C_peek_fixnum")
(rewrite '##sys#peek-byte 17 2 "C_peek_byte")
-(rewrite 'chicken.lolevel#pointer->object 17 2 "C_pointer_to_object")
+(rewrite 'chicken.memory#pointer->object 17 2 "C_pointer_to_object")
(rewrite '##sys#setislot 17 3 "C_i_set_i_slot")
(rewrite '##sys#poke-integer 17 3 "C_poke_integer")
(rewrite '##sys#poke-double 17 3 "C_poke_double")
@@ -973,14 +973,14 @@
(srfi-4#f64vector-ref . srfi-4#f64vector-set!)
(chicken.locative#locative-ref . chicken.locative#locative-set!)
(chicken.lolevel#block-ref . chicken.lolevel#block-set!)
- (chicken.lolevel#pointer-u8-ref . chicken.lolevel#pointer-u8-set!)
- (chicken.lolevel#pointer-s8-ref . chicken.lolevel#pointer-s8-set!)
- (chicken.lolevel#pointer-u16-ref . chicken.lolevel#pointer-u16-set!)
- (chicken.lolevel#pointer-s16-ref . chicken.lolevel#pointer-s16-set!)
- (chicken.lolevel#pointer-u32-ref . chicken.lolevel#pointer-u32-set!)
- (chicken.lolevel#pointer-s32-ref . chicken.lolevel#pointer-s32-set!)
- (chicken.lolevel#pointer-f32-ref . chicken.lolevel#pointer-f32-set!)
- (chicken.lolevel#pointer-f64-ref . chicken.lolevel#pointer-f64-set!)))
+ (chicken.memory#pointer-u8-ref . chicken.memory#pointer-u8-set!)
+ (chicken.memory#pointer-s8-ref . chicken.memory#pointer-s8-set!)
+ (chicken.memory#pointer-u16-ref . chicken.memory#pointer-u16-set!)
+ (chicken.memory#pointer-s16-ref . chicken.memory#pointer-s16-set!)
+ (chicken.memory#pointer-u32-ref . chicken.memory#pointer-u32-set!)
+ (chicken.memory#pointer-s32-ref . chicken.memory#pointer-s32-set!)
+ (chicken.memory#pointer-f32-ref . chicken.memory#pointer-f32-set!)
+ (chicken.memory#pointer-f64-ref . chicken.memory#pointer-f64-set!)))
(rewrite
'##sys#setter 8
diff --git a/chicken-install.scm b/chicken-install.scm
index a4b87ca..68d08c6 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -63,6 +63,7 @@
"chicken.keyword.import.so"
"chicken.locative.import.so"
"chicken.lolevel.import.so"
+ "chicken.memory.import.so"
"chicken.pathname.import.so"
"chicken.ports.import.so"
"chicken.posix.import.so"
diff --git a/defaults.make b/defaults.make
index 404fa11..c9cf458 100644
--- a/defaults.make
+++ b/defaults.make
@@ -265,7 +265,7 @@ CHICKEN_PROGRAM_OPTIONS += $(if $(PROFILE_OBJECTS),-profile)
PRIMITIVE_IMPORT_LIBRARIES = chicken chicken.csi chicken.foreign
DYNAMIC_IMPORT_LIBRARIES = setup-api setup-download srfi-4
DYNAMIC_CHICKEN_IMPORT_LIBRARIES = bitwise fixnum flonum format gc io \
- keyword locative posix pretty-print random time
+ keyword locative memory posix pretty-print random time
DYNAMIC_CHICKEN_COMPILER_IMPORT_LIBRARIES = user-pass
DYNAMIC_CHICKEN_UNIT_IMPORT_LIBRARIES = continuation data-structures \
eval expand files internal irregex lolevel pathname ports \
diff --git a/distribution/manifest b/distribution/manifest
index e9106cb..15dad8b 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -291,6 +291,8 @@ chicken.locative.import.scm
chicken.locative.import.c
chicken.lolevel.import.scm
chicken.lolevel.import.c
+chicken.memory.import.scm
+chicken.memory.import.c
chicken.pathname.import.scm
chicken.pathname.import.c
chicken.ports.import.scm
diff --git a/lolevel.scm b/lolevel.scm
index d226166..e53d526 100644
--- a/lolevel.scm
+++ b/lolevel.scm
@@ -36,30 +36,24 @@
EOF
) )
-(module chicken.lolevel
- (address->pointer align-to-word allocate block-ref block-set!
- extend-procedure extended-procedure? free
- make-pointer-vector make-record-instance
- move-memory! mutate-procedure! number-of-bytes number-of-slots
- object->pointer object-become! object-copy pointer+ pointer->address
+(include "common-declarations.scm")
+
+(module chicken.memory
+ (address->pointer align-to-word allocate free make-pointer-vector
+ move-memory! object->pointer pointer+ pointer->address
pointer->object pointer-f32-ref pointer-f32-set! pointer-f64-ref
pointer-f64-set! pointer-like? pointer-s16-ref pointer-s16-set!
pointer-s32-ref pointer-s32-set! pointer-s64-ref pointer-s64-set!
pointer-s8-ref pointer-s8-set! pointer-tag pointer-u16-ref
- pointer-u16-set! pointer-u32-ref pointer-u32-set!
- pointer-u64-ref pointer-u64-set! pointer-u8-ref pointer-u8-set!
- pointer-vector pointer-vector-fill! pointer-vector-length
- pointer-vector-ref pointer-vector-set! pointer-vector?
- pointer=? pointer? procedure-data
- record->vector record-instance-length record-instance-slot
- record-instance-slot-set! record-instance-type record-instance?
- set-procedure-data! tag-pointer tagged-pointer? vector-like?)
+ pointer-u16-set! pointer-u32-ref pointer-u32-set! pointer-u64-ref
+ pointer-u64-set! pointer-u8-ref pointer-u8-set! pointer-vector
+ pointer-vector-fill! pointer-vector-length pointer-vector-ref
+ pointer-vector-set! pointer-vector? pointer=? pointer? tag-pointer
+ tagged-pointer?)
(import scheme chicken)
(import chicken.foreign)
-(include "common-declarations.scm")
-
;;; Helpers:
@@ -197,23 +191,6 @@ EOF
(typerr from)] ) ) ) ) )
-;;; Copy arbitrary object:
-
-(define (object-copy x)
- (let copy ([x x])
- (cond [(not (##core#inline "C_blockp" x)) x]
- [(symbol? x) (##sys#intern-symbol (##sys#slot x 1))]
- [else
- (let* ([n (##sys#size x)]
- [words (if (##core#inline "C_byteblockp" x) (##core#inline
"C_words" n) n)]
- [y (##core#inline "C_copy_block" x (##sys#make-vector
words))] )
- (unless (or (##core#inline "C_byteblockp" x) (symbol? x))
- (do ([i (if (##core#inline "C_specialp" x) 1 0) (fx+ i 1)])
- [(fx>= i n)]
- (##sys#setslot y i (copy (##sys#slot y i))) ) )
- y) ] ) ) )
-
-
;;; Pointer operations:
(define allocate (foreign-lambda c-pointer "C_malloc" int))
@@ -358,6 +335,107 @@ EOF
"(pointer-f64-ref p)"))
+;;; pointer vectors
+
+(define make-pointer-vector
+ (let ((unset (list 'unset)))
+ (lambda (n #!optional (init unset))
+ (##sys#check-exact n 'make-pointer-vector)
+ (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#make-structure 'pointer-vector n buf)))))
+
+(define (pointer-vector? x)
+ (##sys#structure? x 'pointer-vector))
+
+(define (pointer-vector . ptrs)
+ (let* ((n (length ptrs))
+ (pv (make-pointer-vector n))
+ (buf (##sys#slot pv 2))) ; buf
+ (do ((ptrs ptrs (cdr ptrs))
+ (i 0 (fx+ i 1)))
+ ((null? ptrs) pv)
+ (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!)
+ (when ptr (##sys#check-pointer ptr 'pointer-vector-fill!))
+ (let ((buf (##sys#slot pv 2)) ; buf
+ (n (##sys#slot pv 1))) ; n
+ (do ((i 0 (fx+ i 1)))
+ ((fx>= i n))
+ (pv-buf-set! buf i ptr))))
+
+(define pv-buf-ref
+ (foreign-lambda* c-pointer ((scheme-object buf) (unsigned-int 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))
+ "*((void **)C_data_pointer(buf) + i) = ptr;"))
+
+(define (pointer-vector-set! pv i ptr)
+ (##sys#check-structure pv 'pointer-vector 'pointer-vector-ref)
+ (##sys#check-exact i 'pointer-vector-ref)
+ (##sys#check-range i 0 (##sys#slot pv 1)) ; len
+ (when ptr (##sys#check-pointer ptr 'pointer-vector-set!))
+ (pv-buf-set! (##sys#slot pv 2) i ptr))
+
+(define pointer-vector-ref
+ (getter-with-setter
+ (lambda (pv i)
+ (##sys#check-structure pv 'pointer-vector 'pointer-vector-ref)
+ (##sys#check-exact i 'pointer-vector-ref)
+ (##sys#check-range i 0 (##sys#slot pv 1)) ; len
+ (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))
+
+) ; chicken.memory
+
+
+(module chicken.lolevel
+ (block-ref block-set! extend-procedure extended-procedure?
+ make-record-instance mutate-procedure! number-of-bytes
+ number-of-slots object-become! object-copy procedure-data
+ record->vector record-instance-length record-instance-slot
+ record-instance-slot-set! record-instance-type record-instance?
+ set-procedure-data! vector-like?)
+
+(import scheme chicken)
+(import chicken.foreign)
+
+
+;;; Copy arbitrary object:
+
+(define (object-copy x)
+ (let copy ((x x))
+ (cond ((not (##core#inline "C_blockp" x)) x)
+ ((symbol? x) (##sys#intern-symbol (##sys#slot x 1)))
+ (else
+ (let* ((n (##sys#size x))
+ (words (if (##core#inline "C_byteblockp" x) (##core#inline
"C_words" n) n))
+ (y (##core#inline "C_copy_block" x (##sys#make-vector
words))))
+ (unless (or (##core#inline "C_byteblockp" x) (symbol? x))
+ (do ((i (if (##core#inline "C_specialp" x) 1 0) (fx+ i 1)))
+ ((fx>= i n))
+ (##sys#setslot y i (copy (##sys#slot y i)))))
+ y)))))
+
+
;;; Procedures extended with data:
; Unique id for extended-procedures
@@ -480,78 +558,9 @@ EOF
(##sys#become! (list (cons old (proc new))))
new ) )
-
-;;; pointer vectors
-
-(define make-pointer-vector
- (let ((unset (list 'unset)))
- (lambda (n #!optional (init unset))
- (##sys#check-exact n 'make-pointer-vector)
- (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#make-structure 'pointer-vector n buf)))))
-
-(define (pointer-vector? x)
- (##sys#structure? x 'pointer-vector))
-
-(define (pointer-vector . ptrs)
- (let* ((n (length ptrs))
- (pv (make-pointer-vector n))
- (buf (##sys#slot pv 2))) ; buf
- (do ((ptrs ptrs (cdr ptrs))
- (i 0 (fx+ i 1)))
- ((null? ptrs) pv)
- (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!)
- (when ptr (##sys#check-pointer ptr 'pointer-vector-fill!))
- (let ((buf (##sys#slot pv 2)) ; buf
- (n (##sys#slot pv 1))) ; n
- (do ((i 0 (fx+ i 1)))
- ((fx>= i n))
- (pv-buf-set! buf i ptr))))
-
-(define pv-buf-ref
- (foreign-lambda* c-pointer ((scheme-object buf) (unsigned-int 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))
- "*((void **)C_data_pointer(buf) + i) = ptr;"))
-
-(define (pointer-vector-set! pv i ptr)
- (##sys#check-structure pv 'pointer-vector 'pointer-vector-ref)
- (##sys#check-exact i 'pointer-vector-ref)
- (##sys#check-range i 0 (##sys#slot pv 1)) ; len
- (when ptr (##sys#check-pointer ptr 'pointer-vector-set!))
- (pv-buf-set! (##sys#slot pv 2) i ptr))
-
-(define pointer-vector-ref
- (getter-with-setter
- (lambda (pv i)
- (##sys#check-structure pv 'pointer-vector 'pointer-vector-ref)
- (##sys#check-exact i 'pointer-vector-ref)
- (##sys#check-range i 0 (##sys#slot pv 1)) ; len
- (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))
-
) ; chicken.lolevel
+
(module chicken.locative
(locative? make-locative make-weak-locative
locative-ref locative-set! locative->object)
diff --git a/manual/Unit lolevel b/manual/Unit lolevel
index 33ba499..38f708f 100644
--- a/manual/Unit lolevel
+++ b/manual/Unit lolevel
@@ -7,9 +7,6 @@
This unit provides a number of handy low-level operations. '''Use
at your own risk.'''
-This unit uses the {{srfi-4}} and {{extras}} units.
-
-
=== Foreign pointers
@@ -22,6 +19,8 @@ The abstract class of ''pointer'' is divided into 2
categories:
Note that Locatives, while technically pointers, are not considered a ''pointer
object'', but a ''pointer-like object''. The distinction is artificial.
+Pointer operations are provided by the {{(chicken memory)}} module.
+
==== address->pointer
@@ -128,12 +127,14 @@ Use of anything other than an integer or pointer object
as an argument is
questionable.
-
=== SRFI-4 Foreign pointers
These procedures actually accept a pointer-like object as the {{POINTER}}
argument.
However, as usual, use of anything other than a pointer object is questionable.
+SRFI-4 pointer operations are provided by the {{(chicken memory)}} module.
+
+
==== pointer-u8-ref
<procedure>(pointer-u8-ref POINTER)</procedure>
@@ -288,6 +289,8 @@ Stores the 64-bit floating-point number {{N}} at the
address designated by {{POI
''Tagged'' pointers are foreign pointer objects with an extra tag object.
+Tagged pointer operations are provided by the {{(chicken memory)}} module.
+
==== tag-pointer
@@ -324,6 +327,9 @@ foreign pointer objects. All procedures defined below that
accept
a pointer object allow {{#f}} as an alternative representation of
the {{NULL}}-pointer.
+Pointer vectors are provided by the {{(chicken memory)}} module.
+
+
==== make-pointer-vector
<procedure>(make-pointer-vector LENGTH [INIT])</procedure>
@@ -555,6 +561,8 @@ for the source and destination arguments.
Signals an error if any of the above constraints is violated.
+This procedure is provided by the {{(chicken memory)}} module.
+
=== Record instance
diff --git a/rules.make b/rules.make
index a32d5c6..a4a3293 100644
--- a/rules.make
+++ b/rules.make
@@ -530,6 +530,7 @@ $(eval $(call
declare-emitted-import-lib-dependency,chicken.io,extras))
$(eval $(call
declare-emitted-import-lib-dependency,chicken.pretty-print,extras))
$(eval $(call declare-emitted-import-lib-dependency,chicken.random,extras))
$(eval $(call declare-emitted-import-lib-dependency,chicken.locative,lolevel))
+$(eval $(call declare-emitted-import-lib-dependency,chicken.memory,lolevel))
chicken.c: chicken.scm mini-srfi-1.scm \
chicken.compiler.batch-driver.import.scm \
@@ -820,7 +821,8 @@ files.c: $(SRCDIR)files.scm $(SRCDIR)common-declarations.scm
lolevel.c: $(SRCDIR)lolevel.scm $(SRCDIR)common-declarations.scm
$(bootstrap-lib) \
-emit-import-library chicken.locative \
- -emit-import-library chicken.lolevel
+ -emit-import-library chicken.lolevel \
+ -emit-import-library chicken.memory
tcp.c: $(SRCDIR)tcp.scm $(SRCDIR)common-declarations.scm
$(bootstrap-lib) -emit-import-library chicken.tcp
srfi-4.c: $(SRCDIR)srfi-4.scm $(SRCDIR)common-declarations.scm
diff --git a/tests/lolevel-tests.scm b/tests/lolevel-tests.scm
index 9082bf9..243d2d7 100644
--- a/tests/lolevel-tests.scm
+++ b/tests/lolevel-tests.scm
@@ -1,6 +1,6 @@
;;;; Unit lolevel testing
-(require-extension format locative lolevel srfi-4)
+(use chicken.memory format locative lolevel srfi-4)
(define-syntax assert-error
(syntax-rules ()
diff --git a/tests/typematch-tests.scm b/tests/typematch-tests.scm
index 785691b..83db2d0 100644
--- a/tests/typematch-tests.scm
+++ b/tests/typematch-tests.scm
@@ -1,7 +1,7 @@
;;;; typematch-tests.scm
-(use locative lolevel data-structures)
+(use chicken.memory data-structures locative)
(define (make-list n x)
diff --git a/types.db b/types.db
index 61b4f05..3c0ee1e 100644
--- a/types.db
+++ b/types.db
@@ -1715,27 +1715,78 @@
(chicken.irregex#string->sre (#(procedure #:clean #:enforce)
chicken.irregex#string->sre (string #!rest) *))
-;; lolevel
+;; memory
+
+(chicken.memory#allocate (#(procedure #:clean #:enforce)
chicken.memory#allocate (fixnum) (or false pointer)))
+(chicken.memory#free (#(procedure #:clean #:enforce) chicken.memory#free
(pointer) undefined))
+
+(chicken.memory#address->pointer (#(procedure #:clean #:enforce)
chicken.memory#address->pointer (fixnum) pointer)
+ ((fixnum) (##sys#address->pointer #(1))))
+
+(chicken.memory#pointer->address (#(procedure #:clean #:enforce)
chicken.memory#pointer->address ((or pointer procedure port locative)) integer)
+ ((pointer) (##sys#pointer->address #(1))))
+
+(chicken.memory#align-to-word (#(procedure #:clean)
chicken.memory#align-to-word ((or number pointer locative procedure port)) (or
pointer number)))
+
+(chicken.memory#move-memory! (#(procedure #:enforce)
chicken.memory#move-memory! (* * #!optional fixnum fixnum fixnum) *))
+
+(chicken.memory#object->pointer (#(procedure #:clean)
chicken.memory#object->pointer (*) *))
+(chicken.memory#pointer->object (#(procedure #:clean #:enforce)
chicken.memory#pointer->object (pointer) *)
+ ((pointer) (##core#inline "C_pointer_to_object" #(1))))
+
+(chicken.memory#pointer+ (#(procedure #:clean #:enforce)
chicken.memory#pointer+ ((or pointer procedure port locative) fixnum) pointer))
+(chicken.memory#pointer? (#(procedure #:clean #:predicate pointer)
chicken.memory#pointer? (*) boolean))
+(chicken.memory#pointer=? (#(procedure #:clean #:enforce)
chicken.memory#pointer=? ((or pointer locative procedure port)
+ (or pointer locative procedure port)) boolean)
+ ((pointer pointer) (##core#inline "C_pointer_eqp" #(1) #(2))))
+(chicken.memory#pointer-like? (#(procedure #:pure #:predicate (or pointer
locative procedure port)) chicken.memory#pointer-like? (*) boolean)
+ (((or pointer locative procedure port)) (let ((#(tmp) #(1))) '#t)))
+
+(chicken.memory#make-pointer-vector (#(procedure #:clean #:enforce)
chicken.memory#make-pointer-vector (fixnum #!optional (or pointer false))
pointer-vector))
+(chicken.memory#make-record-instance (#(procedure #:clean)
chicken.memory#make-record-instance (symbol #!rest) *))
+(chicken.memory#pointer-vector (#(procedure #:clean #:enforce)
chicken.memory#pointer-vector (#!rest pointer-vector) boolean))
+(chicken.memory#pointer-vector? (#(procedure #:pure #:predicate
pointer-vector) chicken.memory#pointer-vector? (*) boolean))
+(chicken.memory#pointer-vector-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-vector-ref (pointer-vector fixnum) (or pointer false)))
+(chicken.memory#pointer-vector-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-vector-set! (pointer-vector fixnum (or pointer false))
undefined))
+(chicken.memory#pointer-vector-fill! (#(procedure #:clean #:enforce)
chicken.memory#pointer-vector-fill! (pointer-vector (or pointer false))
undefined))
+(chicken.memory#pointer-vector-length (#(procedure #:clean #:enforce)
chicken.memory#pointer-vector-length (pointer-vector) fixnum)
+ ((pointer-vector) (##sys#slot #(1) '1)))
+
+(chicken.memory#pointer-f32-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-f32-ref (pointer) number))
+(chicken.memory#pointer-f32-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-f32-set! (pointer number) undefined))
+(chicken.memory#pointer-f64-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-f64-ref (pointer) number))
+(chicken.memory#pointer-f64-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-f64-set! (pointer number) undefined))
+
+(chicken.memory#pointer-s16-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-s16-ref (pointer) fixnum))
+(chicken.memory#pointer-s16-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-s16-set! (pointer fixnum) undefined))
+(chicken.memory#pointer-s32-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-s32-ref (pointer) integer))
+(chicken.memory#pointer-s32-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-s32-set! (pointer integer) undefined))
+(chicken.memory#pointer-s64-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-s64-ref (pointer) integer))
+(chicken.memory#pointer-s64-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-s64-set! (pointer integer) undefined))
+(chicken.memory#pointer-s8-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-s8-ref (pointer) fixnum))
+(chicken.memory#pointer-s8-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-s8-set! (pointer fixnum) undefined))
+
+(chicken.memory#pointer-u16-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-u16-ref (pointer) fixnum))
+(chicken.memory#pointer-u16-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-u16-set! (pointer fixnum) undefined))
+(chicken.memory#pointer-u32-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-u32-ref (pointer) integer))
+(chicken.memory#pointer-u32-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-u32-set! (pointer integer) undefined))
+(chicken.memory#pointer-u64-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-u64-ref (pointer) integer))
+(chicken.memory#pointer-u64-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-u64-set! (pointer integer) undefined))
+(chicken.memory#pointer-u8-ref (#(procedure #:clean #:enforce)
chicken.memory#pointer-u8-ref (pointer) fixnum))
+(chicken.memory#pointer-u8-set! (#(procedure #:clean #:enforce)
chicken.memory#pointer-u8-set! (pointer fixnum) undefined))
+
+(chicken.memory#tag-pointer (#(procedure #:clean #:enforce)
chicken.memory#tag-pointer (pointer *) pointer))
+(chicken.memory#tagged-pointer? (#(procedure #:clean #:enforce)
chicken.memory#tagged-pointer? (* #!optional *) boolean))
+(chicken.memory#pointer-tag (#(procedure #:clean #:enforce)
chicken.memory#pointer-tag ((or pointer locative procedure port)) *)
+ (((or locative procedure port)) (let ((#(tmp) #(1))) '#f)))
-(chicken.lolevel#address->pointer (#(procedure #:clean #:enforce)
chicken.lolevel#address->pointer (fixnum) pointer)
- ((fixnum) (##sys#address->pointer #(1))))
-(chicken.lolevel#align-to-word
- (#(procedure #:clean)
- chicken.lolevel#align-to-word
- ((or number pointer locative procedure port))
- (or pointer number)))
+;; lolevel
-(chicken.lolevel#allocate (#(procedure #:clean #:enforce)
chicken.lolevel#allocate (fixnum) (or false pointer)))
(chicken.lolevel#block-ref (#(procedure #:clean #:enforce)
chicken.lolevel#block-ref (* fixnum) *))
(chicken.lolevel#block-set! (#(procedure #:enforce) chicken.lolevel#block-set!
(* fixnum *) *))
(chicken.lolevel#extend-procedure (#(procedure #:clean #:enforce)
chicken.lolevel#extend-procedure (procedure *) procedure))
(chicken.lolevel#extended-procedure? (#(procedure #:clean)
chicken.lolevel#extended-procedure (*) boolean))
-(chicken.lolevel#free (#(procedure #:clean #:enforce) chicken.lolevel#free
(pointer) undefined))
-(chicken.lolevel#make-pointer-vector (#(procedure #:clean #:enforce)
chicken.lolevel#make-pointer-vector (fixnum #!optional (or pointer false))
pointer-vector))
-(chicken.lolevel#make-record-instance (#(procedure #:clean)
chicken.lolevel#make-record-instance (symbol #!rest) *))
-
-(chicken.lolevel#move-memory! (#(procedure #:enforce)
chicken.lolevel#move-memory! (* * #!optional fixnum fixnum fixnum) *))
(chicken.lolevel#mutate-procedure!
(#(procedure #:enforce) chicken.lolevel#mutate-procedure! (procedure
(procedure (procedure) . *)) procedure))
@@ -1750,62 +1801,8 @@
(chicken.lolevel#number-of-slots (#(procedure #:clean #:foldable)
chicken.lolevel#number-of-slots (*) fixnum)
(((or vector symbol pair)) (##sys#size #(1))))
-(chicken.lolevel#object->pointer (#(procedure #:clean)
chicken.lolevel#object->pointer (*) *))
(chicken.lolevel#object-become! (procedure chicken.lolevel#object-become!
(list) *))
(chicken.lolevel#object-copy (#(procedure #:clean) chicken.lolevel#object-copy
(*) *))
-(chicken.lolevel#pointer+ (#(procedure #:clean #:enforce)
chicken.lolevel#pointer+ ((or pointer procedure port locative) fixnum) pointer))
-
-(chicken.lolevel#pointer->address (#(procedure #:clean #:enforce)
chicken.lolevel#pointer->address ((or pointer procedure port locative)) integer)
- ((pointer) (##sys#pointer->address #(1))))
-
-(chicken.lolevel#pointer->object (#(procedure #:clean #:enforce)
chicken.lolevel#pointer->object (pointer) *)
- ((pointer) (##core#inline "C_pointer_to_object" #(1))))
-
-(chicken.lolevel#pointer-like? (#(procedure #:pure #:predicate (or pointer
locative procedure port)) chicken.lolevel#pointer-like? (*) boolean)
- (((or pointer locative procedure port)) (let ((#(tmp) #(1)))
'#t)))
-
-(chicken.lolevel#pointer-f32-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-f32-ref (pointer) number))
-(chicken.lolevel#pointer-f32-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-f32-set! (pointer number) undefined))
-(chicken.lolevel#pointer-f64-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-f64-ref (pointer) number))
-(chicken.lolevel#pointer-f64-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-f64-set! (pointer number) undefined))
-(chicken.lolevel#pointer-vector (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-vector (#!rest pointer-vector) boolean))
-
-(chicken.lolevel#pointer-vector? (#(procedure #:pure #:predicate
pointer-vector) chicken.lolevel#pointer-vector? (*) boolean))
-
-(chicken.lolevel#pointer-vector-fill! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-vector-fill! (pointer-vector (or pointer false))
undefined))
-
-(chicken.lolevel#pointer-vector-length (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-vector-length (pointer-vector) fixnum)
- ((pointer-vector) (##sys#slot #(1) '1)))
-
-(chicken.lolevel#pointer-vector-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-vector-ref (pointer-vector fixnum) (or pointer false)))
-(chicken.lolevel#pointer-vector-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-vector-set! (pointer-vector fixnum (or pointer false))
undefined))
-(chicken.lolevel#pointer-s16-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-s16-ref (pointer) fixnum))
-(chicken.lolevel#pointer-s16-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-s16-set! (pointer fixnum) undefined))
-(chicken.lolevel#pointer-s32-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-s32-ref (pointer) integer))
-(chicken.lolevel#pointer-s32-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-s32-set! (pointer integer) undefined))
-(chicken.lolevel#pointer-s64-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-s64-ref (pointer) integer))
-(chicken.lolevel#pointer-s64-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-s64-set! (pointer integer) undefined))
-(chicken.lolevel#pointer-s8-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-s8-ref (pointer) fixnum))
-(chicken.lolevel#pointer-s8-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-s8-set! (pointer fixnum) undefined))
-
-(chicken.lolevel#pointer-tag (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-tag ((or pointer locative procedure port)) *)
- (((or locative procedure port)) (let ((#(tmp) #(1))) '#f)))
-
-(chicken.lolevel#pointer-u16-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-u16-ref (pointer) fixnum))
-(chicken.lolevel#pointer-u16-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-u16-set! (pointer fixnum) undefined))
-(chicken.lolevel#pointer-u32-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-u32-ref (pointer) integer))
-(chicken.lolevel#pointer-u32-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-u32-set! (pointer integer) undefined))
-(chicken.lolevel#pointer-u64-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-u64-ref (pointer) integer))
-(chicken.lolevel#pointer-u64-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-u64-set! (pointer integer) undefined))
-(chicken.lolevel#pointer-u8-ref (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-u8-ref (pointer) fixnum))
-(chicken.lolevel#pointer-u8-set! (#(procedure #:clean #:enforce)
chicken.lolevel#pointer-u8-set! (pointer fixnum) undefined))
-
-(chicken.lolevel#pointer=? (#(procedure #:clean #:enforce)
chicken.lolevel#pointer=? ((or pointer locative procedure port)
- (or pointer locative procedure port)) boolean)
- ((pointer pointer) (##core#inline "C_pointer_eqp" #(1) #(2))))
-
-(chicken.lolevel#pointer? (#(procedure #:clean #:predicate pointer)
chicken.lolevel#pointer? (*) boolean))
-
(chicken.lolevel#procedure-data (#(procedure #:clean #:enforce)
chicken.lolevel#procedure-data (procedure) *))
(chicken.lolevel#record->vector (#(procedure #:clean)
chicken.lolevel#record->vector (*) vector))
@@ -1821,8 +1818,6 @@
(chicken.lolevel#record-instance-slot-set! (#(procedure #:clean #:enforce)
chicken.lolevel#record-instance-slot-set! (* fixnum *) undefined))
(chicken.lolevel#record-instance-type (#(procedure #:clean)
chicken.lolevel#record-instance-type (*) *))
(chicken.lolevel#set-procedure-data! (#(procedure #:clean #:enforce)
chicken.lolevel#set-procedure-data! (procedure *) undefined))
-(chicken.lolevel#tag-pointer (#(procedure #:clean #:enforce)
chicken.lolevel#tag-pointer (pointer *) pointer))
-(chicken.lolevel#tagged-pointer? (#(procedure #:clean #:enforce)
chicken.lolevel#tagged-pointer? (* #!optional *) boolean))
;; locative
--
2.8.1