~ chicken-core (chicken-5) 6f4a50ce66f8a721a6343ccd75d35426e738755b
commit 6f4a50ce66f8a721a6343ccd75d35426e738755b Author: Evan Hanson <evhan@foldling.org> AuthorDate: Sat Jun 4 00:03:23 2016 +1200 Commit: Peter Bex <peter@more-magic.net> CommitDate: Thu Jun 16 13:21:23 2016 +0200 Move memory-related procedures to new chicken.memory module Signed-off-by: Peter Bex <peter@more-magic.net> diff --git a/README b/README index e997947d..2a92808d 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 f95a2380..acd0b533 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 a4b87caf..68d08c6c 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 404fa11c..c9cf4587 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 e9106cbd..15dad8bd 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 d226166b..e53d5264 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 33ba4994..38f708f2 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 a32d5c6c..a4a32936 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 9082bf95..243d2d74 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 785691b6..83db2d0a 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 61b4f058..3c0ee1e2 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)) ;; locativeTrap