fix for SkSL lexer crash on non-ASCII input

Bug: skia:7126
Change-Id: Ic884d14daf91fd668afe9e29d2f82d1ef1089cce
Reviewed-on: https://skia-review.googlesource.com/56720
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 14ce04a..2b333af 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -429,6 +429,9 @@
 
   action("run_sksllex") {
     script = "gn/run_sksllex.py"
+    deps = [
+      ":sksllex(//gn/toolchain:$host_toolchain)",
+    ]
     sources = [
       "src/sksl/lex/layout.lex",
       "src/sksl/lex/sksl.lex",
diff --git a/src/sksl/SkSLLayoutLexer.cpp b/src/sksl/SkSLLayoutLexer.cpp
index 27efa89..432095a 100644
--- a/src/sksl/SkSLLayoutLexer.cpp
+++ b/src/sksl/SkSLLayoutLexer.cpp
@@ -353,6 +353,9 @@
     LayoutToken::Kind lastAccept = LayoutToken::Kind::INVALID;
     int lastAcceptEnd = startOffset + 1;
     while (offset < fLength) {
+        if ((uint8_t) fText[offset] >= 127) {
+            break;
+        }
         state = transitions[mappings[(int)fText[offset]]][state];
         ++offset;
         if (!state) {
diff --git a/src/sksl/SkSLLexer.cpp b/src/sksl/SkSLLexer.cpp
index 2b3d465..c97ded9 100644
--- a/src/sksl/SkSLLexer.cpp
+++ b/src/sksl/SkSLLexer.cpp
@@ -926,6 +926,9 @@
     Token::Kind lastAccept = Token::Kind::INVALID;
     int lastAcceptEnd = startOffset + 1;
     while (offset < fLength) {
+        if ((uint8_t) fText[offset] >= 127) {
+            break;
+        }
         state = transitions[mappings[(int)fText[offset]]][state];
         ++offset;
         if (!state) {
diff --git a/src/sksl/lex/Main.cpp b/src/sksl/lex/Main.cpp
index ff5d661..fe06a87 100644
--- a/src/sksl/lex/Main.cpp
+++ b/src/sksl/lex/Main.cpp
@@ -141,6 +141,9 @@
     out << "    " << token << "::Kind lastAccept = " << token << "::Kind::INVALID;\n";
     out << "    int lastAcceptEnd = startOffset + 1;\n";
     out << "    while (offset < fLength) {\n";
+    out << "        if ((uint8_t) fText[offset] >= " << dfa.fCharMappings.size() << ") {";
+    out << "            break;";
+    out << "        }";
     out << "        state = transitions[mappings[(int) fText[offset]]][state];\n";
     out << "        ++offset;\n";
     out << "        if (!state) {\n";