TestStringIntrinsics2.java revision 10049:73443d24e529
1215976Sjmallett/* 2232812Sjmallett * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. 3215976Sjmallett * Copyright (c) 2016 SAP SE. All rights reserved. 4215976Sjmallett * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5215976Sjmallett * 6215976Sjmallett * This code is free software; you can redistribute it and/or modify it 7215976Sjmallett * under the terms of the GNU General Public License version 2 only, as 8215976Sjmallett * published by the Free Software Foundation. 9215976Sjmallett * 10215976Sjmallett * This code is distributed in the hope that it will be useful, but WITHOUT 11215976Sjmallett * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12215976Sjmallett * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13215976Sjmallett * version 2 for more details (a copy is included in the LICENSE file that 14215976Sjmallett * accompanied this code). 15215976Sjmallett * 16215976Sjmallett * You should have received a copy of the GNU General Public License version 17215976Sjmallett * 2 along with this work; if not, write to the Free Software Foundation, 18232812Sjmallett * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19215976Sjmallett * 20215976Sjmallett * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21215976Sjmallett * or visit www.oracle.com if you need additional information or have any 22215976Sjmallett * questions. 23215976Sjmallett */ 24215976Sjmallett 25215976Sjmallett/* 26215976Sjmallett * @test 27215976Sjmallett * @bug 8145336 28215976Sjmallett * @summary PPC64: fix string intrinsics after CompactStrings change 29232812Sjmallett * @library /testlibrary /../../test/lib 30215976Sjmallett * @build sun.hotspot.WhiteBox 31215976Sjmallett * @run main ClassFileInstaller sun.hotspot.WhiteBox 32215976Sjmallett * sun.hotspot.WhiteBox$WhiteBoxPermission 33215976Sjmallett * 34215976Sjmallett * @run main/othervm 35215976Sjmallett * -Xbootclasspath/a:. 36215976Sjmallett * -XX:+UnlockDiagnosticVMOptions 37215976Sjmallett * -XX:+WhiteBoxAPI 38215976Sjmallett * -XX:MaxInlineSize=100 39215976Sjmallett * -XX:MinInliningThreshold=0 40215976Sjmallett * TestStringIntrinsics2 41215976Sjmallett */ 42215976Sjmallett 43215976Sjmallettimport java.lang.annotation.ElementType; 44215976Sjmallettimport java.lang.annotation.RetentionPolicy; 45215976Sjmallettimport java.lang.annotation.Retention; 46215976Sjmallettimport java.lang.annotation.Target; 47215976Sjmallettimport java.lang.reflect.Method; 48215976Sjmallettimport java.util.Arrays; 49215976Sjmallettimport java.util.function.Consumer; 50215976Sjmallettimport java.util.function.Function; 51215976Sjmallett 52232812Sjmallettimport static jdk.test.lib.Asserts.*; 53232812Sjmallettimport sun.hotspot.WhiteBox; 54215976Sjmallett 55215976Sjmallettpublic class TestStringIntrinsics2 { 56215976Sjmallett // ------------------------------------------------------------------------ 57215976Sjmallett // 58215976Sjmallett // We test the following cases: 59215976Sjmallett // - no match in string. Do we miss the end condition? Will crash if we read 60215976Sjmallett // past the string. 61215976Sjmallett // - no match in string, but after the string there is a match. 62215976Sjmallett // Do we incorrectly report this match? We had a case where we stepped 63215976Sjmallett // a few chars past the string, this test would report that error. The 64215976Sjmallett // one above would not. 65215976Sjmallett // - The needle is exactly at the end of the string. 66215976Sjmallett // - The needle spans the end of the string 67215976Sjmallett // 68215976Sjmallett // A special case are needles of length 1. For these we test: 69215976Sjmallett // - needle is first char 70215976Sjmallett // - needle is last char 71215976Sjmallett // - no match 72215976Sjmallett // - match behind string. 73215976Sjmallett // 74215976Sjmallett // We test all these for an unknown needle, and needles known to the compiler 75215976Sjmallett // of lengths 5, 2 and 1. 76215976Sjmallett 77215976Sjmallett 78215976Sjmallett private static final WhiteBox WB = WhiteBox.getWhiteBox(); 79215976Sjmallett 80215976Sjmallett public enum Role { 81215976Sjmallett TEST_ENTRY, 82215976Sjmallett TEST_HELPER 83215976Sjmallett } 84215976Sjmallett 85215976Sjmallett @Retention(RetentionPolicy.RUNTIME) 86215976Sjmallett @Target(ElementType.METHOD) 87215976Sjmallett @interface Test { 88215976Sjmallett Role role(); 89215976Sjmallett int compileAt() default 0; 90215976Sjmallett int warmup() default 0; 91215976Sjmallett String[] warmupArgs() default {}; 92215976Sjmallett } 93215976Sjmallett 94215976Sjmallett // All this mess is needed to avoid try/catch inside the lambdas below. 95215976Sjmallett // See: http://stackoverflow.com/questions/27644361/how-can-i-throw-checked-exceptions-from-inside-java-8-streams 96215976Sjmallett @SuppressWarnings ("unchecked") 97215976Sjmallett private static <E extends Throwable> void throwAsUnchecked(Exception exception) throws E { 98215976Sjmallett throw (E)exception; 99215976Sjmallett } 100215976Sjmallett @FunctionalInterface 101215976Sjmallett public interface Consumer_WithExceptions<T, E extends Exception> { 102215976Sjmallett void accept(T t) throws E; 103215976Sjmallett } 104215976Sjmallett public static <T, E extends Exception> Consumer<T> rethrowConsumer(Consumer_WithExceptions<T, E> consumer) { 105215976Sjmallett return t -> { 106215976Sjmallett try { consumer.accept(t); } 107215976Sjmallett catch (Exception exception) { throwAsUnchecked(exception); } 108215976Sjmallett }; 109215976Sjmallett } 110215976Sjmallett 111215976Sjmallett public static void main(String[] args) throws Exception { 112215976Sjmallett 113215976Sjmallett // Warmup helper methods 114215976Sjmallett Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods()) 115215976Sjmallett .filter(m -> m.isAnnotationPresent(Test.class)) 116215976Sjmallett .filter(m -> m.getAnnotation(Test.class).warmup() > 0) 117215976Sjmallett .forEach(rethrowConsumer(m -> { 118215976Sjmallett Test a = m.getAnnotation(Test.class); 119215976Sjmallett System.out.println("Warming up " + m + " " + a.warmup() + " time(s) "); 120215976Sjmallett for (int i=0; i < a.warmup(); i++) { 121215976Sjmallett m.invoke(null, (Object[])a.warmupArgs()); 122215976Sjmallett } 123215976Sjmallett })); 124215976Sjmallett 125215976Sjmallett // Compile helper methods 126215976Sjmallett Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods()) 127215976Sjmallett .filter(m -> m.isAnnotationPresent(Test.class)) 128215976Sjmallett .filter(m -> m.getAnnotation(Test.class).compileAt() > 0) 129215976Sjmallett .forEach(rethrowConsumer(m -> { 130215976Sjmallett Test a = m.getAnnotation(Test.class); 131215976Sjmallett if (WB.isMethodCompilable(m, a.compileAt())) { 132215976Sjmallett WB.enqueueMethodForCompilation(m, a.compileAt()); 133215976Sjmallett while (WB.isMethodQueuedForCompilation(m)) Thread.sleep(10); 134215976Sjmallett System.out.println(m + " compiled at " + WB.getMethodCompilationLevel(m)); 135215976Sjmallett } else { 136215976Sjmallett System.out.println("Can't compile " + m + " at level " + a.compileAt()); 137215976Sjmallett } 138215976Sjmallett })); 139215976Sjmallett 140215976Sjmallett // Run test methods 141215976Sjmallett Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods()) 142215976Sjmallett .filter(m -> m.isAnnotationPresent(Test.class)) 143215976Sjmallett .filter(m -> m.getAnnotation(Test.class).role() == Role.TEST_ENTRY) 144215976Sjmallett .forEach(rethrowConsumer(m -> { 145215976Sjmallett System.out.print("Executing " + m); 146215976Sjmallett m.invoke(null, (Object[])null); 147215976Sjmallett System.out.println(" - OK"); 148215976Sjmallett })); 149215976Sjmallett } 150215976Sjmallett 151215976Sjmallett static String text = "<t><t><t><t><t><t>\n" + "<hit>"; 152215976Sjmallett static String text2 = "<t><t><t><t><t><t><t>\n" + "<hit>"; 153215976Sjmallett static String[] ss = text.split("\n"); 154215976Sjmallett static String[] ss2 = null; 155215976Sjmallett static String needle = "<miss>"; 156215976Sjmallett 157215976Sjmallett @Test(role = Role.TEST_ENTRY) 158215976Sjmallett public static void test_indexOf_no_match() { 159215976Sjmallett int res = indexOf_no_match_unknown_needle(ss[0], "<miss>"); 160215976Sjmallett assertEquals(res, -1, "test_indexOf_no_match_unknown_needle matched at: " + res); 161215976Sjmallett res = indexOf_no_match_imm_needle(ss[0]); 162215976Sjmallett assertEquals(res, -1, "test_indexOf_no_match_imm_needle matched at: " + res); 163215976Sjmallett res = indexOf_no_match_imm2_needle(ss[0]); 164215976Sjmallett assertEquals(res, -1, "test_indexOf_no_match_imm2_needle matched at: " + res); 165215976Sjmallett 166215976Sjmallett if (ss2 == null) ss2 = text.split("\n"); 167215976Sjmallett res = indexOf_no_match_unknown_needle(ss2[0], "<miss>"); 168215976Sjmallett assertEquals(res, -1, "test_indexOf_no_match_unknown_needle matched at: " + res); 169215976Sjmallett res = indexOf_no_match_imm_needle(ss2[0]); 170215976Sjmallett assertEquals(res, -1, "test_indexOf_no_match_imm_needle matched at: " + res); 171215976Sjmallett res = indexOf_no_match_imm2_needle(ss2[0]); 172215976Sjmallett assertEquals(res, -1, "test_indexOf_no_match_imm2_needle matched at: " + res); 173215976Sjmallett res = indexOf_no_match_imm1_needle(ss2[0]); 174215976Sjmallett assertEquals(res, -1, "test_indexOf_no_match_imm1_needle matched at: " + res); 175215976Sjmallett } 176215976Sjmallett 177215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>", "<miss>" }) 178215976Sjmallett static int indexOf_no_match_unknown_needle(String s, String needle) { 179215976Sjmallett int index = s.indexOf(needle); 180215976Sjmallett return index; 181215976Sjmallett } 182215976Sjmallett 183215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" }) 184215976Sjmallett static int indexOf_no_match_imm_needle(String s) { 185215976Sjmallett int index = s.indexOf("<hitt>"); 186215976Sjmallett return index; 187215976Sjmallett } 188215976Sjmallett 189215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" }) 190215976Sjmallett static int indexOf_no_match_imm2_needle(String s) { 191215976Sjmallett int index = s.indexOf("<m"); 192215976Sjmallett return index; 193215976Sjmallett } 194232812Sjmallett 195215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" }) 196232812Sjmallett static int indexOf_no_match_imm1_needle(String s) { 197232812Sjmallett int index = s.indexOf("m"); 198215976Sjmallett return index; 199215976Sjmallett } 200215976Sjmallett 201215976Sjmallett @Test(role = Role.TEST_ENTRY) 202215976Sjmallett public static void test_indexOf_reads_past_string() { 203215976Sjmallett if (ss == null) ss = text.split("\n"); 204215976Sjmallett String res = indexOf_reads_past_string_unknown_needle(ss[0], "<hit>"); 205215976Sjmallett assertEquals(res, null, "test_indexOf_reads_past_string_unknown_needle " + res); 206215976Sjmallett res = indexOf_reads_past_string_imm_needle(ss[0]); 207215976Sjmallett assertEquals(res, null, "test_indexOf_reads_past_string_imm_needle " + res); 208215976Sjmallett res = indexOf_reads_past_string_imm2_needle(ss[0]); 209215976Sjmallett assertEquals(res, null, "test_indexOf_reads_past_string_imm2_needle " + res); 210215976Sjmallett res = indexOf_reads_past_string_imm1_needle(ss[0]); 211215976Sjmallett assertEquals(res, null, "test_indexOf_reads_past_string_imm1_needle " + res); 212215976Sjmallett } 213215976Sjmallett 214215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>", "<hit>" }) 215215976Sjmallett static String indexOf_reads_past_string_unknown_needle(String s, String needle) { 216215976Sjmallett int index = s.indexOf(needle); 217215976Sjmallett if (index > s.length()) { 218215976Sjmallett return "Found needle \"" + needle + "\" behind string of length " + s.length() 219215976Sjmallett + " at position " + index + "."; 220215976Sjmallett } 221215976Sjmallett return null; 222215976Sjmallett } 223215976Sjmallett 224215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" }) 225215976Sjmallett static String indexOf_reads_past_string_imm_needle(String s) { 226215976Sjmallett int index = s.indexOf("<hit>"); 227215976Sjmallett if (index > s.length()) { 228215976Sjmallett return "Found needle \"<hit>\" behind string of length " + s.length() + " at position " + index + "."; 229215976Sjmallett } 230215976Sjmallett return null; 231215976Sjmallett } 232215976Sjmallett 233215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" }) 234215976Sjmallett static String indexOf_reads_past_string_imm2_needle(String s) { 235215976Sjmallett int index = s.indexOf("<h"); 236215976Sjmallett if (index > s.length()) { 237215976Sjmallett return "Found needle \"<h\" behind string of length " + s.length() + " at position " + index + "."; 238215976Sjmallett } 239215976Sjmallett return null; 240215976Sjmallett } 241215976Sjmallett 242215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" }) 243215976Sjmallett static String indexOf_reads_past_string_imm1_needle(String s) { 244215976Sjmallett int index = s.indexOf("h"); 245232812Sjmallett if (index > s.length()) { 246215976Sjmallett return "Found needle \"<h\" behind string of length " + s.length() + " at position " + index + "."; 247232812Sjmallett } 248232812Sjmallett return null; 249215976Sjmallett } 250215976Sjmallett 251215976Sjmallett static String text3 = "<t><hi><t><h><hit<t><hit>"; 252215976Sjmallett static String text4 = "a<t><hi><t><h><hit<t><hit>"; 253215976Sjmallett static String text5 = "gg<t><hi><t><h><hit<t><hit>"; 254215976Sjmallett static String text6 = "ccc<t><hi><t><h><hit<t><hit>"; 255215976Sjmallett static int len3 = text3.length(); 256215976Sjmallett static int len4 = text4.length(); 257215976Sjmallett static int len5 = text5.length(); 258215976Sjmallett static int len6 = text6.length(); 259215976Sjmallett 260215976Sjmallett static String text7 = "<t><t><t><t><t<t><h"; 261215976Sjmallett static String text8 = "a<t><t><t><t><t<t><h"; 262215976Sjmallett static String text9 = "gg<t><t><t><t><t<t><h"; 263215976Sjmallett static String text10 = "ccc<t><t><t><t><t<t><h"; 264215976Sjmallett 265215976Sjmallett @Test(role = Role.TEST_ENTRY) 266215976Sjmallett public static void test_indexOf_match_at_end_of_string() { 267215976Sjmallett String testname = "test_indexOf_match_at_end_of_string"; 268215976Sjmallett int res = 0; 269215976Sjmallett res = indexOf_match_at_end_of_string_unknown_needle(text3, "<hit>"); 270215976Sjmallett assertEquals(len3, res + 5, testname); 271215976Sjmallett res = indexOf_match_at_end_of_string_unknown_needle(text4, "<hit>"); 272215976Sjmallett assertEquals(len4, res + 5, testname); 273215976Sjmallett res = indexOf_match_at_end_of_string_unknown_needle(text5, "<hit>"); 274215976Sjmallett assertEquals(len5, res + 5, testname); 275215976Sjmallett res = indexOf_match_at_end_of_string_unknown_needle(text6, "<hit>"); 276215976Sjmallett assertEquals(len6, res + 5, testname); 277215976Sjmallett 278215976Sjmallett res = indexOf_match_at_end_of_string_imm_needle(text3); 279215976Sjmallett assertEquals(len3, res + 5, testname); 280215976Sjmallett res = indexOf_match_at_end_of_string_imm_needle(text4); 281215976Sjmallett assertEquals(len4, res + 5, testname); 282215976Sjmallett res = indexOf_match_at_end_of_string_imm_needle(text5); 283215976Sjmallett assertEquals(len5, res + 5, testname); 284215976Sjmallett res = indexOf_match_at_end_of_string_imm_needle(text6); 285215976Sjmallett assertEquals(len6, res + 5, testname); 286215976Sjmallett 287215976Sjmallett res = indexOf_match_at_end_of_string_imm2_needle(text7); 288215976Sjmallett assertEquals(text7.length(), res + 2, testname); 289215976Sjmallett res = indexOf_match_at_end_of_string_imm2_needle(text8); 290232812Sjmallett assertEquals(text8.length(), res + 2, testname); 291215976Sjmallett res = indexOf_match_at_end_of_string_imm2_needle(text9); 292232812Sjmallett assertEquals(text9.length(), res + 2, testname); 293232812Sjmallett res = indexOf_match_at_end_of_string_imm2_needle(text10); 294215976Sjmallett assertEquals(text10.length(), res + 2, testname); 295215976Sjmallett 296215976Sjmallett res = indexOf_match_at_end_of_string_imm1_needle(text7); 297215976Sjmallett assertEquals(text7.length(), res + 1, testname); 298215976Sjmallett res = indexOf_match_at_end_of_string_imm1_needle(text8); 299215976Sjmallett assertEquals(text8.length(), res + 1, testname); 300215976Sjmallett res = indexOf_match_at_end_of_string_imm1_needle(text9); 301215976Sjmallett assertEquals(text9.length(), res + 1, testname); 302215976Sjmallett res = indexOf_match_at_end_of_string_imm1_needle(text10); 303215976Sjmallett assertEquals(text10.length(), res + 1, testname); 304215976Sjmallett } 305215976Sjmallett 306215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>", "<hit>" }) 307215976Sjmallett static int indexOf_match_at_end_of_string_unknown_needle(String s, String needle) { 308215976Sjmallett int index = s.indexOf(needle); 309215976Sjmallett return index; 310215976Sjmallett } 311215976Sjmallett 312215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" }) 313215976Sjmallett static int indexOf_match_at_end_of_string_imm_needle(String s) { 314215976Sjmallett int index = s.indexOf("<hit>"); 315215976Sjmallett return index; 316215976Sjmallett } 317215976Sjmallett 318215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" }) 319215976Sjmallett static int indexOf_match_at_end_of_string_imm2_needle(String s) { 320215976Sjmallett int index = s.indexOf("<h"); 321215976Sjmallett return index; 322215976Sjmallett } 323215976Sjmallett 324215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" }) 325215976Sjmallett static int indexOf_match_at_end_of_string_imm1_needle(String s) { 326215976Sjmallett int index = s.indexOf("h"); 327215976Sjmallett return index; 328215976Sjmallett } 329215976Sjmallett 330215976Sjmallett static String s0_1 = text3.substring(0, len3-1); 331215976Sjmallett static String s0_2 = text3.substring(0, len3-2); 332215976Sjmallett static String s0_3 = text3.substring(0, len3-3); 333215976Sjmallett static String s0_4 = text3.substring(0, len3-4); 334215976Sjmallett static String s1_1 = text4.substring(0, len4-1); 335232812Sjmallett static String s1_2 = text4.substring(0, len4-2); 336215976Sjmallett static String s1_3 = text4.substring(0, len4-3); 337232812Sjmallett static String s1_4 = text4.substring(0, len4-4); 338232812Sjmallett static String s2_1 = text5.substring(0, len5-1); 339215976Sjmallett static String s2_2 = text5.substring(0, len5-2); 340215976Sjmallett static String s2_3 = text5.substring(0, len5-3); 341215976Sjmallett static String s2_4 = text5.substring(0, len5-4); 342215976Sjmallett static String s3_1 = text6.substring(0, len6-1); 343215976Sjmallett static String s3_2 = text6.substring(0, len6-2); 344215976Sjmallett static String s3_3 = text6.substring(0, len6-3); 345215976Sjmallett static String s3_4 = text6.substring(0, len6-4); 346215976Sjmallett 347215976Sjmallett static String s0_1x = text7 .substring(0, text7 .length()-1); 348215976Sjmallett static String s1_1x = text8 .substring(0, text8 .length()-1); 349215976Sjmallett static String s2_1x = text9 .substring(0, text9 .length()-1); 350215976Sjmallett static String s3_1x = text10.substring(0, text10.length()-1); 351215976Sjmallett 352215976Sjmallett @Test(role = Role.TEST_ENTRY) 353215976Sjmallett public static void test_indexOf_match_spans_end_of_string() { 354215976Sjmallett String res = null; 355215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s0_1, "<hit>"); 356215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_1 " + res); 357215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s0_2, "<hit>"); 358215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_2 " + res); 359215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s0_3, "<hit>"); 360215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_3 " + res); 361215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s0_4, "<hit>"); 362215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_4 " + res); 363215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s1_1, "<hit>"); 364215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_1 " + res); 365215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s1_2, "<hit>"); 366215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_2 " + res); 367215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s1_3, "<hit>"); 368215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_3 " + res); 369215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s1_4, "<hit>"); 370215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_4 " + res); 371215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s2_1, "<hit>"); 372215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_1 " + res); 373215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s2_2, "<hit>"); 374215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_2 " + res); 375215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s2_3, "<hit>"); 376215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_3 " + res); 377215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s2_4, "<hit>"); 378215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_4 " + res); 379215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s3_1, "<hit>"); 380215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_1 " + res); 381232812Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s3_2, "<hit>"); 382215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_2 " + res); 383232812Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s3_3, "<hit>"); 384232812Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_3 " + res); 385215976Sjmallett res = indexOf_match_spans_end_of_string_unknown_needle(s3_4, "<hit>"); 386215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_4 " + res); 387215976Sjmallett 388215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s0_1); 389215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_1 " + res); 390215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s0_2); 391215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_2 " + res); 392215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s0_3); 393215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_3 " + res); 394215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s0_4); 395215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_4 " + res); 396215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s1_1); 397215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_1 " + res); 398215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s1_2); 399215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_2 " + res); 400215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s1_3); 401215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_3 " + res); 402215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s1_4); 403215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_4 " + res); 404215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s2_1); 405215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_1 " + res); 406215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s2_2); 407215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_2 " + res); 408215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s2_3); 409215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_3 " + res); 410215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s2_4); 411215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_4 " + res); 412215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s3_1); 413215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_1 " + res); 414215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s3_2); 415215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_2 " + res); 416215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s3_3); 417215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_3 " + res); 418215976Sjmallett res = indexOf_match_spans_end_of_string_imm_needle(s3_4); 419215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_4 " + res); 420215976Sjmallett 421215976Sjmallett res = indexOf_match_spans_end_of_string_imm2_needle(s0_1x); 422215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s0_1x " + res); 423215976Sjmallett res = indexOf_match_spans_end_of_string_imm2_needle(s1_1x); 424215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s1_1x " + res); 425215976Sjmallett res = indexOf_match_spans_end_of_string_imm2_needle(s2_1x); 426215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s2_1x " + res); 427215976Sjmallett res = indexOf_match_spans_end_of_string_imm2_needle(s3_1x); 428215976Sjmallett assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s3_1x " + res); 429215976Sjmallett } 430215976Sjmallett 431215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit", "<hit>" }) 432215976Sjmallett static String indexOf_match_spans_end_of_string_unknown_needle(String s, String needle) { 433215976Sjmallett int index = s.indexOf(needle); 434215976Sjmallett if (index > -1) { 435215976Sjmallett return "Found needle \"" + needle + "\" that is spanning the end of the string: " + s + "."; 436215976Sjmallett } 437215976Sjmallett return null; 438215976Sjmallett } 439215976Sjmallett 440215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit" }) 441215976Sjmallett static String indexOf_match_spans_end_of_string_imm_needle(String s) { 442215976Sjmallett int index = s.indexOf("<hit>"); 443232812Sjmallett if (index > -1) { 444215976Sjmallett return "Found needle \"<hit>\" that is spanning the end of the string: " + s + "."; 445232812Sjmallett } 446232812Sjmallett return null; 447215976Sjmallett } 448215976Sjmallett 449215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t><t><t<t><" }) 450215976Sjmallett static String indexOf_match_spans_end_of_string_imm2_needle(String s) { 451215976Sjmallett int index = s.indexOf("<h"); 452215976Sjmallett if (index > -1) { 453215976Sjmallett return "Found needle \"<h\" that is spanning the end of the string: " + s + "."; 454215976Sjmallett } 455215976Sjmallett return null; 456215976Sjmallett } 457215976Sjmallett 458215976Sjmallett static String text16 = "ooooooo"; 459215976Sjmallett static String text11 = "1ooooooo"; 460215976Sjmallett static String text12 = "ooooooo1"; 461215976Sjmallett static String text13 = "oooooooo1"; 462215976Sjmallett static String text14 = "ooooooooo1"; 463215976Sjmallett static String text15 = "oooooooooo1"; 464215976Sjmallett static int len12 = text12.length(); 465215976Sjmallett static int len13 = text13.length(); 466232812Sjmallett static int len14 = text14.length(); 467232812Sjmallett static int len15 = text15.length(); 468215976Sjmallett 469215976Sjmallett static String text12_1 = text12.substring(0, len12-1); 470215976Sjmallett static String text13_1 = text13.substring(0, len13-1); 471215976Sjmallett static String text14_1 = text14.substring(0, len14-1); 472215976Sjmallett static String text15_1 = text15.substring(0, len15-1); 473215976Sjmallett 474215976Sjmallett @Test(role = Role.TEST_ENTRY) 475215976Sjmallett public static void test_indexOf_imm1_needle() { 476215976Sjmallett assertEquals( -1, indexOf_imm1_needle(text16), "test_indexOf_imm1_needle no_match"); 477215976Sjmallett 478215976Sjmallett assertEquals( 0, indexOf_imm1_needle(text11), "test_indexOf_imm1_needle first_matches"); 479215976Sjmallett 480215976Sjmallett assertEquals(len12-1, indexOf_imm1_needle(text12), "test_indexOf_imm1_needle last_matches"); 481215976Sjmallett assertEquals(len13-1, indexOf_imm1_needle(text13), "test_indexOf_imm1_needle last_matches"); 482215976Sjmallett assertEquals(len14-1, indexOf_imm1_needle(text14), "test_indexOf_imm1_needle last_matches"); 483215976Sjmallett assertEquals(len15-1, indexOf_imm1_needle(text15), "test_indexOf_imm1_needle last_matches"); 484232812Sjmallett 485232812Sjmallett assertEquals( -1, indexOf_imm1_needle(text12_1), "test_indexOf_imm1_needle walked_past"); 486215976Sjmallett assertEquals( -1, indexOf_imm1_needle(text13_1), "test_indexOf_imm1_needle walked_past"); 487215976Sjmallett assertEquals( -1, indexOf_imm1_needle(text14_1), "test_indexOf_imm1_needle walked_past"); 488215976Sjmallett assertEquals( -1, indexOf_imm1_needle(text15_1), "test_indexOf_imm1_needle walked_past"); 489215976Sjmallett } 490215976Sjmallett 491215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "ooooooo1" }) 492215976Sjmallett static int indexOf_imm1_needle(String s) { 493215976Sjmallett return s.indexOf("1"); 494215976Sjmallett } 495215976Sjmallett 496215976Sjmallett 497215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "abc", "abcd" }) 498215976Sjmallett public static int asmStringCompareTo(String a, String b) { 499215976Sjmallett return a.compareTo(b); 500215976Sjmallett } 501215976Sjmallett 502215976Sjmallett @Test(role = Role.TEST_ENTRY) 503232812Sjmallett public static void test_asmStringCompareTo() { 504232812Sjmallett // null 505215976Sjmallett try { 506215976Sjmallett asmStringCompareTo("not null", null); 507215976Sjmallett assertTrue(false, 508215976Sjmallett "TestOther.asmStringCompareTo(\"not null\", null) doesn't throw exception"); 509215976Sjmallett } catch (NullPointerException e) { 510215976Sjmallett assertEquals("java.lang.String.compareTo", 511215976Sjmallett e.getStackTrace()[0].getClassName() + "." + 512215976Sjmallett e.getStackTrace()[0].getMethodName(), 513215976Sjmallett "TestOther.asmStringCompareTo(\"not null\", null) throws exception"); 514215976Sjmallett } 515215976Sjmallett 516215976Sjmallett // ==0 517215976Sjmallett { 518232812Sjmallett // check length 0 optimization 519232812Sjmallett assertEquals(0, asmStringCompareTo("", ""), 520215976Sjmallett "TestOther.asmStringCompareTo(\"\", \"\")"); 521215976Sjmallett 522215976Sjmallett // check first character optimization 523215976Sjmallett assertEquals(0, asmStringCompareTo("A", "A"), 524215976Sjmallett "TestOther.asmStringCompareTo(\"A\", \"A\")"); 525215976Sjmallett 526215976Sjmallett // check real comparisons 527215976Sjmallett assertEquals(0, asmStringCompareTo(new String("eq") + new String("ual"), "equal"), 528215976Sjmallett "TestOther.asmStringCompareTo(\"equal\", \"equal\")"); 529215976Sjmallett assertEquals(0, asmStringCompareTo("textABC", "textABC"), 530215976Sjmallett "TestOther.asmStringCompareTo(\"textABC\", \"textABC\")"); 531215976Sjmallett assertEquals(0, 532215976Sjmallett asmStringCompareTo(new String("abcdefgh01234") + 533215976Sjmallett new String("56abcdefgh0123456abcdefgh0123456"), 534215976Sjmallett "abcdefgh0123456abcdefgh0123456abcdefgh0123456"), 535215976Sjmallett "TestOther.asmStringCompareTo(\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\", " + 536215976Sjmallett "\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\")"); 537232812Sjmallett } 538232812Sjmallett 539215976Sjmallett // <0 540215976Sjmallett { 541215976Sjmallett // check first character optimization 542215976Sjmallett assertEquals(-1, asmStringCompareTo("4", "5"), 543215976Sjmallett "TestOther.asmStringCompareTo(\"4\", \"5\")"); 544215976Sjmallett 545215976Sjmallett // check real comparisons 546215976Sjmallett assertEquals(-1, asmStringCompareTo("diff4", "diff5"), 547215976Sjmallett "TestOther.asmStringCompareTo(\"diff4\", \"diff5\")"); 548215976Sjmallett assertEquals(-10, asmStringCompareTo("", "123456789A"), 549215976Sjmallett "TestOther.asmStringCompareTo(\"\", \"123456789A\")"); 550215976Sjmallett assertEquals(-10, asmStringCompareTo("ZYX", "ZYX123456789A"), 551215976Sjmallett "TestOther.asmStringCompareTo(\"ZYX\", \"ZYX123456789A\")"); 552215976Sjmallett } 553215976Sjmallett 554215976Sjmallett // >0 555215976Sjmallett { 556215976Sjmallett // check first character optimization 557215976Sjmallett assertEquals(1, asmStringCompareTo("5", "4"), 558215976Sjmallett "TestOther.asmStringCompareTo(\"5\", \"4\")"); 559215976Sjmallett 560215976Sjmallett // check real comparisons 561215976Sjmallett assertEquals(1, asmStringCompareTo("diff5", "diff4"), 562215976Sjmallett "TestOther.asmStringCompareTo(\"diff5\", \"diff4\")"); 563215976Sjmallett assertEquals(10, asmStringCompareTo("123456789A", ""), 564215976Sjmallett "TestOther.asmStringCompareTo(\"123456789A\", \"\")"); 565215976Sjmallett assertEquals(10, asmStringCompareTo("ZYX123456789A", "ZYX"), 566215976Sjmallett "TestOther.asmStringCompareTo(\"ZYX123456789A\", \"ZYX\")"); 567215976Sjmallett } 568215976Sjmallett 569215976Sjmallett // very long strings (100k) 570215976Sjmallett { 571215976Sjmallett char[] ac = new char[(100 * 1024)]; 572215976Sjmallett for (int i = 0; i < (100 * 1024); i += 315) 573215976Sjmallett ac[i] = (char) ((i % 12) + 'a'); 574215976Sjmallett char[] bc = new char[(100 * 1024)]; 575232812Sjmallett for (int i = 0; i < (100 * 1024); i += 315) 576215976Sjmallett bc[i] = (char) ((i % 12) + 'a'); 577232812Sjmallett 578232812Sjmallett ac[(100 * 1024) - 1] = '2'; 579215976Sjmallett bc[(100 * 1024) - 1] = '2'; 580215976Sjmallett String a1 = new String(ac); 581215976Sjmallett String b1 = new String(bc); 582215976Sjmallett assertEquals(0, asmStringCompareTo(a1, b1), 583215976Sjmallett "TestOther.asmStringCompareTo(very_long_strings_1)"); 584215976Sjmallett 585215976Sjmallett ac[(100 * 1024) - 1] = 'X'; 586215976Sjmallett bc[(100 * 1024) - 1] = 'Z'; 587215976Sjmallett String a2 = new String(ac); 588215976Sjmallett String b2 = new String(bc); 589215976Sjmallett assertEquals(-2, asmStringCompareTo(a2, b2), 590215976Sjmallett "TestOther.asmStringCompareTo(very_long_strings_2)"); 591215976Sjmallett } 592215976Sjmallett 593215976Sjmallett // very very long strings (2M) 594215976Sjmallett { 595215976Sjmallett char[] ac = new char[(2 * 1024 * 1024)]; 596215976Sjmallett for (int i = 0; i < (2 * 1024 * 1024); i += 315) 597215976Sjmallett ac[i] = (char) ((i % 12) + 'a'); 598215976Sjmallett char[] bc = new char[(2 * 1024 * 1024)]; 599215976Sjmallett for (int i = 0; i < (2 * 1024 * 1024); i += 315) 600215976Sjmallett bc[i] = (char) ((i % 12) + 'a'); 601215976Sjmallett 602215976Sjmallett ac[(2 * 1024 * 1024) - 1] = '3'; 603215976Sjmallett bc[(2 * 1024 * 1024) - 1] = '3'; 604215976Sjmallett String a1 = new String(ac); 605215976Sjmallett String b1 = new String(bc); 606215976Sjmallett assertEquals(0, asmStringCompareTo(a1, b1), 607215976Sjmallett "TestOther.asmStringCompareTo(very_very_long_strings_1)"); 608215976Sjmallett 609215976Sjmallett ac[(2 * 1024 * 1024) - 1] = 'W'; 610215976Sjmallett bc[(2 * 1024 * 1024) - 1] = 'Z'; 611215976Sjmallett String a2 = new String(ac); 612215976Sjmallett String b2 = new String(bc); 613215976Sjmallett assertEquals(-3, asmStringCompareTo(a2, b2), 614215976Sjmallett "TestOther.asmStringCompareTo(very_very_long_strings_2)"); 615215976Sjmallett } 616215976Sjmallett } 617215976Sjmallett 618215976Sjmallett 619215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "abc", "abcd" }) 620215976Sjmallett public static boolean asmStringEquals(String a, String b) { 621215976Sjmallett return a.equals(b); 622215976Sjmallett } 623215976Sjmallett 624215976Sjmallett static String a1 = "abcd"; 625215976Sjmallett static String b1 = "abcd"; 626215976Sjmallett static final String a2 = "1234"; 627215976Sjmallett static final String b2 = "1234"; 628215976Sjmallett 629215976Sjmallett @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1) 630215976Sjmallett public static boolean asmStringEqualsConst() { 631215976Sjmallett boolean ret = a1.equals(b1); 632215976Sjmallett ret &= a2.equals(b2); 633232812Sjmallett ret &= !a2.equals(b1); 634215976Sjmallett ret &= "ABCD".equals("ABCD"); 635232812Sjmallett return ret; 636232812Sjmallett } 637215976Sjmallett 638215976Sjmallett 639215976Sjmallett @Test(role = Role.TEST_ENTRY) 640215976Sjmallett public static void test_asmStringEquals() { 641215976Sjmallett // null 642215976Sjmallett { 643215976Sjmallett assertFalse(asmStringEquals("not null", null), 644215976Sjmallett "TestOther.asmStringEquals(\"not null\", null)"); 645215976Sjmallett } 646215976Sjmallett 647215976Sjmallett // true 648215976Sjmallett { 649215976Sjmallett // check constant optimization 650215976Sjmallett assertTrue(asmStringEqualsConst(), 651215976Sjmallett "TestOther.asmStringEqualsConst(\"\", \"\")"); 652215976Sjmallett 653215976Sjmallett // check length 0 optimization 654215976Sjmallett assertTrue(asmStringEquals("", ""), 655215976Sjmallett "TestOther.asmStringEquals(\"\", \"\")"); 656215976Sjmallett 657215976Sjmallett // check first character optimization 658215976Sjmallett assertTrue(asmStringEquals("A", "A"), 659215976Sjmallett "TestOther.asmStringEquals(\"A\", \"A\")"); 660215976Sjmallett 661215976Sjmallett // check real comparisons 662215976Sjmallett assertTrue(asmStringEquals(new String("eq") + new String("ual"), "equal"), 663215976Sjmallett "TestOther.asmStringEquals(\"equal\", \"equal\")"); 664215976Sjmallett assertTrue(asmStringEquals("textABC", "textABC"), 665215976Sjmallett "TestOther.asmStringEquals(\"textABC\", \"textABC\")"); 666232812Sjmallett assertTrue(asmStringEquals(new String("abcdefgh01234") + 667215976Sjmallett new String("56abcdefgh0123456abcdefgh0123456"), 668232812Sjmallett "abcdefgh0123456abcdefgh0123456abcdefgh0123456"), 669232812Sjmallett "TestOther.asmStringEquals(\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\", " + 670215976Sjmallett "\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\")"); 671215976Sjmallett } 672215976Sjmallett } 673215976Sjmallett 674215976Sjmallett} 675215976Sjmallett