diff options
author | jfrijters <jfrijters> | 2015-03-21 09:47:16 +0300 |
---|---|---|
committer | jfrijters <jfrijters> | 2015-03-21 09:47:16 +0300 |
commit | 04a5dd7a316606769f44af6933604939e51811b1 (patch) | |
tree | f9eb98fe73391d2458cfd1616ef1ae90a8501fc6 | |
parent | 0b264f52f601c28e120b54fd9b155c7327eb941d (diff) |
Bug fix. Handle ghost and value types in override stub signatures.
-rw-r--r-- | runtime/DynamicTypeWrapper.cs | 38 |
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; |