-/*
- * sre-save.c: Routine for saving an image to a file.
+/**
+ * \file
+ * Routine for saving an image to a file.
*
*
* Author:
#include "mono/metadata/security-manager.h"
#include "mono/metadata/tabledefs.h"
#include "mono/metadata/tokentype.h"
+#include "mono/metadata/w32file.h"
+#include "mono/metadata/w32error.h"
#include "mono/utils/checked-build.h"
#include "mono/utils/mono-digest.h"
#include "mono/utils/mono-error-internals.h"
+#include "mono/utils/w32api.h"
#define TEXT_OFFSET 512
#define CLI_H_SIZE 136
return idx;
}
+static guint32
+image_create_token_raw (MonoDynamicImage *assembly, MonoObject* obj_raw, gboolean create_methodspec, gboolean register_token, MonoError *error)
+{
+ HANDLE_FUNCTION_ENTER (); /* FIXME callers of image_create_token_raw should use handles */
+ error_init (error);
+ MONO_HANDLE_DCL (MonoObject, obj);
+ guint32 result = mono_image_create_token (assembly, obj, create_methodspec, register_token, error);
+ HANDLE_FUNCTION_RETURN_VAL (result);
+}
+
+
/*
* idx is the table index of the object
* type is one of MONO_CUSTOM_ATTR_*
char blob_size [6];
char *p = blob_size;
- mono_error_init (error);
+ error_init (error);
/* it is legal to pass a NULL cattrs: we avoid to use the if in a lot of places */
if (!cattrs)
for (i = 0; i < count; ++i) {
cattr = (MonoReflectionCustomAttr*)mono_array_get (cattrs, gpointer, i);
values [MONO_CUSTOM_ATTR_PARENT] = idx;
- token = mono_image_create_token (assembly, (MonoObject*)cattr->ctor, FALSE, FALSE, error);
- if (!mono_error_ok (error)) goto fail;
+ g_assert (cattr->ctor != NULL);
+ if (mono_is_sre_ctor_builder (mono_object_class (cattr->ctor))) {
+ MonoReflectionCtorBuilder *ctor = (MonoReflectionCtorBuilder*)cattr->ctor;
+ MonoMethod *method = ctor->mhandle;
+ if (method->klass->image == &assembly->image)
+ token = MONO_TOKEN_METHOD_DEF | ((MonoReflectionCtorBuilder*)cattr->ctor)->table_idx;
+ else
+ token = mono_image_get_methodref_token (assembly, method, FALSE);
+ } else {
+ token = image_create_token_raw (assembly, (MonoObject*)cattr->ctor, FALSE, FALSE, error); /* FIXME use handles */
+ if (!mono_error_ok (error)) goto fail;
+ }
type = mono_metadata_token_index (token);
type <<= MONO_CUSTOM_ATTR_TYPE_BITS;
switch (mono_metadata_token_table (token)) {
guint32 header_size = 12;
MonoArray *code;
- mono_error_init (error);
+ error_init (error);
if ((mb->attrs & (METHOD_ATTRIBUTE_PINVOKE_IMPL | METHOD_ATTRIBUTE_ABSTRACT)) ||
(mb->iattrs & (METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL | METHOD_IMPL_ATTRIBUTE_RUNTIME)))
guint32 *values;
guint i, count;
- mono_error_init (error);
+ error_init (error);
/* room in this table is already allocated */
table = &assembly->tables [MONO_TABLE_METHOD];
MonoReflectionMethod *m;
int i;
- mono_error_init (error);
+ error_init (error);
if (!mb->override_methods)
return TRUE;
values [MONO_METHODIMPL_CLASS] = tb->table_idx;
values [MONO_METHODIMPL_BODY] = MONO_METHODDEFORREF_METHODDEF | (mb->table_idx << MONO_METHODDEFORREF_BITS);
- tok = mono_image_create_token (assembly, (MonoObject*)m, FALSE, FALSE, error);
+ tok = image_create_token_raw (assembly, (MonoObject*)m, FALSE, FALSE, error); /* FIXME use handles */
return_val_if_nok (error, FALSE);
switch (mono_metadata_token_table (tok)) {
ReflectionMethodBuilder rmb;
int i;
- mono_error_init (error);
+ error_init (error);
if (!mono_reflection_methodbuilder_from_method_builder (&rmb, mb, error) ||
!mono_image_basic_method (&rmb, assembly, error))
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDynamicTable *table;
guint32 *values;
values [MONO_FIELD_SIGNATURE] = mono_dynimage_encode_field_signature (assembly, fb, error);
return_if_nok (error);
-
if (fb->offset != -1) {
table = &assembly->tables [MONO_TABLE_FIELDLAYOUT];
table->rows ++;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDynamicTable *table;
guint32 *values;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDynamicTable *table;
guint32 num_constraints, i;
guint32 *values;
guint32 table_idx;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_GENERICPARAM];
table_idx = table->next_idx ++;
params_add_cattrs (MonoDynamicImage *assembly, MonoArray *pinfo, MonoError *error) {
int i;
- mono_error_init (error);
+ error_init (error);
if (!pinfo)
return TRUE;
for (i = 0; i < mono_array_length (pinfo); ++i) {
type_add_cattrs (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *tb, MonoError *error) {
int i;
- mono_error_init (error);
+ error_init (error);
if (!mono_image_add_cattrs (assembly, tb->table_idx, MONO_CUSTOM_ATTR_TYPEDEF, tb->cattrs, error))
return FALSE;
{
int i;
- mono_error_init (error);
+ error_init (error);
if (!mono_image_add_cattrs (assembly, moduleb->table_idx, MONO_CUSTOM_ATTR_MODULE, moduleb->cattrs, error))
return FALSE;
char *b = blob_size;
char *dir, *path;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_FILE];
table->rows++;
MonoDynamicTable *table;
int i;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_MODULE];
mb->table_idx = table->next_idx ++;
guint32 *values;
guint32 visib, res;
- visib = klass->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK;
+ visib = mono_class_get_flags (klass) & TYPE_ATTRIBUTE_VISIBILITY_MASK;
if (! ((visib & TYPE_ATTRIBUTE_PUBLIC) || (visib & TYPE_ATTRIBUTE_NESTED_PUBLIC)))
return 0;
alloc_table (table, table->rows);
values = table->values + table->next_idx * MONO_EXP_TYPE_SIZE;
- values [MONO_EXP_TYPE_FLAGS] = klass->flags;
+ values [MONO_EXP_TYPE_FLAGS] = mono_class_get_flags (klass);
values [MONO_EXP_TYPE_TYPEDEF] = klass->type_token;
if (klass->nested_in)
values [MONO_EXP_TYPE_IMPLEMENTATION] = (parent_index << MONO_IMPLEMENTATION_BITS) + MONO_IMPLEMENTATION_EXP_TYPE;
table->next_idx ++;
/* Emit nested types */
- if (klass->ext && klass->ext->nested_classes) {
- GList *tmp;
-
- for (tmp = klass->ext->nested_classes; tmp; tmp = tmp->next)
- mono_image_fill_export_table_from_class (domain, (MonoClass *)tmp->data, module_index, table->next_idx - 1, assembly);
- }
+ GList *nested_classes = mono_class_get_nested_classes_property (klass);
+ GList *tmp;
+ for (tmp = nested_classes; tmp; tmp = tmp->next)
+ mono_image_fill_export_table_from_class (domain, (MonoClass *)tmp->data, module_index, table->next_idx - 1, assembly);
return res;
}
MonoClass *klass;
guint32 idx, i;
- mono_error_init (error);
+ error_init (error);
MonoType *t = mono_reflection_type_get_handle ((MonoReflectionType*)tb, error);
return_if_nok (error);
MonoClass *klass = mono_class_get_checked (image, mono_metadata_make_token (MONO_TABLE_TYPEDEF, i + 1), &error);
g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */
- if (klass->flags & TYPE_ATTRIBUTE_PUBLIC)
+ if (mono_class_is_public (klass))
mono_image_fill_export_table_from_class (domain, klass, module_index, 0, assembly);
}
}
unsigned char *p;
struct StreamDesc stream_desc [5];
- mono_error_init (error);
+ error_init (error);
qsort (assembly->gen_params->pdata, assembly->gen_params->len, sizeof (gpointer), compare_genericparam);
for (i = 0; i < assembly->gen_params->len; i++) {
{
guint32 code_idx = GPOINTER_TO_UINT (value);
MonoReflectionILTokenInfo *iltoken;
- MonoReflectionFieldBuilder *field;
- MonoReflectionCtorBuilder *ctor;
- MonoReflectionMethodBuilder *method;
MonoReflectionTypeBuilder *tb;
MonoReflectionArrayMethod *am;
guint32 i, idx = 0;
switch (target [3]) {
case MONO_TABLE_FIELD:
if (!strcmp (iltoken->member->vtable->klass->name, "FieldBuilder")) {
- field = (MonoReflectionFieldBuilder *)iltoken->member;
- idx = field->table_idx;
+ g_assert_not_reached ();
} else if (!strcmp (iltoken->member->vtable->klass->name, "MonoField")) {
MonoClassField *f = ((MonoReflectionField*)iltoken->member)->field;
idx = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->field_to_table_idx, f));
break;
case MONO_TABLE_METHOD:
if (!strcmp (iltoken->member->vtable->klass->name, "MethodBuilder")) {
- method = (MonoReflectionMethodBuilder *)iltoken->member;
- idx = method->table_idx;
+ g_assert_not_reached ();
} else if (!strcmp (iltoken->member->vtable->klass->name, "ConstructorBuilder")) {
- ctor = (MonoReflectionCtorBuilder *)iltoken->member;
- idx = ctor->table_idx;
+ g_assert_not_reached ();
} else if (!strcmp (iltoken->member->vtable->klass->name, "MonoMethod") ||
!strcmp (iltoken->member->vtable->klass->name, "MonoCMethod")) {
MonoMethod *m = ((MonoReflectionMethod*)iltoken->member)->method;
}
break;
case MONO_TABLE_TYPEDEF:
- if (strcmp (iltoken->member->vtable->klass->name, "TypeBuilder"))
+ if (!strcmp (iltoken->member->vtable->klass->name, "TypeBuilder")) {
+ g_assert_not_reached ();
+ } else if (!strcmp (iltoken->member->vtable->klass->name, "RuntimeType")) {
+ MonoClass *k = mono_class_from_mono_type (((MonoReflectionType*)iltoken->member)->type);
+ MonoObject *obj = mono_class_get_ref_info_raw (k); /* FIXME use handles */
+ g_assert (obj);
+ g_assert (!strcmp (mono_object_class (obj)->name, "TypeBuilder"));
+ tb = (MonoReflectionTypeBuilder*)obj;
+ idx = tb->table_idx;
+ } else {
g_assert_not_reached ();
- tb = (MonoReflectionTypeBuilder *)iltoken->member;
- idx = tb->table_idx;
+ }
break;
+ case MONO_TABLE_TYPEREF:
+ g_assert (!strcmp (iltoken->member->vtable->klass->name, "RuntimeType"));
+ MonoClass *k = mono_class_from_mono_type (((MonoReflectionType*)iltoken->member)->type);
+ MonoObject *obj = mono_class_get_ref_info_raw (k); /* FIXME use handles */
+ g_assert (obj);
+ g_assert (!strcmp (mono_object_class (obj)->name, "TypeBuilder"));
+ g_assert (((MonoReflectionTypeBuilder*)obj)->module->dynamic_image != assembly);
+ continue;
case MONO_TABLE_MEMBERREF:
if (!strcmp (iltoken->member->vtable->klass->name, "MonoArrayMethod")) {
am = (MonoReflectionArrayMethod*)iltoken->member;
idx = am->table_idx;
} else if (!strcmp (iltoken->member->vtable->klass->name, "MonoMethod") ||
- !strcmp (iltoken->member->vtable->klass->name, "MonoCMethod") ||
- !strcmp (iltoken->member->vtable->klass->name, "MonoGenericMethod") ||
- !strcmp (iltoken->member->vtable->klass->name, "MonoGenericCMethod")) {
+ !strcmp (iltoken->member->vtable->klass->name, "MonoCMethod")) {
MonoMethod *m = ((MonoReflectionMethod*)iltoken->member)->method;
- g_assert (m->klass->generic_class || m->klass->generic_container);
+ g_assert (mono_class_is_ginst (m->klass) || mono_class_is_gtd (m->klass));
continue;
} else if (!strcmp (iltoken->member->vtable->klass->name, "FieldBuilder")) {
+ g_assert_not_reached ();
continue;
} else if (!strcmp (iltoken->member->vtable->klass->name, "MonoField")) {
continue;
} else if (!strcmp (iltoken->member->vtable->klass->name, "MethodBuilder") ||
!strcmp (iltoken->member->vtable->klass->name, "ConstructorBuilder")) {
+ g_assert_not_reached ();
continue;
} else if (!strcmp (iltoken->member->vtable->klass->name, "FieldOnTypeBuilderInst")) {
+ g_assert_not_reached ();
continue;
} else if (!strcmp (iltoken->member->vtable->klass->name, "MethodOnTypeBuilderInst")) {
+ g_assert_not_reached ();
continue;
} else if (!strcmp (iltoken->member->vtable->klass->name, "ConstructorOnTypeBuilderInst")) {
+ g_assert_not_reached ();
continue;
} else {
g_assert_not_reached ();
}
break;
case MONO_TABLE_METHODSPEC:
- if (!strcmp (iltoken->member->vtable->klass->name, "MonoGenericMethod")) {
+ if (!strcmp (iltoken->member->vtable->klass->name, "MonoMethod")) {
MonoMethod *m = ((MonoReflectionMethod*)iltoken->member)->method;
g_assert (mono_method_signature (m)->generic_param_count);
continue;
} else if (!strcmp (iltoken->member->vtable->klass->name, "MethodBuilder")) {
+ g_assert_not_reached ();
continue;
} else if (!strcmp (iltoken->member->vtable->klass->name, "MethodOnTypeBuilderInst")) {
+ g_assert_not_reached ();
+ continue;
+ } else {
+ g_assert_not_reached ();
+ }
+ break;
+ case MONO_TABLE_TYPESPEC:
+ if (!strcmp (iltoken->member->vtable->klass->name, "RuntimeType")) {
continue;
} else {
g_assert_not_reached ();
MonoDynamicTable *table;
guint32 *values;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_MANIFESTRESOURCE];
table->rows++;
char *name, *sname;
guint32 idx, offset;
- mono_error_init (error);
+ error_init (error);
if (rsrc->filename) {
name = mono_string_to_utf8_checked (rsrc->filename, error);
gchar *ver, *p, *str;
guint32 i;
- mono_error_init (error);
+ error_init (error);
values [MONO_ASSEMBLY_MAJOR_VERSION] = 0;
values [MONO_ASSEMBLY_MINOR_VERSION] = 0;
int i;
guint32 module_index;
- mono_error_init (error);
+ error_init (error);
assemblyb = moduleb->assemblyb;
assembly = moduleb->dynamic_image;
int i, is_object = 0, is_system = 0;
char *n;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_TYPEDEF];
values = table->values + tb->table_idx * MONO_TYPEDEF_SIZE;
guint32 *values;
int i, j;
- mono_error_init (error);
+ error_init (error);
assemblyb = moduleb->assemblyb;
assembly = moduleb->dynamic_image;
checked_write_file (HANDLE f, gconstpointer buffer, guint32 numbytes)
{
guint32 dummy;
- if (!WriteFile (f, buffer, numbytes, &dummy, NULL))
- g_error ("WriteFile returned %d\n", GetLastError ());
+ if (!mono_w32file_write (f, buffer, numbytes, &dummy))
+ g_error ("mono_w32file_write returned %d\n", mono_w32error_get_last ());
}
/*
0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
- mono_error_init (error);
+ error_init (error);
assemblyb = mb->assemblyb;
if (!assembly->sections [i].size)
continue;
- if (SetFilePointer (file, assembly->sections [i].offset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
- g_error ("SetFilePointer returned %d\n", GetLastError ());
+ if (mono_w32file_seek (file, assembly->sections [i].offset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
+ g_error ("mono_w32file_seek returned %d\n", mono_w32error_get_last ());
switch (i) {
case MONO_SECTION_TEXT:
}
/* check that the file is properly padded */
- if (SetFilePointer (file, file_offset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
- g_error ("SetFilePointer returned %d\n", GetLastError ());
- if (! SetEndOfFile (file))
- g_error ("SetEndOfFile returned %d\n", GetLastError ());
+ if (mono_w32file_seek (file, file_offset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
+ g_error ("mono_w32file_seek returned %d\n", mono_w32error_get_last ());
+ if (! mono_w32file_truncate (file))
+ g_error ("mono_w32file_truncate returned %d\n", mono_w32error_get_last ());
mono_dynamic_stream_reset (&assembly->code);
mono_dynamic_stream_reset (&assembly->us);