# HG changeset patch # User vlivanov # Date 1500485432 -10800 # Wed Jul 19 20:30:32 2017 +0300 # Branch mvt # Node ID 2760f7c563a1c9dc12297cc7da9a06a3ce4a4535 # Parent dc6a599385189ae566bc33804123d10a063d72a7 [mq]: lfb.customize diff --git a/src/java.base/share/classes/java/lang/invoke/LambdaFormBuilder.java b/src/java.base/share/classes/java/lang/invoke/LambdaFormBuilder.java --- a/src/java.base/share/classes/java/lang/invoke/LambdaFormBuilder.java +++ b/src/java.base/share/classes/java/lang/invoke/LambdaFormBuilder.java @@ -65,6 +65,7 @@ private static final String CLASS_PREFIX = "java/lang/invoke/LambdaForm$Value$"; private static final String DEFAULT_CLASS = "MH"; private static final String LL_SIG = "(L" + OBJ + ";)L" + OBJ + ";"; + private static final String LLV_SIG = "(L" + OBJ + ";L" + OBJ + ";)V"; private static final String MH = "java/lang/invoke/MethodHandle"; private static final String MHARY2 = "[[L" + MH + ";"; @@ -94,7 +95,25 @@ this.lambdaForm = lambdaForm; } + /** Generates code to check that actual receiver and LambdaForm matches */ + private boolean checkActualReceiver() { + // Expects MethodHandle on the stack and actual receiver MethodHandle in slot #0 + builder.dup().load(0).invokestatic(MethodHandleImpl.class, "assertSame", LLV_SIG, false); + return true; + } + void generateLambdaFormBody() { + if (lambdaForm.customized != null && MethodHandleBuilder.ENABLE_POOL_PATCHES) { + // Since LambdaForm is customized for a particular MethodHandle, it's safe to substitute + // receiver MethodHandle (at slot #0) with an embedded constant and use it instead. + // It enables more efficient code generation in some situations, since embedded constants + // are compile-time constants for JIT compiler. + builder.ldc(lambdaForm.customized) + .checkcast(MethodHandle.class); + assert(checkActualReceiver()); // generates runtime check + builder.store(0); + } + // iterate over the form's names, generating bytecode instructions for each // start iterating at the first name following the arguments Name onStack = null; diff --git a/src/java.base/share/classes/jdk/experimental/value/MethodHandleBuilder.java b/src/java.base/share/classes/jdk/experimental/value/MethodHandleBuilder.java --- a/src/java.base/share/classes/jdk/experimental/value/MethodHandleBuilder.java +++ b/src/java.base/share/classes/jdk/experimental/value/MethodHandleBuilder.java @@ -54,7 +54,7 @@ static final Unsafe UNSAFE = Unsafe.getUnsafe(); - static final boolean ENABLE_POOL_PATCHES; + public static final boolean ENABLE_POOL_PATCHES; static { Properties props = GetPropertyAction.privilegedGetProperties();