This is an automated email from the ASF dual-hosted git repository. sjaranowski pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-dependency-analyzer.git
The following commit(s) were added to refs/heads/master by this push: new a9be307 [MSHARED-1247] java.lang.RuntimeException: Unknown constant pool type '17' a9be307 is described below commit a9be30788abbd413a02d42ff3bcf6df6b96ec4e6 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Fri Apr 28 08:47:48 2023 -0400 [MSHARED-1247] java.lang.RuntimeException: Unknown constant pool type '17' [MSHARED-1247] java.lang.RuntimeException: Unknown constant pool type '17' --- .../dependency/analyzer/ClassFileVisitorUtils.java | 8 +++++- .../analyzer/asm/ConstantPoolParser.java | 11 ++++++++ .../analyzer/asm/ResultCollectorTest.java | 14 +++++++++++ .../analyzer/commons-bcel-issue362/Bcel362.class | Bin 0 -> 903 bytes .../analyzer/commons-bcel-issue362/Bcel362.java | 28 +++++++++++++++++++++ 5 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java index 29cd9b5..b2211c3 100644 --- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java +++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java @@ -94,7 +94,13 @@ public final class ClassFileVisitorUtils { for (Path path : classFiles) { try (InputStream in = Files.newInputStream(path)) { - visitClass(directory, path, in, visitor); + try { + visitClass(directory, path, in, visitor); + } catch (RuntimeException e) { + // visitClass throws RuntimeException + throw new RuntimeException( + String.format("%s from directory = %s, path = %s", e.getMessage(), directory, path), e); + } } } } diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ConstantPoolParser.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ConstantPoolParser.java index 3c53701..1b7f0c6 100644 --- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ConstantPoolParser.java +++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ConstantPoolParser.java @@ -85,6 +85,9 @@ public class ConstantPoolParser { /** Constant <code>CONSTANT_METHOD_TYPE=16</code> */ public static final byte CONSTANT_METHOD_TYPE = 16; + /** Constant <code>CONSTANT_INVOKE=17</code> */ + public static final byte CONSTANT_INVOKE = 17; + /** Constant <code>CONSTANT_INVOKE_DYNAMIC=18</code> */ public static final byte CONSTANT_INVOKE_DYNAMIC = 18; @@ -156,6 +159,9 @@ public class ConstantPoolParser { case CONSTANT_METHODHANDLE: consumeMethodHandle(buf); break; + case CONSTANT_INVOKE: + consumeDynamic(buf); + break; case CONSTANT_INVOKE_DYNAMIC: consumeInvokeDynamic(buf); break; @@ -260,6 +266,11 @@ public class ConstantPoolParser { buf.getChar(); } + private static void consumeDynamic(ByteBuffer buf) { + buf.getChar(); // u2 bootstrap_method_attr_index; + buf.getChar(); // u2 name_and_type_index; + } + private static void consumeInvokeDynamic(ByteBuffer buf) { buf.getChar(); buf.getChar(); diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollectorTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollectorTest.java index 1796679..7cb376e 100644 --- a/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollectorTest.java +++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollectorTest.java @@ -20,6 +20,9 @@ package org.apache.maven.shared.dependency.analyzer.asm; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Set; import org.apache.maven.shared.dependency.analyzer.testcases.ArrayCases; @@ -40,6 +43,17 @@ public class ResultCollectorTest { return visitor.getDependencies(); } + @Test + public void testJava11Invoke() throws IOException { + String className = "issue362.Bcel362"; + Path path = Paths.get( + "src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.class"); + DependencyClassFileVisitor visitor = new DependencyClassFileVisitor(); + try (InputStream is = Files.newInputStream(path)) { + visitor.visitClass(className, is); + } + } + @Test public void testArrayCases() throws IOException { Set<String> dependencies = getDependencies(ArrayCases.class); diff --git a/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.class b/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.class new file mode 100644 index 0000000..b1e1415 Binary files /dev/null and b/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.class differ diff --git a/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.java b/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.java new file mode 100644 index 0000000..736dd6c --- /dev/null +++ b/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package issue362; + +/** + * Compile to Java 11 byte code, then instrument with JaCoCo in order to add + * condy (constant dynamic) instructions + */ +public class Bcel362 { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +}