~ 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