@@ -207,6 +207,26 @@ public class ConstantPool implements Node { | |||
str = (constantToString(((ConstantCP) c).getClassIndex(), Constants.CONSTANT_Class) + "." + constantToString( | |||
((ConstantCP) c).getNameAndTypeIndex(), Constants.CONSTANT_NameAndType)); | |||
break; | |||
case Constants.CONSTANT_InvokeDynamic: | |||
ConstantInvokeDynamic cID = ((ConstantInvokeDynamic)c); | |||
return "#"+cID.getBootstrapMethodAttrIndex()+"."+constantToString(cID.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType); | |||
case Constants.CONSTANT_MethodHandle: | |||
ConstantMethodHandle cMH = ((ConstantMethodHandle)c); | |||
return cMH.getReferenceKind()+":"+constantToString(cMH.getReferenceIndex(),Constants.CONSTANT_Methodref); | |||
case Constants.CONSTANT_MethodType: | |||
ConstantMethodType cMT = (ConstantMethodType)c; | |||
return constantToString(cMT.getDescriptorIndex(),Constants.CONSTANT_Utf8); | |||
case Constants.CONSTANT_Module: | |||
ConstantModule cM = (ConstantModule)c; | |||
return "Module:"+constantToString(cM.getNameIndex(),Constants.CONSTANT_Utf8); | |||
case Constants.CONSTANT_Package: | |||
ConstantPackage cP = (ConstantPackage)c; | |||
return "Package:"+constantToString(cP.getNameIndex(),Constants.CONSTANT_Utf8); | |||
default: // Never reached | |||
throw new RuntimeException("Unknown constant type " + c.tag); | |||
@@ -254,6 +274,7 @@ public class ConstantPool implements Node { | |||
return constantToString(getConstant(index)); | |||
} | |||
@Override | |||
public void accept(ClassVisitor v) { | |||
v.visitConstantPool(this); | |||
} |
@@ -0,0 +1,8 @@ | |||
# Use Java9 or later to compile this | |||
cd one | |||
javac Code.java | |||
jar -cvMf ../../lambda.jar Code.class | |||
rm Code.class | |||
cd .. |
@@ -0,0 +1,7 @@ | |||
public class Code { | |||
public static void main(String[] args) { | |||
Runnable r = () -> { System.out.println("hello world!"); }; | |||
r.run(); | |||
} | |||
} |
@@ -25,6 +25,7 @@ public class AllTests { | |||
suite.addTestSuite(Fundamentals.class); | |||
suite.addTestSuite(RuntimeVisibleParameterAnnotationAttributeTest.class); | |||
suite.addTestSuite(AnnotationDefaultAttributeTest.class); | |||
suite.addTestSuite(ConstantPoolToStringTest.class); | |||
suite.addTestSuite(EnclosingMethodAttributeTest.class); | |||
suite.addTestSuite(MethodAnnotationsTest.class); | |||
suite.addTestSuite(RuntimeVisibleAnnotationAttributeTest.class); |
@@ -0,0 +1,54 @@ | |||
/* ******************************************************************* | |||
* Copyright (c) 2018 Contributors | |||
* All rights reserved. | |||
* This program and the accompanying materials are made available | |||
* under the terms of the Eclipse Public License v1.0 | |||
* which accompanies this distribution and is available at | |||
* http://www.eclipse.org/legal/epl-v10.html | |||
* | |||
* Contributors: | |||
* Andy Clement - initial implementation | |||
* ******************************************************************/ | |||
package org.aspectj.apache.bcel.classfile.tests; | |||
import org.aspectj.apache.bcel.classfile.ConstantPool; | |||
import org.aspectj.apache.bcel.classfile.JavaClass; | |||
import org.aspectj.apache.bcel.classfile.Method; | |||
import org.aspectj.apache.bcel.util.SyntheticRepository; | |||
public class ConstantPoolToStringTest extends BcelTestCase { | |||
@Override | |||
protected void setUp() throws Exception { | |||
super.setUp(); | |||
} | |||
public void testToStringLambdaElements() throws ClassNotFoundException { | |||
SyntheticRepository repos = createRepos("lambda.jar"); | |||
JavaClass clazz = repos.loadClass("Code"); | |||
ConstantPool pool = clazz.getConstantPool(); | |||
Method[] methods = clazz.getMethods(); | |||
String codeString = methods[1].getCode().getCodeString(); | |||
assertEquals("Code(max_stack = 1, max_locals = 2, code_length = 13)\n" + | |||
"0: invokedynamic #0.run ()Ljava/lang/Runnable; (2)\n" + | |||
"5: astore_1\n" + | |||
"6: aload_1\n" + | |||
"7: invokeinterface java.lang.Runnable.run ()V (3) 1 0\n" + | |||
"12: return\n",codeString); | |||
// #20 = MethodHandle 6:#32 // REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; | |||
String cts = pool.constantToString(pool.getConstant(20)); | |||
assertEquals("6:java.lang.invoke.LambdaMetafactory.metafactory (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;",cts); | |||
// #21 = MethodType #10 // ()V | |||
cts = pool.constantToString(pool.getConstant(21)); | |||
assertEquals("()V",cts); | |||
} | |||
@Override | |||
protected void tearDown() throws Exception { | |||
super.tearDown(); | |||
} | |||
} |
@@ -4,8 +4,8 @@ | |||
<taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"/> | |||
<target name="package" description="Jarjar asm-5.0.4.jar and prefix package name with aj"> | |||
<jarjar destfile="asm-6.0_BETA.renamed.jar"> | |||
<zipfileset src="asm-6.0_BETA.jar" excludes="module-info.class"/> | |||
<jarjar destfile="asm-6.0.renamed.jar"> | |||
<zipfileset src="asm-6.0.jar" excludes="module-info.class"/> | |||
<rule pattern="org.objectweb.asm.**" result="aj.org.objectweb.asm.@1"/> | |||
</jarjar> | |||
</target> |
@@ -1 +0,0 @@ | |||
asm 2.0 is used by some tests |
@@ -13,6 +13,6 @@ | |||
<classpathentry kind="lib" path="/lib/bcel/bcel.jar" sourcepath="/lib/bcel/bcel-src.zip"/> | |||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/> | |||
<classpathentry combineaccessrules="false" kind="src" path="/org.aspectj.matcher"/> | |||
<classpathentry kind="lib" path="/lib/asm/asm-6.0_BETA.renamed.jar"/> | |||
<classpathentry kind="lib" path="/lib/asm/asm-6.0.renamed.jar"/> | |||
<classpathentry kind="output" path="bin"/> | |||
</classpath> |