Ignore:
Timestamp:
Oct 22, 2008, 5:21:39 AM (11 years ago)
Author:
gb
Message:

Handle cast to pointer types.
(Hopefully) handle cases where a macro expands into the name of a
parameterized macro, e.g.

/* given */
#defun foo(x,y,z) (x+y+z)
#defun bar foo

bar(1,2,3) should expand to 6
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/library/parse-ffi.lisp

    r11090 r11197  
    308308                  (c::\| (logior a b))
    309309                  (c::\& (logand a b))
    310                   (c::cast (if (foreign-typep b a)
     310                  (c::cast (if (foreign-typep (setq b (eval-parsed-c-expression b constant-alist)) a)
    311311                             b
    312312                             (if (and (typep a 'foreign-integer-type)
     
    315315                                      (not (> (integer-length b)
    316316                                              (foreign-integer-type-bits a))))
    317                                (logand b (1- (ash 1 (foreign-integer-type-bits a)))))))
     317                               (logand b (1- (ash 1 (foreign-integer-type-bits a))))
     318                               (if (and (typep a 'foreign-pointer-type)
     319                                        (typep b 'integer)
     320                                        (<= (integer-length b) 16))
     321                                 (progn                                   
     322                                   (%int-to-ptr (logand b #xffffffff)))))))
     323                               
    318324                                           
    319325                  (t
     
    331337      (progn
    332338        (unless (ffi-macro-tokens macro)
    333           (multiple-value-bind (tokens error) (ignore-errors (string-to-tokens string))
    334             (if error
    335               (setf (ffi-macro-disposition macro) :bad-tokenize)
    336               (setf (ffi-macro-tokens macro) tokens))))
     339          (let* ((transitive (gethash (ffi-macro-expansion macro) macro-table)))
     340            (if transitive
     341              (setf (ffi-macro-tokens macro) transitive
     342                    (gethash (ffi-macro-name macro) macro-table) transitive)
     343              (multiple-value-bind (tokens error) (ignore-errors (string-to-tokens string))
     344                (if error
     345                  (setf (ffi-macro-disposition macro) :bad-tokenize)
     346                  (setf (ffi-macro-tokens macro) tokens))))))
    337347        (unless (ffi-macro-expression macro)
    338348          (let* ((tokens (ffi-macro-tokens macro)))
Note: See TracChangeset for help on using the changeset viewer.