[Openmcl-devel] Getting a double-float from ObjC

Sebastian Nozzi sebnozzi at gmx.net
Sat Jun 19 14:41:23 PDT 2004


The problem seems to be that the bridge is calling REQUIRES-STRET-P with 
2 (as "2 words") as value and not with :UNSIGNED-DOUBLEWORD. In the last 
case, according to the code (which only just now I took the time to look 
at), it should work and return false. But called with a 2 makes the line

(> rspec 1)

return true.
I don't really know where, but what needs to be fixed is in one of the 
callers to REQUIRES-STRET-P, presumably in MAKE-OPTIMIZED-SEND. But I'm 
no Lisp expert yet and I'm not familiar at all with the workings of the 
bridge under the hood and I can only conjeturate (I would have loved to 
fix MAKE-OPTIMIZED-SEND by myself, but I'm not there yet).

I tried to trace as many functions as possible.
I hope this transcript helps:

? (send n 'unsigned-long-long-value )

  Calling (MAKE-OPTIMIZED-SEND N 'UNSIGNED-LONG-LONG-VALUE NIL NIL)

   Calling (PARSE-FOREIGN-TYPE :UNSIGNED-DOUBLEWORD)

   PARSE-FOREIGN-TYPE returned #<FOREIGN-INTEGER-TYPE (:UNSIGNED 64) 
#x62A6EB6>

   Calling (ENSURE-FOREIGN-TYPE-BITS #<FOREIGN-INTEGER-TYPE (:UNSIGNED 
64) #x62A6EB6>)

   ENSURE-FOREIGN-TYPE-BITS returned 64

   Calling (PARSE-FOREIGN-TYPE :UNSIGNED-DOUBLEWORD)

   PARSE-FOREIGN-TYPE returned #<FOREIGN-INTEGER-TYPE (:UNSIGNED 64) 
#x62A6EB6>

   Calling (BUILD-CALL N (@SELECTOR "unsignedLongLongValue") 
"unsignedLongLongValue" (2) NIL NIL NIL)

    Calling (REQUIRES-STRET-P 2)

    REQUIRES-STRET-P returned T

 > Error in process Listener-2(6): The message "unsignedLongLongValue" 
must be sent using SEND/STRET

 > While executing: BUILD-CALL


Gary Byers wrote:

> 
> On Sat, 19 Jun 2004, Sebastian Nozzi wrote:
> 
> 
>>Hi Gary,
>>
>>There might be a similar problem here:
>>(or doesn't OpenMCL support unsigned long longs?)
>>
>>? (setf num *)
>>#<NS-CF-NUMBER 6148 (#x1BAF70)>
>>
>>? (send num 'unsigned-long-long-value)
>> > Error in process Listener(5): The message "unsignedLongLongValue"
>>must be sent using SEND/STRET
>>
>> > While executing: BUILD-CALL
>>
>>(OpenMCL 0.14.2-p1)
> 
> 
> The version of REQUIRES-STRET-P that I mailed out in response to your
> earlier bug report (and that's now in 0.14 CVS) seems to recognize
> that :UNSIGNED-DOUBLEWORDs aren't returned in structures:
> 
> (defun requires-stret-p (rspec)
>   (when (member rspec '(:DOUBLE-FLOAT :UNSIGNED-DOUBLEWORD :SIGNED-DOUBLEWORD)
> 		:test #'eq)
>     (return-from requires-stret-p nil))
>   (setq rspec (fudge-objc-type rspec))
>   (if (numberp rspec)
>     (> rspec 1)
>     (> (ensure-foreign-type-bits (parse-foreign-type rspec)) 32)))
> 
> What version of this function is failing ?  What happens if you
> 
> ? (trace ccl::requires-stret-p)
> 
> and try to compile:
> 
> ? (send num 'unsigned-long-long-value)
> 
> ?
> 
> 



More information about the Openmcl-devel mailing list