// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+#if !FULL_AOT_RUNTIME
using System;
using System.IO;
using System.Collections;
internal class CodeGenerator
{
// Code generation
+
+ static object monitor = new object ();
static ModuleBuilder _module;
_module = myAsmBuilder.DefineDynamicModule("__MetadataTypesModule", false);
}
- static public Type GenerateMetadataType (Type type, StreamingContext context)
+ static public Type GenerateMetadataType (Type type, StreamingContext context) {
+ /* SRE is not thread safe */
+ lock (monitor) {
+ return GenerateMetadataTypeInternal (type, context);
+ }
+ }
+
+ static public Type GenerateMetadataTypeInternal (Type type, StreamingContext context)
{
string name = type.Name + "__TypeMetadata";
string sufix = "";
// *********************
// METHOD public constructor (Type t): base (t);
- parameters = new Type[0];
+ parameters = Type.EmptyTypes;
ConstructorBuilder ctor = typeBuilder.DefineConstructor (MethodAttributes.Public, CallingConventions.Standard, parameters);
ConstructorInfo baseCtor = typeof(ClrTypeMetadata).GetConstructor (new Type[] { typeof(Type) });
// EMIT ow.WriteAssembly (writer, memberType.Assembly);
gen.Emit (OpCodes.Ldarg_1);
gen.Emit (OpCodes.Ldarg_2);
+#if NET_4_0
+ EmitLoadType (gen, memberType);
+ gen.EmitCall (OpCodes.Callvirt, typeof(ObjectWriter).GetMethod("WriteTypeAssembly"), null);
+#else
EmitLoadTypeAssembly (gen, memberType, field.Name);
gen.EmitCall (OpCodes.Callvirt, typeof(ObjectWriter).GetMethod("WriteAssembly"), null);
+#endif
gen.Emit (OpCodes.Pop);
}
}
ig.Emit (OpCodes.Ldind_Ref);
}
- public static void EmitWriteTypeSpec (ILGenerator gen, Type type, string member)
+ static void EmitWriteTypeSpec (ILGenerator gen, Type type, string member)
{
// WARNING Keep in sync with WriteTypeSpec
// EMIT writer.Write ((int)ow.GetAssemblyId (type.Assembly));
gen.Emit (OpCodes.Ldarg_2);
gen.Emit (OpCodes.Ldarg_1);
+#if NET_4_0
+ EmitLoadType (gen, type);
+ gen.EmitCall (OpCodes.Callvirt, typeof(GetForwardedAttribute).GetMethod("GetAssemblyName"), null);
+ gen.EmitCall (OpCodes.Callvirt, typeof(ObjectWriter).GetMethod("GetAssemblyNameId"), null);
+#else
EmitLoadTypeAssembly (gen, type, member);
gen.EmitCall (OpCodes.Callvirt, typeof(ObjectWriter).GetMethod("GetAssemblyId"), null);
+#endif
gen.Emit (OpCodes.Conv_I4);
EmitWrite (gen, typeof(int));
break;
gen.EmitCall (OpCodes.Callvirt, typeof(Type).GetProperty("Assembly").GetGetMethod(), null);
}
+ static void EmitLoadType (ILGenerator gen, Type type)
+ {
+ gen.Emit (OpCodes.Ldtoken, type);
+ gen.EmitCall (OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"), null);
+ }
+
static void EmitWrite (ILGenerator gen, Type type)
{
gen.EmitCall (OpCodes.Callvirt, typeof(BinaryWriter).GetMethod("Write", new Type[] { type }), null);
break;
case TypeCode.DateTime:
- gen.EmitCall (OpCodes.Call, typeof(DateTime).GetProperty("Ticks").GetGetMethod(), null);
+ gen.EmitCall (OpCodes.Call, typeof(DateTime).GetMethod("ToBinary", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance), null);
EmitWrite (gen, typeof(long));
break;
}
}
+#endif