Ejemplo n.º 1
0
        internal static void EmitGetElemSafe(ILGenerator ilg, Symbol array, TypeSymbol elemType)
        {
            LocalSymbol ls = new LocalSymbol(null, Compilation.Get(NativeType.Int32));

            ls.Declare(ilg);
            ls.EmitSet(ilg);

            var notExist = ilg.DefineLabel();
            var exist    = ilg.DefineLabel();

            array.EmitGet(ilg);
            ilg.Emit(OpCodes.Ldlen);
            ilg.Emit(OpCodes.Conv_U4);
            ls.EmitGet(ilg);
            ilg.Emit(OpCodes.Cgt_Un);
            ilg.Emit(OpCodes.Brfalse_S, notExist);

            array.EmitGet(ilg);
            ls.EmitGet(ilg);
            ilg.Emit(OpCodes.Ldelem_Ref);
            ilg.Emit(OpCodes.Br_S, exist);

            ilg.MarkLabel(notExist);
            EmitDefault(ilg, elemType);

            ilg.MarkLabel(exist);
        }
Ejemplo n.º 2
0
        internal override void Emit(Expr expr, TypeSymbol type, ILGenerator ilg)
        {
            Conversion.Emit(expr, type, ilg);
            var loc = new LocalSymbol(Type);

            loc.Declare(ilg);
            loc.EmitSet(ilg);
            Expr = IdExpr.Bound(loc);
        }