On Tue, 2002-08-27 at 14:57, Paolo Molaro wrote:
> On 08/26/02 Tomi Pakarinen wrote:
> > I've implemented two methods:
> >   System.Reflection.Assembly.GetModules()
> >   System.Reflection.Assembly.GetReferencedAssemblies()
> > 
> > GetModules implementation is not complete, because i couldn't find, how
> > to make a difference between resource modules and other kind of modules.
> > System.Reflection.Module.IsResource is unimplemented.
> 
> Uhm, yes, the documentation is not clear on that point.
> You can safely leave that bit unimplemented for now.
> 
 Ok.

> > I've attached patches and a simple test program. I'm bit suspicious of
> > my mono_assemblyname_get_object & mono_module_get_object
> > implementations. I'm not sure, how those are supposed to be implemented.
> 
> mono_module_get_object looks fine.
> As for GetReferencedAssemblies() I'd make a different icall that returns
> a Assembly[] and GetReferencedAssemblies() will create an AssemblyName
> array and fill it from the Assembly array (using Assembly.GetName).
> That way you don't need a mono_assemblyname_get_object().


 I changed that. Here are new patches.

   Tomi.



Index: class/corlib/System.Reflection/Assembly.cs
===================================================================
RCS file: /mono/mcs/class/corlib/System.Reflection/Assembly.cs,v
retrieving revision 1.29
diff -u -r1.29 Assembly.cs
--- class/corlib/System.Reflection/Assembly.cs	21 Aug 2002 11:04:50 -0000	1.29
+++ class/corlib/System.Reflection/Assembly.cs	1 Sep 2002 16:07:48 -0000
@@ -282,9 +282,12 @@
 			throw new NotImplementedException ();
 		}
 
+		[MethodImplAttribute (MethodImplOptions.InternalCall)]
+		public extern Module[] GetModules (bool include_resources);
+
 		public Module[] GetModules ()
 		{
-			throw new NotImplementedException ();
+			return GetModules (true);
 		}
 
 		public Module GetModule (String name)
@@ -301,9 +304,16 @@
 		[MethodImplAttribute (MethodImplOptions.InternalCall)]
 		public extern static Assembly GetCallingAssembly ();
 
+		[MethodImplAttribute (MethodImplOptions.InternalCall)]
+		private extern Assembly[] GetReferencedAssembliesInternal ();
+
 		public AssemblyName[] GetReferencedAssemblies ()
 		{
-			throw new NotImplementedException ();
+			Assembly[] assemblies = GetReferencedAssembliesInternal();
+			AssemblyName[] names = new AssemblyName[assemblies.Length];
+			for ( int i=0; i<assemblies.Length; ++i )
+				names[i] = assemblies[i].GetName();
+			return names;
 		}
 
 		public virtual ManifestResourceInfo GetManifestResourceInfo (String resourceName)
Index: mono/metadata/icall.c
===================================================================
RCS file: /mono/mono/mono/metadata/icall.c,v
retrieving revision 1.201
diff -u -r1.201 icall.c
--- mono/metadata/icall.c	29 Aug 2002 11:38:36 -0000	1.201
+++ mono/metadata/icall.c	1 Sep 2002 16:15:14 -0000
@@ -2047,6 +2047,33 @@
 }
 
 
+static MonoArray*
+ves_icall_System_Reflection_Assembly_GetReferencedAssembliesInternal (MonoReflectionAssembly *assembly)
+{
+	MonoDomain *domain = mono_domain_get();
+	MonoArray *res;
+	MonoClass *klass;
+	int i, count = 0;
+	MonoAssembly **refs = assembly->assembly->image->references;
+
+	if (refs) 
+	{
+		while (refs[count])
+			++count;
+	}
+
+	klass = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "Assembly");
+
+	res = mono_array_new (domain, klass, count);
+
+	for ( i = 0; i < count; ++i )
+		mono_array_set (res, gpointer, i, mono_assembly_get_object (domain, refs[i]));
+
+	return res;
+}
+
+
+
 static MonoReflectionAssembly*
 ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
 {
@@ -2058,6 +2085,35 @@
 	return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
 }
 
