From 3b47209a32b54c6c368dc8a4bc565e103e907764 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Tue, 11 Apr 2017 22:32:49 +0200 Subject: [PATCH] 8178480: Wrong exception being thrown on an invalid MethodType Reviewed-by: psandoz --- .../java/lang/invoke/InvokerBytecodeGenerator.java | 4 +--- .../share/classes/java/lang/invoke/LambdaForm.java | 9 +++++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index 9c05acb791a..7349ea2bec4 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -673,9 +673,7 @@ class InvokerBytecodeGenerator { /** * Generate customized bytecode for a given LambdaForm. */ - static MemberName generateCustomizedCode(LambdaForm form) { - final MethodType invokerType = form.methodType(); - + static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType) { MemberName pregenerated = lookupPregenerated(form, invokerType); if (pregenerated != null) return pregenerated; // pre-generated bytecode diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java index 4880a7b58aa..bde94381ddc 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java @@ -847,9 +847,14 @@ class LambdaForm { if (vmentry != null && isCompiled) { return; // already compiled somehow } - assert(vmentry == null || vmentry.getMethodType().basicType().equals(methodType())); + + // Obtain the invoker MethodType outside of the following try block. + // This ensures that an IllegalArgumentException is directly thrown if the + // type would have 256 or more parameters + MethodType invokerType = methodType(); + assert(vmentry == null || vmentry.getMethodType().basicType().equals(invokerType)); try { - vmentry = InvokerBytecodeGenerator.generateCustomizedCode(this); + vmentry = InvokerBytecodeGenerator.generateCustomizedCode(this, invokerType); if (TRACE_INTERPRETER) traceInterpreter("compileToBytecode", this); isCompiled = true;