Hi Brian, Can you submit a bug report to http://bugzilla.xamarin.com? This is something the JIT guys will have to take a look at because I don't know enough to answer this question.
Thanks, Jeff On Fri, Sep 9, 2011 at 10:41 AM, Brian Schuth <br...@alphce.com> wrote: > I have simplified this even further; with all the interface cruft out > of the way, it seems like the problem is that even the simplest "join" > is going to cause a JIT error? This sounds like a bug to me, but I'm > happy to be told it's my fault :). > > The code that causes the problem is below, reduced to about its bare > minimum. git://github.com/bschuth/MT-JIT-Problem.git has been updated > as well... > > But the problem is really simple: I have two collections of objects > (sessions and scores) connected by an integer key in a one-to-many > relationship, where score.OwnerID equal session.SessionID. This linq > fails: > > from s in sessions > join score in scores > on s.SessionID equals score.OwnerID > select score.Name; > > Are joins just not possible here? What to do? Thanks. > > ==== Source: PROBLEMLINQ.CS STARTS > using System; > using System.Linq; > using System.Collections.Generic; > > namespace JIT20110908 > { > public class ProblemLinq > { > public IList<string> Execute () > { > List<ActualScore> scores = new List<ActualScore> (); > ActualScore score1 = new ActualScore () { > Name = "ACTIVITIES", > OwnerID = 666 > }; > scores.Add (score1); > > List<MySession> sessions = new List<MySession> (); > MySession mysession = new MySession () { > SessionID = 666, > }; > sessions.Add (mysession); > > var summaryVar = from s in sessions > join score in scores > on s.SessionID equals score.OwnerID > select score.Name; > > List<string> summaryRows = summaryVar.ToList(); > return summaryRows; > } > } > > public class MySession > { > public int SessionID { get; set; } > } > > public class ActualScore > { > public int OwnerID { get; set; } > public string Name { get; set; } > } > } > > On Fri, Sep 9, 2011 at 9:07 AM, Brian Schuth <br...@alphce.com> wrote: > > > > Thanks, this confirms my vague sense that the problem came from something > the LINQ depends on that is not generated during compilation. This specific > fix doesn't work, since the type involved isn't quite the same. I'm > relatively new to the guts of LINQ, so I think I need some help parsing > exactly what the error is. > > The stack trace says it is attempting to compile this method: > > System.Linq.Enumerable:<ToLookup`2>m__18<JIT20110908.ActualScore, > int>(JIT20110908.ActualScore) > > I tried just substituting ActualScore as the type in your fix, but that > doesn't seem to do it either. > > The exception occurs inside the method: > > at System.Linq.Enumerable.ToLookup[ActualScore,Int32,ActualScore] > (IEnumerable`1 source, System.Func`2 keySelector, System.Func`2 > elementSelector, IEqualityComparer`1 comparer) [0x00079] in > /Developer/MonoTouch/Source/mono/mcs/class/System.Core/System.Linq/Enumerable.cs:2915 > > I've read the docs on Enumerable.ToLookup, and maybe I just need more > coffee, but I'm not quite getting what this may be trying to do at the > mysterious line 2915 that is causing a crash... > > Can anyone point me just a little closer? I'm just trying random stuff at > the moment to see if I magically create the thing that MT wants. > > If there's a resource out there that explains the guts of LINQ well > enough to start figuring out what's going on under the hood here, I'd love > to know about it! > > Thanks, > > bjs > > On Fri, Sep 9, 2011 at 3:15 AM, Pete Macko <pma...@me.com> wrote: > >> > >> Try putting this in your code and calling it from FinishedLaunching > >> private void MonoTouchForcedCompilationHacks() > >> { > >> { > >> var hack1 = new IFooSession[0]; > >> if(!((ICollection< IFooSession>)hack1).Contains(// some bogus lambda or > other thing to force the system to evaluate the collection)) > >> { > >> blah blah blah log some crap here or whatever > >> } > >> } > >> } > >> Could put this anywhere I guess, but I got tired of dealing with jit > errors and stuck all this sort of stuff in one place for the sake of > organization. > >> Then again, it could be your sample values in the code that are making > baby jeebus cry -- and MT is watching! :) > >> -pm > >> On Sep 8, 2011, at 4:22 PM, Brian Schuth wrote: > >> > >> A couple of months back I hit JIT errors when using LINQ for objects. I > was never able to resolve them, but as the LINQ involved was pretty simple, > I just "unrolled" it into procedural code. > >> Now I'm getting more of them, and I'd really prefer to leave the LINQ > alone if possible. The exception I'm getting today is: > >> Attempting to JIT compile method > 'System.Linq.Enumerable:<ToLookup`2>m__18<JIT20110908.ActualScore, int> > (JIT20110908.ActualScore)' while running with --aot-only. > >> Below is my ProblemLinq.cs file, which contains a class with an > Execute() method that causes this error. I realize there's a lot of > interfaces and classes here; this is a severely dumbed-down version of the > actual code, which is part of a cross-platform reporting library. The code > in question is running in Windows as part of a production product. > >> I've read the "Limitations" section on the xamarin website, and while I > can't say I understand it totally, I don't see that my code is doing any of > the verboten virtualization things; although LINQ does enough magic that I > don't necessarily know the secondary effects of the code. > >> The stack trace from the error this class causes follows the code. > >> I'm running MT 4.0.7 and MD2.6. > >> Am I doing some LINQ thing I shouldn't? Or is MT missing something? > >> Thanks. > _______________________________________________ > MonoTouch mailing list > MonoTouch@lists.ximian.com > http://lists.ximian.com/mailman/listinfo/monotouch >
_______________________________________________ MonoTouch mailing list MonoTouch@lists.ximian.com http://lists.ximian.com/mailman/listinfo/monotouch