# HG changeset patch
# User redestad
# Date 1491942769 -7200
# Node ID 6b028630b652d8e557bdf657ccfa0983beee8799
# Parent  b9bf065070fe0f6dc78db4724119c2a8546d2fca
8178480: Wrong exception being thrown on an invalid MethodType
Reviewed-by: psandoz

diff -r b9bf065070fe -r 6b028630b652 jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
--- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java	Tue Apr 11 18:57:46 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java	Tue Apr 11 22:32:49 2017 +0200
@@ -673,9 +673,7 @@
     /**
      * 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 -r b9bf065070fe -r 6b028630b652 jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java
--- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java	Tue Apr 11 18:57:46 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java	Tue Apr 11 22:32:49 2017 +0200
@@ -847,9 +847,14 @@
         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;