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); }
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); }
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); }