Răsfoiți Sursa

2006-03-15 Zoltan Varga <[email protected]>

	* metadata.c (mono_type_size): Add a fixme.
	(mono_type_stack_size): Ditto.

	* object-internals.h (MonoReflectionAssemblyBuilder): Added 
	'type_forwarders' field.

	* tabledefs.h (TYPE_ATTRIBUTE_FORWARDER): Added new (undocumented) type
	attribute from net 2.0.

	* object.c (mono_vtable_get_static_field_data): Moved this to object.c
	from class.c.

	* class.c (mono_class_setup_fields): Fix a warning.
	
	* class.c (mono_class_from_name): Add support for assemblyref entries
	in the EXPORTEDTYPE table.

	* reflection.c: Add support for handling type forwarders under net 2.0.

	* appdomain.c (MONO_CORLIB_VERSION): Bump corlib version.	

svn path=/trunk/mono/; revision=57982
Zoltan Varga 20 ani în urmă
părinte
comite
a2776fc336

+ 23 - 0
mono/metadata/ChangeLog

@@ -1,3 +1,26 @@
+2006-03-15  Zoltan Varga  <[email protected]>
+
+	* metadata.c (mono_type_size): Add a fixme.
+	(mono_type_stack_size): Ditto.
+
+	* object-internals.h (MonoReflectionAssemblyBuilder): Added 
+	'type_forwarders' field.
+
+	* tabledefs.h (TYPE_ATTRIBUTE_FORWARDER): Added new (undocumented) type
+	attribute from net 2.0.
+
+	* object.c (mono_vtable_get_static_field_data): Moved this to object.c
+	from class.c.
+
+	* class.c (mono_class_setup_fields): Fix a warning.
+	
+	* class.c (mono_class_from_name): Add support for assemblyref entries
+	in the EXPORTEDTYPE table.
+
+	* reflection.c: Add support for handling type forwarders under net 2.0.
+
+	* appdomain.c (MONO_CORLIB_VERSION): Bump corlib version.	
+	
 2006-03-14  Zoltan Varga  <[email protected]>
 
 	* icall.c (ves_icall_System_Reflection_Assembly_GetTypes): Avoid

+ 3 - 2
mono/metadata/appdomain.c

@@ -30,7 +30,7 @@
 #include <mono/metadata/threadpool.h>
 #include <mono/utils/mono-uri.h>
 
-#define MONO_CORLIB_VERSION 48
+#define MONO_CORLIB_VERSION 49
 
 CRITICAL_SECTION mono_delegate_section;
 
@@ -481,7 +481,8 @@ ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomai
 	if (!setup->application_base) {
 		/* Inherit from the root domain since MS.NET does this */
 		MonoDomain *root = mono_get_root_domain ();
-		setup->application_base = mono_string_new_utf16 (data, mono_string_chars (root->setup->application_base), mono_string_length (root->setup->application_base));
+		if (root->setup->application_base)
+			setup->application_base = mono_string_new_utf16 (data, mono_string_chars (root->setup->application_base), mono_string_length (root->setup->application_base));
 	}
 
 	mono_context_init (data);

+ 16 - 8
mono/metadata/class.c

@@ -772,7 +772,8 @@ mono_class_setup_fields (MonoClass *class)
 	const int top = class->field.count;
 	guint32 layout = class->flags & TYPE_ATTRIBUTE_LAYOUT_MASK;
 	MonoTableInfo *t = &m->tables [MONO_TABLE_FIELD];
-	int i, blittable = TRUE, real_size = 0;
+	int i, blittable = TRUE;
+	guint32 real_size = 0;
 	guint32 packing_size = 0;
 	gboolean explicit_size;
 	MonoClassField *field;
@@ -879,7 +880,9 @@ mono_class_setup_fields (MonoClass *class)
 			if (mono_field_is_deleted (field))
 				continue;
 			if (layout == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) {
-				mono_metadata_field_info (m, idx, &field->offset, NULL, NULL);
+				guint32 offset;
+				mono_metadata_field_info (m, idx, &offset, NULL, NULL);
+				field->offset = offset;
 				if (field->offset == (guint32)-1 && !(field->type->attrs & FIELD_ATTRIBUTE_STATIC))
 					g_warning ("%s not initialized correctly (missing field layout info for %s)",
 						   class->name, field->name);
@@ -3508,12 +3511,6 @@ mono_class_get_event_token (MonoEvent *event)
 	return 0;
 }
 
-void *
-mono_vtable_get_static_field_data (MonoVTable *vt)
-{
-	return vt->data;
-}
-
 MonoProperty*
 mono_class_get_property_from_name (MonoClass *klass, const char *name)
 {
@@ -3870,6 +3867,17 @@ mono_class_from_name (MonoImage *image, const char* name_space, const char *name
 			if (nested)
 				return return_nested_in (class, nested);
 			return class;
+		} else if ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_ASSEMBLYREF) {
+			MonoAssembly **references = image->references;
+			if (!references [idx - 1])
+				mono_assembly_load_reference (image, idx - 1);
+			g_assert (references == image->references);
+			g_assert (references [idx - 1]);
+			if (references [idx - 1] == (gpointer)-1)
+				return NULL;			
+			else
+				/* FIXME: Cycle detection */
+				return mono_class_from_name (references [idx - 1]->image, name_space, name);
 		} else {
 			g_error ("not yet implemented");
 		}

