On Mon, 4 Feb 2008 11:22:10 +0100, "Iver Odin Kvello" iverodin@gmail.com wrote:
I don't understand why I haven't seen it before, but it seems something happens with values returned from lisp to .Net.
Iver, thanks for the analysis. With that as a starting point, I've managed to find the actual problem. (And this seems to show that Michael was the first one for a long time who actually used callbacks into Lisp which are supposed to return something... :)
The code in DelegateAdapterBuilder.cpp creates the wrong IL code. I don't have the time right now to prepare a new release (maybe in the next days), but if you want to fix this yourself, here's what to do:
1. The error is in "generateInvokeMethod" /after/ "invoke" has been called, i.e. when the return value is handled.
2. In case of a void return value, the code is correct.
3. In case of a value type, the correct loading form (depending on the type) must be emitted after the "Unbox" operation - for System.Int32 this would be "Ldind_I4" for example - to bring the actual value on the stack.
Which loading form has to be emitted must be decided from a small table lookup or so - "Ldind_I1" for booleans, "Ldind_R8" for double floats, and so on.
4. And in the third case the code which is there (which emits "Ldind_I4") is bogus. In this case nothing has to be done and the return value is already correct.
I've confirmed that with these changes I can use Lisp callbacks which return System.Int32 as well as ones which return System.String.
Thanks to you and Michael for catching this one, Edi.