I just thought of a scheme to do non-static delegate marshalling without code generation, but it&#39;s a little bit goofy.<div><br><div><div>Allocate a structure that contains two things:</div><div><br></div><div>(1) the instance ptr that you want to capture</div>
<div>(2) the function ptr for a compile-time-generated invoker that implements the desired unmanaged function signature.</div><div><br></div><div>Then hand this structure off to unmanaged-land as if it were a function pointer.</div>
<div><br></div><div>when you try to execute the function, the kernel will raise a fault. The runtime can notice that it&#39;s in this situation and invoke (2) with (1) either using another compile time generated function to forward the call, or (maybe on x86) by rewriting the stack to push the instance pointer + then jumping to the real function.</div>
<div><br></div><div>There&#39;s obviously a cost associated with the fault. There&#39;s also a chance that the specific implementation of iOS&#39;s limitations would prohibit this (the kernel might murder the process before we get a chance to recover). </div>
<div><br></div><div>Anyways, just a thought..</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br><div class="gmail_quote">On Fri, Jul 29, 2011 at 5:14 PM, Geoff Norton <span dir="ltr">&lt;<a href="mailto:grompf@gmail.com">grompf@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word">It is disabled in full-aot environments.  Full-aot only supports static delegates to be pinvoked, and even then they need to be decorated with a special attribute.<div>
<br></div><div>See <a href="https://github.com/mono/mono/blob/master/mono/mini/aot-compiler.c" target="_blank">https://github.com/mono/mono/blob/master/mono/mini/aot-compiler.c</a> around line 2793.</div><div><br></div><div>
-g</div><div><br><div><div class="im"><div>On 2011-07-29, at 5:03 PM, Brian Luczkiewicz wrote:</div><br></div><blockquote type="cite"><div class="im"><div>I&#39;m having trouble seeing how an arbitrary delegate can be marshalled into an unmanaged function pointer without runtime code generation to capture the object pointer.</div>
<div><br></div><div>Is this functionality disabled in full-aot environments or is it accomplished by some mechanism that I&#39;m not considering?</div>
<div><br></div><div><br></div></div>
_______________________________________________<br>Mono-devel-list mailing list<br><a href="mailto:Mono-devel-list@lists.ximian.com" target="_blank">Mono-devel-list@lists.ximian.com</a><br><a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br></div></div></blockquote></div><br></div></div></div>