2002-07-08 Radek Doulik <rodo@ximian.com>
authorRadek Doulik <rodo@mono-cvs.ximian.com>
Mon, 8 Jul 2002 16:13:36 +0000 (16:13 -0000)
committerRadek Doulik <rodo@mono-cvs.ximian.com>
Mon, 8 Jul 2002 16:13:36 +0000 (16:13 -0000)
* ppc/tramp.c: marshaling for SZARRAY

svn path=/trunk/mono/; revision=5650

mono/arch/ChangeLog
mono/arch/ppc/tramp.c

index becdf94b2264fb5eba01f5ac37dfc77ee4585743..5260f793d8897bd51c983b35c3ef9b0bb7291884 100644 (file)
@@ -1,3 +1,7 @@
+2002-07-08  Radek Doulik  <rodo@ximian.com>
+
+       * ppc/tramp.c: marshaling for SZARRAY
+
 2002-07-05  Radek Doulik  <rodo@ximian.com>
 
        * ppc/tramp.c: removed magic hack
index eb0fd3a14848c6919b5fbe20f4e7635c1a55512b..17a90b31c2460434d7d3c0940013ea5411f28b97 100644 (file)
@@ -127,11 +127,16 @@ calculate_sizes (MonoMethod *method, guint *stack_size, guint *code_size, guint
                case MONO_TYPE_I:
                case MONO_TYPE_U:
                case MONO_TYPE_PTR:
-               case MONO_TYPE_SZARRAY:
                case MONO_TYPE_CLASS:
                case MONO_TYPE_OBJECT:
                        add_general (&gr, stack_size, code_size, TRUE);
                        break;
+               case MONO_TYPE_SZARRAY:
+                       add_general (&gr, stack_size, code_size, TRUE);
+                       if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) || runtime)
+                               break;
+                       *code_size += 4;
+                       break;
                case MONO_TYPE_VALUETYPE:
                        if (sig->params [i]->data.klass->enumtype) {
                                simpletype = sig->params [i]->data.klass->enum_basetype->type;
@@ -327,11 +332,24 @@ emit_save_parameters (guint8 *p, MonoMethod *method, guint stack_size, guint str
                case MONO_TYPE_I:
                case MONO_TYPE_U:
                case MONO_TYPE_PTR:
-               case MONO_TYPE_SZARRAY:
                case MONO_TYPE_CLASS:
                case MONO_TYPE_OBJECT:
                        SAVE_4_IN_GENERIC_REGISTER;
                        break;
+               case MONO_TYPE_SZARRAY:
+                       if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) || runtime) {
+                               SAVE_4_IN_GENERIC_REGISTER;
+                       } else {
+                               g_warning ("untested marshaling\n");
+                               if (gr < GENERAL_REGS) {
+                                       ppc_lwz  (p, ppc_r3 + gr, i*16, ARG_BASE);
+                                       ppc_lwz  (p, ppc_r3 + gr, G_STRUCT_OFFSET (MonoArray, vector), ppc_r3 + gr);
+                                       gr ++;
+                               } else {
+                                       NOT_IMPLEMENTED ("save marshalled SZARRAY on stack");
+                               }
+                       }
+                       break;
                case MONO_TYPE_VALUETYPE:
                        if (sig->params [i]->data.klass->enumtype) {
                                simpletype = sig->params [i]->data.klass->enum_basetype->type;