< prev index next >
test/tools/javac/StringConcat/TestIndyStringConcat.java
Print this page
@@ -19,56 +19,93 @@
* 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 {
- private static class MyObject {
- public String toString() {
- throw new RuntimeException("Boyyaa");
+ 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);
}
}
- 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;
+ 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;
+ }
}
}
- if (indifiedStringConcat != useIndyConcat) {
- throw new AssertionError();
}
}
+ return false;
}
+
}
< prev index next >