- Home /
Unity Mono AOT iOS failure for generic method
Hi there.
We're bumping into AOT limitations of Mono. Basically we have this:
Attempting to JIT compile 'com.tinylabproductions.TLPLib.Functional.Option:fold<com.tinylabproductions.TLPLib.Functional.Try`1<com.tinylabproductions.TLPLib.Formats.SimpleJSON.JSONClass>, bool> (com.tinylabproductions.TLPLib.Functional.Option`1<com.tinylabproductions.TLPLib.Functional.Try`1<com.tinylabproductions.TLPLib.Formats.SimpleJSON.JSONClass>>,System.Fn`1<bool>,System.Fn`2<com.tinylabproductions.TLPLib.Functional.Try`1<com.tinylabproductions.TLPLib.Formats.SimpleJSON.JSONClass>, bool>)' while running with --aot-only.
Which looks a bit horrible. :)
Fold was defined as:
interface Option<out A> {
B fold(Fn<B> ifEmpty, Fn<A, B> ifSome);
}
Fn is a delegate type we have defined:
public delegate R Fn<in P1, out R>(P1 p1);
However upon reading http://www.reentrygames.com/unity-3d-using-extension-methods-to-solve-problems-with-generics-and-aot-on-ios/ I've tried changing all generic interface calls to static extension methods like:
public static class Option {
public static B fold<A, B>(
this Option<A> opt, Fn<B> ifEmpty, Fn<A, B> ifNonEmpty
) {
return opt.isDefined ? ifNonEmpty(opt.get) : ifEmpty();
}
}
However AOT is still not picking it up. The call site looks like:
public interface Promise<in A> {
/** Complete with value, return false if already completed. **/
bool tryComplete(Try<A> v);
}
class FutureImpl<A> : Future<A>, Promise<A> {
private Option<Try<A>> _value = F.none<Try<A>>();
public bool tryComplete(Try<A> v) {
// FOLD FAILS HERE.
var ret = value.
fold(() => { _value = F.some(v); return true; }, _ => false);
completed(v);
return ret;
}
}
public interface Try<out A> { ... }
I was wondering if you guys bumped into this and perhaps could share tips and tricks to work around this. Or have you ditched generics all together?
Thanks a lot!
Your answer
Follow this Question
Related Questions
iOS JIT compile error on Generic method called with basic types (int, bool, float) 1 Answer
AOT Runtime Problem: Variable of type IMyInterface changes type to String(impossible..??) 0 Answers
PtrToStructure with array fields on iOS (ie AOT only mode) 0 Answers
Are there any tips for speeding up SQLite through Unity on iOS 1 Answer