diff options
author | jfrijters <jfrijters> | 2011-08-09 09:22:37 +0400 |
---|---|---|
committer | jfrijters <jfrijters> | 2011-08-09 09:22:37 +0400 |
commit | e45851621ab011c6467c58dc8f8b1d00cf786fe6 (patch) | |
tree | 65d15b24d841a2dfcf7ac5006c0269fce17e7c73 /runtime/openjdk/java.lang.invoke.cs | |
parent | c0510be7fdb46887e4a81f44ec737f2cf9f07e4e (diff) |
Moved boxing/unboxing (and subsequent conversion) into BoxUtil.
Diffstat (limited to 'runtime/openjdk/java.lang.invoke.cs')
-rw-r--r-- | runtime/openjdk/java.lang.invoke.cs | 65 |
1 files changed, 21 insertions, 44 deletions
diff --git a/runtime/openjdk/java.lang.invoke.cs b/runtime/openjdk/java.lang.invoke.cs index df3e2d61..246fbbe5 100644 --- a/runtime/openjdk/java.lang.invoke.cs +++ b/runtime/openjdk/java.lang.invoke.cs @@ -27,9 +27,6 @@ using System.Reflection; using System.Reflection.Emit; using IKVM.Internal; using java.lang.invoke; -#if !FIRST_PASS -using sun.invoke.util; -#endif using jlClass = java.lang.Class; static class Java_java_lang_invoke_MethodHandle @@ -404,40 +401,43 @@ static partial class MethodHandleUtil typeof(sun.invoke.util.ValueConversions).GetMethod("unbox" + longName, BindingFlags.Static | BindingFlags.NonPublic)); } - internal static MethodInfo Boxer(jlClass type) + internal static void Box(CodeEmitter ilgen, jlClass srcClass, jlClass dstClass, int level) { for (int i = 0; i < boxers.Length; i++) { - if (boxers[i].type == type) + if (boxers[i].type == srcClass) { - return boxers[i].box; + ilgen.Emit(OpCodes.Call, boxers[i].box); + EmitConvert(ilgen, boxers[i].clazz, dstClass, level); + return; } } - throw new NotImplementedException(type.getName()); + throw new InvalidOperationException(); } - internal static MethodInfo Unboxer(jlClass srcType) + internal static void Unbox(CodeEmitter ilgen, jlClass srcClass, jlClass dstClass, int level) { for (int i = 0; i < boxers.Length; i++) { - if (boxers[i].clazz == srcType) + if (boxers[i].clazz == srcClass) { - return boxers[i].unbox; + // typed unboxing + ilgen.Emit(OpCodes.Call, boxers[i].unbox); + EmitConvert(ilgen, boxers[i].type, dstClass, level); + return; } } - throw new NotImplementedException(srcType.getName()); - } - - internal static MethodInfo ObjectUnboxer(jlClass dstType) - { for (int i = 0; i < boxers.Length; i++) { - if (boxers[i].type == dstType) + if (boxers[i].type == dstClass) { - return boxers[i].unboxObject; + // untyped unboxing + ilgen.Emit(OpCodes.Ldc_I4_1); + ilgen.Emit(OpCodes.Call, boxers[i].unboxObject); + return; } } - throw new NotImplementedException(dstType.getName()); + throw new InvalidOperationException(); } } @@ -526,9 +526,7 @@ static partial class MethodHandleUtil } else { - // boxing - ilgen.Emit(OpCodes.Call, BoxUtil.Boxer(srcClass)); - EmitConvert(ilgen, Wrapper.asWrapperType(srcClass), dstClass, level); + BoxUtil.Box(ilgen, srcClass, dstClass, level); } } else if (src.IsGhost) @@ -539,32 +537,11 @@ static partial class MethodHandleUtil else if (srcClass == ikvm.@internal.ClassLiteral<sun.invoke.empty.Empty>.Value) { ilgen.Emit(OpCodes.Pop); - if (dst != PrimitiveTypeWrapper.VOID) - { - ilgen.Emit(OpCodes.Ldloc, ilgen.DeclareLocal(dst.TypeAsSignatureType)); - } + ilgen.Emit(OpCodes.Ldloc, ilgen.DeclareLocal(dst.TypeAsSignatureType)); } else if (dst.IsPrimitive) { - if (Wrapper.isWrapperType(srcClass)) - { - if (src == CoreClasses.java.lang.Object.Wrapper) - { - // untyped unboxing - ilgen.Emit(OpCodes.Ldc_I4_1); - ilgen.Emit(OpCodes.Call, BoxUtil.ObjectUnboxer(dstClass)); - } - else - { - // typed unboxing - ilgen.Emit(OpCodes.Call, BoxUtil.Unboxer(srcClass)); - EmitConvert(ilgen, Wrapper.asPrimitiveType(srcClass), dstClass, level); - } - } - else - { - throw new NotImplementedException(src.Name + " -> " + dst.Name); - } + BoxUtil.Unbox(ilgen, srcClass, dstClass, level); } else if (dst.IsGhost) { |