From: <Joe...@t-...> - 2010-08-18 10:04:12
|
Yaroslav Kavenchuk wrote: > (:return-type int)) > (unless res >It is right? No. You didn't try it out, did you? This is not C. What branch is (unless <integer>) going to take in Lisp? > (LLVMCreateJITCompiler provider 2 err) > (LLVMDisposeMessage err) Compare with > if(LLVMCreateJITCompiler(&engine, provider, 2, &error) != 0) { > LLVMDisposeMessage(error); Obviously you cannot use the same object in Lisp. One time you need a pointer to pointer-sized slot, another time the value of that slot. >Or 'LLVMCreateJITCompiler' will be called with a value of >'err', rather than its address? I find "value of err" is confusing in this sentence. err "represents" the object you asked to allocate on the stack, You can view it as a pointer to this object. The Lisp side likes to ignore pointers and consider the value that object holds. The C sides values the pointer itself. So it's suitable for the &error call. Note that this is not the only way to interface to these functions. I wrote: >I'd say you're better off using an explicit c-pointer for [out]error Perhaps you'd get less confusion by defining LLVMCreateJITCompiler with (OutErr (c-ptr c-pointer) :out) as you initially wanted. You'll be returned a pointer that you can pass back or interpret as a string with memory-as. Beware: This pointer is not the same as the above err object! It does not represent a pointer to a pointer, rather than the string data itself. (memory-as error 'string) ; not ffi:c-string! This is a special pattern that reads a string from memory, not a pointer to a string. It appears that this is not documented in the impnotes. Strange... That is an oversight. Regards, Jörg Höhle |