<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Hi Rodrigo,</div><div><br></div><div>I have played with the MONO_INLINELIMIT env variable (just discovered in the mono code a couple of days ago).  It solved some of my other inlining issues.   The AggressiveInlining option should be helpful for methods in 4.5 (I'm still on 4.0), though I don't believe the attribute can be used on properties, even though they are effectively methods (or am I wrong here).</div><div><br></div><div>I noticed the code in <b>method-to-ir.c</b>, the other day re: excluding code that needs a class constructor to be run.   I am not clear on what this means exactly.   Are you referring to:</div><div><br></div><div><ol class="MailOutline"><li>classes with static constructors</li><li>classes with non-empty constructors</li><li>something else? </li></ol></div><div><br></div><div>You mentioned "we don't inline methods that call other methods" and suggested might be the case in my code.   I am simply indexing the get method in:</div><div><br></div><div>public override double this[int i]</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>get { return _data[i]; }</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>set { _data[i]  = value; }</div><div>}</div><div><br></div><div>I thought that since this is an override, though on a leaf / sealed class, perhaps mono could not handle this case.   Not sure where indexing on this property would hit the "call another method" case.</div><div><br></div><div>If I understand this better, I can investigate / suggest some new feature re: inlining.</div><div><br></div><div>Thanks</div><div>Jonathan</div><div><br></div><br><div><div>On Jul 16, 2012, at 12:20 PM, Rodrigo Kumpera wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hi Jonathan,<div><br></div><div>There are a few factors that affect inlining. </div><div><br></div><div>We don't inline more than 10 levels deep, but I doubt this is your problem.</div><div>We don't inline synchronized methods, methods that belong to MarshalByRef classes or method that do exception handlibg. Not your case, probably.</div>
<div>We only inline methods smaller than 20bytes of IL. It might be your case. You can control this with the MONO_INLINELIMIT env var or use the AgressiveInlining compiler hint.</div><div>We don't inline calls to classes that need their class constructor to be ran. Might be your case.</div>
<div>We don't do inlining when generics are involved. Doesn't look to be your case;</div><div>And, finally, we don't inline methods that call other methods (including constructors).</div><div><br></div><div>The last restriction does look to be your issue. We do it due to a pair of issues, first because it produces broken stacktraces</div>
<div>and because it breaks calls that check caller assembly. Both can be fixed if mono had support for inlining maps.</div><div><br></div><div>My suggestion is that you play with MONO_INLINELIMIT and AgressiveInlining. This can be reported as a feature request.</div>
<div>I would love to see this done.</div><div><br></div><div>Regards,</div><div>Rodrigo</div><div><br></div></blockquote></div><br></body></html>