[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