[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: strange record behavior in MCL2.0B1P2 (system 7) (again)



   Date: Wed, 12 Jun 91 14:54:00 -0400
   To: info-macl@cambridge.apple.com (Macintosh Allegro Common Lisp)
   From: cartier@math.uqam.ca (Guillaume Cartier)
   Subject: strange record behavior in MCL2.0B1P2 (system 7) (again)
   
   > You cannot simply pretend that something is a pointer and not a handle.
   > You have to actually make it a pointer.  You get a pointer from a handle
   > by dereferencing it.
   > 
   > If a bitmap is a handle, then you cannot say:
   > 
   > (rref b :bitmap.bounds :storage :pointer)
   > 
   > You must say
   > 
   > (with-dereferenced-handles ((b-pointer b))
   >  (rref b :bitmap.bounds :storage :pointer))
   > 
   > Of course, if you do this and the handle is then relocated, you will
   > lose.
   
   But (make-bitmap 0 0 10 10) returns a pointer!!!
   
   ? (setq b (make-bitmap 0 0 10 10))
   #<A Mac Zone Pointer Size 34 #x18D240>
   
The real problem is in the fact the RREF defaults the :STORAGE option.
In 1.3.2 where all the record definitions were typed in by hand by a
human, they were all well-known and made sense.  In 2.0, where the
record definitions were spit out by some Lisp code that converted
Pascal into Lisp, the default :STORAGE is :HANDLE if there is a
defined type which is a handle to the record.  The default :STORAGE
for the :BITMAP record type as defined in "interfaces;quickdraw.lisp"
is :HANDLE.  We are planning to make RREF require its :STORAGE
parameter, and add macros HREF & PREF (Handle REF & Pointer REF).

MAKE-BITMAP crashes your machine sometimes, because it contains RREF's
to the :BITMAP record which compile as handles.  The following version
should work:

(defun make-bitmap (left &optional top right bottom &aux rowbytes bm)
  (with-rectangle-arg (r left top right bottom)
    (setq rowbytes 
          (logand
           #xfffe 
           (+ 2  (ash (- (rref r rect.right) (rref r rect.left) 1) -3))))
    (setq bm 
          (#_NewPtr :check-error
                    (+ 14 (* rowbytes (- (rref r rect.bottom) (rref r rect.top))))))
    (rset bm bitmap.bounds r :storage :pointer)
    (rset bm bitmap.rowbytes rowbytes :storage :pointer)
    (rset bm bitmap.baseaddr (%inc-ptr bm 14) :storage :pointer))
  bm)