~ chicken-core (chicken-5) f7818e6ab942174453f02659380efc38140c6b0b
commit f7818e6ab942174453f02659380efc38140c6b0b
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Jan 14 04:54:06 2011 -0500
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Fri Jan 14 04:54:06 2011 -0500
added foreign-type-size
diff --git a/chicken-ffi-syntax.scm b/chicken-ffi-syntax.scm
index a54dfad6..dd07b0e2 100644
--- a/chicken-ffi-syntax.scm
+++ b/chicken-ffi-syntax.scm
@@ -158,7 +158,7 @@
(##sys#er-transformer
(lambda (form r c)
(##sys#check-syntax 'foreign-value form '(_ _ _))
- (let ((tmp (gensym 'code_))
+ (let ((tmp (gensym "code_"))
(code (cadr form)))
`(##core#begin
(##core#define-foreign-variable ,tmp
@@ -231,5 +231,21 @@
(lambda (form r c)
`(##core#foreign-safe-lambda* ,@(cdr form)))))
+(##sys#extend-macro-environment
+ 'foreign-type-size
+ '()
+ (##sys#er-transformer
+ (lambda (form r c)
+ (##sys#check-syntax 'foreign-type-size form '(_ _))
+ (let* ((t (##sys#strip-syntax (cadr form)))
+ (tmp (gensym "code_"))
+ (decl
+ (if (string? t)
+ t
+ (##compiler#foreign-type-declaration t ""))))
+ `(##core#begin
+ (##core#define-foreign-variable ,tmp size_t ,(string-append "sizeof(" decl ")"))
+ ,tmp) ) ) ) )
+
(##sys#macro-subset me0)))
diff --git a/manual/Accessing external objects b/manual/Accessing external objects
index 06b90d06..e043e926 100644
--- a/manual/Accessing external objects
+++ b/manual/Accessing external objects
@@ -70,6 +70,21 @@ they are defined, so use {{include}} to use the same definitions
in multiple files.
+=== foreign-type-size
+
+<macro>(foreign-type-size TYPE)</macro>
+
+Returns the size of the storage required to hold values of the
+given foreign type {{TYPE}}. This is basically equivalent to
+
+<enscript highlight=scheme>
+(foreign-value "sizeof(TYPE)" size_t)
+</enscript>
+
+but also handles user-defined types and allows "TYPE" to be a string,
+which will be given literally to the {{sizeof}} operator.
+
+
=== define-foreign-variable
<macro>(define-foreign-variable NAME TYPE [STRING])</macro>
Trap