[MonoTouch] LINQ and OrderBy, again
Sebastien Pouliot
sebastien at xamarin.com
Thu Mar 1 18:54:19 UTC 2012
Please always c.c. the mailing-list or we lose the googlability for
future references.
On Thu, Mar 1, 2012 at 12:33 PM, Rodrigo Kumpera <kumpera at xamarin.com> wrote:
> Hi Dan,
>
> I'm in no way the expert on the subject, as you could see by me giving you
> bad advice. I'm CC'ing Sebastien,
> who has a better understanding on the subject and might have some ideas on
> how to workaround it.
>
> There's on option I know that works. Which is to replace int with an object
> wrapper. Performance won't be
> stelar, but it will definitely work.
That's a hack we used in several cases [1] for LINQ to workaround
full-AOT limitations [2]. In your case you could do something like:
var x = from l in list orderby l.Name, l.Id.ToString () select l;
That turns the value-type (int) into a class (string). It can be
expensive but it's faster at sort'ing than a ExecutionEngineException
would be :-|
The other solution would be to avoid LINQ to sort your result. Since,
in many cases, ordering occurs last in the query (everything is
joined/filtered then turned into a list first) the performance impact
could be lower. However it won't work for complex (or chained)
queries. YMMV.
Sebastien
p.s. please fill bug reports when you find such issues. We do keep the
test cases in our test suite and if whenever we want to try potential
fixes we can run them thru all the test cases we are provided.
[1] https://bugzilla.xamarin.com/show_bug.cgi?id=3627
[2] http://docs.xamarin.com/ios/about/limitations
> On Thu, Mar 1, 2012 at 12:39 PM, Dan Miser <danmiser at gmail.com> wrote:
>>
>> Hi Rodrigo,
>>
>> Any thoughts on something I can try? Thanks
>>
>> Sent from my iPhone
>>
>> On Feb 29, 2012, at 1:41 PM, Rodrigo Kumpera <kumpera at xamarin.com> wrote:
>>
>> Oh, sorry, OrderedEnumerable is an internal framework class, this
>> work-around won't help you.
>>
>> I'll ask the team of other options.
>>
>>
>> On Wed, Feb 29, 2012 at 3:27 PM, Dan Miser <danmiser at gmail.com> wrote:
>>>
>>> That doesn't compile. There is no OrderedEnumerable class that I can
>>> find. Just the interface. Changing it to the interface also doesnt compile.
>>> I put the code in my Main.cs class.
>>>
>>> Any idea where I'm going wrong?
>>>
>>> Sent from my iPhone
>>>
>>> On Feb 29, 2012, at 11:48 AM, Rodrigo Kumpera <kumpera at xamarin.com>
>>> wrote:
>>>
>>> Hi,
>>>
>>> As simple workaround while we figure out how to fix it add a static
>>> method to you App class with the following:
>>>
>>> static void LinqWorkAround () {
>>> System.Linq.OrderedEnumerable<Foo>.CreateOrderedEnumerable<int> (null,
>>> null, false);
>>> }
>>>
>>> This should take care of this crash. If you're building your project with
>>> user code linking enabled,
>>> make sure to have this method called during initialization, something
>>> like this:
>>>
>>> static bool dummy = false;
>>>
>>> static void main () {
>>>
>>> if (dummy) LinqWorkAround ();
>>> }
>>>
>>>
>>>
>>> On Wed, Feb 29, 2012 at 2:24 PM, danmiser <danmiser at gmail.com> wrote:
>>>>
>>>> I've searched through this group, StackOverflow, and the MT bugzilla
>>>> list.
>>>> There are a lot of mentions about this, but I'm having a hard time
>>>> finding
>>>> an authoritative answer. Assume the following code:
>>>>
>>>> var list = new List<Foo>();
>>>> list.Add (new Foo { Id = 3, Name="def"});
>>>> list.Add (new Foo { Id = 2, Name="def"});
>>>> list.Add (new Foo { Id = 1, Name="ggg"});
>>>> var x = from l in list orderby l.Name, l.Id select l;
>>>> foreach (var item in x) { ... do something ... }
>>>>
>>>> public class Foo {
>>>> public int Id { get; set; }
>>>> public string Name { get; set; }
>>>> }
>>>>
>>>> When running on the device, I get the info pasted below.
>>>>
>>>> Notes:
>>>> 1. This only fails on the device
>>>> 2. It doesn't fail if you just have one orderby item
>>>>
>>>> I have a lot of LINQ in my POCO classes, and I wouldn't relish the idea
>>>> of
>>>> unwinding it all.
>>>>
>>>> What do I need to do to make this work?
>>>>
>>>> Unhandled Exception: System.ExecutionEngineException: Attempting to JIT
>>>> compile method
>>>> 'System.Linq.OrderedEnumerable`1<Foo>:CreateOrderedEnumerable<int>
>>>> (System.Func`2<Foo,
>>>> int>,System.Collections.Generic.IComparer`1<int>,bool)'
>>>> while running with --aot-only.
>>>>
>>>> at System.Linq.Enumerable.ThenBy[Foo,Int32] (IOrderedEnumerable`1
>>>> source,
>>>> System.Func`2 keySelector, IComparer`1 comparer) [0x00007] in
>>>>
>>>> /Developer/MonoTouch/Source/mono/mcs/class/System.Core/System.Linq/Enumerable.cs:2787
>>>> at System.Linq.Enumerable.ThenBy[Foo,Int32] (IOrderedEnumerable`1
>>>> source,
>>>> System.Func`2 keySelector) [0x00000] in
>>>>
>>>> /Developer/MonoTouch/Source/mono/mcs/class/System.Core/System.Linq/Enumerable.cs:2779
>>>> at TestLibrary.HelloContext.List () [0x00006] in
>>>> /Users/danmiser/code/MonoTouchRestDemo/TestLibrary/MyClass.cs:18
>>>> at MonoTouchRestDemo.MonoTouchRestDemoViewController.<ViewDidLoad>m__0
>>>> (System.Object sender, System.EventArgs e) [0x00006] in
>>>>
>>>> /Users/danmiser/code/MonoTouchRestDemo/MonoTouchRestDemo/MonoTouchRestDemoViewController.cs:38
>>>> at MonoTouch.UIKit.UIControlEventProxy.Activated () [0x00000] in
>>>> /Developer/MonoTouch/Source/monotouch/src/UIKit/UIControl.cs:30
>>>> at MonoTouch.UIKit.UIApplication.Main (System.String[] args,
>>>> System.String
>>>> principalClassName, System.String delegateClassName) [0x00042] in
>>>> /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29
>>>> at MonoTouchRestDemo.Application.Main (System.String[] args) [0x00000]
>>>> in
>>>> /Users/danmiser/code/MonoTouchRestDemo/MonoTouchRestDemo/Main.cs:16
>>>> [ERROR] FATAL UNHANDLED EXCEPTION: System.ExecutionEngineException:
>>>> Attempting to JIT compile method
>>>>
>>>> 'System.Linq.OrderedEnumerable`1<TestLibrary.HelloClone>:CreateOrderedEnumerable<int>
>>>> (System.Func`2<TestLibrary.HelloClone,
>>>> int>,System.Collections.Generic.IComparer`1<int>,bool)' while running
>>>> with
>>>> --aot-only.
>>>>
>>>> at System.Linq.Enumerable.ThenBy[Foo,Int32] (IOrderedEnumerable`1
>>>> source,
>>>> System.Func`2 keySelector, IComparer`1 comparer) [0x00007] in
>>>>
>>>> /Developer/MonoTouch/Source/mono/mcs/class/System.Core/System.Linq/Enumerable.cs:2787
>>>> at System.Linq.Enumerable.ThenBy[Foo,Int32] (IOrderedEnumerable`1
>>>> source,
>>>> System.Func`2 keySelector) [0x00000] in
>>>>
>>>> /Developer/MonoTouch/Source/mono/mcs/class/System.Core/System.Linq/Enumerable.cs:2779
>>>> at TestLibrary.HelloContext.List () [0x00006] in
>>>> /Users/danmiser/code/MonoTouchRestDemo/TestLibrary/MyClass.cs:18
>>>> at MonoTouchRestDemo.MonoTouchRestDemoViewController.<ViewDidLoad>m__0
>>>> (System.Object sender, System.EventArgs e) [0x00006] in
>>>>
>>>> /Users/danmiser/code/MonoTouchRestDemo/MonoTouchRestDemo/MonoTouchRestDemoViewController.cs:38
>>>> at MonoTouch.UIKit.UIControlEventProxy.Activated () [0x00000] in
>>>> /Developer/MonoTouch/Source/monotouch/src/UIKit/UIControl.cs:30
>>>> at MonoTouch.UIKit.UIApplication.Main (System.String[] args,
>>>> System.String
>>>> principalClassName, System.String delegateClassName) [0x00042] in
>>>> /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29
>>>> at MonoTouchRestDemo.Application.Main (System.String[] args) [0x00000]
>>>> in
>>>> /Users/danmiser/code/MonoTouchRestDemo/MonoTouchRestDemo/Main.cs:16
>>>> Terminating runtime due to unhandled exception
>>>> Stacktrace:
>>>>
>>>>
>>>> Native stacktrace:
>>>>
>>>> 0 MonoTouchRestDemo 0x01616970
>>>> mono_handle_native_sigsegv + 280
>>>> 1 MonoTouchRestDemo 0x016396c4
>>>> sigabrt_signal_handler +
>>>> 180
>>>> 2 libsystem_c.dylib 0x331b6539 _sigtramp + 48
>>>> 3 libsystem_c.dylib 0x331abf5b pthread_kill +
>>>> 54
>>>> 4 libsystem_c.dylib 0x331a4feb abort + 94
>>>> 5 MonoTouchRestDemo 0x016f2774 monoeg_g_logv
>>>> + 152
>>>> 6 MonoTouchRestDemo 0x016f27c0
>>>> monoeg_assertion_message
>>>> + 52
>>>> 7 MonoTouchRestDemo 0x01600348
>>>> mono_thread_abort + 148
>>>> 8 MonoTouchRestDemo 0x0161653c
>>>> mono_handle_exception_internal + 3188
>>>> 9 MonoTouchRestDemo 0x01616740
>>>> mono_handle_exception +
>>>> 24
>>>> 10 MonoTouchRestDemo 0x016382d8
>>>> mono_arm_throw_exception
>>>> + 172
>>>> 11 MonoTouchRestDemo 0x005c361c
>>>> throw_exception + 48
>>>> 12 MonoTouchRestDemo 0x01602910
>>>> mono_jit_compile_method
>>>> + 68
>>>> 13 MonoTouchRestDemo 0x016a9ed8
>>>> mono_compile_method + 56
>>>> 14 MonoTouchRestDemo 0x01619d10
>>>> common_call_trampoline +
>>>> 1364
>>>> 15 MonoTouchRestDemo 0x01617de4
>>>> mono_vcall_trampoline +
>>>> 228
>>>> 16 MonoTouchRestDemo 0x005c3528
>>>> generic_trampoline_vcall
>>>> + 136
>>>> 17 MonoTouchRestDemo 0x003b1c5c
>>>>
>>>> System_Linq_Enumerable_ThenBy_TestLibrary_HelloClone_int_System_Linq_IOrderedEnumerable_1_TestLibrary_HelloClone_System_Func_2_TestLibrary_HelloClone_int
>>>> + 144
>>>> 18 MonoTouchRestDemo 0x003b0ca0
>>>> TestLibrary_HelloContext_List + 512
>>>> 19 MonoTouchRestDemo 0x006a9d34
>>>>
>>>> MonoTouchRestDemo_MonoTouchRestDemoViewController__ViewDidLoadm__0_object_System_EventArgs
>>>> + 300
>>>> 20 MonoTouchRestDemo 0x0000edcc
>>>> MonoTouch_UIKit_UIControlEventProxy_Activated + 68
>>>> 21 MonoTouchRestDemo 0x0057c188
>>>>
>>>> wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr
>>>> + 200
>>>> 22 MonoTouchRestDemo 0x01602fbc
>>>> mono_jit_runtime_invoke
>>>> + 1644
>>>> 23 MonoTouchRestDemo 0x016ab43c
>>>> mono_runtime_invoke +
>>>> 128
>>>> 24 MonoTouchRestDemo 0x01707b54
>>>> monotouch_trampoline +
>>>> 3228
>>>> 25 CoreFoundation 0x34321435 -[NSObject
>>>> performSelector:withObject:withObject:] + 52
>>>> 26 UIKit 0x3778b9eb
>>>> -[UIApplication
>>>> sendAction:to:from:forEvent:] + 62
>>>> 27 UIKit 0x3778b9a7
>>>> -[UIApplication
>>>> sendAction:toTarget:fromSender:forEvent:] + 30
>>>> 28 UIKit 0x3778b985 -[UIControl
>>>> sendAction:to:forEvent:] + 44
>>>> 29 UIKit 0x3778b6f5
>>>> -[UIControl(Internal)
>>>> _sendActionsForEvents:withEvent:] + 492
>>>> 30 UIKit 0x3778c02d -[UIControl
>>>> touchesEnded:withEvent:] + 476
>>>> 31 UIKit 0x3778a50f -[UIWindow
>>>> _sendTouchesForEvent:] + 318
>>>> 32 UIKit 0x37789f01 -[UIWindow
>>>> sendEvent:] +
>>>> 380
>>>> 33 UIKit 0x377704ed
>>>> -[UIApplication
>>>> sendEvent:] + 356
>>>> 34 UIKit 0x3776fd2d
>>>> _UIApplicationHandleEvent + 5808
>>>> 35 GraphicsServices 0x30ba2df3
>>>> PurpleEventCallback +
>>>> 882
>>>> 36 CoreFoundation 0x3439b553
>>>> __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 38
>>>> 37 CoreFoundation 0x3439b4f5
>>>> __CFRunLoopDoSource1 +
>>>> 140
>>>> 38 CoreFoundation 0x3439a343 __CFRunLoopRun
>>>> + 1370
>>>> 39 CoreFoundation 0x3431d4dd
>>>> CFRunLoopRunSpecific +
>>>> 300
>>>> 40 CoreFoundation 0x3431d3a5
>>>> CFRunLoopRunInMode + 104
>>>> 41 GraphicsServices 0x30ba1fcd
>>>> GSEventRunModal + 156
>>>> 42 UIKit 0x3779e743
>>>> UIApplicationMain + 1090
>>>> 43 MonoTouchRestDemo 0x00026cfc
>>>>
>>>> wrapper_managed_to_native_MonoTouch_UIKit_UIApplication_UIApplicationMain_int_string___intptr_intptr
>>>> + 240
>>>> 44 MonoTouchRestDemo 0x006a8f20
>>>> MonoTouchRestDemo_Application_Main_string__ + 152
>>>> 45 MonoTouchRestDemo 0x0057c188
>>>>
>>>> wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr
>>>> + 200
>>>> 46 MonoTouchRestDemo 0x01602fbc
>>>> mono_jit_runtime_invoke
>>>> + 1644
>>>> 47 MonoTouchRestDemo 0x016ab43c
>>>> mono_runtime_invoke +
>>>> 128
>>>> 48 MonoTouchRestDemo 0x016af6e8
>>>> mono_runtime_exec_main +
>>>> 436
>>>> 49 MonoTouchRestDemo 0x016b435c
>>>> mono_runtime_run_main +
>>>> 756
>>>> 50 MonoTouchRestDemo 0x01607344 mono_jit_exec
>>>> + 140
>>>> 51 MonoTouchRestDemo 0x015ff550 main + 2168
>>>> 52 MonoTouchRestDemo 0x00002504 start + 52
>>>>
>>>> --
>>>> View this message in context:
>>>> http://monotouch.2284126.n4.nabble.com/LINQ-and-OrderBy-again-tp4432245p4432245.html
>>>> Sent from the MonoTouch mailing list archive at Nabble.com.
>>>> _______________________________________________
>>>> MonoTouch mailing list
>>>> MonoTouch at lists.ximian.com
>>>> http://lists.ximian.com/mailman/listinfo/monotouch
>>>
>>>
>>
>
More information about the MonoTouch
mailing list