From 4b15ad68c4e71728ec7f3474ecbcfec269c67459 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 31 Jan 2002 09:51:27 +0000 Subject: [PATCH] impl. LDFTN, more bug fixes svn path=/trunk/mono/; revision=2207 --- mono/interpreter/interp.c | 13 +++++++--- mono/jit/ChangeLog | 7 +++++ mono/jit/jit.c | 54 +++++++++++++++++++++++++++++++-------- mono/jit/x86.brg | 28 ++++++++++++++++---- mono/wrapper/ChangeLog | 4 +++ mono/wrapper/wrapper.c | 4 +++ 6 files changed, 91 insertions(+), 19 deletions(-) diff --git a/mono/interpreter/interp.c b/mono/interpreter/interp.c index c69bcb0d206..30e3517ebcd 100644 --- a/mono/interpreter/interp.c +++ b/mono/interpreter/interp.c @@ -2287,10 +2287,15 @@ array_constructed: --sp; /* need to handle fieldrefs */ - klass = mono_class_get (image, - MONO_TOKEN_TYPE_DEF | mono_metadata_typedef_from_field (image, token & 0xffffff)); - mono_class_init (klass); - field = mono_class_get_field (klass, token); + if (mono_metadata_token_table (token) == MONO_TABLE_MEMBERREF) { + field = mono_field_from_memberref (image, token, &klass); + mono_class_init (klass); + } else { + klass = mono_class_get (image, + MONO_TOKEN_TYPE_DEF | mono_metadata_typedef_from_field (image, token & 0xffffff)); + mono_class_init (klass); + field = mono_class_get_field (klass, token); + } g_assert (field); stackval_to_data (field->type, sp, (char*)MONO_CLASS_STATIC_FIELDS_BASE(klass) + field->offset); vt_free (sp); diff --git a/mono/jit/ChangeLog b/mono/jit/ChangeLog index 3112e399ed6..8644a717c52 100644 --- a/mono/jit/ChangeLog +++ b/mono/jit/ChangeLog @@ -1,3 +1,10 @@ +2002-01-31 Dietmar Maurer + + * jit.c (mono_analyze_stack): impl. LDVIRTFTN + (mono_analyze_stack): handle MONO_TABLE_MEMBERREF in LDSFLD/STSFLD + + * x86.brg: removed some dead code. + 2002-01-18 Dietmar Maurer * jit.c (arch_allocate_var): fixed alignment bugs diff --git a/mono/jit/jit.c b/mono/jit/jit.c index 748bdfba6f9..5af0bace358 100644 --- a/mono/jit/jit.c +++ b/mono/jit/jit.c @@ -1395,6 +1395,7 @@ mono_analyze_flow (MonoFlowGraph *cfg) case CEE_LDARG: case CEE_INITOBJ: case CEE_LDFTN: + case CEE_LDVIRTFTN: ip +=5; break; case CEE_ENDFILTER: @@ -1847,12 +1848,16 @@ mono_analyze_stack (MonoFlowGraph *cfg) ip += 4; /* need to handle fieldrefs */ - klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | - mono_metadata_typedef_from_field (image, token & 0xffffff)); - - mono_class_init (klass); + if (mono_metadata_token_table (token) == MONO_TABLE_MEMBERREF) { + field = mono_field_from_memberref (image, token, &klass); + mono_class_init (klass); + } else { + klass = mono_class_get (image, + MONO_TOKEN_TYPE_DEF | mono_metadata_typedef_from_field (image, token & 0xffffff)); + mono_class_init (klass); + field = mono_class_get_field (klass, token); + } - field = mono_class_get_field (klass, token); g_assert (field); addr = MONO_CLASS_STATIC_FIELDS_BASE (klass) + field->offset; @@ -1865,6 +1870,7 @@ mono_analyze_stack (MonoFlowGraph *cfg) t1 = mono_ctree_new_leaf (mp, MB_TERM_ADDR_G); t1->data.p = addr; t1 = ctree_create_load (cfg, field->type, t1, &svt, FALSE); + } PUSH_TREE (t1, svt); @@ -1919,12 +1925,16 @@ mono_analyze_stack (MonoFlowGraph *cfg) --sp; /* need to handle fieldrefs */ - klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | - mono_metadata_typedef_from_field (image, token & 0xffffff)); + if (mono_metadata_token_table (token) == MONO_TABLE_MEMBERREF) { + field = mono_field_from_memberref (image, token, &klass); + mono_class_init (klass); + } else { + klass = mono_class_get (image, + MONO_TOKEN_TYPE_DEF | mono_metadata_typedef_from_field (image, token & 0xffffff)); + mono_class_init (klass); + field = mono_class_get_field (klass, token); - mono_class_init (klass); - - field = mono_class_get_field (klass, token); + } g_assert (field); t1 = mono_ctree_new_leaf (mp, MB_TERM_ADDR_G); @@ -3061,6 +3071,30 @@ mono_analyze_stack (MonoFlowGraph *cfg) PUSH_TREE (t1, VAL_POINTER); break; } + case CEE_LDVIRTFTN: { + MonoMethod *cm; + guint32 token; + ++ip; + token = read32 (ip); + ip += 4; + --sp; + + cm = mono_get_method (image, token, NULL); + g_assert (cm); + + if (cm->klass->flags & TYPE_ATTRIBUTE_INTERFACE) + t2 = mono_ctree_new_leaf (mp, MB_TERM_INTF_ADDR); + else + t2 = mono_ctree_new_leaf (mp, MB_TERM_VFUNC_ADDR); + + t2->data.m = cm; + + t1 = mono_ctree_new (mp, MB_TERM_LDFTN, *sp, t2); + + PUSH_TREE (t1, VAL_POINTER); + + break; + } case CEE_INITOBJ: { MonoClass *class; guint32 token; diff --git a/mono/jit/x86.brg b/mono/jit/x86.brg index 1c265c80910..e7590b642cc 100644 --- a/mono/jit/x86.brg +++ b/mono/jit/x86.brg @@ -176,7 +176,7 @@ void *MEMCOPY (void *dest, const void *src, size_t n); %term CONV_OVF_I4_UN CONV_OVF_U1_UN CONV_OVF_U2_UN %term CONV_OVF_I2_UN CONV_OVF_I8_UN CONV_OVF_I1_UN %term EXCEPTION THROW RETHROW HANDLER SAVE_LMF RESTORE_LMF -%term LDLEN +%term LDLEN LDFTN # # we start at stmt @@ -1066,6 +1066,8 @@ reg: NEWARR (reg) { x86_mov_reg_reg (s->code, tree->reg1, X86_EAX, 4); x86_pop_reg (s->code, X86_EAX); } + + PRINT_REG ("NEWARR", tree->reg1); } reg: NEWOBJ { @@ -1085,6 +1087,7 @@ reg: NEWOBJ { x86_mov_reg_reg (s->code, tree->reg1, X86_EAX, 4); x86_pop_reg (s->code, X86_EAX); } + PRINT_REG ("NEWOBJ", tree->reg1); } reg: NEWSTRUCT { @@ -1618,6 +1621,16 @@ reg: CALL_I4 (this, LDIND_REF (ADDR_G)) { g_assert (tree->reg1 == X86_EAX); } +reg: LDFTN (reg, INTF_ADDR) { + int lreg = tree->left->reg1; + + x86_mov_reg_membase (s->code, lreg, lreg, 0, 4); + x86_mov_reg_membase (s->code, lreg, lreg, + G_STRUCT_OFFSET (MonoClass, interface_offsets), 4); + x86_mov_reg_membase (s->code, lreg, lreg, tree->right->data.m->klass->interface_id << 2, 4); + x86_mov_reg_membase (s->code, tree->reg1, lreg, tree->right->data.m->slot << 2, 4); +} + reg: CALL_I4 (this, INTF_ADDR) { MethodCallInfo *ci = tree->data.ci; int lreg = tree->left->reg1; @@ -1651,6 +1664,14 @@ reg: CALL_I4 (this, INTF_ADDR) { g_assert (tree->reg1 == X86_EAX); } +reg: LDFTN (reg, VFUNC_ADDR) { + int lreg = tree->left->reg1; + + x86_mov_reg_membase (s->code, tree->reg1, lreg, 0, 4); + + x86_mov_reg_membase (s->code, tree->reg1, tree->reg1, G_STRUCT_OFFSET (MonoClass, vtable) + (tree->right->data.m->slot << 2), 4); +} + reg: CALL_I4 (this, VFUNC_ADDR) { MethodCallInfo *ci = tree->data.ci; int lreg = tree->left->reg1; @@ -1670,10 +1691,7 @@ reg: CALL_I4 (this, VFUNC_ADDR) { x86_push_reg (s->code, treg); } - x86_mov_reg_membase (s->code, lreg, lreg, 0, 4); - - x86_mov_reg_membase (s->code, treg, lreg, G_STRUCT_OFFSET (MonoClass, vtable) + (tree->right->data.m->slot << 2), 4); - + x86_mov_reg_membase (s->code, lreg, lreg, 0, 4); x86_call_virtual (s->code, lreg, G_STRUCT_OFFSET (MonoClass, vtable) + (tree->right->data.m->slot << 2)); diff --git a/mono/wrapper/ChangeLog b/mono/wrapper/ChangeLog index e402ebb0ec3..bde89a4da35 100644 --- a/mono/wrapper/ChangeLog +++ b/mono/wrapper/ChangeLog @@ -1,3 +1,7 @@ +2002-01-31 Dietmar Maurer + + * wrapper.c (mono_wrapper_readdir): ugly hack - we must return a String + instead of a char* Thu Jan 24 17:41:06 CET 2002 Paolo Molaro diff --git a/mono/wrapper/wrapper.c b/mono/wrapper/wrapper.c index d2e13e97e07..1d24e96e389 100644 --- a/mono/wrapper/wrapper.c +++ b/mono/wrapper/wrapper.c @@ -134,6 +134,10 @@ mono_wrapper_readdir (gpointer dir) struct dirent* p; p = readdir((DIR*)dir); + + // fixme: ugly hack - remove this code ASAP + return mono_string_new (p); + return p != NULL ? p->d_name : NULL; } -- 2.25.1