+ 2 - 0
mono/metadata/metadata.c

@@ -2933,6 +2933,7 @@ mono_backtrace (int limit)
  *
  * Returns: the number of bytes required to hold an instance of this
  * type in memory
+ * FIXME: This should really use 'guint32*' for the align parameter.
  */
 int
 mono_type_size (MonoType *t, gint *align)
@@ -3038,6 +3039,7 @@ mono_type_size (MonoType *t, gint *align)
  *
  * Returns: the number of bytes required to hold an instance of this
  * type on the runtime stack
+ * FIXME: This should really use 'guint32*' for the align parameter.
  */
 int
 mono_type_stack_size (MonoType *t, gint *align)

+ 1 - 0
mono/metadata/object-internals.h

@@ -795,6 +795,7 @@ typedef struct {
 	gint32 pe_kind;
 	gint32 machine;
 	MonoBoolean corlib_internal;
+	MonoArray *type_forwarders;
 } MonoReflectionAssemblyBuilder;
 
 typedef struct {

+ 8 - 0
mono/metadata/object.c

@@ -32,6 +32,7 @@
 #include <mono/metadata/environment.h>
 #include "mono/metadata/profiler-private.h"
 #include "mono/metadata/security-manager.h"
+#include "mono/metadata/mono-debug-debugger.h"
 #include <mono/os/gc_wrapper.h>
 #include <mono/utils/strenc.h>
 
@@ -1486,6 +1487,13 @@ mono_field_static_set_value (MonoVTable *vt, MonoClassField *field, void *value)
 	set_value (field->type, dest, value, FALSE);
 }
 
+/* Used by the debugger */
+void *
+mono_vtable_get_static_field_data (MonoVTable *vt)
+{
+	return vt->data;
+}
+
 /**
  * mono_field_get_value:
  * @obj: Object instance

+ 41 - 0
mono/metadata/reflection.c

@@ -3161,6 +3161,44 @@ mono_image_fill_export_table_from_module (MonoDomain *domain, MonoReflectionModu
 	}
 }
 
+static void
+mono_image_fill_export_table_from_type_forwarders (MonoReflectionAssemblyBuilder *assemblyb, MonoDynamicImage *assembly)
+{
+	MonoDynamicTable *table;
+	MonoClass *klass;
+	guint32 *values;
+	guint32 scope, idx;
+	int i;
+
+	table = &assembly->tables [MONO_TABLE_EXPORTEDTYPE];
+
+	if (assemblyb->type_forwarders) {
+		for (i = 0; i < mono_array_length (assemblyb->type_forwarders); ++i) {
+			MonoReflectionType *t = mono_array_get (assemblyb->type_forwarders, MonoReflectionType*, i);
+			if (!t)
+				continue;
+
+			g_assert (t->type);
+
+			klass = mono_class_from_mono_type (t->type);
+
+			scope = resolution_scope_from_image (assembly, klass->image);
+			g_assert ((scope & MONO_RESOLTION_SCOPE_MASK) == MONO_RESOLTION_SCOPE_ASSEMBLYREF);
+			idx = scope >> MONO_RESOLTION_SCOPE_BITS;
+
+			table->rows++;
+			alloc_table (table, table->rows);
+			values = table->values + table->next_idx * MONO_EXP_TYPE_SIZE;
+
+			values [MONO_EXP_TYPE_FLAGS] = TYPE_ATTRIBUTE_FORWARDER;
+			values [MONO_EXP_TYPE_TYPEDEF] = 0;
+			values [MONO_EXP_TYPE_IMPLEMENTATION] = (idx << MONO_IMPLEMENTATION_BITS) + MONO_IMPLEMENTATION_ASSEMBLYREF;
+			values [MONO_EXP_TYPE_NAME] = string_heap_insert (&assembly->sheap, klass->name);
+			values [MONO_EXP_TYPE_NAMESPACE] = string_heap_insert (&assembly->sheap, klass->name_space);
+		}
+	}
+}
+
 #define align_pointer(base,p)\
 	do {\
 		guint32 __diff = (unsigned char*)(p)-(unsigned char*)(base);\
@@ -3847,6 +3885,8 @@ mono_image_emit_manifest (MonoReflectionModuleBuilder *moduleb)
 			mono_image_fill_export_table_from_module (domain, file_module, module_index, assembly);
 		}
 	}
+	if (assemblyb->type_forwarders)
+		mono_image_fill_export_table_from_type_forwarders (assemblyb, assembly);
 
 	/* Emit MANIFESTRESOURCE table */
 	module_index = 0;
@@ -9367,6 +9407,7 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
 
 	res = mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);
 	g_assert (res != (MonoReflectionType*)tb);
+
 	return res;
 }
 

+ 1 - 0
mono/metadata/tabledefs.h

@@ -133,6 +133,7 @@ enum {
 #define TYPE_ATTRIBUTE_AUTO_CLASS            0x00020000
 
 #define TYPE_ATTRIBUTE_BEFORE_FIELD_INIT     0x00100000
+#define TYPE_ATTRIBUTE_FORWARDER             0x00200000
 
 #define TYPE_ATTRIBUTE_RESERVED_MASK         0x00040800
 #define TYPE_ATTRIBUTE_RT_SPECIAL_NAME       0x00000800