Skip to content

Commit

Permalink
Read the constant pool using BCEL to avoid hacks or re-inventing the …
Browse files Browse the repository at this point in the history
…wheel
  • Loading branch information
luontola committed Dec 28, 2017
1 parent 0e19573 commit f9a14aa
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 32 deletions.
13 changes: 13 additions & 0 deletions .idea/libraries/Maven__jakarta_regexp_jakarta_regexp_1_4.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions .idea/libraries/Maven__org_apache_bcel_bcel_5_2.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions end-to-end-tests/end-to-end-tests.iml
Expand Up @@ -15,6 +15,8 @@
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm-debug-all:5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.bcel:bcel:5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta-regexp:jakarta-regexp:1.4" level="project" />
<orderEntry type="module-library">
<library name="Maven: net.orfjackal.retrolambda:java-lang-dummies:1">
<CLASSES>
Expand Down
6 changes: 6 additions & 0 deletions end-to-end-tests/pom.xml
Expand Up @@ -34,6 +34,12 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.bcel</groupId>
<artifactId>bcel</artifactId>
<scope>test</scope>
</dependency>

<!-- See net.orfjackal.retrolambda.test.ClasspathTest#ignores_classes_in_explicit_classpath_that_are_under_the_java_package -->
<dependency>
<groupId>net.orfjackal.retrolambda</groupId>
Expand Down
Expand Up @@ -5,8 +5,8 @@
package net.orfjackal.retrolambda.test;

import com.google.common.collect.ImmutableSet;
import org.apache.bcel.classfile.*;
import org.junit.Test;
import org.objectweb.asm.ClassReader;

import java.io.IOException;
import java.lang.reflect.Method;
Expand Down Expand Up @@ -83,14 +83,14 @@ public void enclosing_classes_contain_no_unnecessary_methods_in_addition_to_the_

@Test
public void does_not_contain_references_to_JDK_lambda_classes() throws IOException {
ClassReader cr = new ClassReader("net/orfjackal/retrolambda/test/LambdaClassesTest$Dummy1$$Lambda$1");
ConstantPool constantPool = TestUtil.getConstantPool("net/orfjackal/retrolambda/test/LambdaClassesTest$Dummy1$$Lambda$1");

// XXX: fix visitConstantPool and assert the constant pool entries instead of this hack
// TestUtil.visitConstantPool(cr, (item, constant) -> {
// });

String bytecode = new String(cr.b);
assertThat(bytecode, not(containsString("java/lang/invoke/LambdaForm")));
for (Constant constant : constantPool.getConstantPool()) {
if (constant != null) {
String s = constantPool.constantToString(constant);
assertThat(s, not(containsString("java/lang/invoke/LambdaForm")));
}
}
}


Expand Down
Expand Up @@ -5,12 +5,13 @@
package net.orfjackal.retrolambda.test;

import net.orfjackal.retrolambda.test.anotherpackage.DifferentPackageBase;
import org.apache.bcel.Constants;
import org.apache.bcel.classfile.*;
import org.apache.commons.lang.SystemUtils;
import org.junit.Test;
import org.objectweb.asm.*;
import org.objectweb.asm.Type;

import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.*;
import java.util.*;
import java.util.concurrent.Callable;
Expand Down Expand Up @@ -365,13 +366,15 @@ public void foo() {
public void bytecode_constant_pool_will_not_contain_dangling_references_to_MethodHandles() throws IOException {
assumeThat(SystemUtils.JAVA_VERSION_FLOAT, is(lessThan(1.7f)));

ClassReader cr = new ClassReader(getClass().getName().replace('.', '/'));
TestUtil.visitConstantPool(cr, (item, constant) -> {
if (constant instanceof Type) {
Type type = (Type) constant;
assertThat("constant #" + item, type.getDescriptor(), not(containsString("java/lang/invoke")));
ConstantPool constantPool = TestUtil.getConstantPool(getClass().getName().replace('.', '/'));

for (Constant constant : constantPool.getConstantPool()) {
if (constant != null && constant.getTag() == Constants.CONSTANT_Class) {
String s = constantPool.constantToString(constant);
assertThat(s, not(containsString("java/lang/invoke")));
assertThat(s, not(containsString("java.lang.invoke")));
}
});
}
}
}

Expand Down
Expand Up @@ -4,7 +4,9 @@

package net.orfjackal.retrolambda.test;

import org.objectweb.asm.ClassReader;
import org.apache.bcel.classfile.*;

import java.io.*;

public class TestUtil {

Expand Down Expand Up @@ -33,21 +35,12 @@ public static String companionNameOf(Class<?> itf) {
return itf.getName() + "$";
}

public static void visitConstantPool(ClassReader reader, ConstantPoolVisitor visitor) {
char[] buf = new char[reader.getMaxStringLength()];
for (int item = 0; item < reader.getItemCount(); item++) {
try {
Object constant = reader.readConst(item, buf);
visitor.visit(item, constant);
} catch (Exception e) {
// XXX: constant pool entry which is a Methodref, InvokeDynamic or similar non-plain constant
// FIXME: readConst throws ArrayIndexOutOfBoundsException nearly all the time; how to use it???
//e.printStackTrace();
}
public static ConstantPool getConstantPool(String className) throws IOException {
String fileName = className + ".class";
try (InputStream in = TestUtil.class.getResourceAsStream("/" + fileName)) {
ClassParser parser = new ClassParser(in, className);
JavaClass javaClass = parser.parse();
return javaClass.getConstantPool();
}
}

public interface ConstantPoolVisitor {
void visit(int item, Object constant);
}
}
7 changes: 7 additions & 0 deletions parent/pom.xml
Expand Up @@ -90,6 +90,13 @@
<version>5.2</version>
</dependency>

<dependency>
<groupId>org.apache.bcel</groupId>
<artifactId>bcel</artifactId>
<!-- last version to support Java 5-->
<version>5.2</version>
</dependency>

<!-- Testing -->

<dependency>
Expand Down

0 comments on commit f9a14aa

Please sign in to comment.