diff --git a/pom.xml b/pom.xml index ac1ac5e958..dc0f823229 100644 --- a/pom.xml +++ b/pom.xml @@ -59,9 +59,7 @@ 12314220 5.19.1 false - - - 3.26.0 + 3.46.100 true @@ -497,6 +495,27 @@ + + ecj-java-11-down + + (,12) + + + + 3.33.0 + + + + + ecj-java-8-down + + (,1.9) + + + + 3.26.0 + + spdx-java-11 diff --git a/src/test/java/org/apache/bcel/data/SWAP.java b/src/test/java/org/apache/bcel/data/SWAP.java deleted file mode 100644 index cb0ac82a73..0000000000 --- a/src/test/java/org/apache/bcel/data/SWAP.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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 - * - * https://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 org.apache.bcel.data; - -import java.lang.reflect.Constructor; - -/* - * A test for SWAP instruction. - * To be compiled with Eclipse Compiler (ecj) with source/target 1.4. - * This is a requirement for SWAP instruction to be generated. - * If compiled with javac source/target 1.1+ or ecj source/target 1.5+, no SWAP instruction is generated. - */ -public class SWAP { - public static Constructor getTestConstructor(final Class theClass) throws NoSuchMethodException { - final Class[] args = { String.class }; - try { - return theClass.getConstructor(args); - } catch (final NoSuchMethodException e) { - } - return theClass.getConstructor(new Class[0]); - } -} diff --git a/src/test/java/org/apache/bcel/verifier/VerifierMainTest.java b/src/test/java/org/apache/bcel/verifier/VerifierMainTest.java index e6f490b61d..a2938ad38b 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierMainTest.java +++ b/src/test/java/org/apache/bcel/verifier/VerifierMainTest.java @@ -22,24 +22,29 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.BufferedInputStream; +import java.io.File; import java.io.InputStream; -import java.io.PrintWriter; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import org.apache.bcel.AbstractTest; +import org.apache.bcel.Const; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.EmptyVisitor; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.InstructionConst; import org.apache.bcel.generic.InstructionHandle; import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; import org.apache.bcel.generic.SWAP; +import org.apache.bcel.generic.Type; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemProperties; -import org.eclipse.jdt.internal.compiler.batch.Main; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -50,16 +55,36 @@ class VerifierMainTest extends AbstractTest { @Test void testSWAP() throws Exception { - final String[] argv = { "src/test/java/org/apache/bcel/data/SWAP.java", "-g", "-source", "1.4", "-target", "1.4", "-d", tempDir.toString() }; - new Main(new PrintWriter(System.out), new PrintWriter(System.err), false/*systemExit*/, null/*options*/, null/*progress*/).compile(argv); + final String className = "org.apache.bcel.data.SWAP"; + final Path classFile = tempDir.resolve("org/apache/bcel/data/SWAP.class"); + final ClassGen classGen = new ClassGen(className, "java.lang.Object", "SWAP.java", Const.ACC_PUBLIC | Const.ACC_SUPER, null); + classGen.setMajor(Const.MAJOR_1_4); + classGen.setMinor(Const.MINOR_1_4); + classGen.addEmptyConstructor(Const.ACC_PUBLIC); + final InstructionList instructions = new InstructionList(); + try { + instructions.append(new ILOAD(0)); + instructions.append(new ILOAD(1)); + instructions.append(InstructionConst.SWAP); + instructions.append(InstructionConst.ISUB); + instructions.append(InstructionConst.IRETURN); + final MethodGen methodGen = new MethodGen(Const.ACC_PUBLIC | Const.ACC_STATIC, Type.INT, new Type[] { Type.INT, Type.INT }, + new String[] { "first", "second" }, "swap", className, instructions, classGen.getConstantPool()); + methodGen.setMaxStack(); + methodGen.setMaxLocals(); + classGen.addMethod(methodGen.getMethod()); + } finally { + instructions.dispose(); + } + classGen.getJavaClass().dump(classFile.toFile()); final String javaAgent = getJavaAgent(); final List args = new ArrayList<>(); - args.add("java"); + args.add(SystemProperties.getJavaHome() + File.separator + "bin" + File.separator + "java"); if (javaAgent != null) { args.add(javaAgent.replace("jacoco.exec", "jacoco_org.apache.bcel.data.SWAP.exec")); } args.add("-cp"); - args.add(SystemProperties.getJavaClassPath()); + args.add(tempDir + File.pathSeparator + SystemProperties.getJavaClassPath()); args.add("org.apache.bcel.verifier.Verifier"); args.add("org/apache/bcel/data/SWAP.class"); final ProcessBuilder pb = new ProcessBuilder(args); @@ -76,7 +101,7 @@ void testSWAP() throws Exception { assertEquals(0, StringUtils.countMatches(output, "VERIFIED_REJECTED"), output); assertEquals(6, StringUtils.countMatches(output, "VERIFIED_OK"), output); } - // Class has passed the JustIce verifier, but now we need to ensure that the SWAP instruction is in the compiled class. + // Class has passed the JustIce verifier, but now we need to ensure that the SWAP instruction is in the generated class. final List swapInstructionsList = new ArrayList<>(); final EmptyVisitor swapCollector = new EmptyVisitor() { @Override @@ -85,14 +110,18 @@ public void visitSWAP(final SWAP obj) { super.visitSWAP(obj); } }; - try (InputStream in = Files.newInputStream(tempDir.resolve("org/apache/bcel/data/SWAP.class"))) { + try (InputStream in = Files.newInputStream(classFile)) { final ClassParser classParser = new ClassParser(in, "SWAP.class"); final JavaClass javaClass = classParser.parse(); - final Method method = javaClass.getMethod(org.apache.bcel.data.SWAP.class.getMethod("getTestConstructor", Class.class)); - final byte[] code = method.getCode().getCode(); - final InstructionList instructionList = new InstructionList(code); - for (final InstructionHandle instructionHandle : instructionList) { - instructionHandle.accept(swapCollector); + for (final Method method : javaClass.getMethods()) { + final InstructionList instructionList = new InstructionList(method.getCode().getCode()); + try { + for (final InstructionHandle instructionHandle : instructionList) { + instructionHandle.accept(swapCollector); + } + } finally { + instructionList.dispose(); + } } } assertEquals(1, swapInstructionsList.size());