diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | configure.in | 17 | ||||
-rw-r--r-- | mono/arch/ChangeLog | 5 | ||||
-rw-r--r-- | mono/arch/x86/tramp.c | 30 | ||||
-rw-r--r-- | mono/dis/ChangeLog | 6 | ||||
-rw-r--r-- | mono/dis/get.c | 2 | ||||
-rw-r--r-- | mono/dis/get.h | 2 | ||||
-rw-r--r-- | mono/dis/main.c | 11 | ||||
-rw-r--r-- | mono/interpreter/ChangeLog | 6 | ||||
-rw-r--r-- | mono/interpreter/interp.c | 90 | ||||
-rw-r--r-- | mono/metadata/ChangeLog | 16 | ||||
-rw-r--r-- | mono/metadata/Makefile.am | 1 | ||||
-rw-r--r-- | mono/metadata/icall.c | 36 | ||||
-rw-r--r-- | mono/metadata/image.c | 45 | ||||
-rw-r--r-- | mono/metadata/metadata.c | 17 | ||||
-rw-r--r-- | mono/metadata/metadata.h | 10 | ||||
-rw-r--r-- | mono/metadata/mono-endian.h | 12 | ||||
-rw-r--r-- | mono/metadata/object.c | 48 | ||||
-rw-r--r-- | mono/metadata/object.h | 26 | ||||
-rw-r--r-- | mono/metadata/threads-pthread.c | 3 |
20 files changed, 238 insertions, 151 deletions
diff --git a/ChangeLog b/ChangeLog index 80c88fe1746..ca981bfedb8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ + +Mon Oct 8 20:27:50 CEST 2001 Paolo Molaro <lupus@ximian.com> + + * configure.in: define NO_UNALIGNED_ACCESS for platforms that + can't read on unaligned boundaries + 2001-10-04 Dick Porter <dick@ximian.com> * configure.in: Do some deeper checks on pthreads for some of the diff --git a/configure.in b/configure.in index 666589b9a71..a50c9ffaba5 100644 --- a/configure.in +++ b/configure.in @@ -91,17 +91,16 @@ AC_CHECK_LIB(pthread, pthread_create, [ AC_SUBST(THREAD_LIBS) TARGET="unknown" +ACCESS_UNALIGNED="yes" case "$host" in -#mips-sgi-irix5.* | mips-sgi-irix6.*) TARGET=MIPS;; +#mips-sgi-irix5.* | mips-sgi-irix6.*) TARGET=MIPS; ACCESS_UNALIGNED="no";; i*86-*-*) TARGET=X86; arch_target=x86;; -#sparc-sun-4*) TARGET=SPARC;; -#sparc-sun-*) TARGET=SPARC;; -#sparc*-*-linux*) TARGET=SPARC;; -#alpha*-*-linux* | alpha*-*-osf*) TARGET=ALPHA;; +sparc*-*-*) TARGET=SPARC; ACCESS_UNALIGNED="no";; +#alpha*-*-linux* | alpha*-*-osf*) TARGET=ALPHA; ACCESS_UNALIGNED="no";; #m68k-*-linux*) TARGET=M68K;; -#powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC;; -#arm-*-linux-*) TARGET=ARM;; +#powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; ACCESS_UNALIGNED="no";; +#arm-*-linux-*) TARGET=ARM; ACCESS_UNALIGNED="no";; esac if test ${TARGET} = unknown; then @@ -109,6 +108,10 @@ if test ${TARGET} = unknown; then AC_MSG_WARN("mono has not been ported to $host: some things may not work.") fi +if test ${ACCESS_UNALIGNED} = no; then + CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS" +fi + AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes) AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno) AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC) diff --git a/mono/arch/ChangeLog b/mono/arch/ChangeLog index 43bb4a958a1..4e4a7e334d7 100644 --- a/mono/arch/ChangeLog +++ b/mono/arch/ChangeLog @@ -1,4 +1,9 @@ +Mon Oct 8 16:13:07 CEST 2001 Paolo Molaro <lupus@ximian.com> + + * x86/tramp.c: remove mono_get_ansi_string () and use + mono_string_to_utf8 () instead. + Thu Oct 4 19:09:13 CEST 2001 Paolo Molaro <lupus@ximian.com> * x86/tramp.c: allow marshalling valuetypes if they are diff --git a/mono/arch/x86/tramp.c b/mono/arch/x86/tramp.c index 38ce31fdc00..5b6de5b544d 100644 --- a/mono/arch/x86/tramp.c +++ b/mono/arch/x86/tramp.c @@ -25,34 +25,6 @@ #define ARG_SIZE sizeof (stackval) -static char * -mono_get_ansi_string (MonoObject *o) -{ - MonoStringObject *s = (MonoStringObject *)o; - char *as, *vector; - int i; - - g_assert (o != NULL); - - if (!s->length) - return g_strdup (""); - - vector = s->c_str->vector; - - g_assert (vector != NULL); - - as = g_malloc (s->length + 1); - - /* fixme: replace with a real unicode/ansi conversion */ - for (i = 0; i < s->length; i++) { - as [i] = vector [i*2]; - } - - as [i] = '\0'; - - return as; -} - MonoPIFunc mono_create_trampoline (MonoMethod *method) { @@ -200,7 +172,7 @@ mono_create_trampoline (MonoMethod *method) } /*if (frame->method->flags & PINVOKE_ATTRIBUTE_CHAR_SET_ANSI*/ x86_push_membase (p, X86_EDX, arg_pos); - x86_mov_reg_imm (p, X86_EDX, mono_get_ansi_string); + x86_mov_reg_imm (p, X86_EDX, mono_string_to_utf8); x86_call_reg (p, X86_EDX); x86_alu_reg_imm (p, X86_ADD, X86_ESP, 4); x86_push_reg (p, X86_EAX); diff --git a/mono/dis/ChangeLog b/mono/dis/ChangeLog index a20bbca3662..62f1bf037e7 100644 --- a/mono/dis/ChangeLog +++ b/mono/dis/ChangeLog @@ -1,4 +1,10 @@ +Mon Oct 8 16:13:55 CEST 2001 Paolo Molaro <lupus@ximian.com> + + * get.c, get.h: MonoArray changed in MonoArrayType. + * main.c: guard against calling bsearch with a NULL pointer + (pointed out by Laurent Rioux, smoux). + Thu Oct 4 19:05:56 CEST 2001 Paolo Molaro <lupus@ximian.com> * dis-cil.c: fix printing of exception stuff. diff --git a/mono/dis/get.c b/mono/dis/get.c index 0e2af93c025..fe76da32edc 100644 --- a/mono/dis/get.c +++ b/mono/dis/get.c @@ -385,7 +385,7 @@ dis_stringify_token (MonoMetadata *m, guint32 token) } char* -dis_stringify_array (MonoMetadata *m, MonoArray *array) +dis_stringify_array (MonoMetadata *m, MonoArrayType *array) { char *type; GString *s = g_string_new(""); diff --git a/mono/dis/get.h b/mono/dis/get.h index f8843aa1ad0..afdc4e223cf 100644 --- a/mono/dis/get.h +++ b/mono/dis/get.h @@ -22,7 +22,7 @@ char *get_method (MonoMetadata *m, guint32 token); char *dis_stringify_type (MonoMetadata *m, MonoType *type); char *dis_stringify_token (MonoMetadata *m, guint32 token); -char *dis_stringify_array (MonoMetadata *m, MonoArray *array); +char *dis_stringify_array (MonoMetadata *m, MonoArrayType *array); char *dis_stringify_modifiers (MonoMetadata *m, int n, MonoCustomMod *mod); char *dis_stringify_param (MonoMetadata *m, MonoType *param); char *dis_stringify_method_signature (MonoMetadata *m, MonoMethodSignature *method, int methoddef_row); diff --git a/mono/dis/main.c b/mono/dis/main.c index 7a3a8df8593..d470ed52c1a 100644 --- a/mono/dis/main.c +++ b/mono/dis/main.c @@ -515,6 +515,9 @@ dis_property_methods (MonoMetadata *m, guint32 prop) char *sig; char *type[] = {NULL, ".set", ".get", NULL, ".other"}; + if (!msemt->base) + return + loc.t = msemt; loc.col_idx = MONO_METHOD_SEMA_ASSOCIATION; loc.idx = (prop << 1) | 1; /* Method association coded index */ @@ -601,6 +604,9 @@ dis_property_list (MonoMetadata *m, guint32 typedef_row) guint32 start, end, i; MonoTableInfo *tdef = &m->tables [MONO_TABLE_PROPERTYMAP]; + if (!tdef->base) + return; + loc.t = tdef; loc.col_idx = MONO_PROPERTY_MAP_PARENT; loc.idx = typedef_row + 1; @@ -632,7 +638,10 @@ dis_interfaces (MonoMetadata *m, guint32 typedef_row) guint32 cols [MONO_INTERFACEIMPL_SIZE]; char *intf; MonoTableInfo *table = &m->tables [MONO_TABLE_INTERFACEIMPL]; - + + if (!table->base) + return; + loc.t = table; loc.col_idx = MONO_INTERFACEIMPL_CLASS; loc.idx = typedef_row; diff --git a/mono/interpreter/ChangeLog b/mono/interpreter/ChangeLog index 63107933d86..ae3668f72b8 100644 --- a/mono/interpreter/ChangeLog +++ b/mono/interpreter/ChangeLog @@ -1,4 +1,10 @@ +Mon Oct 8 16:14:40 CEST 2001 Paolo Molaro <lupus@ximian.com> + + * interp.c: use the accessors provided in object.h to deal with + MonoArrays. Updates for API renames in metadata. Throw exception + in ldelema if index is out of bounds. + Mon Oct 8 10:44:25 CEST 2001 Paolo Molaro <lupus@ximian.com> * interp.c: fixes for changes in metadata. diff --git a/mono/interpreter/interp.c b/mono/interpreter/interp.c index 8f140cb67a7..0c3f27deeae 100644 --- a/mono/interpreter/interp.c +++ b/mono/interpreter/interp.c @@ -156,7 +156,7 @@ newobj (MonoImage *image, guint32 token) idx = mono_metadata_typedef_from_method (image, token); - result = mono_new_object_from_token (image, MONO_TOKEN_TYPE_DEF | idx); + result = mono_object_new_from_token (image, MONO_TOKEN_TYPE_DEF | idx); break; } case MONO_TOKEN_MEMBER_REF: { @@ -176,10 +176,10 @@ newobj (MonoImage *image, guint32 token) switch (table){ case 0: /* TypeDef */ - result = mono_new_object_from_token (image, MONO_TOKEN_TYPE_DEF | idx); + result = mono_object_new_from_token (image, MONO_TOKEN_TYPE_DEF | idx); break; case 1: /* TypeRef */ - result = mono_new_object_from_token (image, MONO_TOKEN_TYPE_REF | idx); + result = mono_object_new_from_token (image, MONO_TOKEN_TYPE_REF | idx); break; case 2: /* ModuleRef */ g_error ("Unhandled: ModuleRef"); @@ -188,7 +188,7 @@ newobj (MonoImage *image, guint32 token) g_error ("Unhandled: MethodDef"); case 4: /* TypeSpec */ - result = mono_new_object_from_token (image, MONO_TOKEN_TYPE_SPEC | idx); + result = mono_object_new_from_token (image, MONO_TOKEN_TYPE_SPEC | idx); } break; } @@ -238,7 +238,7 @@ get_named_exception (const char *name) klass = mono_class_from_name (mono_defaults.corlib, "System", name); - o = mono_new_object (klass); + o = mono_object_new (klass); g_assert (o != NULL); for (i = 0; i < klass->method.count; ++i) { @@ -538,14 +538,14 @@ ves_array_set (MonoInvocation *frame) { stackval *sp = frame->stack_args; MonoObject *o; - MonoArrayObject *ao; + MonoArray *ao; MonoArrayClass *ac; gint32 i, t, pos, esize; gpointer ea; MonoType *mt; o = frame->obj; - ao = (MonoArrayObject *)o; + ao = (MonoArray *)o; ac = (MonoArrayClass *)o->klass; g_assert (ac->rank >= 1); @@ -562,7 +562,7 @@ ves_array_set (MonoInvocation *frame) } esize = mono_array_element_size (ac); - ea = (char*)ao->vector + (pos * esize); + ea = mono_array_addr_with_size (ao, esize, pos); mt = frame->method->signature->params [ac->rank]; stackval_to_data (mt, &sp [ac->rank], ea); @@ -573,14 +573,14 @@ ves_array_get (MonoInvocation *frame) { stackval *sp = frame->stack_args; MonoObject *o; - MonoArrayObject *ao; + MonoArray *ao; MonoArrayClass *ac; gint32 i, pos, esize; gpointer ea; MonoType *mt; o = frame->obj; - ao = (MonoArrayObject *)o; + ao = (MonoArray *)o; ac = (MonoArrayClass *)o->klass; g_assert (ac->rank >= 1); @@ -591,7 +591,7 @@ ves_array_get (MonoInvocation *frame) ao->bounds [i].lower_bound; esize = mono_array_element_size (ac); - ea = (char*)ao->vector + (pos * esize); + ea = mono_array_addr_with_size (ao, esize, pos); mt = frame->method->signature->ret; stackval_from_data (mt, frame->retval, ea); @@ -2469,7 +2469,7 @@ ves_exec_method (MonoInvocation *frame) ip++; token = read32 (ip); class = mono_class_get (image, token); - o = mono_new_szarray (class, sp [-1].data.i); + o = mono_array_new (class, sp [-1].data.i); ip += 4; sp [-1].type = VAL_OBJ; @@ -2478,7 +2478,7 @@ ves_exec_method (MonoInvocation *frame) BREAK; } CASE (CEE_LDLEN) { - MonoArrayObject *o; + MonoArray *o; ip++; @@ -2490,12 +2490,12 @@ ves_exec_method (MonoInvocation *frame) g_assert (MONO_CLASS_IS_ARRAY (o->obj.klass)); sp [-1].type = VAL_I32; - sp [-1].data.i = o->bounds [0].length; + sp [-1].data.i = mono_array_length (o); BREAK; } CASE (CEE_LDELEMA) { - MonoArrayObject *o; + MonoArray *o; guint32 esize, token; ++ip; @@ -2508,14 +2508,14 @@ ves_exec_method (MonoInvocation *frame) g_assert (MONO_CLASS_IS_ARRAY (o->obj.klass)); - g_assert (sp [1].data.i >= 0); - g_assert (sp [1].data.i < o->bounds [0].length); + if (sp [1].data.nati >= mono_array_length (o)) + THROW_EX (get_exception_index_out_of_range (), ip - 5); /* check the array element corresponds to token */ esize = mono_array_element_size ((MonoArrayClass *)o->obj.klass); sp->type = VAL_MP; - sp->data.p = (char*)((MonoArrayObject *)o)->vector + (sp [1].data.i * esize); + sp->data.p = mono_array_addr_with_size (o, esize, sp [1].data.i); sp->data.vt.klass = ((MonoArrayClass *)o->obj.klass)->element_class; ++sp; BREAK; @@ -2531,7 +2531,7 @@ ves_exec_method (MonoInvocation *frame) CASE (CEE_LDELEM_R4) /* fall through */ CASE (CEE_LDELEM_R8) /* fall through */ CASE (CEE_LDELEM_REF) { - MonoArrayObject *o; + MonoArray *o; mono_u aindex; sp -= 2; @@ -2544,7 +2544,7 @@ ves_exec_method (MonoInvocation *frame) g_assert (MONO_CLASS_IS_ARRAY (o->obj.klass)); aindex = sp [1].data.nati; - if (aindex >= o->bounds [0].length) + if (aindex >= mono_array_length (o)) THROW_EX (get_exception_index_out_of_range (), ip); /* @@ -2552,47 +2552,47 @@ ves_exec_method (MonoInvocation *frame) */ switch (*ip) { case CEE_LDELEM_I1: - sp [0].data.i = ((gint8 *)o->vector)[aindex]; + sp [0].data.i = mono_array_get (o, gint8, aindex); sp [0].type = VAL_I32; break; case CEE_LDELEM_U1: - sp [0].data.i = ((guint8 *)o->vector)[aindex]; + sp [0].data.i = mono_array_get (o, guint8, aindex); sp [0].type = VAL_I32; break; case CEE_LDELEM_I2: - sp [0].data.i = ((gint16 *)o->vector)[aindex]; + sp [0].data.i = mono_array_get (o, gint16, aindex); sp [0].type = VAL_I32; break; case CEE_LDELEM_U2: - sp [0].data.i = ((guint16 *)o->vector)[aindex]; + sp [0].data.i = mono_array_get (o, guint16, aindex); sp [0].type = VAL_I32; break; case CEE_LDELEM_I: - sp [0].data.nati = ((mono_i *)o->vector)[aindex]; + sp [0].data.nati = mono_array_get (o, mono_i, aindex); sp [0].type = VAL_NATI; break; case CEE_LDELEM_I4: - sp [0].data.i = ((gint32 *)o->vector)[aindex]; + sp [0].data.i = mono_array_get (o, gint32, aindex); sp [0].type = VAL_I32; break; case CEE_LDELEM_U4: - sp [0].data.i = ((guint32 *)o->vector)[aindex]; + sp [0].data.i = mono_array_get (o, guint32, aindex); sp [0].type = VAL_I32; break; case CEE_LDELEM_I8: - sp [0].data.l = ((gint64 *)o->vector)[aindex]; + sp [0].data.l = mono_array_get (o, gint64, aindex); sp [0].type = VAL_I64; break; case CEE_LDELEM_R4: - sp [0].data.f = ((float *)o->vector)[aindex]; + sp [0].data.f = mono_array_get (o, float, aindex); sp [0].type = VAL_DOUBLE; break; case CEE_LDELEM_R8: - sp [0].data.f = ((double *)o->vector)[aindex]; + sp [0].data.f = mono_array_get (o, double, aindex); sp [0].type = VAL_DOUBLE; break; case CEE_LDELEM_REF: - sp [0].data.p = ((gpointer *)o->vector)[aindex]; + sp [0].data.p = mono_array_get (o, gpointer, aindex); sp [0].data.vt.klass = NULL; sp [0].type = VAL_OBJ; break; @@ -2612,9 +2612,8 @@ ves_exec_method (MonoInvocation *frame) CASE (CEE_STELEM_R4) /* fall through */ CASE (CEE_STELEM_R8) /* fall through */ CASE (CEE_STELEM_REF) { - MonoArrayObject *o; + MonoArray *o; MonoArrayClass *ac; - MonoObject *v; mono_u aindex; sp -= 3; @@ -2628,7 +2627,7 @@ ves_exec_method (MonoInvocation *frame) ac = (MonoArrayClass *)o->obj.klass; aindex = sp [1].data.nati; - if (aindex >= o->bounds [0].length) + if (aindex >= mono_array_length (o)) THROW_EX (get_exception_index_out_of_range (), ip); /* @@ -2636,32 +2635,29 @@ ves_exec_method (MonoInvocation *frame) */ switch (*ip) { case CEE_STELEM_I: - ((mono_i *)o->vector)[aindex] = sp [2].data.nati; + mono_array_set (o, mono_i, aindex, sp [2].data.nati); break; case CEE_STELEM_I1: - ((gint8 *)o->vector)[aindex] = sp [2].data.i; + mono_array_set (o, gint8, aindex, sp [2].data.i); break; case CEE_STELEM_I2: - ((gint16 *)o->vector)[aindex] = sp [2].data.i; + mono_array_set (o, gint16, aindex, sp [2].data.i); break; case CEE_STELEM_I4: - ((gint32 *)o->vector)[aindex] = sp [2].data.i; + mono_array_set (o, gint32, aindex, sp [2].data.i); break; case CEE_STELEM_I8: - ((gint64 *)o->vector)[aindex] = sp [2].data.l; + mono_array_set (o, gint64, aindex, sp [2].data.l); break; case CEE_STELEM_R4: - ((float *)o->vector)[aindex] = sp [2].data.f; + mono_array_set (o, float, aindex, sp [2].data.f); break; case CEE_STELEM_R8: - ((double *)o->vector)[aindex] = sp [2].data.f; + mono_array_set (o, double, aindex, sp [2].data.f); break; case CEE_STELEM_REF: g_assert (sp [2].type == VAL_OBJ); - - v = sp [2].data.p; - - ((gpointer *)o->vector)[aindex] = sp [2].data.p; + mono_array_set (o, gpointer, aindex, sp [2].data.p); break; default: ves_abort(); @@ -3281,12 +3277,12 @@ ves_exec (MonoAssembly *assembly, int argc, char *argv[]) if (method->signature->param_count) { int i; stackval argv_array; - MonoArrayObject *arr = (MonoArrayObject*)mono_new_szarray (mono_defaults.string_class, argc); + MonoArray *arr = (MonoArray*)mono_array_new (mono_defaults.string_class, argc); argv_array.type = VAL_OBJ; argv_array.data.p = arr; argv_array.data.vt.klass = NULL; for (i=0; i < argc; ++i) { - ((gpointer *)arr->vector)[i] = mono_new_string (argv [i]); + mono_array_set (arr, gpointer, i, mono_string_new (argv [i])); } INIT_FRAME (&call, NULL, NULL, &argv_array, &result, method); } else { diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index fccb484d762..fb52dddb651 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,4 +1,20 @@ +Mon Oct 8 16:12:38 CEST 2001 Paolo Molaro <lupus@ximian.com> + + * metadata.c, metadata.h: use MonoArrayType to describe the shape of an array. + Guard against calling bsearch with a NULL pointer (pointed out by Laurent Rioux, smoux). + * image.c: endian fixes by Laurent Rioux. + * object.h, object.c: rename MonoStringObject to MonoString and + MonoArrayObject to MonoArray. Change some function names to conform to + the style mono_<object>_<action>. mono_string_new_utf16 () takes a + guint16* as first argument, so don't use char*. + Provide macros to do the interesting things on arrays in a portable way. + * threads-pthread.c: updates for the API changes and #include <sched.h> + (required for sched_yield()). + * icall.c: updates for the API changes above. + * Makefile.am, mono-endian.c. mono-endian.h: include unaligned read routines for + platforms that need them. + Mon Oct 8 10:43:23 CEST 2001 Paolo Molaro <lupus@ximian.com> * class.c: set the correct type for all the fundamental diff --git a/mono/metadata/Makefile.am b/mono/metadata/Makefile.am index 4366d333ba0..da64bfc74ef 100644 --- a/mono/metadata/Makefile.am +++ b/mono/metadata/Makefile.am @@ -31,6 +31,7 @@ libmetadata_a_SOURCES = \ assembly.c \ image.c \ metadata.c \ + mono-endian.c \ private.h \ rawbuffer.c \ reflection.c \ diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 5b3d388adab..c90b3d80301 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -19,15 +19,15 @@ static MonoObject * ves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs) { - MonoArrayObject *ao, *io; + MonoArray *ao, *io; MonoArrayClass *ac, *ic; gint32 i, pos, *ind, esize; gpointer *ea; - io = (MonoArrayObject *)idxs; + io = (MonoArray *)idxs; ic = (MonoArrayClass *)io->obj.klass; - ao = (MonoArrayObject *)this; + ao = (MonoArray *)this; ac = (MonoArrayClass *)ao->obj.klass; g_assert (ic->rank == 1); @@ -53,18 +53,18 @@ static void ves_icall_System_Array_SetValue (MonoObject *this, MonoObject *value, MonoObject *idxs) { - MonoArrayObject *ao, *io, *vo; + MonoArray *ao, *io, *vo; MonoArrayClass *ac, *ic, *vc; gint32 i, pos, *ind, esize; gpointer *ea; - vo = (MonoArrayObject *)value; + vo = (MonoArray *)value; vc = (MonoArrayClass *)vo->obj.klass; - io = (MonoArrayObject *)idxs; + io = (MonoArray *)idxs; ic = (MonoArrayClass *)io->obj.klass; - ao = (MonoArrayObject *)this; + ao = (MonoArray *)this; ac = (MonoArrayClass *)ao->obj.klass; g_assert (ic->rank == 1); @@ -94,13 +94,13 @@ static void ves_icall_array_ctor (MonoObject *this, gint32 n1, ...) { va_list ap; - MonoArrayObject *ao; + MonoArray *ao; MonoArrayClass *ac; gint32 i, s, len, esize; va_start (ap, n1); - ao = (MonoArrayObject *)this; + ao = (MonoArray *)this; ac = (MonoArrayClass *)this->klass; g_assert (ac->rank >= 1); @@ -123,13 +123,13 @@ static void ves_icall_array_bound_ctor (MonoObject *this, gint32 n1, ...) { va_list ap; - MonoArrayObject *ao; + MonoArray *ao; MonoArrayClass *ac; gint32 i, s, len, esize; va_start (ap, n1); - ao = (MonoArrayObject *)this; + ao = (MonoArray *)this; ac = (MonoArrayClass *)this->klass; g_assert (ac->rank >= 1); @@ -169,13 +169,13 @@ ves_icall_System_Array_GetRank (MonoObject *this) static gint32 ves_icall_System_Array_GetLength (MonoObject *this, gint32 dimension) { - return ((MonoArrayObject *)this)->bounds [dimension].length; + return ((MonoArray *)this)->bounds [dimension].length; } static gint32 ves_icall_System_Array_GetLowerBound (MonoObject *this, gint32 dimension) { - return ((MonoArrayObject *)this)->bounds [dimension].lower_bound; + return ((MonoArray *)this)->bounds [dimension].lower_bound; } static MonoObject * @@ -189,14 +189,14 @@ ves_icall_app_get_cur_domain () { MonoClass *klass = mono_class_from_name (mono_defaults.corlib, "System", "AppDomain"); - return mono_new_object (klass); + return mono_object_new (klass); } static MonoObject * my_mono_new_object (MonoClass *klass, gpointer data) { MonoClassField *field; - MonoObject *res = mono_new_object (klass); + MonoObject *res = mono_object_new (klass); gpointer *slot; field = mono_class_get_field_from_name (klass, "_impl"); @@ -239,7 +239,7 @@ ves_icall_app_define_assembly (MonoObject *appdomain, MonoObject *assembly_name, } static gint32 -ves_icall_get_data_chunk (MonoObject *assb, gint32 type, MonoArrayObject *buf) +ves_icall_get_data_chunk (MonoObject *assb, gint32 type, MonoArray *buf) { MonoDynamicAssembly *ass = object_impl_pointer (assb); MonoObject *ep; @@ -308,7 +308,7 @@ ves_icall_define_type (MonoObject *moduleb, MonoObject *name, int attrs) } static MonoObject * -ves_icall_define_method (MonoObject *typeb, MonoObject *name, int attrs, int callconv, MonoObject *rettype, MonoArrayObject *paramtypes) +ves_icall_define_method (MonoObject *typeb, MonoObject *name, int attrs, int callconv, MonoObject *rettype, MonoArray *paramtypes) { MonoClass *klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection.Emit", "MethodBuilder"); MonoMethodBuilder *mb = g_new0 (MonoMethodBuilder, 1); @@ -331,7 +331,7 @@ ves_icall_define_method (MonoObject *typeb, MonoObject *name, int attrs, int cal } static void -ves_icall_set_method_body (MonoObject *methodb, MonoArrayObject *code, gint32 count) +ves_icall_set_method_body (MonoObject *methodb, MonoArray *code, gint32 count) { MonoMethodBuilder *mb = object_impl_pointer (methodb); if (code->bounds->length < count) { diff --git a/mono/metadata/image.c b/mono/metadata/image.c index 51d4d6d941d..9f46067a5d4 100644 --- a/mono/metadata/image.c +++ b/mono/metadata/image.c @@ -150,7 +150,7 @@ load_section_tables (MonoImage *image, MonoCLIImageInfo *iinfo) t->st_lineno_ptr = GUINT32_FROM_LE (t->st_lineno_ptr); t->st_reloc_count = GUINT16_FROM_LE (t->st_reloc_count); t->st_line_count = GUINT16_FROM_LE (t->st_line_count); - t->st_flags = GUINT16_FROM_LE (t->st_flags); + t->st_flags = GUINT32_FROM_LE (t->st_flags); #endif /* consistency checks here */ } @@ -418,6 +418,7 @@ do_mono_image_open (const char *fname, enum MonoImageOpenStatus *status) #if G_BYTE_ORDER != G_LITTLE_ENDIAN #define SWAP32(x) (x) = GUINT32_FROM_LE ((x)) #define SWAP16(x) (x) = GUINT16_FROM_LE ((x)) +#define SWAPPDE(x) do { (x).rva = GUINT32_FROM_LE ((x).rva); (x).size = GUINT32_FROM_LE ((x).size);} while (0) SWAP32 (header->coff.coff_time); SWAP32 (header->coff.coff_symptr); SWAP32 (header->coff.coff_symcount); @@ -433,13 +434,51 @@ do_mono_image_open (const char *fname, enum MonoImageOpenStatus *status) SWAP32 (header->pe.pe_rva_code_base); SWAP32 (header->pe.pe_rva_data_base); SWAP16 (header->pe.pe_magic); + /* MonoPEHeaderNT: not used yet */ + SWAP32 (header->nt.pe_image_base); /* must be 0x400000 */ + SWAP32 (header->nt.pe_section_align); /* must be 8192 */ + SWAP32 (header->nt.pe_file_alignment); /* must be 512 or 4096 */ + SWAP16 (header->nt.pe_os_major); /* must be 4 */ + SWAP16 (header->nt.pe_os_minor); /* must be 0 */ + SWAP16 (header->nt.pe_user_major); + SWAP16 (header->nt.pe_user_minor); + SWAP16 (header->nt.pe_subsys_major); + SWAP16 (header->nt.pe_subsys_minor); + SWAP32 (header->nt.pe_reserved_1); + SWAP32 (header->nt.pe_image_size); + SWAP32 (header->nt.pe_header_size); + SWAP32 (header->nt.pe_checksum); + SWAP16 (header->nt.pe_subsys_required); + SWAP16 (header->nt.pe_dll_flags); + SWAP32 (header->nt.pe_stack_reserve); + SWAP32 (header->nt.pe_stack_commit); + SWAP32 (header->nt.pe_heap_reserve); + SWAP32 (header->nt.pe_heap_commit); + SWAP32 (header->nt.pe_loader_flags); + SWAP32 (header->nt.pe_data_dir_count); + /* MonoDotNetHeader: mostly unused */ - SWAP32 (header->datadir.pe_cli_header.rva); - SWAP32 (header->datadir.pe_cli_header.size); + SWAPPDE (header->datadir.pe_export_table); + SWAPPDE (header->datadir.pe_import_table); + SWAPPDE (header->datadir.pe_resource_table); + SWAPPDE (header->datadir.pe_exception_table); + SWAPPDE (header->datadir.pe_certificate_table); + SWAPPDE (header->datadir.pe_reloc_table); + SWAPPDE (header->datadir.pe_debug); + SWAPPDE (header->datadir.pe_copyright); + SWAPPDE (header->datadir.pe_global_ptr); + SWAPPDE (header->datadir.pe_tls_table); + SWAPPDE (header->datadir.pe_load_config_table); + SWAPPDE (header->datadir.pe_bound_import); + SWAPPDE (header->datadir.pe_iat); + SWAPPDE (header->datadir.pe_delay_import_desc); + SWAPPDE (header->datadir.pe_cli_header); + SWAPPDE (header->datadir.pe_reserved); #undef SWAP32 #undef SWAP16 +#undef SWAPPDE #endif if (header->coff.coff_machine != 0x14c) diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index 4605d6c8104..ace5e4cfea7 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -931,11 +931,11 @@ mono_metadata_parse_custom_mod (MonoMetadata *m, MonoCustomMod *dest, const char return FALSE; } -MonoArray * +MonoArrayType * mono_metadata_parse_array (MonoMetadata *m, const char *ptr, const char **rptr) { int i; - MonoArray *array = g_new0 (MonoArray, 1); + MonoArrayType *array = g_new0 (MonoArrayType, 1); array->type = mono_metadata_parse_type (m, MONO_PARSE_TYPE, 0, ptr, &ptr); array->rank = mono_metadata_decode_value (ptr, &ptr); @@ -958,7 +958,7 @@ mono_metadata_parse_array (MonoMetadata *m, const char *ptr, const char **rptr) } void -mono_metadata_free_array (MonoArray *array) +mono_metadata_free_array (MonoArrayType *array) { mono_metadata_free_type (array->type); g_free (array->sizes); @@ -1658,7 +1658,10 @@ mono_metadata_typedef_from_field (MonoMetadata *meta, guint32 index) { MonoTableInfo *tdef = &meta->tables [MONO_TABLE_TYPEDEF]; locator_t loc; - + + if (!tdef->base) + return 0; + loc.idx = mono_metadata_token_index (index); loc.col_idx = MONO_TYPEDEF_FIELD_LIST; loc.t = tdef; @@ -1676,6 +1679,9 @@ mono_metadata_typedef_from_method (MonoMetadata *meta, guint32 index) MonoTableInfo *tdef = &meta->tables [MONO_TABLE_TYPEDEF]; locator_t loc; + if (!tdef->base) + return 0; + loc.idx = mono_metadata_token_index (index); loc.col_idx = MONO_TYPEDEF_METHOD_LIST; loc.t = tdef; @@ -1696,6 +1702,9 @@ mono_metadata_interfaces_from_typedef (MonoMetadata *meta, guint32 index) guint32 cols [MONO_INTERFACEIMPL_SIZE]; MonoClass **result; + if (!tdef->base) + return NULL; + loc.idx = mono_metadata_token_index (index); loc.col_idx = MONO_INTERFACEIMPL_CLASS; loc.t = tdef; diff --git a/mono/metadata/metadata.h b/mono/metadata/metadata.h index 514b6aeed54..7b95f37cea1 100644 --- a/mono/metadata/metadata.h +++ b/mono/metadata/metadata.h @@ -134,7 +134,7 @@ typedef struct { } MonoExceptionClause; typedef struct _MonoType MonoType; -typedef struct _MonoArray MonoArray; +typedef struct _MonoArrayType MonoArrayType; typedef struct _MonoMethodSignature MonoMethodSignature; typedef struct { @@ -142,7 +142,7 @@ typedef struct { unsigned int token : 31; } MonoCustomMod; -struct _MonoArray { +struct _MonoArrayType { MonoType *type; int rank; int numsizes; @@ -155,7 +155,7 @@ struct _MonoType { union { MonoClass *klass; /* for VALUETYPE and CLASS */ MonoType *type; /* for PTR and SZARRAY */ - MonoArray *array; /* for ARRAY */ + MonoArrayType *array; /* for ARRAY */ MonoMethodSignature *method; } data; unsigned int attrs : 16; /* param attributes or field flags */ @@ -207,10 +207,10 @@ int mono_metadata_parse_custom_mod (MonoMetadata *m, MonoCustomMod *dest, const char *ptr, const char **rptr); -MonoArray *mono_metadata_parse_array (MonoMetadata *m, +MonoArrayType *mono_metadata_parse_array (MonoMetadata *m, const char *ptr, const char **rptr); -void mono_metadata_free_array (MonoArray *array); +void mono_metadata_free_array (MonoArrayType *array); MonoType *mono_metadata_parse_type (MonoMetadata *m, MonoParseTypeMode mode, short opt_attrs, diff --git a/mono/metadata/mono-endian.h b/mono/metadata/mono-endian.h index 08075b406ce..acf8776f7b5 100644 --- a/mono/metadata/mono-endian.h +++ b/mono/metadata/mono-endian.h @@ -3,8 +3,6 @@ #include <glib.h> -/* FIXME: implement support for misaligned reads */ - typedef union { guint32 ival; float fval; @@ -15,10 +13,20 @@ typedef union { double fval; } mono_rdouble; +#if NO_UNALIGNED_ACCESS + +#define read16(x) (mono_read16 ((x))) +#define read32(x) (mono_read32 ((x))) +#define read64(x) (mono_read64 ((x))) + +#else + #define read16(x) GUINT16_FROM_LE (*((guint16 *) (x))) #define read32(x) GUINT32_FROM_LE (*((guint32 *) (x))) #define read64(x) GUINT64_FROM_LE (*((guint64 *) (x))) +#endif + #define readr4(x,dest) \ do { \ mono_rfloat mf; \ diff --git a/mono/metadata/object.c b/mono/metadata/object.c index eca5d7358a3..65cfb054956 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -45,14 +45,14 @@ mono_object_free (MonoObject *o) } /** - * mono_new_object: + * mono_object_new: * @klass: the class of the object that we want to create * * Returns: A newly created object whose definition is * looked up using @klass */ MonoObject * -mono_new_object (MonoClass *klass) +mono_object_new (MonoClass *klass) { MonoObject *o; @@ -68,7 +68,7 @@ mono_new_object (MonoClass *klass) } /** - * mono_new_object_from_token: + * mono_object_new_from_token: * @image: Context where the type_token is hosted * @token: a token of the type that we want to create * @@ -76,13 +76,13 @@ mono_new_object (MonoClass *klass) * looked up using @token in the @image image */ MonoObject * -mono_new_object_from_token (MonoImage *image, guint32 token) +mono_object_new_from_token (MonoImage *image, guint32 token) { MonoClass *class; class = mono_class_get (image, token); - return mono_new_object (class); + return mono_object_new (class); } @@ -107,7 +107,7 @@ mono_object_clone (MonoObject *obj) } /* - * mono_new_szarray: + * mono_array_new: * @image: image where the object is being referenced * @eclass: element class * @n: number of array elements @@ -115,19 +115,19 @@ mono_object_clone (MonoObject *obj) * This routine creates a new szarray with @n elements of type @token */ MonoObject * -mono_new_szarray (MonoClass *eclass, guint32 n) +mono_array_new (MonoClass *eclass, guint32 n) { MonoClass *c; MonoObject *o; - MonoArrayObject *ao; + MonoArray *ao; MonoArrayClass *ac; c = mono_array_class_get (eclass, 1); g_assert (c != NULL); - o = mono_new_object (c); + o = mono_object_new (c); - ao = (MonoArrayObject *)o; + ao = (MonoArray *)o; ac = (MonoArrayClass *)c; ao->bounds = g_malloc0 (sizeof (MonoArrayBounds)); @@ -140,26 +140,26 @@ mono_new_szarray (MonoClass *eclass, guint32 n) } /** - * mono_new_utf16_string: + * mono_string_new_utf16: * @text: a pointer to an utf16 string * @len: the length of the string * * Returns: A newly created string object which contains @text. */ MonoObject * -mono_new_utf16_string (const char *text, gint32 len) +mono_string_new_utf16 (const guint16 *text, gint32 len) { MonoObject *s; - MonoArrayObject *ca; + MonoArray *ca; - s = mono_new_object (mono_defaults.string_class); + s = mono_object_new (mono_defaults.string_class); g_assert (s != NULL); - ca = (MonoArrayObject *)mono_new_szarray (mono_defaults.string_class, len); + ca = (MonoArray *)mono_array_new (mono_defaults.string_class, len); g_assert (ca != NULL); - ((MonoStringObject *)s)->c_str = ca; - ((MonoStringObject *)s)->length = len; + ((MonoString *)s)->c_str = ca; + ((MonoString *)s)->length = len; memcpy (ca->vector, text, len * 2); @@ -167,13 +167,13 @@ mono_new_utf16_string (const char *text, gint32 len) } /** - * mono_new_string: + * mono_string_new: * @text: a pointer to an utf8 string * * Returns: A newly created string object which contains @text. */ MonoObject * -mono_new_string (const char *text) +mono_string_new (const char *text) { MonoObject *o; guint16 *ut; @@ -187,7 +187,7 @@ mono_new_string (const char *text) for (i = 0; i < l; i++) ut [i] = text[i]; - o = mono_new_utf16_string ((char *)ut, l); + o = mono_string_new_utf16 (ut, l); g_free (ut); @@ -298,7 +298,7 @@ MonoObject* mono_string_intern (MonoObject *o) { MonoObject *res; - MonoStringObject *str = (MonoStringObject*) o; + MonoString *str = (MonoString*) o; char *ins = g_malloc (4 + str->length * 2); char *p; @@ -331,8 +331,8 @@ mono_ldstr (MonoImage *image, guint32 index) return o; len = mono_metadata_decode_blob_size (str, &str); - o = mono_new_utf16_string (str, len >> 1); - g_hash_table_insert (ldstr_table, sig, o); + o = mono_string_new_utf16 (str, len >> 1); + g_hash_table_insert (ldstr_table, (gpointer)sig, o); return o; } @@ -340,7 +340,7 @@ mono_ldstr (MonoImage *image, guint32 index) char * mono_string_to_utf8 (MonoObject *o) { - MonoStringObject *s = (MonoStringObject *)o; + MonoString *s = (MonoString *)o; char *as, *vector; int i; diff --git a/mono/metadata/object.h b/mono/metadata/object.h index b10437730c0..24fdadbe356 100644 --- a/mono/metadata/object.h +++ b/mono/metadata/object.h @@ -18,25 +18,35 @@ typedef struct { MonoObject obj; gpointer vector; MonoArrayBounds *bounds; -} MonoArrayObject; +} MonoArray; typedef struct { MonoObject obj; - MonoArrayObject *c_str; + MonoArray *c_str; gint32 length; -} MonoStringObject; +} MonoString; + +#define mono_array_length(array) ((array)->bounds->length) +#define mono_array_addr(array,type,index) ( ((char*)(array)->vector) + sizeof (type) * (index) ) +#define mono_array_addr_with_size(array,size,index) ( ((char*)(array)->vector) + (size) * (index) ) +#define mono_array_get(array,type,index) ( *(type*)mono_array_addr ((array), type, (index)) ) +#define mono_array_set(array,type,index,value) \ + do { \ + type *__p = (type *) mono_array_addr ((array), type, (index)); \ + *__p = (value); \ + } while (0) MonoObject * -mono_new_object (MonoClass *klass); +mono_object_new (MonoClass *klass); MonoObject * -mono_new_object_from_token (MonoImage *image, guint32 token); +mono_object_new_from_token (MonoImage *image, guint32 token); MonoObject * -mono_new_szarray (MonoClass *eclass, guint32 n); +mono_array_new (MonoClass *eclass, guint32 n); MonoObject * -mono_new_utf16_string (const char *text, gint32 len); +mono_string_new_utf16 (const guint16 *text, gint32 len); MonoObject* mono_ldstr (MonoImage *image, guint32 index); @@ -48,7 +58,7 @@ MonoObject* mono_string_intern (MonoObject *o); MonoObject * -mono_new_string (const char *text); +mono_string_new (const char *text); char * mono_string_to_utf8 (MonoObject *string_obj); diff --git a/mono/metadata/threads-pthread.c b/mono/metadata/threads-pthread.c index 0a72c40509a..fca1ae8b91c 100644 --- a/mono/metadata/threads-pthread.c +++ b/mono/metadata/threads-pthread.c @@ -15,6 +15,7 @@ #include <time.h> #include <sys/time.h> #include <errno.h> +#include <sched.h> #include <mono/metadata/object.h> #include <mono/metadata/threads.h> @@ -829,7 +830,7 @@ void mono_thread_init(void) * object? In theory, I guess the whole program should act as * though exit() were called :-) */ - main_thread=mono_new_object(thread_class); + main_thread = mono_object_new (thread_class); pthread_mutex_init(&threads_mutex, NULL); pthread_mutex_init(&data_slots_mutex, NULL); |