+static MonoArray*
+ves_icall_System_Reflection_Assembly_GetModules (MonoReflectionAssembly* assembly, MonoBoolean include_resource_modules )
+{
+	MonoDomain *domain = mono_domain_get();
+	MonoArray *res;
+	MonoClass *klass;
+	int i, count = 0;
+	MonoImage **modules = assembly->assembly->modules;
+
+	if (modules) 
+	{
+		while (modules[count])
+			++count;
+	}
+
+	g_assert( assembly->assembly->image != NULL );
+	++count;
+
+	klass = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "Module");
+	res = mono_array_new (domain, klass, count);
+
+	mono_array_set (res, gpointer, 0, mono_module_get_object (domain, assembly->assembly->image));
+	for ( i = 1; i < count; ++i ) 
+		mono_array_set (res, gpointer, i, mono_module_get_object (domain, modules[i]));
+
+	return res;
+}
+
+
 static MonoString *
 ves_icall_System_MonoType_getFullName (MonoReflectionType *object)
 {
@@ -2889,8 +2945,10 @@
 	"System.Reflection.Assembly::FillName", ves_icall_System_Reflection_Assembly_FillName,
 	"System.Reflection.Assembly::get_code_base", ves_icall_System_Reflection_Assembly_get_code_base,
 	"System.Reflection.Assembly::GetExecutingAssembly", ves_icall_System_Reflection_Assembly_GetExecutingAssembly,
+	"System.Reflection.Assembly::GetReferencedAssembliesInternal", ves_icall_System_Reflection_Assembly_GetReferencedAssembliesInternal,
 	"System.Reflection.Assembly::GetEntryAssembly", ves_icall_System_Reflection_Assembly_GetEntryAssembly,
 	"System.Reflection.Assembly::GetCallingAssembly", ves_icall_System_Reflection_Assembly_GetCallingAssembly,
+	"System.Reflection.Assembly::GetModules", ves_icall_System_Reflection_Assembly_GetModules,
 	"System.Reflection.Assembly::get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint,
 	"System.Reflection.Assembly::GetManifestResourceNames", ves_icall_System_Reflection_Assembly_GetManifestResourceNames,
 	"System.Reflection.Assembly::GetManifestResourceInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInternal,
Index: mono/metadata/reflection.c
===================================================================
RCS file: /mono/mono/mono/metadata/reflection.c,v
retrieving revision 1.107
diff -u -r1.107 reflection.c
--- mono/metadata/reflection.c	27 Aug 2002 14:39:19 -0000	1.107
+++ mono/metadata/reflection.c	1 Sep 2002 16:15:16 -0000
@@ -2692,6 +2692,31 @@
 	return res;
 }
 
+
+MonoReflectionModule*   
+mono_module_get_object   (MonoDomain *domain, MonoImage *image)
+{
+	static MonoClass *System_Reflection_Module;
+	MonoReflectionModule *res;
+	
+	CHECK_OBJECT (MonoReflectionModule *, image, NULL);
+	if (!System_Reflection_Module)
+		System_Reflection_Module = mono_class_from_name (
+			mono_defaults.corlib, "System.Reflection", "Module");
+	res = (MonoReflectionModule *)mono_object_new (domain, System_Reflection_Module);
+
+	res->image = image;
+	res->assembly = (MonoReflectionAssembly *) mono_assembly_get_object(domain, image->assembly);
+
+	res->fqname    = mono_string_new (domain, image->name);
+	res->name      = mono_string_new (domain, image->name);
+	res->scopename = mono_string_new (domain, image->module_name);
+
+	CACHE_OBJECT (image, res, NULL);
+	return res;
+}
+
+
 static gboolean
 mymono_metadata_type_equal (MonoType *t1, MonoType *t2)
 {
Index: mono/metadata/reflection.h
===================================================================
RCS file: /mono/mono/mono/metadata/reflection.h,v
retrieving revision 1.55
diff -u -r1.55 reflection.h
--- mono/metadata/reflection.h	27 Aug 2002 14:42:07 -0000	1.55
+++ mono/metadata/reflection.h	1 Sep 2002 16:15:16 -0000
@@ -323,7 +323,7 @@
 typedef struct {
 	MonoObject	obj;
 	MonoImage  *image;
-	MonoObject *assembly;
+	MonoReflectionAssembly *assembly;
 	MonoString *fqname;
 	MonoString *name;
 	MonoString *scopename;
@@ -365,6 +365,16 @@
 	MonoString *codebase;
 	gint32 major, minor, build, revision;
 	/* FIXME: add missing stuff */
+/*	CultureInfo cultureinfo;
+	AssemblyNameFlags flags;
+	AssemblyHashAlgorithm hashalg;
+	StrongNameKeyPair keypair;
+	AssemblyVersionCompatibility versioncompat;*/
+	MonoObject  *cultureInfo;
+	MonoObject  *flags;
+	MonoObject  *hashalg;
+	MonoObject  *keypair;
+	MonoObject  *versioncompat;
 } MonoReflectionAssemblyName;
 
 typedef struct {
@@ -417,6 +427,7 @@
 guint32       mono_image_create_token  (MonoDynamicAssembly *assembly, MonoObject *obj);
 
 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
+MonoReflectionModule*   mono_module_get_object   (MonoDomain *domain, MonoImage *image);
 MonoReflectionType*     mono_type_get_object     (MonoDomain *domain, MonoType *type);
 MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method, MonoClass *refclass);
 MonoReflectionField*    mono_field_get_object    (MonoDomain *domain, MonoClass *klass, MonoClassField *field);

Reply via email to