Skip to content

Commit

Permalink
Thu Jul 25 13:58:38 CEST 2002 Paolo Molaro <lupus@ximian.com>
Browse files Browse the repository at this point in the history
	* reflection.h, reflection.c: added support for linking resources.
	* verify.c: check we have an updated corlib.

svn path=/trunk/mono/; revision=6171
  • Loading branch information
illupus committed Jul 25, 2002
1 parent 36bba0f commit d8dfe26
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 0 deletions.
6 changes: 6 additions & 0 deletions mono/metadata/ChangeLog
@@ -1,3 +1,9 @@

Thu Jul 25 13:58:38 CEST 2002 Paolo Molaro <lupus@ximian.com>

* reflection.h, reflection.c: added support for linking resources.
* verify.c: check we have an updated corlib.

2002-07-25 Dietmar Maurer <dietmar@ximian.com>

* marshal.c (mono_marshal_get_native_wrapper): correctly marshal
Expand Down
50 changes: 50 additions & 0 deletions mono/metadata/reflection.c
Expand Up @@ -9,6 +9,7 @@
*
*/
#include <config.h>
#include "mono/utils/mono-digest.h"
#include "mono/metadata/reflection.h"
#include "mono/metadata/tabledefs.h"
#include "mono/metadata/tokentype.h"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions mono/metadata/reflection.h
Expand Up @@ -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;
Expand All @@ -282,6 +289,7 @@ typedef struct {
MonoString *name;
MonoString *dir;
MonoArray *cattrs;
MonoArray *resources;
} MonoReflectionAssemblyBuilder;

typedef struct {
Expand Down
1 change: 1 addition & 0 deletions mono/metadata/verify.c
Expand Up @@ -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}
};

Expand Down

0 comments on commit d8dfe26

Please sign in to comment.