make/jdk/src/classes/build/tools/generateemojidata/GenerateEmojiData.java
changeset 55141 db105c4c5776
parent 55013 8dae495a59e7
--- a/make/jdk/src/classes/build/tools/generateemojidata/GenerateEmojiData.java	Fri May 31 17:27:28 2019 -0700
+++ b/make/jdk/src/classes/build/tools/generateemojidata/GenerateEmojiData.java	Sat Jun 01 03:18:23 2019 +0200
@@ -67,27 +67,28 @@
                     },
                     ArrayList<Range>::addAll);
 
+
             // make the code point conditions
-            String extPictCodePoints = extPictRanges.stream()
-                .map(r -> {
-                    if (r.start == r.last) {
-                        return (" ".repeat(12) + "cp == 0x" + toHexString(r.start));
-                    } else  if (r.start == r.last - 1) {
-                        return " ".repeat(12) + "cp == 0x" + toHexString(r.start) + " ||\n" +
-                               " ".repeat(12) + "cp == 0x" + toHexString(r.last);
-                    } else {
-                        return " ".repeat(11) + "(cp >= 0x" + toHexString(r.start) +
-                               " && cp <= 0x" + toHexString(r.last) + ")";
-                    }
-                })
-                .collect(Collectors.joining(" ||\n")) + ";\n";
+            // only very few codepoints below 0x2000 are "emojis", so separate them
+            // out to generate a fast-path check that can be efficiently inlined
+            String lowExtPictCodePoints = extPictRanges.stream()
+                    .takeWhile(r -> r.last < 0x2000)
+                    .map(r -> rangeToString(r))
+                    .collect(Collectors.joining(" ||\n", "", ";\n"));
+
+            String highExtPictCodePoints = extPictRanges.stream()
+                    .dropWhile(r -> r.last < 0x2000)
+                    .map(r -> rangeToString(r))
+                    .collect(Collectors.joining(" ||\n", "", ";\n"));
 
             // Generate EmojiData.java file
             Files.write(Paths.get(args[2]),
                 Files.lines(Paths.get(args[0]))
                     .flatMap(l -> {
-                        if (l.equals("%%%EXTPICT%%%")) {
-                            return Stream.of(extPictCodePoints);
+                        if (l.equals("%%%EXTPICT_LOW%%%")) {
+                            return Stream.of(lowExtPictCodePoints);
+                        } else if (l.equals("%%%EXTPICT_HIGH%%%")) {
+                            return Stream.of(highExtPictCodePoints);
                         } else {
                             return Stream.of(l);
                         }
@@ -99,6 +100,18 @@
         }
     }
 
+    static String rangeToString(Range r) {
+        if (r.start == r.last) {
+            return (" ".repeat(16) + "cp == 0x" + toHexString(r.start));
+        } else  if (r.start == r.last - 1) {
+            return " ".repeat(16) + "cp == 0x" + toHexString(r.start) + " ||\n" +
+                    " ".repeat(16) + "cp == 0x" + toHexString(r.last);
+        } else {
+            return " ".repeat(15) + "(cp >= 0x" + toHexString(r.start) +
+                    " && cp <= 0x" + toHexString(r.last) + ")";
+        }
+    }
+
     static int toInt(String hexStr) {
         return Integer.parseUnsignedInt(hexStr, 16);
     }