Просмотр исходного кода

[llvmonly] Fix invocation of string ctors. Emit Array.Set/Get wrappers for more types.

Zoltan Varga 9 лет назад
Родитель
Сommit
60bee25211
2 измененных файлов с 11 добавлено и 6 удалено
  1. 6 4
      mono/mini/aot-compiler.c
  2. 5 2
      mono/mini/mini-runtime.c

+ 6 - 4
mono/mini/aot-compiler.c

@@ -4057,7 +4057,7 @@ add_wrappers (MonoAotCompile *acfg)
 			continue;
 		}
 
-		if (!acfg->aot_opts.llvm_only && klass->rank && MONO_TYPE_IS_PRIMITIVE (&klass->element_class->byval_arg)) {
+		if (klass->rank && MONO_TYPE_IS_PRIMITIVE (&klass->element_class->byval_arg)) {
 			MonoMethod *m, *wrapper;
 
 			/* Add runtime-invoke wrappers too */
@@ -4066,13 +4066,15 @@ add_wrappers (MonoAotCompile *acfg)
 			g_assert (m);
 			wrapper = mono_marshal_get_array_accessor_wrapper (m);
 			add_extra_method (acfg, wrapper);
-			add_extra_method (acfg, get_runtime_invoke (acfg, wrapper, FALSE));
+			if (!acfg->aot_opts.llvm_only)
+				add_extra_method (acfg, get_runtime_invoke (acfg, wrapper, FALSE));
 
 			m = mono_class_get_method_from_name (klass, "Set", -1);
 			g_assert (m);
 			wrapper = mono_marshal_get_array_accessor_wrapper (m);
 			add_extra_method (acfg, wrapper);
-			add_extra_method (acfg, get_runtime_invoke (acfg, wrapper, FALSE));
+			if (!acfg->aot_opts.llvm_only)
+				add_extra_method (acfg, get_runtime_invoke (acfg, wrapper, FALSE));
 		}
 	}
 
@@ -4942,7 +4944,7 @@ add_generic_instances (MonoAotCompile *acfg)
 		}
 
 		/* object[] accessor wrappers. */
-		for (i = 1; i < 3; ++i) {
+		for (i = 1; i < 4; ++i) {
 			MonoClass *obj_array_class = mono_array_class_get (mono_defaults.object_class, i);
 			MonoMethod *m;
 

+ 5 - 2
mono/mini/mini-runtime.c

@@ -2158,7 +2158,10 @@ create_runtime_invoke_info (MonoDomain *domain, MonoMethod *method, gpointer com
 
 	info = g_new0 (RuntimeInvokeInfo, 1);
 	info->compiled_method = compiled_method;
-	info->sig = mono_method_signature (method);
+	if (mono_llvm_only && method->string_ctor)
+		info->sig = mono_marshal_get_string_ctor_signature (method);
+	else
+		info->sig = mono_method_signature (method);
 
 	invoke = mono_marshal_get_runtime_invoke (method, FALSE);
 	info->vtable = mono_class_vtable_full (domain, method->klass, error);
@@ -2166,7 +2169,7 @@ create_runtime_invoke_info (MonoDomain *domain, MonoMethod *method, gpointer com
 		return NULL;
 	g_assert (info->vtable);
 
-	MonoMethodSignature *sig = mono_method_signature (method);
+	MonoMethodSignature *sig = info->sig;
 	MonoType *ret_type;
 
 	/*