< prev index next >
test/tools/javac/StringConcat/TestIndyStringConcat.java
Print this page
*** 19,74 ****
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @summary Test that StringConcat is working for JDK >= 9
* @compile -source 6 -target 6 TestIndyStringConcat.java
* @run main TestIndyStringConcat false
* @clean TestIndyStringConcat*
* @compile -source 7 -target 7 TestIndyStringConcat.java
* @run main TestIndyStringConcat false
* @clean TestIndyStringConcat*
* @compile -source 8 -target 8 TestIndyStringConcat.java
* @run main TestIndyStringConcat false
* @clean TestIndyStringConcat*
* @compile -XDstringConcat=inline -source 9 -target 9 TestIndyStringConcat.java
* @run main TestIndyStringConcat false
* @clean TestIndyStringConcat*
* @compile -XDstringConcat=indy -source 9 -target 9 TestIndyStringConcat.java
* @run main TestIndyStringConcat true
* @clean TestIndyStringConcat*
* @compile -XDstringConcat=indyWithConstants -source 9 -target 9 TestIndyStringConcat.java
* @run main TestIndyStringConcat true
*/
public class TestIndyStringConcat {
! private static class MyObject {
! public String toString() {
! throw new RuntimeException("Boyyaa");
}
}
! class Inner { }
!
! public static void main(String[] args) {
! boolean useIndyConcat = Boolean.valueOf(args[0]);
! try {
! String s = "Foo" + new MyObject();
! } catch (RuntimeException ex) {
! boolean indifiedStringConcat = false;
! ex.printStackTrace();
! for (StackTraceElement e : ex.getStackTrace()) {
! if (e.getClassName().contains("$$StringConcat") &&
! e.getMethodName().equals("concat")) {
! indifiedStringConcat = true;
! break;
}
}
- if (indifiedStringConcat != useIndyConcat) {
- throw new AssertionError();
}
}
}
}
--- 19,111 ----
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+ import com.sun.tools.classfile.*;
+ import com.sun.tools.classfile.BootstrapMethods_attribute.BootstrapMethodSpecifier;
+ import com.sun.tools.classfile.ConstantPool.CONSTANT_InvokeDynamic_info;
+ import com.sun.tools.classfile.ConstantPool.CONSTANT_MethodHandle_info;
+
+ import java.io.File;
+
/*
* @test
+ * @bug 8148483 8151516 8151223
* @summary Test that StringConcat is working for JDK >= 9
+ * @modules jdk.jdeps/com.sun.tools.classfile
+ *
+ * @clean TestIndyStringConcat*
* @compile -source 6 -target 6 TestIndyStringConcat.java
* @run main TestIndyStringConcat false
+ *
* @clean TestIndyStringConcat*
* @compile -source 7 -target 7 TestIndyStringConcat.java
* @run main TestIndyStringConcat false
+ *
* @clean TestIndyStringConcat*
* @compile -source 8 -target 8 TestIndyStringConcat.java
* @run main TestIndyStringConcat false
+ *
* @clean TestIndyStringConcat*
* @compile -XDstringConcat=inline -source 9 -target 9 TestIndyStringConcat.java
* @run main TestIndyStringConcat false
+ *
* @clean TestIndyStringConcat*
* @compile -XDstringConcat=indy -source 9 -target 9 TestIndyStringConcat.java
* @run main TestIndyStringConcat true
+ *
* @clean TestIndyStringConcat*
* @compile -XDstringConcat=indyWithConstants -source 9 -target 9 TestIndyStringConcat.java
* @run main TestIndyStringConcat true
*/
public class TestIndyStringConcat {
! static String other;
!
! public static String test() {
! return "Foo" + other;
! }
!
! public static void main(String[] args) throws Exception {
! boolean expected = Boolean.valueOf(args[0]);
! boolean actual = hasStringConcatFactoryCall("test");
! if (expected != actual) {
! throw new AssertionError("expected = " + expected + ", actual = " + actual);
}
}
! public static boolean hasStringConcatFactoryCall(String methodName) throws Exception {
! ClassFile classFile = ClassFile.read(new File(System.getProperty("test.classes", "."),
! TestIndyStringConcat.class.getName() + ".class"));
! ConstantPool constantPool = classFile.constant_pool;
!
! BootstrapMethods_attribute bsm_attr =
! (BootstrapMethods_attribute)classFile
! .getAttribute(Attribute.BootstrapMethods);
!
! for (Method method : classFile.methods) {
! if (method.getName(constantPool).equals(methodName)) {
! Code_attribute code = (Code_attribute) method.attributes
! .get(Attribute.Code);
! for (Instruction i : code.getInstructions()) {
! if (i.getOpcode() == Opcode.INVOKEDYNAMIC) {
! CONSTANT_InvokeDynamic_info indyInfo =
! (CONSTANT_InvokeDynamic_info) constantPool.get(i.getUnsignedShort(1));
!
! BootstrapMethodSpecifier bsmSpec =
! bsm_attr.bootstrap_method_specifiers[indyInfo.bootstrap_method_attr_index];
!
! CONSTANT_MethodHandle_info bsmInfo =
! (CONSTANT_MethodHandle_info) constantPool.get(bsmSpec.bootstrap_method_ref);
!
! if (bsmInfo.getCPRefInfo().getClassName().equals("java/lang/invoke/StringConcatFactory")) {
! return true;
! }
}
}
}
}
+ return false;
}
+
}
< prev index next >