public ErrorList GenerateSet(Context ctx, Action<Context> exp) { Ctx = ctx; Errors.Clear(); var errors = new ErrorList(); if (T.Type == 0) { var error = (CommonErrorNode) T; errors.ErrorParse(error); return Errors; } var child = (CommonTree) T.Children[0]; switch (child.Type) { case 0: { var error = (CommonErrorNode) child; errors.ErrorParse(error); break; } case TemplateLexer.MStart: case TemplateLexer.EStart: { EmitSet(child, exp); //pop off voidtype from final function in chain break; } default: { break; } } return Errors; }
public ErrorList EmitArgList(CommonTree fnArgs, Action<Context> last) { var errors = new ErrorList(); if (fnArgs.Type == 0) { EmitNullRef(); errors.ErrorParse((CommonErrorNode) fnArgs); return errors; } var args = fnArgs.Children; var size = args.Count + 1; var local = Sink.DeclareLocal(typeof (ITemplateType[])); Sink.FastEmitConstInt(size); Sink.Emit(OpCodes.Newarr, typeof (ITemplateType)); Sink.FastEmitStoreLocal(local.LocalIndex); for (var i = 0; i < args.Count; i++) { Sink.FastEmitLoadLocal(local.LocalIndex); Sink.FastEmitConstInt(i); var exp = new Expression(args[i]); errors.AddRange(exp.Generate(this)); Sink.Emit(OpCodes.Stelem_Ref); } Sink.FastEmitLoadLocal(local.LocalIndex); Sink.FastEmitConstInt(fnArgs.Children.Count); last(this); Sink.Emit(OpCodes.Stelem_Ref); Sink.FastEmitLoadLocal(local.LocalIndex); return errors; }
protected override void OnGenerate() { var errors = new ErrorList(); if (T.Type == 0) { var error = (CommonErrorNode) T; errors.ErrorParse(error); Ctx.EmitNullRef(); return; } var child = (CommonTree) T.Children[0]; switch (child.Type) { case 0: { var error = (CommonErrorNode) child; errors.ErrorParse(error); Ctx.EmitNullRef(); break; } case TemplateLexer.MStart: case TemplateLexer.EStart: { EmitStatement(child); if (child.Type == TemplateLexer.MStart) { EmitDoMacro(); } break; } default: { break; } } }