Beispiel #1
0
 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;
 }
Beispiel #2
0
        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;
        }
Beispiel #3
0
 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;
         }
     }
 }