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