private static void Compile1(TypeBuilder tb, CljILGen ilg, ObjExpr objx, object form)
{
object line = LineVarDeref();
if (RT.meta(form) != null && RT.meta(form).containsKey(RT.LineKey))
line = RT.meta(form).valAt(RT.LineKey);
object column = ColumnVarDeref();
if (RT.meta(form) != null && RT.meta(form).containsKey(RT.ColumnKey))
column = RT.meta(form).valAt(RT.ColumnKey);
IPersistentMap sourceSpan = (IPersistentMap)SourceSpanVar.deref();
if (RT.meta(form) != null && RT.meta(form).containsKey(RT.SourceSpanKey))
sourceSpan = (IPersistentMap)RT.meta(form).valAt(RT.SourceSpanKey);
ParserContext evPC = new ParserContext(RHC.Eval);
Var.pushThreadBindings(RT.map(LineVar, line, ColumnVar, column, SourceSpanVar, sourceSpan));
try
{
form = Macroexpand(form);
if (form is ISeq && Util.Equals(RT.first(form), DoSym))
{
for (ISeq s = RT.next(form); s != null; s = RT.next(s))
Compile1(tb, ilg, objx, RT.first(s));
}
else
{
Expr expr = Analyze(evPC, form);
objx.Keywords = (IPersistentMap)KeywordsVar.deref();
objx.Vars = (IPersistentMap)VarsVar.deref();
objx.Constants = (PersistentVector)ConstantsVar.deref();
objx.EmitConstantFieldDefs(tb);
expr.Emit(RHC.Expression,objx,ilg);
ilg.Emit(OpCodes.Pop);
expr.Eval();
}
}
finally
{
Var.popThreadBindings();
}
}