public static void EmitLoadLocal(FleeILGenerator ilg, int index) { Debug.Assert(index >= 0, "Invalid index"); if (index >= 0 & index <= 3) { switch (index) { case 0: ilg.Emit(OpCodes.Ldloc_0); break; case 1: ilg.Emit(OpCodes.Ldloc_1); break; case 2: ilg.Emit(OpCodes.Ldloc_2); break; case 3: ilg.Emit(OpCodes.Ldloc_3); break; } } else { Debug.Assert(index < 256, "local index too large"); ilg.Emit(OpCodes.Ldloc_S, Convert.ToByte(index)); } }
public static void EmitArrayStore(FleeILGenerator ilg, Type elementType) { TypeCode tc = Type.GetTypeCode(elementType); switch (tc) { case TypeCode.Byte: case TypeCode.SByte: case TypeCode.Boolean: ilg.Emit(OpCodes.Stelem_I1); break; case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Char: ilg.Emit(OpCodes.Stelem_I2); break; case TypeCode.Int32: case TypeCode.UInt32: ilg.Emit(OpCodes.Stelem_I4); break; case TypeCode.Int64: case TypeCode.UInt64: ilg.Emit(OpCodes.Stelem_I8); break; case TypeCode.Single: ilg.Emit(OpCodes.Stelem_R4); break; case TypeCode.Double: ilg.Emit(OpCodes.Stelem_R8); break; case TypeCode.Object: // TimeSpan EmitArrayStore bugfix. TimeSpan TypeCode returns Object but Emit(OpCodes.Stelem, elementType) must be called if (elementType == typeof(TimeSpan)) { ilg.Emit(OpCodes.Stelem, elementType); } else { ilg.Emit(OpCodes.Stelem_Ref); } break; case TypeCode.String: ilg.Emit(OpCodes.Stelem_Ref); break; default: // Must be a non-primitive value type ilg.Emit(OpCodes.Stelem, elementType); break; } }
public static void EmitLoadLocalAddress(FleeILGenerator ilg, int index) { Debug.Assert(index >= 0, "Invalid index"); if (index <= byte.MaxValue) { ilg.Emit(OpCodes.Ldloca_S, Convert.ToByte(index)); } else { ilg.Emit(OpCodes.Ldloca, index); } }
private static void EmitConvert(FleeILGenerator ilg, OpCode convertOpcode) { if ((ilg != null)) { ilg.Emit(convertOpcode); } }
private static bool ImplicitConvertToReferenceType(Type sourceType, Type destType, FleeILGenerator ilg) { if (destType.IsValueType == true) { return(false); } if (object.ReferenceEquals(sourceType, typeof(Null))) { // Null is always convertible to a reference type return(true); } if (destType.IsAssignableFrom(sourceType) == false) { return(false); } if (sourceType.IsValueType == true) { if ((ilg != null)) { ilg.Emit(OpCodes.Box, sourceType); } } return(true); }
public static void EmitStoreLocal(FleeILGenerator ilg, int index) { if (index >= 0 & index <= 3) { switch (index) { case 0: ilg.Emit(OpCodes.Stloc_0); break; case 1: ilg.Emit(OpCodes.Stloc_1); break; case 2: ilg.Emit(OpCodes.Stloc_2); break; case 3: ilg.Emit(OpCodes.Stloc_3); break; } } else if (index < 256) { ilg.Emit(OpCodes.Stloc_S, Convert.ToByte(index)); } else { Debug.Assert(index < 65535, "local index too large"); ilg.Emit(OpCodes.Stloc, unchecked ((short)Convert.ToUInt16(index))); } }
public static void EmitArrayStore(FleeILGenerator ilg, Type elementType) { TypeCode tc = Type.GetTypeCode(elementType); switch (tc) { case TypeCode.Byte: case TypeCode.SByte: case TypeCode.Boolean: ilg.Emit(OpCodes.Stelem_I1); break; case TypeCode.Int16: case TypeCode.UInt16: ilg.Emit(OpCodes.Stelem_I2); break; case TypeCode.Int32: case TypeCode.UInt32: ilg.Emit(OpCodes.Stelem_I4); break; case TypeCode.Int64: case TypeCode.UInt64: ilg.Emit(OpCodes.Stelem_I8); break; case TypeCode.Single: ilg.Emit(OpCodes.Stelem_R4); break; case TypeCode.Double: ilg.Emit(OpCodes.Stelem_R8); break; case TypeCode.Object: case TypeCode.String: ilg.Emit(OpCodes.Stelem_Ref); break; default: // Must be a non-primitive value type ilg.Emit(OpCodes.Stelem, elementType); break; } }
private static bool EmitOverloadedImplicitConvert(Type sourceType, Type destType, FleeILGenerator ilg) { // Look for an implicit operator on the destination type MethodInfo mi = Utility.GetSimpleOverloadedOperator("Implicit", sourceType, destType); if (mi == null) { // No match return(false); } if ((ilg != null)) { ilg.Emit(OpCodes.Call, mi); } return(true); }