[Openmcl-devel] Getting a double-float from ObjC
Sebastian Nozzi
sebnozzi at gmx.net
Sat Jun 19 06:47:18 PDT 2004
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)
Gary Byers wrote:
> The problem seems to be a buggy version of REQUIRES-STRET-P. Randall
> Beer fixed this a few months ago, but I'd neglected to merge the fix
> into the main CVS tree.
>
> It's there now.
>
> On Sun, 13 Jun 2004, Sebastian Nozzi wrote:
>
>
>>I seem to be doing just what you did and what you said, but it still
>>complains (?!?!) that I have to use send/stret. I know I shouldn't, I
>>just can't see what I'm doing wrong.
>>
>>Gary Byers wrote:
>>
>>
>>>It's indeed exactly the same as calling a C function that returns a
>>>DOUBLE-FLOAT,
>>
>>It should, yes.
>>
>>
>>>? (send
>>> (send (@class "NSDate") :date-with-time-interval-since-now 10000.0d0)
>>> 'time-interval-since-reference-date)
>>>1.087937955145176D+8
>>
>>I copy-pasted the code above and still got the error.
>>
>>
>>>SEND/STRET only really applies when the method in question is declared
>>>to return a structure (e.g., an :<NSR>ect, an :<NSR>ange, ...)
>
>>
>
>
> ------------------------------------------------------------------------
>
> Index: examples/bridge.lisp
> ===================================================================
> RCS file: /usr/local/tmpcvs/ccl-0.14/ccl/examples/bridge.lisp,v
> retrieving revision 1.3
> diff -u -r1.3 bridge.lisp
> --- examples/bridge.lisp 10 Feb 2004 21:27:25 -0000 1.3
> +++ examples/bridge.lisp 13 Jun 2004 03:11:41 -0000
> @@ -185,15 +185,28 @@
> m)))
>
>
> +;;; For some reason, these types sometimes show up as :STRUCTs even though they
> +;;; are not structure tags, but type names
> +
> +(defun fudge-objc-type (ftype)
> + (if (equal ftype '(:STRUCT :<NSD>ecimal))
> + :<NSD>ecimal
> + ftype))
> +
> +
> ;;; Returns T if the result spec requires a STRET for its return, NIL otherwise
> ;;; RSPEC may be either a number (in which case it is interpreted as a number
> ;;; of words) or a foreign type spec acceptable to PARSE-FOREIGN-TYPE. STRETS
> ;;; must be used when a structure larger than 4 bytes is returned
>
> (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)))
> + (> (ensure-foreign-type-bits (parse-foreign-type rspec)) 32))))
>
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
More information about the Openmcl-devel
mailing list