<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Consolas;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:Consolas;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoPlainText>So here we go/you&#8217;ve inspired me. :) For syntax
highlighting, view in HTML.<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>I&#8217;m starting with the if condition evaluation in
ConditionalExpr. The delegate returned can call either the interpreted version
or a dynamic method to evaluate the expression. The delegates are created
on-demand inside ConditionalExpr.Write, and called instead of directly creating
instances of ActionEvaluator like before.<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:blue'>public</span><span style='font-size:8.0pt;
font-family:Consolas'> <span style='color:blue'>static</span> <span
style='color:blue'>bool</span> EnableDynamicMethods = <span style='color:blue'>true</span>;<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:blue'>static</span><span style='font-size:8.0pt;
font-family:Consolas'> <span style='color:blue'>int</span> _evaluatorNumber =
1;<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:blue'>static</span><span style='font-size:8.0pt;
font-family:Consolas'> System.<span style='color:#2B91AF'>Func</span>&lt;<span
style='color:#2B91AF'>StringTemplate</span>, <span style='color:#2B91AF'>IStringTemplateWriter</span>,
<span style='color:blue'>bool</span>&gt; GetEvaluator( <span style='color:#2B91AF'>ASTExpr</span>
chunk, <span style='color:#2B91AF'>ITree</span> condition )<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>{<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; <span style='color:blue'>if</span> (
EnableDynamicMethods )<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; {<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:blue'>try<o:p></o:p></span></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='color:#2B91AF'>Type</span>[] parameterTypes = { <span
style='color:blue'>typeof</span>( <span style='color:#2B91AF'>StringTemplate</span>
), <span style='color:blue'>typeof</span>( <span style='color:#2B91AF'>IStringTemplateWriter</span>
) };<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='color:#2B91AF'>DynamicMethod</span> method = <span
style='color:blue'>new</span> <span style='color:#2B91AF'>DynamicMethod</span>(
<span style='color:#A31515'>&quot;ConditionEvaluator&quot;</span> +
_evaluatorNumber++, <span style='color:blue'>typeof</span>( <span
style='color:blue'>bool</span> ), parameterTypes );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='color:blue'>var</span> gen = method.GetILGenerator();<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='color:#2B91AF'>ActionEvaluator</span> evalCompiled = <span
style='color:blue'>new</span> <span style='color:#2B91AF'>ActionEvaluator</span>(
<span style='color:blue'>null</span>, chunk, <span style='color:blue'>null</span>,
condition );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
evalCompiled.ifConditionCompiled( gen );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gen.Emit( <span style='color:#2B91AF'>OpCodes</span>.Ret );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='color:blue'>var</span> dynamicEvaluator = (System.<span
style='color:#2B91AF'>Func</span>&lt;<span style='color:#2B91AF'>StringTemplate</span>,
<span style='color:#2B91AF'>IStringTemplateWriter</span>, <span
style='color:blue'>bool</span>&gt;)method.CreateDelegate( <span
style='color:blue'>typeof</span>( System.<span style='color:#2B91AF'>Func</span>&lt;<span
style='color:#2B91AF'>StringTemplate</span>, <span style='color:#2B91AF'>IStringTemplateWriter</span>,
<span style='color:blue'>bool</span>&gt; ) );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='color:blue'>return</span> dynamicEvaluator;<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:blue'>catch<o:p></o:p></span></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='color:green'>// fall back to interpreted version<o:p></o:p></span></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; <span style='color:blue'>return</span>
<span style='color:blue'>new</span> System.<span style='color:#2B91AF'>Func</span>&lt;<span
style='color:#2B91AF'>StringTemplate</span>, <span style='color:#2B91AF'>IStringTemplateWriter</span>,
<span style='color:blue'>bool</span>&gt;( ( self, @out ) =&gt;<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; {<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:#2B91AF'>ActionEvaluator</span> eval = <span style='color:blue'>new</span>
<span style='color:#2B91AF'>ActionEvaluator</span>( self, chunk, @out,
condition );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:blue'>return</span> eval.ifCondition();<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; } );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>}<o:p></o:p></span></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>Inside ActionEvaluator.g3, I&#8217;m working my way up,
and it throws System.NotImplementedException if it doesn&#8217;t know how to
emit IL for the [sub]expression. The exception results in automatic fallback to
the interpreted code that we know works.<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:blue'>public<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:slateblue'>ifConditionCompiled</span><span
style='font-size:8.0pt;font-family:Consolas'>[System.Reflection.Emit.ILGenerator
gen]<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:slateblue'>ifAtomCompiled</span>[$gen]<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^(<span
style='color:navy'>NOT</span> <span style='color:slateblue'>ifAtomCompiled</span>[$gen])<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {EmitNot($gen);}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:slateblue'>ifAtomCompiled</span><span
style='font-size:8.0pt;font-family:Consolas'>[System.Reflection.Emit.ILGenerator
gen]<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:slateblue'>exprCompiled</span>[$gen] {EmitTest($gen);}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:slateblue'>exprCompiled</span><span
style='font-size:8.0pt;font-family:Consolas'>[System.Reflection.Emit.ILGenerator
gen]<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^(<span
style='color:navy'>PLUS</span> <span style='color:slateblue'>exprCompiled</span>[$gen]
<span style='color:slateblue'>exprCompiled</span>[$gen])<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {throw
new System.NotImplementedException();}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:slateblue'>templateApplication<o:p></o:p></span></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {throw
new System.NotImplementedException();}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:slateblue'>attribute<o:p></o:p></span></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {throw
new System.NotImplementedException();}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:slateblue'>templateInclude<o:p></o:p></span></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {throw
new System.NotImplementedException();}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:slateblue'>function<o:p></o:p></span></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {throw
new System.NotImplementedException();}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span
style='color:slateblue'>list<o:p></o:p></span></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {throw
new System.NotImplementedException();}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^(<span
style='color:navy'>VALUE</span> <span style='color:slateblue'>exprCompiled</span>[$gen])<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {throw
new System.NotImplementedException();}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<o:p></o:p></span></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>Helper methods do the actual emit:<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:blue'>static</span><span style='font-size:8.0pt;
font-family:Consolas'> <span style='color:blue'>void</span> EmitNot( <span
style='color:#2B91AF'>ILGenerator</span> gen )<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>{<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; gen.Emit( <span style='color:#2B91AF'>OpCodes</span>.Not
);<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>}<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas;color:blue'>static</span><span style='font-size:8.0pt;
font-family:Consolas'> <span style='color:blue'>void</span> EmitTest( <span
style='color:#2B91AF'>ILGenerator</span> gen )<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>{<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; <span style='color:blue'>var</span>
label = gen.DefineLabel();<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; <span style='color:blue'>var</span>
label2 = gen.DefineLabel();<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; gen.Emit( <span style='color:#2B91AF'>OpCodes</span>.Brtrue_S,
label );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; gen.Emit( <span style='color:#2B91AF'>OpCodes</span>.Ldc_I4_0
);<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; gen.Emit( <span style='color:#2B91AF'>OpCodes</span>.Br_S,
label2 );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; gen.MarkLabel( label );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; gen.Emit( <span style='color:#2B91AF'>OpCodes</span>.Ldc_I4_1
);<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>&nbsp;&nbsp;&nbsp; gen.MarkLabel( label2 );<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:8.0pt;
font-family:Consolas'>}<o:p></o:p></span></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>Sam<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>-----Original Message-----<br>
From: stringtemplate-interest-bounces@antlr.org [mailto:stringtemplate-interest-bounces@antlr.org]
On Behalf Of Volkan Ceylan<br>
Sent: Tuesday, March 17, 2009 3:52 AM<br>
To: stringtemplate-interest@antlr.org<br>
Subject: [stringtemplate-interest] StringTemplate Compiler for .NET<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&gt; I&#8217;m extremely interested to see how the
compiled code performs compared<o:p></o:p></p>

<p class=MsoPlainText>&gt; to my C# port of StringTemplate.<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;Hi, is your C# port open source? Would like to see
what optimizations<o:p></o:p></p>

<p class=MsoPlainText>you did. I'm currently working on public 3.1beta at
stringtemplate.org<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&gt; That aside, I think the idea of compiling templates
to an assembly is great.<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>Actually, i'm not thinking about compiling to an
assembly, but to<o:p></o:p></p>

<p class=MsoPlainText>dynamic methods. AFAIK, due to some problems with .NET,
when you load<o:p></o:p></p>

<p class=MsoPlainText>an assembly, there is no way to unload it, unless you use
a separate<o:p></o:p></p>

<p class=MsoPlainText>application domain to load assemblies, and unload the
domain<o:p></o:p></p>

<p class=MsoPlainText>completely.<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>Dynamic methods can be garbage collected when you have no
delegates or<o:p></o:p></p>

<p class=MsoPlainText>references to them. That's why i prefer dynamic methods
versus<o:p></o:p></p>

<p class=MsoPlainText>assemblies. The only problem with dynamic methods i see
is that they<o:p></o:p></p>

<p class=MsoPlainText>are harder to debug :(<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&gt;I used a sampling method to profile the library. The
test was a batch conversion<o:p></o:p></p>

<p class=MsoPlainText>&gt; of the 8 grammars that are used in the C# port of
the ANTLR &gt;Tool. 54.33% (inclusive)<o:p></o:p></p>

<p class=MsoPlainText>&gt; of the samples were in Antlr3.StringTemplate.dll.
Only 6.59% (inclusive) was spent<o:p></o:p></p>

<p class=MsoPlainText>&gt; in &gt;ASTExpr.rawGetObjectProperty, which is
responsible for all measurable uses of .NET reflection.<o:p></o:p></p>

<p class=MsoPlainText>&gt; 35.31% (inclusive) of the time was spent in
&gt;ActionEvaluator.action,<o:p></o:p></p>

<p class=MsoPlainText>&gt; (note: this call encapsulates all calls to
ASTExpr.rawGetObjectProperty).<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>ActionEvaluator.action is walking a tree and consists of
some costly<o:p></o:p></p>

<p class=MsoPlainText>CASE statements. When a template is compiled, there will
not be any of<o:p></o:p></p>

<p class=MsoPlainText>them in the generated IL. Currently i'm having about 10x
speed for<o:p></o:p></p>

<p class=MsoPlainText>simple templates.<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&gt; By implementing a System.Type -&gt; System.Reflection.MemberInfo
map in ASTExpr and<o:p></o:p></p>

<p class=MsoPlainText>&gt; caching the property accessors, I was able to reduce
the time spent in<o:p></o:p></p>

<p class=MsoPlainText>&gt; ASTExpr.rawGetObjectProperty to 2.36% (inclusive).<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>This is a nice idea, would like to see implementation.
There may be<o:p></o:p></p>

<p class=MsoPlainText>even a further improvement by compiling property
accessors as dynamic<o:p></o:p></p>

<p class=MsoPlainText>methods such as (type, property) -&gt; dynamic get
delegate (though i'm<o:p></o:p></p>

<p class=MsoPlainText>not %100 sure about that, need to see source code of new
DLR)<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&gt; PS: I&#8217;ve thought about doing something similar
to the CLI compilation with<o:p></o:p></p>

<p class=MsoPlainText>&gt; ANTLR grammars, but profiling the generated code has
shown that it&#8217;s not the bottleneck right now.<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>I don't know much about ANTLR and its grammars, other
than a general<o:p></o:p></p>

<p class=MsoPlainText>overview of what it is used for :(<o:p></o:p></p>

<p class=MsoPlainText>_______________________________________________<o:p></o:p></p>

<p class=MsoPlainText>stringtemplate-interest mailing list<o:p></o:p></p>

<p class=MsoPlainText>stringtemplate-interest@antlr.org<o:p></o:p></p>

<p class=MsoPlainText>http://www.antlr.org/mailman/listinfo/stringtemplate-interest<o:p></o:p></p>

</div>

</body>

</html>