From d8dfe2603ee001a163c5ac582c915a47e436519d Mon Sep 17 00:00:00 2001 From: Paolo Molaro Date: Thu, 25 Jul 2002 12:03:33 +0000 Subject: [PATCH] Thu Jul 25 13:58:38 CEST 2002 Paolo Molaro * reflection.h, reflection.c: added support for linking resources. * verify.c: check we have an updated corlib. svn path=/trunk/mono/; revision=6171 --- mono/metadata/ChangeLog | 6 +++++ mono/metadata/reflection.c | 50 ++++++++++++++++++++++++++++++++++++++ mono/metadata/reflection.h | 8 ++++++ mono/metadata/verify.c | 1 + 4 files changed, 65 insertions(+) diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 6affede336da6..a5af872778c0c 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,9 @@ + +Thu Jul 25 13:58:38 CEST 2002 Paolo Molaro + + * reflection.h, reflection.c: added support for linking resources. + * verify.c: check we have an updated corlib. + 2002-07-25 Dietmar Maurer * marshal.c (mono_marshal_get_native_wrapper): correctly marshal diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index ed8256692cd30..7d2b08a4e7873 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -9,6 +9,7 @@ * */ #include +#include "mono/utils/mono-digest.h" #include "mono/metadata/reflection.h" #include "mono/metadata/tabledefs.h" #include "mono/metadata/tokentype.h" @@ -2017,6 +2018,49 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicAssembly *a } } +static void +assembly_add_resource (MonoDynamicAssembly *assembly, MonoReflectionResource *rsrc) +{ + MonoDynamicTable *table; + guint32 *values; + char blob_size [6]; + guchar hash [20]; + char *b = blob_size; + char *name, *sname; + guint32 idx; + + /* FIXME: later add support (also in mcs) to embed resurces */ + g_assert (rsrc->filename); + name = mono_string_to_utf8 (rsrc->filename); + sname = g_path_get_basename (name); + + table = &assembly->tables [MONO_TABLE_FILE]; + table->rows++; + alloc_table (table, table->rows); + values = table->values + table->next_idx * MONO_FILE_SIZE; + values [MONO_FILE_FLAGS] = 1; /* nometadata */ + values [MONO_FILE_NAME] = string_heap_insert (&assembly->sheap, sname); + g_free (sname); + + mono_sha1_get_digest_from_file (name, hash); + mono_metadata_encode_value (20, b, &b); + values [MONO_FILE_HASH_VALUE] = mono_image_add_stream_data (&assembly->blob, blob_size, b-blob_size); + mono_image_add_stream_data (&assembly->blob, hash, 20); + g_free (name); + idx = table->next_idx++; + + table = &assembly->tables [MONO_TABLE_MANIFESTRESOURCE]; + table->rows++; + alloc_table (table, table->rows); + values = table->values + table->next_idx * MONO_MANIFEST_SIZE; + values [MONO_MANIFEST_OFFSET] = 0; + values [MONO_MANIFEST_FLAGS] = rsrc->attrs; + name = mono_string_to_utf8 (rsrc->name); + values [MONO_MANIFEST_NAME] = string_heap_insert (&assembly->sheap, name); + g_free (name); + values [MONO_MANIFEST_IMPLEMENTATION] = IMPLEMENTATION_FILE | (idx << IMPLEMENTATION_BITS); +} + /* * mono_image_build_metadata() will fill the info in all the needed metadata tables * for the AssemblyBuilder @assemblyb: it iterates over the assembly modules @@ -2094,6 +2138,12 @@ mono_image_build_metadata (MonoReflectionAssemblyBuilder *assemblyb) for (i = 0; i < len; ++i) module_add_cattrs (assembly, mono_array_get (assemblyb->modules, MonoReflectionModuleBuilder*, i)); } + + if (assemblyb->resources) { + len = mono_array_length (assemblyb->resources); + for (i = 0; i < len; ++i) + assembly_add_resource (assembly, (MonoReflectionResource*)mono_array_addr (assemblyb->resources, MonoReflectionResource, i)); + } /* fixup tokens */ mono_g_hash_table_foreach (assembly->token_fixups, (GHFunc)fixup_method, assembly); diff --git a/mono/metadata/reflection.h b/mono/metadata/reflection.h index 97a367f8e7144..65f5f94a4899f 100644 --- a/mono/metadata/reflection.h +++ b/mono/metadata/reflection.h @@ -274,6 +274,13 @@ typedef struct { MonoDynamicTable tables [64]; } MonoDynamicAssembly; +typedef struct { + MonoArray *data; + MonoString *name; + MonoString *filename; + guint32 attrs; +} MonoReflectionResource; + typedef struct { MonoReflectionAssembly assembly; MonoDynamicAssembly *dynamic_assembly; @@ -282,6 +289,7 @@ typedef struct { MonoString *name; MonoString *dir; MonoArray *cattrs; + MonoArray *resources; } MonoReflectionAssemblyBuilder; typedef struct { diff --git a/mono/metadata/verify.c b/mono/metadata/verify.c index 40e089fa078bd..4e804b85b8590 100644 --- a/mono/metadata/verify.c +++ b/mono/metadata/verify.c @@ -2175,6 +2175,7 @@ assemblybuilder_fields[] = { {"entry_point", G_STRUCT_OFFSET (MonoReflectionAssemblyBuilder, entry_point)}, {"modules", G_STRUCT_OFFSET (MonoReflectionAssemblyBuilder, modules)}, {"name", G_STRUCT_OFFSET (MonoReflectionAssemblyBuilder, name)}, + {"resources", G_STRUCT_OFFSET (MonoReflectionAssemblyBuilder, resources)}, {NULL, 0} };