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

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2015-03-21 09:47:16 +0300
committerjfrijters <jfrijters>2015-03-21 09:47:16 +0300
commit04a5dd7a316606769f44af6933604939e51811b1 (patch)
treef9eb98fe73391d2458cfd1616ef1ae90a8501fc6
parent0b264f52f601c28e120b54fd9b155c7327eb941d (diff)
Bug fix. Handle ghost and value types in override stub signatures.
-rw-r--r--runtime/DynamicTypeWrapper.cs38
1 files changed, 26 insertions, 12 deletions
diff --git a/runtime/DynamicTypeWrapper.cs b/runtime/DynamicTypeWrapper.cs
index 89af34ad..ee9fdb3d 100644
--- a/runtime/DynamicTypeWrapper.cs
+++ b/runtime/DynamicTypeWrapper.cs
@@ -6536,19 +6536,14 @@ namespace IKVM.Internal
MethodBuilder overrideStub = baseMethod.GetDefineMethodHelper().DefineMethod(this, typeBuilder, "__<overridestub>" + baseMethod.DeclaringType.Name + "::" + baseMethod.Name, MethodAttributes.Private | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.Final);
typeBuilder.DefineMethodOverride(overrideStub, (MethodInfo)baseMethod.GetMethod());
- Type stubret = baseMethod.ReturnTypeForDefineMethod;
- Type[] stubargs = baseMethod.GetParametersForDefineMethod();
- Type targetRet = targetMethod.ReturnTypeForDefineMethod;
- Type[] targetArgs = targetMethod.GetParametersForDefineMethod();
+ TypeWrapper[] stubargs = baseMethod.GetParameters();
+ TypeWrapper[] targetArgs = targetMethod.GetParameters();
CodeEmitter ilgen = CodeEmitter.Create(overrideStub);
ilgen.Emit(OpCodes.Ldarg_0);
for (int i = 0; i < targetArgs.Length; i++)
{
ilgen.EmitLdarg(i + 1);
- if (targetArgs[i] != stubargs[i])
- {
- ilgen.Emit(OpCodes.Castclass, targetArgs[i]);
- }
+ ConvertStubArg(stubargs[i], targetArgs[i], ilgen);
}
if (target != null)
{
@@ -6558,14 +6553,33 @@ namespace IKVM.Internal
{
targetMethod.EmitCallvirt(ilgen);
}
- if (targetRet != stubret)
- {
- ilgen.Emit(OpCodes.Castclass, stubret);
- }
+ ConvertStubArg(targetMethod.ReturnType, baseMethod.ReturnType, ilgen);
ilgen.Emit(OpCodes.Ret);
ilgen.DoEmit();
}
+ private static void ConvertStubArg(TypeWrapper src, TypeWrapper dst, CodeEmitter ilgen)
+ {
+ if (src != dst)
+ {
+ if (dst.IsUnloadable)
+ {
+ if (!src.IsUnloadable && (src.IsGhost || src.IsNonPrimitiveValueType))
+ {
+ src.EmitConvSignatureTypeToStackType(ilgen);
+ }
+ }
+ else if (dst.IsGhost || dst.IsNonPrimitiveValueType)
+ {
+ dst.EmitConvStackTypeToSignatureType(ilgen, null);
+ }
+ else
+ {
+ dst.EmitCheckcast(ilgen);
+ }
+ }
+ }
+
private static void GetParameterNamesFromMP(ClassFile.Method m, string[] parameterNames)
{
MethodParametersEntry[] methodParameters = m.MethodParameters;