< 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 >