2004-07-05 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / metadata / icall.c
index b68863fc4005d50c3c6a6eeb7bc820a46e7f953a..d0a3f6e0394aa13cfae0b6e3b687d293f8c9ca22 100644 (file)
@@ -1805,6 +1805,13 @@ ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)
        return FALSE;
 }
 
+static void
+ves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,
+                                                                          MonoReflectionType *t)
+{
+       enumtype->type = t->type;
+}
+
 static MonoReflectionType*
 ves_icall_MonoGenericInst_GetParentType (MonoReflectionGenericInst *type)
 {
@@ -3195,6 +3202,7 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
        MonoAssembly **ptr;
        MonoDomain *domain = mono_object_domain (assembly);
        int i, count = 0;
+       static MonoMethod *create_culture = NULL;
 
        MONO_ARCH_SAVE_REGS;
 
@@ -3205,7 +3213,15 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
        for (ptr = assembly->assembly->image->references; ptr && *ptr; ptr++)
                count++;
 
-       result = mono_array_new (mono_object_domain (assembly), System_Reflection_AssemblyName, count);
+       result = mono_array_new (domain, System_Reflection_AssemblyName, count);
+
+       if (count > 0) {
+               MonoMethodDesc *desc = mono_method_desc_new (
+                       "System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
+               create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
+               g_assert (create_culture);
+               mono_method_desc_free (desc);
+       }
 
        for (i = 0; i < count; i++) {
                MonoAssembly *assem = assembly->assembly->image->references [i];
@@ -3221,6 +3237,27 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
                aname->minor = assem->aname.minor;
                aname->build = assem->aname.build;
                aname->revision = assem->aname.revision;
+               aname->revision = assem->aname.revision;
+               aname->hashalg = assem->aname.hash_alg;
+               aname->flags = assem->aname.flags;
+
+               if (create_culture) {
+                       gpointer args [1];
+                       args [0] = mono_string_new (domain, assem->aname.culture);
+                       aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
+               }
+
+               if (assem->aname.public_key) {
+                       guint32 pkey_len;
+                       const char *pkey_ptr = assem->aname.public_key;
+                       pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
+
+                       aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
+                       memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
+               }
+
+               /* public key token isn't copied - the class library will 
+                  automatically generate it from the public key if required */
 
                absolute = g_build_filename (assem->basedir, assem->image->module_name, NULL);
                codebase = g_filename_to_uri (absolute, NULL, NULL);
@@ -4897,7 +4934,7 @@ mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)
        iter->args = (char*)iter->args + arg_size;
        iter->next_arg++;
 
-       //g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value);
+       /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
 
        return res;
 }
@@ -4923,10 +4960,10 @@ mono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type)
                arg_size = mono_type_stack_size (res.type, &align);
                iter->args = (char*)iter->args + arg_size;
                iter->next_arg++;
-               //g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value);
+               /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
                return res;
        }
-       //g_print ("arg type 0x%02x not found\n", res.type->type);
+       /* g_print ("arg type 0x%02x not found\n", res.type->type); */
 
        res.type = NULL;
        res.value = NULL;
@@ -5502,11 +5539,17 @@ static const IcallEntry typebuilder_icalls [] = {
        {"setup_internal_class", mono_reflection_setup_internal_class}
 };
 
+static const IcallEntry enumbuilder_icalls [] = {
+       {"setup_enum_type", ves_icall_EnumBuilder_setup_enum_type}
+};
+
 static const IcallEntry runtimehelpers_icalls [] = {
        {"GetObjectValue", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue},
+        /* REMOVEME: no longer needed, just so we dont break things when not needed */
        {"GetOffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData},
        {"InitializeArray", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray},
-       {"RunClassConstructor", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor}
+       {"RunClassConstructor", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor},
+       {"get_OffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData}
 };
 
 static const IcallEntry gchandle_icalls [] = {
@@ -5647,8 +5690,8 @@ static const IcallEntry interlocked_icalls [] = {
 };
 
 static const IcallEntry mutex_icalls [] = {
-       {"CreateMutex_internal", ves_icall_System_Threading_Mutex_CreateMutex_internal},
-       {"ReleaseMutex_internal", ves_icall_System_Threading_Mutex_ReleaseMutex_internal}
+       {"CreateMutex_internal(bool,string,bool&)", ves_icall_System_Threading_Mutex_CreateMutex_internal},
+       {"ReleaseMutex_internal(intptr)", ves_icall_System_Threading_Mutex_ReleaseMutex_internal}
 };
 
 static const IcallEntry nativeevents_icalls [] = {
@@ -5822,6 +5865,7 @@ static const IcallMap icall_entries [] = {
        {"System.Reflection.Emit.AssemblyBuilder", assemblybuilder_icalls, G_N_ELEMENTS (assemblybuilder_icalls)},
        {"System.Reflection.Emit.CustomAttributeBuilder", customattrbuilder_icalls, G_N_ELEMENTS (customattrbuilder_icalls)},
        {"System.Reflection.Emit.DynamicMethod", dynamicmethod_icalls, G_N_ELEMENTS (dynamicmethod_icalls)},
+       {"System.Reflection.Emit.EnumBuilder", enumbuilder_icalls, G_N_ELEMENTS (enumbuilder_icalls)},
        {"System.Reflection.Emit.GenericTypeParameterBuilder", generictypeparambuilder_icalls, G_N_ELEMENTS (generictypeparambuilder_icalls)},
        {"System.Reflection.Emit.MethodBuilder", methodbuilder_icalls, G_N_ELEMENTS (methodbuilder_icalls)},
        {"System.Reflection.Emit.ModuleBuilder", modulebuilder_icalls, G_N_ELEMENTS (modulebuilder_icalls)},