зеркало из https://github.com/mono/ikvm-fork.git
Optimized LambdaForm compiler.
This commit is contained in:
Родитель
3483682942
Коммит
c857637a61
|
@ -30,6 +30,7 @@ jdk/src/share/classes/java/io/RandomAccessFile.java=java/io/RandomAccessFile.jav
|
|||
jdk/src/share/classes/java/lang/Class.java=java/lang/Class.java
|
||||
jdk/src/share/classes/java/lang/ClassLoader.java=java/lang/ClassLoader.java
|
||||
jdk/src/share/classes/java/lang/Enum.java=java/lang/Enum.java
|
||||
jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java=../runtime/openjdk/NativeInvokerBytecodeGenerator.cs
|
||||
jdk/src/share/classes/java/lang/management/PlatformComponent.java=java/lang/management/PlatformComponent.java
|
||||
jdk/src/share/classes/java/lang/ref/SoftReference.java=java/lang/ref/SoftReference.java
|
||||
jdk/src/share/classes/java/lang/reflect/Constructor.java=java/lang/reflect/Constructor.java
|
||||
|
|
|
@ -2867,6 +2867,47 @@
|
|||
<attribute type="IKVM.Attributes.HideFromJavaAttribute" sig="()V" />
|
||||
</field>
|
||||
</class>
|
||||
<class name="java.lang.invoke.LambdaForm">
|
||||
<method name="_arity" sig="()I" modifiers="final">
|
||||
<body>
|
||||
<ldarg_0 />
|
||||
<ldfld class="java.lang.invoke.LambdaForm" name="arity" sig="I" />
|
||||
<ret />
|
||||
</body>
|
||||
</method>
|
||||
<method name="compileToBytecode" sig="()Ljava.lang.invoke.MemberName;">
|
||||
<replace-method-call class="java.lang.invoke.InvokerBytecodeGenerator" name="generateCustomizedCode" sig="(Ljava.lang.invoke.LambdaForm;Ljava.lang.invoke.MethodType;)Ljava.lang.invoke.MemberName;">
|
||||
<code>
|
||||
<call type="NativeInvokerBytecodeGenerator" name="generateCustomizedCode" sig="(Ljava.lang.invoke.LambdaForm;Ljava.lang.invoke.MethodType;)Ljava.lang.invoke.MemberName;" />
|
||||
</code>
|
||||
</replace-method-call>
|
||||
</method>
|
||||
</class>
|
||||
<class name="java.lang.invoke.LambdaForm$Name">
|
||||
<method name="_type" sig="()Ljava.lang.invoke.LambdaForm$BasicType;" modifiers="final">
|
||||
<body>
|
||||
<ldarg_0 />
|
||||
<ldfld class="java.lang.invoke.LambdaForm$Name" name="type" sig="Ljava.lang.invoke.LambdaForm$BasicType;" />
|
||||
<ret />
|
||||
</body>
|
||||
</method>
|
||||
</class>
|
||||
<class name="java.lang.invoke.LambdaForm$NamedFunction">
|
||||
<method name="_member" sig="()Ljava.lang.invoke.MemberName;" modifiers="final">
|
||||
<body>
|
||||
<ldarg_0 />
|
||||
<ldfld class="java.lang.invoke.LambdaForm$NamedFunction" name="member" sig="Ljava.lang.invoke.MemberName;" />
|
||||
<ret />
|
||||
</body>
|
||||
</method>
|
||||
<method name="_resolvedHandle" sig="()Ljava.lang.invoke.MethodHandle;" modifiers="final">
|
||||
<body>
|
||||
<ldarg_0 />
|
||||
<ldfld class="java.lang.invoke.LambdaForm$NamedFunction" name="resolvedHandle" sig="Ljava.lang.invoke.MethodHandle;" />
|
||||
<ret />
|
||||
</body>
|
||||
</method>
|
||||
</class>
|
||||
<class name="java.lang.invoke.MemberName">
|
||||
<field name="vmtarget" sig="Ljava.lang.Object;" modifiers="">
|
||||
<attribute type="IKVM.Attributes.HideFromJavaAttribute" sig="()V" />
|
||||
|
@ -2888,6 +2929,15 @@
|
|||
<ret />
|
||||
</body>
|
||||
</method>
|
||||
<method name="_name" sig="(Ljava.lang.String;)V" modifiers="final">
|
||||
<attribute type="IKVM.Attributes.HideFromJavaAttribute" sig="()V" />
|
||||
<body>
|
||||
<ldarg_0 />
|
||||
<ldarg_1 />
|
||||
<stfld class="java.lang.invoke.MemberName" name="name" sig="Ljava.lang.String;" />
|
||||
<ret />
|
||||
</body>
|
||||
</method>
|
||||
<method name="_type" sig="(Ljava.lang.invoke.MethodType;)V" modifiers="final">
|
||||
<attribute type="IKVM.Attributes.HideFromJavaAttribute" sig="()V" />
|
||||
<body>
|
||||
|
|
|
@ -54,6 +54,7 @@ namespace java
|
|||
namespace invoke
|
||||
{
|
||||
public class DirectMethodHandle { }
|
||||
public class LambdaForm { }
|
||||
public class MemberName { }
|
||||
public class MethodType { }
|
||||
public class MethodHandle { }
|
||||
|
|
|
@ -160,6 +160,7 @@
|
|||
<Compile Include="openjdk\java.util.cs" />
|
||||
<Compile Include="openjdk\java.util.prefs.cs" />
|
||||
<Compile Include="openjdk\misc.cs" />
|
||||
<Compile Include="openjdk\NativeInvokerBytecodeGenerator.cs" />
|
||||
<Compile Include="openjdk\sun.management.cs" />
|
||||
<Compile Include="openjdk\sun.misc.cs" />
|
||||
<Compile Include="openjdk\sun.nio.ch.cs" />
|
||||
|
|
|
@ -267,7 +267,7 @@ static partial class MethodHandleUtil
|
|||
|
||||
sealed class Compiler
|
||||
{
|
||||
private static readonly MethodInfo unmapExceptionMethod;
|
||||
internal static readonly MethodInfo unmapExceptionMethod;
|
||||
private static readonly MethodInfo fixateExceptionMethod;
|
||||
private static readonly MethodInfo suppressFillInStackTraceMethod;
|
||||
internal static readonly MethodInfo getTypeFromHandleMethod;
|
||||
|
@ -3604,7 +3604,7 @@ sealed class Compiler
|
|||
}
|
||||
}
|
||||
|
||||
private sealed class MethodHandleMethodWrapper : MethodWrapper
|
||||
internal sealed class MethodHandleMethodWrapper : MethodWrapper
|
||||
{
|
||||
private readonly Compiler compiler;
|
||||
private readonly TypeWrapper wrapper;
|
||||
|
@ -3648,10 +3648,13 @@ sealed class Compiler
|
|||
|
||||
internal override void EmitCall(CodeEmitter ilgen)
|
||||
{
|
||||
#if !FIRST_PASS && !STATIC_COMPILER
|
||||
Debug.Assert(cpi.Name == "linkToVirtual" || cpi.Name == "linkToStatic" || cpi.Name == "linkToSpecial" || cpi.Name == "linkToInterface");
|
||||
EmitLinkToCall(ilgen, cpi.GetArgTypes(), cpi.GetRetType());
|
||||
}
|
||||
|
||||
TypeWrapper[] args = cpi.GetArgTypes();
|
||||
internal static void EmitLinkToCall(CodeEmitter ilgen, TypeWrapper[] args, TypeWrapper retType)
|
||||
{
|
||||
#if !FIRST_PASS && !STATIC_COMPILER
|
||||
CodeEmitterLocal[] temps = new CodeEmitterLocal[args.Length];
|
||||
for (int i = args.Length - 1; i > 0; i--)
|
||||
{
|
||||
|
@ -3662,7 +3665,7 @@ sealed class Compiler
|
|||
temps[0] = ilgen.DeclareLocal(args[0].TypeAsSignatureType);
|
||||
ilgen.Emit(OpCodes.Stloc, temps[0]);
|
||||
Array.Resize(ref args, args.Length - 1);
|
||||
Type delegateType = MethodHandleUtil.CreateMemberWrapperDelegateType(args, cpi.GetRetType());
|
||||
Type delegateType = MethodHandleUtil.CreateMemberWrapperDelegateType(args, retType);
|
||||
ilgen.Emit(OpCodes.Ldloc, temps[args.Length]);
|
||||
ilgen.Emit(OpCodes.Ldfld, typeof(java.lang.invoke.MemberName).GetField("vmtarget", BindingFlags.Instance | BindingFlags.NonPublic));
|
||||
ilgen.Emit(OpCodes.Castclass, delegateType);
|
||||
|
@ -3671,7 +3674,7 @@ sealed class Compiler
|
|||
ilgen.Emit(OpCodes.Ldloc, temps[i]);
|
||||
}
|
||||
MethodHandleUtil.EmitCallDelegateInvokeMethod(ilgen, delegateType);
|
||||
FromBasic(ReturnType, ilgen);
|
||||
FromBasic(retType, ilgen);
|
||||
#else
|
||||
throw new InvalidOperationException();
|
||||
#endif
|
||||
|
@ -3774,17 +3777,27 @@ sealed class Compiler
|
|||
|
||||
private void EmitInvokeBasic(CodeEmitter ilgen)
|
||||
{
|
||||
TypeWrapper[] args = ArrayUtil.Concat(CoreClasses.java.lang.invoke.MethodHandle.Wrapper, cpi.GetArgTypes());
|
||||
TypeWrapper retType = cpi.GetRetType();
|
||||
EmitInvokeBasic(ilgen, cpi.GetArgTypes(), retType, true);
|
||||
FromBasic(retType, ilgen);
|
||||
}
|
||||
|
||||
internal static void EmitInvokeBasic(CodeEmitter ilgen, TypeWrapper[] args, TypeWrapper retType, bool toBasic)
|
||||
{
|
||||
args = ArrayUtil.Concat(CoreClasses.java.lang.invoke.MethodHandle.Wrapper, args);
|
||||
CodeEmitterLocal[] temps = new CodeEmitterLocal[args.Length];
|
||||
for (int i = args.Length - 1; i > 0; i--)
|
||||
{
|
||||
temps[i] = ilgen.DeclareLocal(MethodHandleUtil.AsBasicType(args[i]));
|
||||
ToBasic(args[i], ilgen);
|
||||
if (toBasic)
|
||||
{
|
||||
ToBasic(args[i], ilgen);
|
||||
}
|
||||
ilgen.Emit(OpCodes.Stloc, temps[i]);
|
||||
}
|
||||
temps[0] = ilgen.DeclareLocal(args[0].TypeAsSignatureType);
|
||||
ilgen.Emit(OpCodes.Stloc, temps[0]);
|
||||
Type delegateType = MethodHandleUtil.CreateMemberWrapperDelegateType(args, cpi.GetRetType());
|
||||
Type delegateType = MethodHandleUtil.CreateMemberWrapperDelegateType(args, retType);
|
||||
MethodInfo mi = ByteCodeHelperMethods.GetDelegateForInvokeBasic.MakeGenericMethod(delegateType);
|
||||
ilgen.Emit(OpCodes.Ldloc, temps[0]);
|
||||
ilgen.Emit(OpCodes.Call, mi);
|
||||
|
@ -3793,7 +3806,6 @@ sealed class Compiler
|
|||
ilgen.Emit(OpCodes.Ldloc, temps[i]);
|
||||
}
|
||||
MethodHandleUtil.EmitCallDelegateInvokeMethod(ilgen, delegateType);
|
||||
FromBasic(ReturnType, ilgen);
|
||||
}
|
||||
|
||||
internal override void EmitCallvirt(CodeEmitter ilgen)
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -645,7 +645,7 @@ static partial class MethodHandleUtil
|
|||
return args;
|
||||
}
|
||||
|
||||
private static Type[] GetParameterTypes(Type thisType, MethodBase mb)
|
||||
internal static Type[] GetParameterTypes(Type thisType, MethodBase mb)
|
||||
{
|
||||
ParameterInfo[] pi = mb.GetParameters();
|
||||
Type[] args = new Type[pi.Length + 1];
|
||||
|
@ -1064,25 +1064,7 @@ static partial class MethodHandleUtil
|
|||
|
||||
internal void Ldarg(int i)
|
||||
{
|
||||
i += firstArg;
|
||||
if (i >= packedArgPos)
|
||||
{
|
||||
ilgen.EmitLdarga(packedArgPos);
|
||||
int fieldPos = i - packedArgPos;
|
||||
Type type = packedArgType;
|
||||
while (fieldPos >= MaxArity || (fieldPos == MaxArity - 1 && IsPackedArgsContainer(type.GetField("t8").FieldType)))
|
||||
{
|
||||
FieldInfo field = type.GetField("t8");
|
||||
type = field.FieldType;
|
||||
ilgen.Emit(OpCodes.Ldflda, field);
|
||||
fieldPos -= MaxArity - 1;
|
||||
}
|
||||
ilgen.Emit(OpCodes.Ldfld, type.GetField("t" + (1 + fieldPos)));
|
||||
}
|
||||
else
|
||||
{
|
||||
ilgen.EmitLdarg(i);
|
||||
}
|
||||
LoadPackedArg(ilgen, i, firstArg, packedArgPos, packedArgType);
|
||||
}
|
||||
|
||||
internal void LoadCallerID()
|
||||
|
@ -1269,5 +1251,28 @@ static partial class MethodHandleUtil
|
|||
}
|
||||
return type.voidAdapter;
|
||||
}
|
||||
|
||||
internal static void LoadPackedArg(CodeEmitter ilgen, int index, int firstArg, int packedArgPos, Type packedArgType)
|
||||
{
|
||||
index += firstArg;
|
||||
if (index >= packedArgPos)
|
||||
{
|
||||
ilgen.EmitLdarga(packedArgPos);
|
||||
int fieldPos = index - packedArgPos;
|
||||
Type type = packedArgType;
|
||||
while (fieldPos >= MaxArity || (fieldPos == MaxArity - 1 && IsPackedArgsContainer(type.GetField("t8").FieldType)))
|
||||
{
|
||||
FieldInfo field = type.GetField("t8");
|
||||
type = field.FieldType;
|
||||
ilgen.Emit(OpCodes.Ldflda, field);
|
||||
fieldPos -= MaxArity - 1;
|
||||
}
|
||||
ilgen.Emit(OpCodes.Ldfld, type.GetField("t" + (1 + fieldPos)));
|
||||
}
|
||||
else
|
||||
{
|
||||
ilgen.EmitLdarg(index);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Copyright (C) 2002-2013 Jeroen Frijters
|
||||
Copyright (C) 2002-2015 Jeroen Frijters
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
@ -195,6 +195,7 @@
|
|||
<include name="openjdk/java.util.cs" />
|
||||
<include name="openjdk/java.util.prefs.cs" />
|
||||
<include name="openjdk/misc.cs" />
|
||||
<include name="openjdk/NativeInvokerBytecodeGenerator.cs" />
|
||||
<include name="openjdk/sun.management.cs" />
|
||||
<include name="openjdk/sun.misc.cs" />
|
||||
<include name="openjdk/sun.nio.ch.cs" />
|
||||
|
|
Загрузка…
Ссылка в новой задаче