Пример #1
0
        internal override void Emit(ILGenerator ilg)
        {
            if (Params != null)
            {
                foreach (var p in Params)
                {
                    LocalSymbol ls = (LocalSymbol)p.Symbol;
                    ls.Declare(ilg);

                    var idx  = Constant.Create(ls.Index);
                    var skip = ilg.DefineLabel();
                    var lidx = Constant.Create(ls.Index);

                    ParamArray.EmitGet(ilg);
                    ilg.Emit(OpCodes.Ldlen);
                    ilg.Emit(OpCodes.Conv_I4);
                    lidx.EmitGet(ilg);
                    ilg.Emit(OpCodes.Cgt);
                    ilg.Emit(OpCodes.Brfalse, skip);

                    ParamArray.EmitGet(ilg);
                    lidx.EmitGet(ilg);
                    if (ls.Type.IsReferenceType)
                    {
                        ilg.Emit(OpCodes.Ldelem_Ref);
                    }
                    else
                    {
                        ilg.Emit(OpCodes.Ldelem, ls.Type.Type);
                    }
                    ls.EmitSet(ilg);

                    ilg.MarkLabel(skip);
                }
            }
            if (PCount != null)
            {
                PCount.Declare(ilg);
                ParamArray.EmitGet(ilg);
                ilg.Emit(OpCodes.Ldlen);
                ilg.Emit(OpCodes.Conv_I4);
                PCount.EmitSet(ilg);
            }
            Body.Codeblock = this;
            Body.Emit(ilg);
            if (Symbol != null)
            {
                Symbol.EmitGet(ilg);
            }
            ilg.Emit(OpCodes.Ret);
        }
Пример #2
0
        internal override void Emit(ILGenerator ilg)
        {
            if (Params != null)
            {
                foreach (var p in Params)
                {
                    LocalSymbol ls = (LocalSymbol)p.Symbol;
                    ls.Declare(ilg);

                    var idx  = Constant.Create(ls.Index);
                    var skip = ilg.DefineLabel();
                    var lidx = Constant.Create(ls.Index);

                    ParamArray.EmitGet(ilg);
                    ilg.Emit(OpCodes.Ldlen);
                    ilg.Emit(OpCodes.Conv_I4);
                    lidx.EmitGet(ilg);
                    ilg.Emit(OpCodes.Cgt);
                    ilg.Emit(OpCodes.Brfalse, skip);

                    ParamArray.EmitGet(ilg);
                    lidx.EmitGet(ilg);
                    ilg.Emit(OpCodes.Ldelem_Ref);
                    ls.EmitSet(ilg);

                    ilg.MarkLabel(skip);
                }
            }
            if (PCount != null)
            {
                PCount.Declare(ilg);
                ParamArray.EmitGet(ilg);
                ilg.Emit(OpCodes.Ldlen);
                ilg.Emit(OpCodes.Conv_I4);
                PCount.EmitSet(ilg);
            }
            bool isVoid = true;

            if (Body != null)
            {
                isVoid &= Body.Datatype.NativeType == NativeType.Void;
                Body.Emit(ilg, true);
            }
            if (isVoid)
            {
                EmitDefault(ilg, (TypeSymbol)Symbol);
            }
            ilg.Emit(OpCodes.Ret);
        }
Пример #3
0
        internal override void Emit(ILGenerator ilg)
        {
            var result = ilg.DeclareLocal(((TypeSymbol)Symbol).Type);

            Symbol = new LocalSymbol((TypeSymbol)Symbol, result.LocalIndex);

            if (PCount != null)
            {
                PCount.Declare(ilg);
                ParamArray.EmitGet(ilg);
                ilg.Emit(OpCodes.Ldlen);
                ilg.Emit(OpCodes.Conv_I4);
                PCount.EmitSet(ilg);
            }

            Body.Emit(ilg);
            if (End != null)
            {
                ilg.MarkLabel(End.Value);
            }
            Symbol.EmitGet(ilg);
            ilg.Emit(OpCodes.Ret);
        }