Switch to shared allocate and free functions
This commit is contained in:
parent
f783ea1521
commit
1d4d2c7339
|
|
@ -31,7 +31,7 @@
|
||||||
pffi-struct-set!
|
pffi-struct-set!
|
||||||
pffi-define
|
pffi-define
|
||||||
pffi-define-callback
|
pffi-define-callback
|
||||||
scheme-procedure-to-pointer
|
;scheme-procedure-to-pointer
|
||||||
)
|
)
|
||||||
(include-shared "pffi/chibi-pffi"))
|
(include-shared "pffi/chibi-pffi"))
|
||||||
(chicken-5
|
(chicken-5
|
||||||
|
|
@ -66,8 +66,7 @@
|
||||||
pffi-struct-get
|
pffi-struct-get
|
||||||
pffi-struct-set!
|
pffi-struct-set!
|
||||||
pffi-define
|
pffi-define
|
||||||
;pffi-define-callback
|
pffi-define-callback))
|
||||||
))
|
|
||||||
(chicken6
|
(chicken6
|
||||||
(import (scheme base)
|
(import (scheme base)
|
||||||
(scheme write)
|
(scheme write)
|
||||||
|
|
@ -404,8 +403,7 @@
|
||||||
pffi-struct-get
|
pffi-struct-get
|
||||||
pffi-struct-set!
|
pffi-struct-set!
|
||||||
pffi-define
|
pffi-define
|
||||||
;pffi-define-callback
|
pffi-define-callback))
|
||||||
))
|
|
||||||
(skint
|
(skint
|
||||||
(import (scheme base)
|
(import (scheme base)
|
||||||
(scheme write)
|
(scheme write)
|
||||||
|
|
@ -544,5 +542,7 @@
|
||||||
(tr7 (include "pffi/tr7.scm"))
|
(tr7 (include "pffi/tr7.scm"))
|
||||||
(ypsilon (include "pffi/ypsilon.scm")))
|
(ypsilon (include "pffi/ypsilon.scm")))
|
||||||
;(include "pffi/shared/union.scm")
|
;(include "pffi/shared/union.scm")
|
||||||
|
(include "pffi/shared/main.scm")
|
||||||
|
(include "pffi/shared/pointer.scm")
|
||||||
(include "pffi/shared/struct.scm")
|
(include "pffi/shared/struct.scm")
|
||||||
(include "pffi/shared/main.scm"))
|
)
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
(or (equal? object #f) ; False can be null pointer
|
(or (equal? object #f) ; False can be null pointer
|
||||||
(pointer? object))))
|
(pointer? object))))
|
||||||
|
|
||||||
(define pffi-pointer-allocate
|
#;(define pffi-pointer-allocate
|
||||||
(lambda (size)
|
(lambda (size)
|
||||||
(pointer-allocate size)))
|
(pointer-allocate size)))
|
||||||
|
|
||||||
|
|
@ -54,7 +54,7 @@
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(pointer-address pointer)))
|
(pointer-address pointer)))
|
||||||
|
|
||||||
(define pffi-pointer-free
|
#;(define pffi-pointer-free
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(pointer-free pointer)))
|
(pointer-free pointer)))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -272,8 +272,9 @@
|
||||||
(c-declare
|
(c-declare
|
||||||
"void* scheme_procedure_to_pointer(sexp proc) {
|
"void* scheme_procedure_to_pointer(sexp proc) {
|
||||||
if(sexp_procedurep(proc) == 1) {
|
if(sexp_procedurep(proc) == 1) {
|
||||||
sexp debug1 = sexp_procedure_code(proc);
|
return 0; //&sexp_unbox_fixnum(proc);
|
||||||
printf(\"HERE: %u\\n\", sexp_bytecode_length(debug1));
|
} else {
|
||||||
|
printf(\"NOT A FUNCTION\\n\");
|
||||||
}
|
}
|
||||||
return (void*)proc;
|
return (void*)proc;
|
||||||
}")
|
}")
|
||||||
|
|
|
||||||
|
|
@ -67,14 +67,10 @@
|
||||||
`(define ,scheme-name
|
`(define ,scheme-name
|
||||||
(foreign-safe-lambda ,return-type ,c-name ,@ argument-types)))))))
|
(foreign-safe-lambda ,return-type ,c-name ,@ argument-types)))))))
|
||||||
|
|
||||||
#;(define-syntax pffi-define-callback
|
(define-syntax pffi-define-callback
|
||||||
(er-macro-transformer
|
(er-macro-transformer
|
||||||
(lambda (expr rename compare)
|
(lambda (expr rename compare)
|
||||||
(let* ((debug (begin
|
(let* ((pffi-type->native-type ; Chicken has this procedure in three places
|
||||||
(write (list-ref expr 4))
|
|
||||||
(newline)
|
|
||||||
))
|
|
||||||
(pffi-type->native-type ; Chicken has this procedure in three places
|
|
||||||
(lambda (type)
|
(lambda (type)
|
||||||
(cond ((equal? type 'int8) 'byte)
|
(cond ((equal? type 'int8) 'byte)
|
||||||
((equal? type 'uint8) 'unsigned-byte)
|
((equal? type 'uint8) 'unsigned-byte)
|
||||||
|
|
@ -107,7 +103,7 @@
|
||||||
(lambda (name type)
|
(lambda (name type)
|
||||||
`(,name ,type))
|
`(,name ,type))
|
||||||
argument-types argument-names))
|
argument-types argument-names))
|
||||||
(procedure-body (cadr (cdr (list-ref expr 4)))))
|
(procedure-body (cdr (cdr (list-ref expr 4)))))
|
||||||
`(begin (define-external ,(cons 'external_123456789 arguments)
|
`(begin (define-external ,(cons 'external_123456789 arguments)
|
||||||
,return-type
|
,return-type
|
||||||
(begin ,@ procedure-body))
|
(begin ,@ procedure-body))
|
||||||
|
|
@ -137,7 +133,7 @@
|
||||||
((equal? type 'string) (foreign-value "sizeof(void*)" int))
|
((equal? type 'string) (foreign-value "sizeof(void*)" int))
|
||||||
((equal? type 'callback) (foreign-value "sizeof(void*)" int)))))
|
((equal? type 'callback) (foreign-value "sizeof(void*)" int)))))
|
||||||
|
|
||||||
(define pffi-pointer-allocate
|
#;(define pffi-pointer-allocate
|
||||||
(lambda (size)
|
(lambda (size)
|
||||||
(allocate size)))
|
(allocate size)))
|
||||||
|
|
||||||
|
|
@ -186,7 +182,7 @@
|
||||||
`(foreign-declare ,(string-append "#include <" header ">")))
|
`(foreign-declare ,(string-append "#include <" header ">")))
|
||||||
headers))))))
|
headers))))))
|
||||||
|
|
||||||
(define pffi-pointer-free
|
#;(define pffi-pointer-free
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(if (not (pointer? pointer))
|
(if (not (pointer? pointer))
|
||||||
(error "pffi-pointer-free -- Argument is not pointer" pointer))
|
(error "pffi-pointer-free -- Argument is not pointer" pointer))
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@
|
||||||
((equal? type 'double) (c-value "sizeof(double)" int))
|
((equal? type 'double) (c-value "sizeof(double)" int))
|
||||||
((equal? type 'pointer) (c-value "sizeof(void*)" int)))))
|
((equal? type 'pointer) (c-value "sizeof(void*)" int)))))
|
||||||
|
|
||||||
(define-c pffi-pointer-allocate
|
#;(define-c pffi-pointer-allocate
|
||||||
"(void *data, int argc, closure _, object k, object size)"
|
"(void *data, int argc, closure _, object k, object size)"
|
||||||
"make_c_opaque(opq, malloc(obj_obj2int(size)));
|
"make_c_opaque(opq, malloc(obj_obj2int(size)));
|
||||||
return_closcall1(data, k, &opq);")
|
return_closcall1(data, k, &opq);")
|
||||||
|
|
@ -121,7 +121,7 @@
|
||||||
`(include-c-header ,(string-append "<" header ">")))
|
`(include-c-header ,(string-append "<" header ">")))
|
||||||
(cdr (car (cdr expr))))))))
|
(cdr (car (cdr expr))))))))
|
||||||
|
|
||||||
(define-c pffi-pointer-free
|
#;(define-c pffi-pointer-free
|
||||||
"(void *data, int argc, closure _, object k, object pointer)"
|
"(void *data, int argc, closure _, object k, object pointer)"
|
||||||
"free(opaque_ptr(pointer));
|
"free(opaque_ptr(pointer));
|
||||||
return_closcall1(data, k, make_boolean(boolean_t));")
|
return_closcall1(data, k, make_boolean(boolean_t));")
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@
|
||||||
(map
|
(map
|
||||||
(lambda (header)
|
(lambda (header)
|
||||||
(string-append "#include <" header ">" (string #\newline)))
|
(string-append "#include <" header ">" (string #\newline)))
|
||||||
(cdr headers))))))
|
header-list)))))
|
||||||
|
|
||||||
(define pointer? (c-lambda ((pointer void)) bool "___return(1);"))
|
(define pointer? (c-lambda ((pointer void)) bool "___return(1);"))
|
||||||
(define pffi-pointer?
|
(define pffi-pointer?
|
||||||
|
|
@ -77,11 +77,11 @@
|
||||||
(and (pffi-pointer? pointer)
|
(and (pffi-pointer? pointer)
|
||||||
(pointer-null? pointer))))
|
(pointer-null? pointer))))
|
||||||
|
|
||||||
(define pffi-pointer-allocate (c-lambda (int) (pointer void) "void* p = malloc(___arg1); ___return(p);"))
|
;(define pffi-pointer-allocate (c-lambda (int) (pointer void) "void* p = malloc(___arg1); ___return(p);"))
|
||||||
|
|
||||||
(define pffi-pointer-address (c-lambda ((pointer void)) ptrdiff_t "void* p = ___arg1; ___return((intptr_t)&p);"))
|
(define pffi-pointer-address (c-lambda ((pointer void)) ptrdiff_t "void* p = ___arg1; ___return((intptr_t)&p);"))
|
||||||
|
|
||||||
(define pffi-pointer-free (c-lambda ((pointer void)) void "free(___arg1);"))
|
;(define pffi-pointer-free (c-lambda ((pointer void)) void "free(___arg1);"))
|
||||||
|
|
||||||
(define pointer-set-c-int8_t! (c-lambda ((pointer void) int int8) void "*(int8_t*)((char*)___arg1 + ___arg2) = ___arg3;"))
|
(define pointer-set-c-int8_t! (c-lambda ((pointer void) int int8) void "*(int8_t*)((char*)___arg1 + ___arg2) = ___arg3;"))
|
||||||
(define pointer-set-c-uint8_t! (c-lambda ((pointer void) int unsigned-int8) void "*(uint8_t*)((char*)___arg1 + ___arg2) = ___arg3;"))
|
(define pointer-set-c-uint8_t! (c-lambda ((pointer void) int unsigned-int8) void "*(uint8_t*)((char*)___arg1 + ___arg2) = ___arg3;"))
|
||||||
|
|
|
||||||
|
|
@ -113,14 +113,6 @@
|
||||||
((equal? type 'void) (pointer-get-pointer pointer offset))
|
((equal? type 'void) (pointer-get-pointer pointer offset))
|
||||||
((equal? type 'pointer) (pointer-get-pointer pointer offset)))))
|
((equal? type 'pointer) (pointer-get-pointer pointer offset)))))
|
||||||
|
|
||||||
#;(define pffi-string->pointer
|
|
||||||
(lambda (string-content)
|
|
||||||
(string->pointer string-content)))
|
|
||||||
|
|
||||||
#;(define pffi-pointer->string
|
|
||||||
(lambda (pointer)
|
|
||||||
(pointer->string pointer)))
|
|
||||||
|
|
||||||
(define pffi-type->libffi-type
|
(define pffi-type->libffi-type
|
||||||
(lambda (type)
|
(lambda (type)
|
||||||
(cond ((equal? type 'int8) (get-ffi-type-int8))
|
(cond ((equal? type 'int8) (get-ffi-type-int8))
|
||||||
|
|
@ -185,3 +177,12 @@
|
||||||
return-type
|
return-type
|
||||||
argument-types)))))
|
argument-types)))))
|
||||||
|
|
||||||
|
(define make-c-callback
|
||||||
|
(lambda (return-type argument-types procedure)
|
||||||
|
(scheme-procedure-to-pointer procedure)))
|
||||||
|
|
||||||
|
(define-syntax pffi-define-callback
|
||||||
|
(syntax-rules ()
|
||||||
|
((pffi-define scheme-name return-type argument-types procedure)
|
||||||
|
(define scheme-name
|
||||||
|
(make-c-callback return-type 'argument-types procedure)))))
|
||||||
|
|
|
||||||
|
|
@ -96,4 +96,5 @@
|
||||||
(define-cproc get-ffi-type-float () get_ffi_type_float)
|
(define-cproc get-ffi-type-float () get_ffi_type_float)
|
||||||
(define-cproc get-ffi-type-double () get_ffi_type_double)
|
(define-cproc get-ffi-type-double () get_ffi_type_double)
|
||||||
(define-cproc get-ffi-type-pointer () get_ffi_type_pointer)
|
(define-cproc get-ffi-type-pointer () get_ffi_type_pointer)
|
||||||
)
|
|
||||||
|
(define-cproc procedure-to-pointer (procedure) procedure_to_pointer))
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@
|
||||||
(invoke native-type 'byteAlignment)
|
(invoke native-type 'byteAlignment)
|
||||||
#f))))
|
#f))))
|
||||||
|
|
||||||
(define pffi-pointer-allocate
|
#;(define pffi-pointer-allocate
|
||||||
(lambda (size)
|
(lambda (size)
|
||||||
(invoke (invoke arena 'allocate size 1) 'reinterpret size)))
|
(invoke (invoke arena 'allocate size 1) 'reinterpret size)))
|
||||||
|
|
||||||
|
|
@ -154,7 +154,7 @@
|
||||||
(invoke (invoke pointer 'reinterpret (static-field java.lang.Integer 'MAX_VALUE)) 'getString 0)))
|
(invoke (invoke pointer 'reinterpret (static-field java.lang.Integer 'MAX_VALUE)) 'getString 0)))
|
||||||
|
|
||||||
(define pffi-shared-object-load
|
(define pffi-shared-object-load
|
||||||
(lambda (header path . options)
|
(lambda (path options)
|
||||||
(let* ((library-file (make java.io.File path))
|
(let* ((library-file (make java.io.File path))
|
||||||
(file-name (invoke library-file 'getName))
|
(file-name (invoke library-file 'getName))
|
||||||
(library-parent-folder (make java.io.File (invoke library-file 'getParent)))
|
(library-parent-folder (make java.io.File (invoke library-file 'getParent)))
|
||||||
|
|
@ -169,7 +169,7 @@
|
||||||
(list (cons 'linker linker)
|
(list (cons 'linker linker)
|
||||||
(cons 'lookup lookup)))))
|
(cons 'lookup lookup)))))
|
||||||
|
|
||||||
(define pffi-pointer-free
|
#;(define pffi-pointer-free
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
#t))
|
#t))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
;; Copied from Larceny source
|
||||||
|
;; Copyright 1998 Lars T Hansen.
|
||||||
|
;; Copied code begins
|
||||||
|
|
||||||
|
(define %set32u)
|
||||||
|
|
||||||
|
; %peek* and %poke*: convenient access to values in memory.
|
||||||
|
|
||||||
|
(define (%peek8 addr)
|
||||||
|
(let ((x (make-bytevector 1)))
|
||||||
|
(peek-bytes addr x 1)
|
||||||
|
(let ((v (bytevector-ref x 0)))
|
||||||
|
(if (> v 127)
|
||||||
|
(- (- 256 v))
|
||||||
|
v))))
|
||||||
|
|
||||||
|
(define (%peek16 addr)
|
||||||
|
(let ((x (make-bytevector 2)))
|
||||||
|
(peek-bytes addr x 2)
|
||||||
|
(%get16 x 0)))
|
||||||
|
|
||||||
|
(define (%peek32 addr)
|
||||||
|
(let ((x (make-bytevector 4)))
|
||||||
|
(peek-bytes addr x 4)
|
||||||
|
(%get32 x 0)))
|
||||||
|
|
||||||
|
(define (%peek8u addr)
|
||||||
|
(let ((x (make-bytevector 1)))
|
||||||
|
(peek-bytes addr x 1)
|
||||||
|
(bytevector-ref x 0)))
|
||||||
|
|
||||||
|
(define (%peek16u addr)
|
||||||
|
(let ((x (make-bytevector 2)))
|
||||||
|
(peek-bytes addr x 2)
|
||||||
|
(%get16u x 0)))
|
||||||
|
|
||||||
|
(define (%peek32u addr)
|
||||||
|
(let ((x (make-bytevector 4)))
|
||||||
|
(peek-bytes addr x 4)
|
||||||
|
(%get32u x 0)))
|
||||||
|
|
||||||
|
(define (%poke8 addr val)
|
||||||
|
(let ((x (make-bytevector 1)))
|
||||||
|
(if (< val 0)
|
||||||
|
(bytevector-set! x 0 (+ 256 val))
|
||||||
|
(bytevector-set! x 0 val))
|
||||||
|
(poke-bytes addr x 1)))
|
||||||
|
|
||||||
|
(define (%poke16 addr val)
|
||||||
|
(let ((x (make-bytevector 2)))
|
||||||
|
(%set16 x 0 val)
|
||||||
|
(poke-bytes addr x 2)))
|
||||||
|
|
||||||
|
(define (%poke32 addr val)
|
||||||
|
(let ((x (make-bytevector 4)))
|
||||||
|
(%set32 x 0 val)
|
||||||
|
(poke-bytes addr x 4)))
|
||||||
|
|
||||||
|
(define (%poke8u addr val)
|
||||||
|
(let ((x (make-bytevector 1)))
|
||||||
|
(bytevector-set! x 0 val)
|
||||||
|
(poke-bytes addr x 1)))
|
||||||
|
|
||||||
|
(define (%poke16u addr val)
|
||||||
|
(let ((x (make-bytevector 2)))
|
||||||
|
(%set16u x 0 val)
|
||||||
|
(poke-bytes addr x 2)))
|
||||||
|
|
||||||
|
(define (%poke32u addr val)
|
||||||
|
(let ((x (make-bytevector 4)))
|
||||||
|
(%set32u x 0 val)
|
||||||
|
(poke-bytes addr x 4)))
|
||||||
|
|
||||||
|
(define %peek-int %peek32)
|
||||||
|
(define %peek-long %peek32)
|
||||||
|
(define %peek-uint %peek32u)
|
||||||
|
(define %peek-ulong %peek32u)
|
||||||
|
(define %peek-short %peek16)
|
||||||
|
(define %peek-ushort %peek16u)
|
||||||
|
(define %peek-pointer %peek32u)
|
||||||
|
|
||||||
|
(define %poke-int %poke32)
|
||||||
|
(define %poke-long %poke32)
|
||||||
|
(define %poke-uint %poke32u)
|
||||||
|
(define %poke-ulong %poke32u)
|
||||||
|
(define %poke-short %poke16)
|
||||||
|
(define %poke-ushort %poke16u)
|
||||||
|
(define %poke-pointer %poke32u)
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
(require 'std-ffi)
|
(require 'std-ffi)
|
||||||
|
;(require "Standard/foreign-stdlib")
|
||||||
|
;(require "Lib/Common/system-interface")
|
||||||
|
|
||||||
;; FIXME
|
;; FIXME
|
||||||
(define size-of-type
|
(define size-of-type
|
||||||
|
|
@ -23,3 +25,115 @@
|
||||||
((eq? type 'double) 8)
|
((eq? type 'double) 8)
|
||||||
((eq? type 'pointer) 4)
|
((eq? type 'pointer) 4)
|
||||||
(else (error "Can not get size of unknown type" type)))))
|
(else (error "Can not get size of unknown type" type)))))
|
||||||
|
|
||||||
|
(define c-malloc (foreign-procedure "malloc" '(int) 'void*))
|
||||||
|
;(define c-malloc (stdlib/malloc rtd-void*))
|
||||||
|
#;(define pffi-pointer-allocate
|
||||||
|
(lambda (size)
|
||||||
|
(c-malloc size)))
|
||||||
|
|
||||||
|
#;(define c-free (foreign-procedure "free" '(void*) 'int))
|
||||||
|
;(define c-malloc (stdlib/malloc rtd-void*))
|
||||||
|
#;(define pffi-pointer-free
|
||||||
|
(lambda (pointer)
|
||||||
|
(c-free pointer)))
|
||||||
|
|
||||||
|
(define pffi-pointer-null (lambda () 0))
|
||||||
|
|
||||||
|
(define pffi-pointer-null?
|
||||||
|
(lambda (object)
|
||||||
|
(and (number? object)
|
||||||
|
(= object 0))))
|
||||||
|
|
||||||
|
(define pffi-pointer?
|
||||||
|
(lambda (object)
|
||||||
|
;(void*? object)
|
||||||
|
(number? object)
|
||||||
|
))
|
||||||
|
|
||||||
|
(define pffi-pointer-address
|
||||||
|
(lambda (pointer)
|
||||||
|
;(void*->address pointer)
|
||||||
|
pointer
|
||||||
|
))
|
||||||
|
|
||||||
|
(define pffi-pointer->string
|
||||||
|
(lambda (pointer)
|
||||||
|
;(char*->string pointer)
|
||||||
|
pointer
|
||||||
|
))
|
||||||
|
|
||||||
|
(define pffi-string->pointer
|
||||||
|
(lambda (string-content)
|
||||||
|
;(string->char* string-content)
|
||||||
|
string-content
|
||||||
|
))
|
||||||
|
|
||||||
|
(define pffi-shared-object-load
|
||||||
|
(lambda (headers path . options)
|
||||||
|
(foreign-file path)))
|
||||||
|
|
||||||
|
|
||||||
|
(define pffi-pointer-set!
|
||||||
|
(lambda (pointer type offset value)
|
||||||
|
0
|
||||||
|
#;(cond ((equal? type 'int8) (%poke8 (+ pointer offset) value))
|
||||||
|
((equal? type 'uint8) (%poke8u (+ pointer offset) value))
|
||||||
|
((equal? type 'int16) (%poke16 (+ pointer offset) value))
|
||||||
|
((equal? type 'uint16) (%poke16u (+ pointer offset) value))
|
||||||
|
((equal? type 'int32) (%poke32 (+ pointer offset) value))
|
||||||
|
((equal? type 'uint32) (%poke32u (+ pointer offset) value))
|
||||||
|
;((equal? type 'int64) (%poke64 (+ pointer offset) value))
|
||||||
|
;((equal? type 'uint64) (%poke64u (+ pointer offset) value))
|
||||||
|
((equal? type 'char) (%poke8 (+ pointer offset) value))
|
||||||
|
((equal? type 'short) (%poke-short (+ pointer offset) value))
|
||||||
|
((equal? type 'unsigned-short) (%poke-ushort (+ pointer offset) value))
|
||||||
|
((equal? type 'int) (%poke-int (+ pointer offset) value))
|
||||||
|
((equal? type 'unsigned-int) (%poke-uint (+ pointer offset) value))
|
||||||
|
((equal? type 'long) (%poke-long (+ pointer offset) value))
|
||||||
|
((equal? type 'unsigned-long) (%poke-ulong (+ pointer offset) value))
|
||||||
|
;((equal? type 'float) (%poke-ulong (+ pointer offset) value))
|
||||||
|
;((equal? type 'double) (pointer-set-c-double! pointer offset value))
|
||||||
|
((equal? type 'void) (%poke-pointer (+ pointer offset) value))
|
||||||
|
((equal? type 'pointer) (%poke-pointer (+ pointer offset) value)))))
|
||||||
|
|
||||||
|
(define pffi-pointer-get
|
||||||
|
(lambda (pointer type offset)
|
||||||
|
0
|
||||||
|
#;(cond ((equal? type 'int8) (%peek8 (+ pointer offset)))
|
||||||
|
((equal? type 'uint8) (%peek8u (+ pointer offset)))
|
||||||
|
((equal? type 'int16) (%peek16 (+ pointer offset)))
|
||||||
|
((equal? type 'uint16) (%peek16u (+ pointer offset)))
|
||||||
|
((equal? type 'int32) (%peek32 (+ pointer offset)))
|
||||||
|
((equal? type 'uint32) (%peek32u (+ pointer offset)))
|
||||||
|
;((equal? type 'int64) (%peek64 (+ pointer offset)))
|
||||||
|
;((equal? type 'uint64) (%peek64u (+ pointer offset)))
|
||||||
|
((equal? type 'char) (%peek8 (+ pointer offset)))
|
||||||
|
((equal? type 'short) (%peek-short (+ pointer offset)))
|
||||||
|
((equal? type 'unsigned-short) (%peek-ushort (+ pointer offset)))
|
||||||
|
((equal? type 'int) (%peek-int (+ pointer offset)))
|
||||||
|
((equal? type 'unsigned-int) (%peek-uint (+ pointer offset)))
|
||||||
|
((equal? type 'long) (%peek-long (+ pointer offset)))
|
||||||
|
((equal? type 'unsigned-long) (%peek-ulong (+ pointer offset)))
|
||||||
|
;((equal? type 'float) (%peek-ulong (+ pointer offset)))
|
||||||
|
;((equal? type 'double) (pointer-set-c-double! pointer offset))
|
||||||
|
((equal? type 'void) (%peek-pointer (+ pointer offset)))
|
||||||
|
((equal? type 'pointer) (%peek-pointer (+ pointer offset))))))
|
||||||
|
|
||||||
|
(define-syntax pffi-define
|
||||||
|
(syntax-rules ()
|
||||||
|
((pffi-define scheme-name shared-object c-name return-type argument-types)
|
||||||
|
(define scheme-name
|
||||||
|
0
|
||||||
|
|
||||||
|
#;(make-c-function shared-object
|
||||||
|
(symbol->string c-name)
|
||||||
|
return-type
|
||||||
|
argument-types)))))
|
||||||
|
|
||||||
|
(define-syntax pffi-define-callback
|
||||||
|
(syntax-rules ()
|
||||||
|
((pffi-define scheme-name return-type argument-types procedure)
|
||||||
|
(define scheme-name
|
||||||
|
0
|
||||||
|
#;(make-c-callback return-type argument-types procedure)))))
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
(else #f))))
|
(else #f))))
|
||||||
|
|
||||||
(define pffi-shared-object-load
|
(define pffi-shared-object-load
|
||||||
(lambda (header path . options)
|
(lambda (path . options)
|
||||||
(open-shared-library path)))
|
(open-shared-library path)))
|
||||||
|
|
||||||
(define pffi-pointer-null
|
(define pffi-pointer-null
|
||||||
|
|
@ -36,7 +36,7 @@
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(pointer-null? pointer)))
|
(pointer-null? pointer)))
|
||||||
|
|
||||||
(define pffi-pointer-allocate
|
#;(define pffi-pointer-allocate
|
||||||
(lambda (size)
|
(lambda (size)
|
||||||
(malloc size)))
|
(malloc size)))
|
||||||
|
|
||||||
|
|
@ -48,7 +48,7 @@
|
||||||
(lambda (object)
|
(lambda (object)
|
||||||
(pointer? object)))
|
(pointer? object)))
|
||||||
|
|
||||||
(define pffi-pointer-free
|
#;(define pffi-pointer-free
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(free pointer)))
|
(free pointer)))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@
|
||||||
(ctype-sizeof native-type)
|
(ctype-sizeof native-type)
|
||||||
#f))))
|
#f))))
|
||||||
|
|
||||||
(define pffi-pointer-allocate
|
#;(define pffi-pointer-allocate
|
||||||
(lambda (size)
|
(lambda (size)
|
||||||
(malloc 'raw size)))
|
(malloc 'raw size)))
|
||||||
|
|
||||||
|
|
@ -87,7 +87,7 @@
|
||||||
(list #f))))
|
(list #f))))
|
||||||
(ffi-lib path))))
|
(ffi-lib path))))
|
||||||
|
|
||||||
(define pffi-pointer-free
|
#;(define pffi-pointer-free
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(free pointer)))
|
(free pointer)))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
c-name
|
c-name
|
||||||
(map pffi-type->native-type argument-types))))))
|
(map pffi-type->native-type argument-types))))))
|
||||||
|
|
||||||
#;(define-syntax pffi-define-callback
|
(define-syntax pffi-define-callback
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
((_ scheme-name return-type argument-types procedure)
|
((_ scheme-name return-type argument-types procedure)
|
||||||
(define scheme-name
|
(define scheme-name
|
||||||
|
|
@ -73,15 +73,15 @@
|
||||||
((eq? type 'callback) size-of-void*)
|
((eq? type 'callback) size-of-void*)
|
||||||
(else #f))))
|
(else #f))))
|
||||||
|
|
||||||
(define pffi-pointer-allocate
|
#;(define pffi-pointer-allocate
|
||||||
(lambda (size)
|
(lambda (size)
|
||||||
(c-malloc size)))
|
(c-malloc size)))
|
||||||
|
|
||||||
(define pffi-pointer-address
|
(define pffi-pointer-address
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(pointer-address pointer)))
|
(address pointer 0)))
|
||||||
|
|
||||||
(define pffi-pointer-null
|
#;(define pffi-pointer-null
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(empty-pointer)))
|
(empty-pointer)))
|
||||||
|
|
||||||
|
|
@ -105,7 +105,7 @@
|
||||||
(lambda (path options)
|
(lambda (path options)
|
||||||
(open-shared-library path)))
|
(open-shared-library path)))
|
||||||
|
|
||||||
(define pffi-pointer-free
|
#;(define pffi-pointer-free
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(when (pointer? pointer)
|
(when (pointer? pointer)
|
||||||
(c-free pointer))))
|
(c-free pointer))))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
(cond-expand
|
||||||
|
;(kawa #t) ; JVM
|
||||||
|
(windows (pffi-define-library pffi-libc-stdlib
|
||||||
|
'("stdlib.h")
|
||||||
|
"ucrtbase"
|
||||||
|
'((additional-versions ("0" "6")))))
|
||||||
|
(else (pffi-define-library pffi-libc-stdlib
|
||||||
|
'("stdlib.h")
|
||||||
|
"c"
|
||||||
|
'((additional-versions ("0" "6"))))))
|
||||||
|
|
||||||
|
(pffi-define pffi-pointer-allocate pffi-libc-stdlib 'malloc 'pointer '(int))
|
||||||
|
;(pffi-define pffi-pointer-allocate-aligned pffi-libc-stdlib 'aligned_alloc 'pointer '(int int))
|
||||||
|
(pffi-define pffi-pointer-free pffi-libc-stdlib 'free 'void '(pointer))
|
||||||
|
|
||||||
|
#;(define pffi-pointer-null
|
||||||
|
(lambda ()
|
||||||
|
; Make aligned_alloc fail and return us a null pointer
|
||||||
|
(pffi-pointer-allocate-aligned -1 -1)))
|
||||||
|
|
@ -62,7 +62,7 @@
|
||||||
(size (cdr (assoc 'size size-and-offsets)))
|
(size (cdr (assoc 'size size-and-offsets)))
|
||||||
(offsets (cdr (assoc 'offsets size-and-offsets)))
|
(offsets (cdr (assoc 'offsets size-and-offsets)))
|
||||||
(pointer (if (null? pointer) (pffi-pointer-allocate size) (car pointer)))
|
(pointer (if (null? pointer) (pffi-pointer-allocate size) (car pointer)))
|
||||||
(c-typr (if (string? c-type) c-type (symbol->string c-type))))
|
(c-type (if (string? c-type) c-type (symbol->string c-type))))
|
||||||
(struct-make c-type size pointer offsets))))
|
(struct-make c-type size pointer offsets))))
|
||||||
|
|
||||||
(define (pffi-struct-offset-get struct member-name)
|
(define (pffi-struct-offset-get struct member-name)
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,7 @@
|
||||||
|
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(define pffi-pointer-allocate
|
#;(define pffi-pointer-allocate
|
||||||
(lambda (size)
|
(lambda (size)
|
||||||
(allocate-bytes size)))
|
(allocate-bytes size)))
|
||||||
|
|
||||||
|
|
@ -108,13 +108,14 @@
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
0))
|
0))
|
||||||
|
|
||||||
|
;; FIXME
|
||||||
(define pffi-pointer-null
|
(define pffi-pointer-null
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let ((p (allocate-bytes 0)))
|
(let ((p (allocate-bytes 0)))
|
||||||
(free-bytes p)
|
(free-bytes p)
|
||||||
p)))
|
p)))
|
||||||
|
|
||||||
(define pffi-pointer-free
|
#;(define pffi-pointer-free
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(free-bytes pointer)))
|
(free-bytes pointer)))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
(define c-malloc (c-function void* malloc (size_t)))
|
(define c-malloc (c-function void* malloc (size_t)))
|
||||||
(define c-free (c-function int free (void*)))
|
(define c-free (c-function int free (void*)))
|
||||||
|
|
||||||
(define pffi-pointer-allocate
|
#;(define pffi-pointer-allocate
|
||||||
(lambda (size)
|
(lambda (size)
|
||||||
(c-malloc size)))
|
(c-malloc size)))
|
||||||
|
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
(lambda (object)
|
(lambda (object)
|
||||||
(number? object)))
|
(number? object)))
|
||||||
|
|
||||||
(define pffi-pointer-free
|
#;(define pffi-pointer-free
|
||||||
(lambda (pointer)
|
(lambda (pointer)
|
||||||
(c-free pointer)))
|
(c-free pointer)))
|
||||||
|
|
||||||
|
|
@ -118,31 +118,30 @@
|
||||||
(lambda (headers path options)
|
(lambda (headers path options)
|
||||||
(load-shared-object path)))
|
(load-shared-object path)))
|
||||||
|
|
||||||
(define pffi-type->native-type
|
(define-macro (pffi-type->native-type type)
|
||||||
(lambda (type)
|
`(cond ((equal? ,type int8) int8_t)
|
||||||
(cond ((equal? type '(quote int8)) 'int8_t)
|
((equal? ,type uint8) uint8_t)
|
||||||
((equal? type '(quote uint8)) 'uint8_t)
|
((equal? ,type int16) int16_t)
|
||||||
((equal? type '(quote int16)) 'int16_t)
|
((equal? ,type uint16) uint16_t)
|
||||||
((equal? type '(quote uint16)) 'uint16_t)
|
((equal? ,type int32) int32_t)
|
||||||
((equal? type '(quote int32)) 'int32_t)
|
((equal? ,type uint32) uint32_t)
|
||||||
((equal? type '(quote uint32)) 'uint32_t)
|
((equal? ,type int64) int64_t)
|
||||||
((equal? type '(quote int64)) 'int64_t)
|
((equal? ,type uint64) uint64_t)
|
||||||
((equal? type '(quote uint64)) 'uint64_t)
|
((equal? ,type char) char)
|
||||||
((equal? type '(quote char)) 'char)
|
((equal? ,type unsigned-char) char)
|
||||||
((equal? type '(quote unsigned-char)) 'char)
|
((equal? ,type short) short)
|
||||||
((equal? type '(quote short)) 'short)
|
((equal? ,type unsigned-short) unsigned-short)
|
||||||
((equal? type '(quote unsigned-short)) 'unsigned-short)
|
((equal? ,type int) int)
|
||||||
((equal? type '(quote int)) 'int)
|
((equal? ,type unsigned-int) unsigned-int)
|
||||||
((equal? type '(quote unsigned-int)) 'unsigned-int)
|
((equal? ,type long) long)
|
||||||
((equal? type '(quote long)) 'long)
|
((equal? ,type unsigned-long) unsigned-long)
|
||||||
((equal? type '(quote unsigned-long)) 'unsigned-long)
|
((equal? ,type float) float)
|
||||||
((equal? type '(quote float)) 'float)
|
((equal? ,type double) double)
|
||||||
((equal? type '(quote double)) 'double)
|
((equal? ,type pointer) void*)
|
||||||
((equal? type '(quote pointer)) 'void*)
|
((equal? ,type string) void*)
|
||||||
((equal? type '(quote string)) 'void*)
|
((equal? ,type void) void)
|
||||||
((equal? type '(quote void)) 'void)
|
((equal? ,type callback) void*)
|
||||||
((equal? type '(quote callback)) 'void*)
|
(else (error "pffi-type->native-type -- No such pffi type" ,type))))
|
||||||
(else (error "pffi-type->native-type -- No such pffi type" type)))))
|
|
||||||
|
|
||||||
(define-macro
|
(define-macro
|
||||||
(pffi-define scheme-name shared-object c-name return-type argument-types)
|
(pffi-define scheme-name shared-object c-name return-type argument-types)
|
||||||
|
|
|
||||||
|
|
@ -887,7 +887,7 @@
|
||||||
;; pffi-struct-dereference
|
;; pffi-struct-dereference
|
||||||
|
|
||||||
;(print-header "pffi-struct-dereference 1")
|
;(print-header "pffi-struct-dereference 1")
|
||||||
;(pffi-define c-color-check-by-value c-testlib 'color_check_by_value 'int '(struct))
|
;(pffi-define c-color-check-by-value c-testlib 'color_check_by_value 'int '(uint32))
|
||||||
#;(define struct-color (pffi-struct-make 'color '((int8 . r)
|
#;(define struct-color (pffi-struct-make 'color '((int8 . r)
|
||||||
(int8 . g)
|
(int8 . g)
|
||||||
(int8 . b)
|
(int8 . b)
|
||||||
|
|
@ -896,11 +896,11 @@
|
||||||
;(debug (pffi-struct-set! struct-color 'g 101))
|
;(debug (pffi-struct-set! struct-color 'g 101))
|
||||||
;(debug (pffi-struct-set! struct-color 'b 102))
|
;(debug (pffi-struct-set! struct-color 'b 102))
|
||||||
;(debug (pffi-struct-set! struct-color 'a 103))
|
;(debug (pffi-struct-set! struct-color 'a 103))
|
||||||
;(assert = (c-color-check-by-value (pffi-struct-dereference struct-color)) 0)
|
;(assert = (c-color-check-by-value (pffi-pointer-address (pffi-struct-pointer struct-color))) 0)
|
||||||
|
|
||||||
;(print-header "pffi-struct-dereference 2")
|
;(print-header "pffi-struct-dereference 2")
|
||||||
|
|
||||||
;(pffi-define c-test-check-by-value c-testlib 'test_check_by_value 'int '(struct))
|
;(pffi-define c-test-check-by-value c-testlib 'test_check_by_value 'int '(int))
|
||||||
#;(define struct-test3 (pffi-struct-make 'test
|
#;(define struct-test3 (pffi-struct-make 'test
|
||||||
'((int8 . a)
|
'((int8 . a)
|
||||||
(char . b)
|
(char . b)
|
||||||
|
|
@ -944,7 +944,7 @@
|
||||||
;(debug (pffi-struct-get struct-test3 'l))
|
;(debug (pffi-struct-get struct-test3 'l))
|
||||||
;(debug (pffi-struct-get struct-test3 'm))
|
;(debug (pffi-struct-get struct-test3 'm))
|
||||||
;(debug (pffi-struct-get struct-test3 'n))
|
;(debug (pffi-struct-get struct-test3 'n))
|
||||||
;(c-test-check-by-value (pffi-struct-dereference struct-test3))
|
;(c-test-check-by-value (pffi-pointer-address (pffi-struct-pointer struct-test3)))
|
||||||
|
|
||||||
;; pffi-define-callback
|
;; pffi-define-callback
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue