Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--configure.in17
-rw-r--r--mono/arch/ChangeLog5
-rw-r--r--mono/arch/x86/tramp.c30
-rw-r--r--mono/dis/ChangeLog6
-rw-r--r--mono/dis/get.c2
-rw-r--r--mono/dis/get.h2
-rw-r--r--mono/dis/main.c11
-rw-r--r--mono/interpreter/ChangeLog6
-rw-r--r--mono/interpreter/interp.c90
-rw-r--r--mono/metadata/ChangeLog16
-rw-r--r--mono/metadata/Makefile.am1
-rw-r--r--mono/metadata/icall.c36
-rw-r--r--mono/metadata/image.c45
-rw-r--r--mono/metadata/metadata.c17
-rw-r--r--mono/metadata/metadata.h10
-rw-r--r--mono/metadata/mono-endian.h12
-rw-r--r--mono/metadata/object.c48
-rw-r--r--mono/metadata/object.h26
-rw-r--r--mono/metadata/threads-pthread.c3
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);