Added c-cast, struct member peeks, param syntax checking.
authorMatt Birkholz <matt@birkholz.chandler.az.us>
Sun, 31 Oct 2010 00:05:05 +0000 (17:05 -0700)
committerMatt Birkholz <matt@birkholz.chandler.az.us>
Sun, 31 Oct 2010 00:05:05 +0000 (17:05 -0700)
* src/ffi/cdecls.scm (valid-param): Check that the param name does not
contain `-', nor any other non-C identifier chars.  These names go
into the generated .c files.

* src/ffi/syntax.scm (expand-peek): Allow peeks at struct members to
create or set an alien, just as peeking an array member does already.

* src/ffi/ffi.scm (c-cast): New.  Basically set-%alien/ctype! with a
convenient return value.

(alien/address, copy-alien-address!, alien-null?, alien-null!, alien=?):
Declare these as integrable operators, not via define-integrable.
Their arguments are referenced multiple times.

* src/runtime/runtime.pkg (runtime ffi): Export c-cast to ().

src/ffi/cdecls.scm
src/ffi/syntax.scm
src/runtime/ffi.scm
src/runtime/runtime.pkg

index 5270c81899e58e55f75859f1f850aadc49f6e307..1cf0e11e695f3dcf5fbe87c1d430adf26bbc3053 100644 (file)
@@ -271,10 +271,17 @@ USA.
                (pair? (cdr form))
                (null? (cddr form))))
       (cerror form "malformed parameter declaration"))
+  (if (string-find-next-char-in-set
+       (symbol-name (car form)) char-set:not-c-symbol)
+      (cerror form "invalid parameter name"))
   (let ((name (car form))
        (ctype (valid-ctype (cadr form) includes)))
     (list name ctype)))
 
+(define char-set:not-c-symbol (char-set-invert
+                              (char-set-union (char-set #\_)
+                                              char-set:alphanumeric)))
+
 (define (valid-ctype form includes)
   ;; Returns a valid ctype expression, a copy of FORM.  Modifies
   ;; INCLUDES with any internal struct/union/enum declarations.
index f69b2ea6bb21e42293a82af31a6167d26a1383ce..0dc5f12eba4c9717841de51135f6a2e77fa0d5ac 100644 (file)
@@ -177,12 +177,12 @@ USA.
        ((ctype/pointer? ctype)
         `(,(ucode-primitive c-peek-pointer 3)
           ,alien-form ,offset ,(or value-form '(MAKE-ALIEN))))
-       ((ctype/array? ctype)
+       ((or (ctype/array? ctype) (ctype/struct? ctype))
         (if value-form
             `(LET ((VALUE ,value-form))
-                  (COPY-ALIEN-ADDRESS! VALUE ,alien-form)
-                  (ALIEN-BYTE-INCREMENT! VALUE ,offset)
-                  VALUE)
+               (COPY-ALIEN-ADDRESS! VALUE ,alien-form)
+               (ALIEN-BYTE-INCREMENT! VALUE ,offset)
+               VALUE)
             `(ALIEN-BYTE-INCREMENT ,alien-form ,offset)))
        ((or (ctype/enum? ctype) (eq? ctype 'ENUM))
         `(,(ucode-primitive c-peek-uint 2) ,alien-form ,offset))
index 22344d01c7d7fadc7abf54bdbda14da61fdd1512..2ab9c878d96d6b5e916614d89f9258746819e15b 100644 (file)
@@ -51,6 +51,11 @@ USA.
 
 (define-integrable set-alien/ctype! set-%alien/ctype!)
 
+(declare (integrate-operator c-cast))
+(define (c-cast alien ctype)
+  (set-%alien/ctype! alien ctype)
+  alien)
+
 (define (alien/address-string alien)
   ;; Returns a string of length 8, e.g. "081adc60".
   (let ((high (%alien/high-bits alien)))
@@ -64,27 +69,32 @@ USA.
   (let ((ctype (if (default-object? ctype) #f ctype)))
     (%make-alien 0 0 ctype)))
 
-(define-integrable (alien/address alien)
+(declare (integrate-operator alien/address))
+(define (alien/address alien)
   (+ (* (%alien/high-bits alien) #x10000)
      (%alien/low-bits alien)))
 
-(define-integrable (copy-alien-address! alien source)
+(declare (integrate-operator copy-alien-address!))
+(define (copy-alien-address! alien source)
   (if (not (eq? alien source))
       (begin
        (set-%alien/high-bits! alien (%alien/high-bits source))
        (set-%alien/low-bits! alien (%alien/low-bits source)))))
 
-(define-integrable (alien-null? alien)
+(declare (integrate-operator alien-null?))
+(define (alien-null? alien)
   (and (fix:zero? (%alien/high-bits alien))
        (fix:zero? (%alien/low-bits alien))))
 
-(define-integrable (alien-null! alien)
+(declare (integrate-operator alien-null!))
+(define (alien-null! alien)
   (set-%alien/high-bits! alien 0)
   (set-%alien/low-bits! alien 0))
 
 (define null-alien (make-alien '|void|))
 
-(define-integrable (alien=? alien1 alien2)
+(declare (integrate-operator alien=?))
+(define (alien=? alien1 alien2)
   (and (fix:= (%alien/high-bits alien1) (%alien/high-bits alien2))
        (fix:= (%alien/low-bits alien1) (%alien/low-bits alien2))))
 
index 15edbc165ba9cd7f39213e63ed014befc46b9182..2c93ef3df6d8995537fd3f9cbe6c52f282977015 100644 (file)
@@ -3165,6 +3165,7 @@ USA.
          copy-alien
          alien/ctype
          set-alien/ctype!
+         c-cast
          alien?
          alien-null?
          alien-null!