~ 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