Optimized LambdaForm compiler.

This commit is contained in:
jfrijters 2015-06-24 14:10:40 +00:00
Родитель 3483682942
Коммит c857637a61
8 изменённых файлов: 1131 добавлений и 31 удалений

Просмотреть файл

@ -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" />