re2js 2.3.1 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -15
- package/build/index.cjs.cjs +117 -41
- package/build/index.cjs.cjs.map +1 -1
- package/build/index.esm.d.ts.map +1 -1
- package/build/index.esm.js +117 -41
- package/build/index.esm.js.map +1 -1
- package/build/index.umd.js +117 -41
- package/build/index.umd.js.map +1 -1
- package/package.json +7 -5
package/README.md
CHANGED
|
@@ -615,23 +615,23 @@ Because RE2JS's Lazy DFA, Prefilter, and OnePass engines operate efficiently wit
|
|
|
615
615
|
|
|
616
616
|
Here is a benchmark running 30,000 items through both engines using their respective `.test()` fast-paths (averages of multiple runs):
|
|
617
617
|
|
|
618
|
-
| Benchmark Scenario | Pattern Example | RE2JS (Pure JS) | RE2-Node (C++) | Result
|
|
619
|
-
|
|
620
|
-
| **
|
|
621
|
-
| **
|
|
622
|
-
| **
|
|
623
|
-
| **
|
|
624
|
-
| **
|
|
625
|
-
| **
|
|
626
|
-
| **
|
|
627
|
-
| **Case Insensitive** | `/(?i)swamp/` |
|
|
628
|
-
| **Word Boundaries (NFA)** | `/\b(Flying\|First...)\b/` |
|
|
618
|
+
| Benchmark Scenario | Pattern Example | RE2JS (Pure JS) | RE2-Node (C++) | Result |
|
|
619
|
+
|:--------------------------|:---------------------------|:----------------|:---------------|:----------------------------|
|
|
620
|
+
| **ReDoS Attempt** | `/(a+)+!/` | **7.28 ms** | 12.74 ms | `re2js` is **1.75x** faster |
|
|
621
|
+
| **Deep State Machine** | `/([0-9]+(/[0-9]+)+)/` | **8.78 ms** | 12.56 ms | `re2js` is **1.43x** faster |
|
|
622
|
+
| **Simple Literal** | `/damage/` | **7.04 ms** | 9.59 ms | `re2js` is **1.36x** faster |
|
|
623
|
+
| **Lazy Wildcard** | `/enters.*?battlefield/` | **9.36 ms** | 10.27 ms | `re2js` is **1.10x** faster |
|
|
624
|
+
| **Greedy Wildcard** | `/enters.*battlefield/` | **9.47 ms** | 10.03 ms | `re2js` is **1.06x** faster |
|
|
625
|
+
| **Massive Alternation** | `/White\|Blue\|Black.../` | 11.69 ms | **11.28 ms** | `re2-node` is 1.04x faster |
|
|
626
|
+
| **Bounded Repetition** | `/[A-Z][a-z]{5,15}/` | 12.68 ms | **10.64 ms** | `re2-node` is 1.19x faster |
|
|
627
|
+
| **Case Insensitive** | `/(?i)swamp/` | 18.58 ms | **12.64 ms** | `re2-node` is 1.47x faster |
|
|
628
|
+
| **Word Boundaries (NFA)** | `/\b(Flying\|First...)\b/` | 30.45 ms | **12.22 ms** | `re2-node` is 2.49x faster |
|
|
629
629
|
|
|
630
630
|
**Takeaways:**
|
|
631
|
-
* **
|
|
632
|
-
* **
|
|
633
|
-
* **
|
|
634
|
-
|
|
631
|
+
* **Pure JS Strengths:** For complex state tracking (nested groups, wildcards) and literal string scanning, `re2js` actually beats the native C++ bindings. V8's Turbofan JIT compiler is able to heavily optimize the Pure JS DFA loop, bypassing the C++ boundary entirely.
|
|
632
|
+
* **C++ Strengths:** For character class evaluations (Case Insensitivity, Bounded Repetitions, Alternations), `re2-node` has a slight edge thanks to highly optimized, hardware-level memory tables.
|
|
633
|
+
* **The NFA Fallback:** Pure DFA engines mathematically cannot track look-behind context like Word Boundaries (`\b`). When RE2JS encounters these, it safely bails out to its NFA engine. As shown in the benchmarks, the pure JS NFA is significantly slower than the C++ NFA. **For maximum performance in RE2JS, avoid `\b` when doing bulk boolean `.test()` matching.**
|
|
634
|
+
|
|
635
635
|
|
|
636
636
|
### RE2JS vs JavaScript's native RegExp
|
|
637
637
|
|
package/build/index.cjs.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* re2js
|
|
3
3
|
* RE2JS is the JavaScript port of RE2, a regular expression engine that provides linear time matching
|
|
4
4
|
*
|
|
5
|
-
* @version v2.
|
|
5
|
+
* @version v2.4.0
|
|
6
6
|
* @author Oleksii Vasyliev
|
|
7
7
|
* @homepage https://github.com/le0pard/re2js#readme
|
|
8
8
|
* @repository github:le0pard/re2js
|
|
@@ -224,7 +224,7 @@ class UnicodeTables {
|
|
|
224
224
|
static _CASE_ORBIT = null;
|
|
225
225
|
static get CASE_ORBIT() {
|
|
226
226
|
if (!this._CASE_ORBIT) {
|
|
227
|
-
this._CASE_ORBIT = decodeOrbit('rCrDIzDYqpII-LiC8cQlHa+0HGrpI6EzClClOBmOBkOBoOBpOBnOBrOBsOBqOlByPBzPBxPyK5crCz+HCydD1dD4dB5dB6dC8dEgeBheCieDmeDpeHj-HCweD1fDxeB+9HBwfC1FE2eBxfBjeBjdD1eDmpIHycB0fEmdBgda6cBhdD4cB1cdyhBC0hBK+hBDhiBBiiBIqiBIgkHChkHKikHDjkHBkkHImkHYjjBBnkH9gGygBB0gBB+gBBhhBBlkHBihBBqhBBijBBqypB4OhzHB70H6BgzHD-GiHo8HBp8HBq8HBr8HBs8HBt8HBu8HBv8HBg8HBh8HBi8HBj8HBk8HBl8HBm8HBn8HB48HB58HB68HB78HB88HB98HB+8HB-8HBw8HBx8HBy8HBz8HB08HB18HB28HB38HBo9HBp9HBq9HBr9HBs9HBt9HBu9HBv9HBg9HBh9HBi9HBj9HBk9HBl9HBm9HBn9HE89HJz9HClaFs+HJj+HHwcQwdQ8-HJz-HqJpdErCBlG-ohBrypBBokH6lVm4+BBl4+B');
|
|
227
|
+
this._CASE_ORBIT = decodeOrbit('rCrDIzDYqpII-LiC8cLgHBhHBiHBjHBkHBlHBmHBnHBoHBpHBqHBrHBsHBtHBuHBvHBwHBxHByHBzHB0HB1HB2HC4HB5HB6HB7HB8HB9HB+HB+0HBgGBhGBiGBjGBkGBrpIBmGBnGBoGBpGBqGBrGBsGBtGBuGBvGBwGBxGByGBzGB0GB1GB2GC4GB5GB6GB7GB8GB9GB+GB4LBhIBgIBjIBiIBlIBkIBnIBmIBpIBoIBrIBqIBtIBsIBvIBuIBxIBwIBzIByIB1IB0IB3IB2IB5IB4IB7IB6IB9IB8IB-IB+IBhJBgJBjJBiJBlJBkJBnJBmJBpJBoJBrJBqJBtJBsJBvJBuJDzJByJB1JB0JB3JB2JC6JB5JB8JB7JB+JB9JBgKB-JBiKBhKBkKBjKBmKBlKBoKBnKCrKBqKBtKBsKBvKBuKBxKBwKBzKByKB1KB0KB3KB2KB5KB4KB7KB6KB9KB8KB-KB+KBhLBgLBjLBiLBlLBkLBnLBmLBpLBoLBrLBqLBtLBsLBvLBuLBxLBwLBzLByLB1LB0LB3LB2LB-HB6LB5LB8LB7LB+LB9LBzCBjSBzSBjMBiMBlMBkMB0SBoMBnMB2SB3SBsMBrMC9OB5SB7SByMBxMBgTBjTB2PBpTBoTB5MB4MB9RB8+pBBvTByTBgRB1TBhNBgNBjNBiNBlNBkNBgUBoNBnNBjUDtNBsNBoUBwNBvNBqUBrUB0NBzNB2NB1NByUB5NB4ND9NB8NC3PFlOBmOBkOBoOBpOBnOBrOBsOBqOBuOBtOBwOBvOByOBxOB0OBzOB2OB1OB4OB3OB6OB5OB8OB7OBuMB-OB+OBhPBgPBjPBiPBlPBkPBnPBmPBpPBoPBrPBqPBtPBsPBvPBuPCyPBzPBxPB1PB0PB1MB-NB5PB4PB7PB6PB9PB8PB-PB+PBhQBgQBjQBiQBlQBkQBnQBmQBpQBoQBrQBqQBtQBsQBvQBuQBxQBwQBzQByQB1QB0QB3QB2QB5QB4QB7QB6QB9QB8QB-QB+QB+MCjRBiRBlRBkRBnRBmRBpRBoRBrRBqRBtRBsRBvRBuRBxRBwRBzRByRHljLB8RB7RB6MBmjLB+jLB-jLBiSBhSBgMBpUBsUBnSBmSBpSBoSBrSBqSBtSBsSBvSBuSBvjLBtjLBwjLBhMBmMCpMBqMCvMCwMBr9pBEzMBs9pBC0MBr+pBBt8pBBq9pBC3MB2MBu9pBBijLBt9pBD8MCujLB9MD-MIkjLDmNCl+pBBpNEx9pBBuNBkSBxNByNBlSG3NLy9pBBw9pBnF5crBxbBwbBzbBybD3bB2bE9fB+fB-fCzfHsdCtdBudBvdCseCteBueBz+HBxdBydBzdB0dB1dB2dB3dB4dB5dB6dB7dB8dB9dB+dB-dBgeBheCieBkeBleBmeBneBoeBpeBqeBreBmcBocBpcBqcBj-HBxcBweBzcB0cB1fB2cB3cBxeB+9HBwfB7cB1FB9cB+cB-cB2eBxfBjeBjdBkdBldB1eBndBodBmpIBqdBrdBscBucBvcB3eBycB0fEmdBgdBveB5eB4eB7eB6eB9eB8eB-eB+eBhfBgfBjfBifBlfBkfBnfBmfBpfBofBrfBqfBtfBsfBvfBufB6cBhdB5fB-bB4cB1cC4fB3fByfB7fB6fC7bB8bB9bBwiBBxiBByiBBziBB0iBB1iBB2iBB3iBB4iBB5iBB6iBB7iBB8iBB9iBB+iBB-iBBwhBBxhBByhBBzhBB0hBB1hBB2hBB3hBB4hBB5hBB6hBB7hBB8hBB9hBB+hBB-hBBgiBBhiBBiiBBjiBBkiBBliBBmiBBniBBoiBBpiBBqiBBriBBsiBBtiBBuiBBviBBwgBBxgBBgkHBzgBBhkHB1gBB2gBB3gBB4gBB5gBB6gBB7gBB8gBB9gBBikHB-gBBghBBjkHBkkHBjhBBkhBBlhBBmhBBnhBBohBBphBBmkHBrhBBshBBthBBuhBBvhBBggBBhgBBigBBjgBBkgBBlgBBmgBBngBBogBBpgBBqgBBrgBBsgBBtgBBugBBvgBBhjBBgjBBjjBBnkHBljBBkjBBnjBBmjBBpjBBojBBrjBBqjBBtjBBsjBBvjBBujBBxjBBwjBBzjBByjBB1jBB0jBB3jBB2jBB5jBB4jBB7jBB6jBB9jBB8jBB-jBB+jBBhkBBgkBJrkBBqkBBtkBBskBBvkBBukBBxkBBwkBBzkBBykBB1kBB0kBB3kBB2kBB5kBB4kBB7kBB6kBB9kBB8kBB-kBB+kBBhlBBglBBjlBBilBBllBBklBBnlBBmlBBplBBolBBrlBBqlBBtlBBslBBvlBBulBBxlBBwlBBzlBBylBB1lBB0lBB3lBB2lBB5lBB4lBB7lBB6lBB9lBB8lBB-lBB+lBBvmBBimBBhmBBkmBBjmBBmmBBlmBBomBBnmBBqmBBpmBBsmBBrmBBumBBtmBBgmBBxmBBwmBBzmBBymBB1mBB0mBB3mBB2mBB5mBB4mBB7mBB6mBB9mBB8mBB-mBB+mBBhnBBgnBBjnBBinBBlnBBknBBnnBBmnBBpnBBonBBrnBBqnBBtnBBsnBBvnBBunBBxnBBwnBBznBBynBB1nBB0nBB3nBB2nBB5nBB4nBB7nBB6nBB9nBB8nBB-nBB+nBBhoBBgoBBjoBBioBBloBBkoBBnoBBmoBBpoBBooBBroBBqoBBtoBBsoBBvoBBuoBBxoBBwoBBzoBByoBB1oBB0oBB3oBB2oBB5oBB4oBB7oBB6oBB9oBB8oBB-oBB+oBBhpBBgpBBjpBBipBBlpBBkpBBnpBBmpBBppBBopBBrpBBqpBBtpBBspBBvpBBupBChrBBirBBjrBBkrBBlrBBmrBBnrBBorBBprBBqrBBrrBBsrBBtrBBurBBvrBBwrBBxrBByrBBzrBB0rBB1rBB2rBB3rBB4rBB5rBB6rBB7rBB8rBB9rBB+rBB-rBBgsBBhsBBisBBjsBBksBBlsBBmsBLxpBBypBBzpBB0pBB1pBB2pBB3pBB4pBB5pBB6pBB7pBB8pBB9pBB+pBB-pBBgqBBhqBBiqBBjqBBkqBBlqBBmqBBnqBBoqBBpqBBqqBBrqBBsqBBtqBBuqBBvqBBwqBBxqBByqBBzqBB0qBB1qBB2qB64CgoLBhoLBioLBjoLBkoLBloLBmoLBnoLBooLBpoLBqoLBroLBsoLBtoLBuoLBvoLBwoLBxoLByoLBzoLB0oLB1oLB2oLB3oLB4oLB5oLB6oLB7oLB8oLB9oLB+oLB-oLBgpLBhpLBipLBjpLBkpLBlpLCnpLGtpLDwkHBxkHBykHBzkHB0kHB1kHB2kHB3kHB4kHB5kHB6kHB7kHB8kHB9kHB+kHB-kHBglHBhlHBilHBjlHBklHBllHBmlHBnlHBolHBplHBqlHBrlHBslHBtlHBulHBvlHBwlHBxlHBylHBzlHB0lHB1lHB2lHB3lHB4lHB5lHB6lHD9lHB+lHB-lHhVw7qBBx7qBBy7qBBz7qBB07qBB17qBB27qBB37qBB47qBB57qBB67qBB77qBB87qBB97qBB+7qBB-7qBBg8qBBh8qBBi8qBBj8qBBk8qBBl8qBBm8qBBn8qBBo8qBBp8qBBq8qBBr8qBBs8qBBt8qBBu8qBBv8qBBw8qBBx8qBBy8qBBz8qBB08qBB18qBB28qBB38qBB48qBB58qBB68qBB78qBB88qBB98qBB+8qBB-8qBBg9qBBh9qBBi9qBBj9qBBk9qBBl9qBBm9qBBn9qBBo9qBBp9qBBq9qBBr9qBBs9qBBt9qBBu9qBBv9qBBw9qBBx9qBBy9qBBz9qBB09qBB19qBB29qBB39qBB49qBB59qBB69qBB79qBB89qBB99qBB+9qBB-9qBB4-EB5-EB6-EB7-EB8-EB9-EDw-EBx-EBy-EBz-EB0-EB1-EjkCygBB0gBB+gBBhhBBlkHBihBBqhBBijBBqypBBqkHBpkHGwmEBxmEBymEBzmEB0mEB1mEB2mEB3mEB4mEB5mEB6mEB7mEB8mEB9mEB+mEB-mEBgnEBhnEBinEBjnEBknEBlnEBmnEBnnEBonEBpnEBqnEBrnEBsnEBtnEBunEBvnEBwnEBxnEBynEBznEB0nEB1nEB2nEB3nEB4nEB5nEB6nED9nEB+nEB-nE6F97pBEjjLRm+pByDhwHBgwHBjwHBiwHBlwHBkwHBnwHBmwHBpwHBowHBrwHBqwHBtwHBswHBvwHBuwHBxwHBwwHBzwHBywHB1wHB0wHB3wHB2wHB5wHB4wHB7wHB6wHB9wHB8wHB-wHB+wHBhxHBgxHBjxHBixHBlxHBkxHBnxHBmxHBpxHBoxHBrxHBqxHBtxHBsxHBvxHBuxHBxxHBwxHBzxHByxHB1xHB0xHB3xHB2xHB5xHB4xHB7xHB6xHB9xHB8xHB-xHB+xHBhyHBgyHBjyHBiyHBlyHBkyHBnyHBmyHBpyHBoyHBryHBqyHBtyHBsyHBvyHBuyHBxyHBwyHBzyHByyHB1yHB0yHB3yHB2yHB5yHB4yHB7yHB6yHB9yHB8yHB-yHB+yHBhzHB70HBjzHBizHBlzHBkzHBnzHBmzHBpzHBozHBrzHBqzHBtzHBszHBvzHBuzHBxzHBwzHBzzHByzHB1zHB0zHB3zHB2zHB5zHB4zHB7zHB6zHB9zHB8zHB-zHB+zHBh0HBg0HBj0HBi0HBl0HBk0HBn0HBm0HBp0HBo0HBr0HBq0HBt0HBs0HBv0HBu0HBx0HBw0HBz0HBy0HB10HB00HGgzHD-GCh1HBg1HBj1HBi1HBl1HBk1HBn1HBm1HBp1HBo1HBr1HBq1HBt1HBs1HBv1HBu1HBx1HBw1HBz1HBy1HB11HB01HB31HB21HB51HB41HB71HB61HB91HB81HB-1HB+1HBh2HBg2HBj2HBi2HBl2HBk2HBn2HBm2HBp2HBo2HBr2HBq2HBt2HBs2HBv2HBu2HBx2HBw2HBz2HBy2HB12HB02HB32HB22HB52HB42HB72HB62HB92HB82HB-2HB+2HBh3HBg3HBj3HBi3HBl3HBk3HBn3HBm3HBp3HBo3HBr3HBq3HBt3HBs3HBv3HBu3HBx3HBw3HBz3HBy3HB13HB03HB33HB23HB53HB43HB73HB63HB93HB83HB-3HB+3HBo4HBp4HBq4HBr4HBs4HBt4HBu4HBv4HBg4HBh4HBi4HBj4HBk4HBl4HBm4HBn4HB44HB54HB64HB74HB84HB94HDw4HBx4HBy4HBz4HB04HB14HDo5HBp5HBq5HBr5HBs5HBt5HBu5HBv5HBg5HBh5HBi5HBj5HBk5HBl5HBm5HBn5HB45HB55HB65HB75HB85HB95HB+5HB-5HBw5HBx5HBy5HBz5HB05HB15HB25HB35HBo6HBp6HBq6HBr6HBs6HBt6HDg6HBh6HBi6HBj6HBk6HBl6HE56HC76HC96HC-6HCx6HCz6HC16HC36HBo7HBp7HBq7HBr7HBs7HBt7HBu7HBv7HBg7HBh7HBi7HBj7HBk7HBl7HBm7HBn7HB69HB79HBo+HBp+HBq+HBr+HB6+HB7+HB4-HB5-HBq-HBr-HB6-HB7-HDo8HBp8HBq8HBr8HBs8HBt8HBu8HBv8HBg8HBh8HBi8HBj8HBk8HBl8HBm8HBn8HB48HB58HB68HB78HB88HB98HB+8HB-8HBw8HBx8HBy8HBz8HB08HB18HB28HB38HBo9HBp9HBq9HBr9HBs9HBt9HBu9HBv9HBg9HBh9HBi9HBj9HBk9HBl9HBm9HBn9HB49HB59HC89HFw9HBx9HBw7HBx7HBz9HClaFs+HFy7HBz7HB07HB17HBj+HE4+HB5+HCwcFw+HBx+HB27HB37HFo-HBp-HCwdCs-HDg-HBh-HB67HB77HBl-HH8-HF47HB57HB87HB97HBz-HqJpdErCBlGHuqIcypISwrIBxrIByrIBzrIB0rIB1rIB2rIB3rIB4rIB5rIB6rIB7rIB8rIB9rIB+rIB-rIBgrIBhrIBirIBjrIBkrIBlrIBmrIBnrIBorIBprIBqrIBrrIBsrIBtrIBurIBvrIEksIBjsIyZwmJBxmJBymJBzmJB0mJB1mJB2mJB3mJB4mJB5mJB6mJB7mJB8mJB9mJB+mJB-mJBgnJBhnJBinJBjnJBknJBlnJBmnJBnnJBonJBpnJB2lJB3lJB4lJB5lJB6lJB7lJB8lJB9lJB+lJB-lJBgmJBhmJBimJBjmJBkmJBlmJBmmJBnmJBomJBpmJBqmJBrmJBsmJBtmJBumJBvmJ34BwhLBxhLByhLBzhLB0hLB1hLB2hLB3hLB4hLB5hLB6hLB7hLB8hLB9hLB+hLB-hLBgiLBhiLBiiLBjiLBkiLBliLBmiLBniLBoiLBpiLBqiLBriLBsiLBtiLBuiLBviLBwiLBxiLByiLBziLB0iLB1iLB2iLB3iLB4iLB5iLB6iLB7iLB8iLB9iLB+iLB-iLBggLBhgLBigLBjgLBkgLBlgLBmgLBngLBogLBpgLBqgLBrgLBsgLBtgLBugLBvgLBwgLBxgLBygLBzgLB0gLB1gLB2gLB3gLB4gLB5gLB6gLB7gLB8gLB9gLB+gLB-gLBghLBhhLBihLBjhLBkhLBlhLBmhLBnhLBohLBphLBqhLBrhLBshLBthLBuhLBvhLBhjLBgjLBrTB9rHB9TB6RB+RBojLBnjLBqjLBpjLBsjLBrjLBxSBxTBwSBySCzjLByjLC2jLB1jLI-RBgSBhkLBgkLBjkLBikLBlkLBkkLBnkLBmkLBpkLBokLBrkLBqkLBtkLBskLBvkLBukLBxkLBwkLBzkLBykLB1kLB0kLB3kLB2kLB5kLB4kLB7kLB6kLB9kLB8kLB-kLB+kLBhlLBglLBjlLBilLBllLBklLBnlLBmlLBplLBolLBrlLBqlLBtlLBslLBvlLBulLBxlLBwlLBzlLBylLB1lLB0lLB3lLB2lLB5lLB4lLB7lLB6lLB9lLB8lLB-lLB+lLBhmLBgmLBjmLBimLBlmLBkmLBnmLBmmLBpmLBomLBrmLBqmLBtmLBsmLBvmLBumLBxmLBwmLBzmLBymLB1mLB0mLB3mLB2mLB5mLB4mLB7mLB6mLB9mLB8mLB-mLB+mLBhnLBgnLBjnLBinLIsnLBrnLBunLBtnLEznLBynLNglEBhlEBilEBjlEBklEBllEBmlEBnlEBolEBplEBqlEBrlEBslEBtlEBulEBvlEBwlEBxlEBylEBzlEB0lEB1lEB2lEB3lEB4lEB5lEB6lEB7lEB8lEB9lEB+lEB-lEBgmEBhmEBimEBjmEBkmEBlmECnmEGtmEzoehypBBgypBBjypBBiypBBlypBBkypBBnypBBmypBBpypBBoypBBrypBBokHBtypBBsypBBvypBBuypBBxypBBwypBBzypBByypBB1ypBB0ypBB3ypBB2ypBB5ypBB4ypBB7ypBB6ypBB9ypBB8ypBB-ypBB+ypBBhzpBBgzpBBjzpBBizpBBlzpBBkzpBBnzpBBmzpBBpzpBBozpBBrzpBBqzpBBtzpBBszpBTh0pBBg0pBBj0pBBi0pBBl0pBBk0pBBn0pBBm0pBBp0pBBo0pBBr0pBBq0pBBt0pBBs0pBBv0pBBu0pBBx0pBBw0pBBz0pBBy0pBB10pBB00pBB30pBB20pBB50pBB40pBB70pBB60pBnEj5pBBi5pBBl5pBBk5pBBn5pBBm5pBBp5pBBo5pBBr5pBBq5pBBt5pBBs5pBBv5pBBu5pBDz5pBBy5pBB15pBB05pBB35pBB25pBB55pBB45pBB75pBB65pBB95pBB85pBB-5pBB+5pBBh6pBBg6pBBj6pBBi6pBBl6pBBk6pBBn6pBBm6pBBp6pBBo6pBBr6pBBq6pBBt6pBBs6pBBv6pBBu6pBBx6pBBw6pBBz6pBBy6pBB16pBB06pBB36pBB26pBB56pBB46pBB76pBB66pBB96pBB86pBB-6pBB+6pBBh7pBBg7pBBj7pBBi7pBBl7pBBk7pBBn7pBBm7pBBp7pBBo7pBBr7pBBq7pBBt7pBBs7pBBv7pBBu7pBK67pBB57pBB87pBB77pBB5rHB-7pBB+7pBBh8pBBg8pBBj8pBBi8pBBl8pBBk8pBBn8pBBm8pBEs8pBBr8pBBlTDx8pBBw8pBBz8pBBy8pBBk+pBC38pBB28pBB58pBB48pBB78pBB68pBB98pBB88pBB-8pBB+8pBBh9pBBg9pBBj9pBBi9pBBl9pBBk9pBBn9pBBm9pBBp9pBBo9pBBmTB8SBhTBsTBqTC+UBnUB9UBz6qBB19pBB09pBB39pBB29pBB59pBB49pBB79pBB69pBB99pBB89pBB-9pBB+9pBBh+pBBg+pBBj+pBBi+pBB08pBBiUBusHBo+pBBn+pBBq+pBBp+pBBkTBt+pBBs+pBBv+pBBu+pBBx+pBBw+pBBz+pBBy+pBB1+pBB0+pBB3+pBB2+pBB5+pBB4+pBB7+pBB6+pBB7MZ2-pBB1-pB9az9pBdg9EBh9EBi9EBj9EBk9EBl9EBm9EBn9EBo9EBp9EBq9EBr9EBs9EBt9EBu9EBv9EBw9EBx9EBy9EBz9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EB+9EB-9EBg+EBh+EBi+EBj+EBk+EBl+EBm+EBn+EBo+EBp+EBq+EBr+EBs+EBt+EBu+EBv+EBw+EBx+EBy+EBz+EB0+EB1+EB2+EB3+EB4+EB5+EB6+EB7+EB8+EB9+EB++EB-+EBg-EBh-EBi-EBj-EBk-EBl-EBm-EBn-EBo-EBp-EBq-EBr-EBs-EBt-EBu-EBv-Em6Tm4+BBl4+B7gBh6-BBi6-BBj6-BBk6-BBl6-BBm6-BBn6-BBo6-BBp6-BBq6-BBr6-BBs6-BBt6-BBu6-BBv6-BBw6-BBx6-BBy6-BBz6-BB06-BB16-BB26-BB36-BB46-BB56-BB66-BHh5-BBi5-BBj5-BBk5-BBl5-BBm5-BBn5-BBo5-BBp5-BBq5-BBr5-BBs5-BBt5-BBu5-BBv5-BBw5-BBx5-BBy5-BBz5-BB05-BB15-BB25-BB35-BB45-BB55-BB65-BmlBohhCBphhCBqhhCBrhhCBshhCBthhCBuhhCBvhhCBwhhCBxhhCByhhCBzhhCB0hhCB1hhCB2hhCB3hhCB4hhCB5hhCB6hhCB7hhCB8hhCB9hhCB+hhCB-hhCBgihCBhihCBiihCBjihCBkihCBlihCBmihCBnihCBoihCBpihCBqihCBrihCBsihCBtihCBuihCBvihCBgghCBhghCBighCBjghCBkghCBlghCBmghCBnghCBoghCBpghCBqghCBrghCBsghCBtghCBughCBvghCBwghCBxghCByghCBzghCB0ghCB1ghCB2ghCB3ghCB4ghCB5ghCB6ghCB7ghCB8ghCB9ghCB+ghCB-ghCBghhCBhhhCBihhCBjhhCBkhhCBlhhCBmhhCBnhhChD4mhCB5mhCB6mhCB7mhCB8mhCB9mhCB+mhCB-mhCBgnhCBhnhCBinhCBjnhCBknhCBlnhCBmnhCBnnhCBonhCBpnhCBqnhCBrnhCBsnhCBtnhCBunhCBvnhCBwnhCBxnhCBynhCBznhCB0nhCB1nhCB2nhCB3nhCB4nhCB5nhCB6nhCB7nhCFwlhCBxlhCBylhCBzlhCB0lhCB1lhCB2lhCB3lhCB4lhCB5lhCB6lhCB7lhCB8lhCB9lhCB+lhCB-lhCBgmhCBhmhCBimhCBjmhCBkmhCBlmhCBmmhCBnmhCBomhCBpmhCBqmhCBrmhCBsmhCBtmhCBumhCBvmhCBwmhCBxmhCBymhCBzmhC1D3shCB4shCB5shCB6shCB7shCB8shCB9shCB+shCB-shCBgthCBhthCCjthCBkthCBlthCBmthCBnthCBothCBpthCBqthCBrthCBsthCBtthCButhCBvthCBwthCBxthCCzthCB0thCB1thCB2thCB3thCB4thCB5thCC7thCB8thCCwrhCBxrhCByrhCBzrhCB0rhCB1rhCB2rhCB3rhCB4rhCB5rhCB6rhCC8rhCB9rhCB+rhCB-rhCBgshCBhshCBishCBjshCBkshCBlshCBmshCBnshCBoshCBpshCBqshCCsshCBtshCBushCBvshCBwshCBxshCByshCC0shCB1shCk2BgmjCBhmjCBimjCBjmjCBkmjCBlmjCBmmjCBnmjCBomjCBpmjCBqmjCBrmjCBsmjCBtmjCBumjCBvmjCBwmjCBxmjCBymjCBzmjCB0mjCB1mjCB2mjCB3mjCB4mjCB5mjCB6mjCB7mjCB8mjCB9mjCB+mjCB-mjCBgnjCBhnjCBinjCBjnjCBknjCBlnjCBmnjCBnnjCBonjCBpnjCBqnjCBrnjCBsnjCBtnjCBunjCBvnjCBwnjCBxnjCBynjCOgkjCBhkjCBikjCBjkjCBkkjCBlkjCBmkjCBnkjCBokjCBpkjCBqkjCBrkjCBskjCBtkjCBukjCBvkjCBwkjCBxkjCBykjCBzkjCB0kjCB1kjCB2kjCB3kjCB4kjCB5kjCB6kjCB7kjCB8kjCB9kjCB+kjCB-kjCBgljCBhljCBiljCBjljCBkljCBlljCBmljCBnljCBoljCBpljCBqljCBrljCBsljCBtljCBuljCBvljCBwljCBxljCByljC+CwrjCBxrjCByrjCBzrjCB0rjCB1rjCB2rjCB3rjCB4rjCB5rjCB6rjCB7rjCB8rjCB9rjCB+rjCB-rjCBgsjCBhsjCBisjCBjsjCBksjCBlsjCLwqjCBxqjCByqjCBzqjCB0qjCB1qjCB2qjCB3qjCB4qjCB5qjCB6qjCB7qjCB8qjCB9qjCB+qjCB-qjCBgrjCBhrjCBirjCBjrjCBkrjCBlrjC74CgmmCBhmmCBimmCBjmmCBkmmCBlmmCBmmmCBnmmCBommCBpmmCBqmmCBrmmCBsmmCBtmmCBummCBvmmCBwmmCBxmmCBymmCBzmmCB0mmCB1mmCB2mmCB3mmCB4mmCB5mmCB6mmCB7mmCB8mmCB9mmCB+mmCB-mmCBglmCBhlmCBilmCBjlmCBklmCBllmCBmlmCBnlmCBolmCBplmCBqlmCBrlmCBslmCBtlmCBulmCBvlmCBwlmCBxlmCBylmCBzlmCB0lmCB1lmCB2lmCB3lmCB4lmCB5lmCB6lmCB7lmCB8lmCB9lmCB+lmCB-lmChrVgz7CBhz7CBiz7CBjz7CBkz7CBlz7CBmz7CBnz7CBoz7CBpz7CBqz7CBrz7CBsz7CBtz7CBuz7CBvz7CBwz7CBxz7CByz7CBzz7CB0z7CB1z7CB2z7CB3z7CB4z7CB5z7CB6z7CB7z7CB8z7CB9z7CB+z7CB-z7CBgy7CBhy7CBiy7CBjy7CBky7CBly7CBmy7CBny7CBoy7CBpy7CBqy7CBry7CBsy7CBty7CBuy7CBvy7CBwy7CBxy7CByy7CBzy7CB0y7CB1y7CB2y7CB3y7CB4y7CB5y7CB6y7CB7y7CB8y7CB9y7CB+y7CB-y7ChB717CB817CB917CB+17CB-17CBg27CBh27CBi27CBj27CBk27CBl27CBm27CBn27CBo27CBp27CBq27CBr27CBs27CBt27CBu27CBv27CBw27CBx27CBy27CBz27CDg17CBh17CBi17CBj17CBk17CBl17CBm17CBn17CBo17CBp17CBq17CBr17CBs17CBt17CBu17CBv17CBw17CBx17CBy17CBz17CB017CB117CB217CB317CB417Ctxeip6DBjp6DBkp6DBlp6DBmp6DBnp6DBop6DBpp6DBqp6DBrp6DBsp6DBtp6DBup6DBvp6DBwp6DBxp6DByp6DBzp6DB0p6DB1p6DB2p6DB3p6DB4p6DB5p6DB6p6DB7p6DB8p6DB9p6DB+p6DB-p6DBgq6DBhq6DBiq6DBjq6DBgo6DBho6DBio6DBjo6DBko6DBlo6DBmo6DBno6DBoo6DBpo6DBqo6DBro6DBso6DBto6DBuo6DBvo6DBwo6DBxo6DByo6DBzo6DB0o6DB1o6DB2o6DB3o6DB4o6DB5o6DB6o6DB7o6DB8o6DB9o6DB+o6DB-o6DBgp6DBhp6D');
|
|
228
228
|
}
|
|
229
229
|
return this._CASE_ORBIT;
|
|
230
230
|
}
|
|
@@ -519,7 +519,7 @@ class Unicode {
|
|
|
519
519
|
// is tests whether rune is in the specified table of ranges.
|
|
520
520
|
static is(ranges, r) {
|
|
521
521
|
// Fast path for Latin-1 characters using linear search.
|
|
522
|
-
if (r <=
|
|
522
|
+
if (r <= Unicode.MAX_LATIN1) {
|
|
523
523
|
for (let i = 0; i < ranges.length; i++) {
|
|
524
524
|
const rhi = ranges.getHi(i);
|
|
525
525
|
if (r > rhi) {
|
|
@@ -536,24 +536,24 @@ class Unicode {
|
|
|
536
536
|
}
|
|
537
537
|
|
|
538
538
|
// Fallback to binary search for runes outside Latin-1
|
|
539
|
-
return ranges.length > 0 && r >= ranges.getLo(0) &&
|
|
539
|
+
return ranges.length > 0 && r >= ranges.getLo(0) && Unicode.is32(ranges, r);
|
|
540
540
|
}
|
|
541
541
|
|
|
542
542
|
// isUpper reports whether the rune is an upper case letter.
|
|
543
543
|
static isUpper(r) {
|
|
544
|
-
if (r <=
|
|
544
|
+
if (r <= Unicode.MAX_LATIN1) {
|
|
545
545
|
const s = String.fromCodePoint(r);
|
|
546
546
|
return s.toUpperCase() === s && s.toLowerCase() !== s;
|
|
547
547
|
}
|
|
548
|
-
return
|
|
548
|
+
return Unicode.is(UnicodeTables.Upper, r);
|
|
549
549
|
}
|
|
550
550
|
|
|
551
551
|
// isPrint reports whether the rune is printable (Unicode L/M/N/P/S or ' ').
|
|
552
552
|
static isPrint(r) {
|
|
553
|
-
if (r <=
|
|
554
|
-
return r >= 0x20 && r <
|
|
553
|
+
if (r <= Unicode.MAX_LATIN1) {
|
|
554
|
+
return r >= 0x20 && r < Unicode.MAX_ASCII || r >= 0xa1 && r !== 0xad;
|
|
555
555
|
}
|
|
556
|
-
return
|
|
556
|
+
return Unicode.is(UnicodeTables.Print, r);
|
|
557
557
|
}
|
|
558
558
|
|
|
559
559
|
// simpleFold iterates over Unicode code points equivalent under
|
|
@@ -608,11 +608,13 @@ class Unicode {
|
|
|
608
608
|
|
|
609
609
|
// Fast path for the common case where both runes are ASCII characters.
|
|
610
610
|
// Coerces both runes to lowercase if applicable.
|
|
611
|
-
if (r1 <=
|
|
612
|
-
|
|
611
|
+
if (r1 <= Unicode.MAX_ASCII && r2 <= Unicode.MAX_ASCII) {
|
|
612
|
+
// 65 is 'A', 90 is 'Z'
|
|
613
|
+
if (65 <= r1 && r1 <= 90) {
|
|
613
614
|
r1 |= 0x20;
|
|
614
615
|
}
|
|
615
|
-
|
|
616
|
+
// 65 is 'A', 90 is 'Z'
|
|
617
|
+
if (65 <= r2 && r2 <= 90) {
|
|
616
618
|
r2 |= 0x20;
|
|
617
619
|
}
|
|
618
620
|
return r1 === r2;
|
|
@@ -620,7 +622,7 @@ class Unicode {
|
|
|
620
622
|
|
|
621
623
|
// Fall back to full Unicode case folding otherwise.
|
|
622
624
|
// Invariant: r1 must be non-negative
|
|
623
|
-
for (let r =
|
|
625
|
+
for (let r = Unicode.simpleFold(r1); r !== r1; r = Unicode.simpleFold(r)) {
|
|
624
626
|
if (r === r2) {
|
|
625
627
|
return true;
|
|
626
628
|
}
|
|
@@ -629,6 +631,31 @@ class Unicode {
|
|
|
629
631
|
}
|
|
630
632
|
}
|
|
631
633
|
|
|
634
|
+
/**
|
|
635
|
+
* Size of the precomputed single-byte lookup table.
|
|
636
|
+
* Covers standard ASCII and Latin-1 characters for fast-path execution.
|
|
637
|
+
*/
|
|
638
|
+
const FAST_PATH_TABLE_SIZE = 256;
|
|
639
|
+
/**
|
|
640
|
+
* Precomputed lookup table for Word Boundary (\b, \B) assertions.
|
|
641
|
+
* * By precomputing the boolean results for standard ASCII word ranges
|
|
642
|
+
* ('a'-'z', 'A'-'Z', '0'-'9', '_'), we completely eliminate 4 logical
|
|
643
|
+
* branches from the NFA's hot execution loop. This prevents costly
|
|
644
|
+
* CPU branch mispredictions when scanning large strings.
|
|
645
|
+
*/
|
|
646
|
+
const WORD_RUNE_TABLE = new Uint8Array(FAST_PATH_TABLE_SIZE);
|
|
647
|
+
for (let i = 0; i < FAST_PATH_TABLE_SIZE; i++) {
|
|
648
|
+
WORD_RUNE_TABLE[i] = 97 <= i && i <= 122 ||
|
|
649
|
+
// 'a' - 'z'
|
|
650
|
+
65 <= i && i <= 90 ||
|
|
651
|
+
// 'A' - 'Z'
|
|
652
|
+
48 <= i && i <= 57 ||
|
|
653
|
+
// '0' - '9'
|
|
654
|
+
i === 95 // '_'
|
|
655
|
+
? 1 : 0;
|
|
656
|
+
}
|
|
657
|
+
let cachedNativeEncoder = null;
|
|
658
|
+
let cachedNativeDecoder = null;
|
|
632
659
|
/**
|
|
633
660
|
* Various constants and helper utilities.
|
|
634
661
|
*/
|
|
@@ -674,7 +701,7 @@ class Utils {
|
|
|
674
701
|
static escapeRune(rune) {
|
|
675
702
|
let out = '';
|
|
676
703
|
if (Unicode.isPrint(rune)) {
|
|
677
|
-
if (
|
|
704
|
+
if (Utils.METACHARACTERS.indexOf(String.fromCodePoint(rune)) >= 0) {
|
|
678
705
|
out += '\\';
|
|
679
706
|
}
|
|
680
707
|
out += String.fromCodePoint(rune);
|
|
@@ -727,12 +754,21 @@ class Utils {
|
|
|
727
754
|
return out;
|
|
728
755
|
}
|
|
729
756
|
|
|
730
|
-
// Returns the array of runes in the specified
|
|
757
|
+
// Returns the array of runes in the specified JS UTF-16 string.
|
|
731
758
|
static stringToRunes(str) {
|
|
732
|
-
|
|
759
|
+
const string = String(str);
|
|
760
|
+
const runes = [];
|
|
761
|
+
let i = 0;
|
|
762
|
+
while (i < string.length) {
|
|
763
|
+
const cp = string.codePointAt(i);
|
|
764
|
+
runes.push(cp);
|
|
765
|
+
// Surrogate pairs (Emojis, etc.) are > 0xFFFF
|
|
766
|
+
i += cp > Unicode.MAX_BMP ? 2 : 1;
|
|
767
|
+
}
|
|
768
|
+
return runes;
|
|
733
769
|
}
|
|
734
770
|
|
|
735
|
-
// Returns the
|
|
771
|
+
// Returns the JS UTF-16 string containing the single rune |r|.
|
|
736
772
|
static runeToString(r) {
|
|
737
773
|
return String.fromCodePoint(r);
|
|
738
774
|
}
|
|
@@ -741,7 +777,7 @@ class Utils {
|
|
|
741
777
|
// during the evaluation of the \b and \B zero-width assertions.
|
|
742
778
|
// These assertions are ASCII-only: the word characters are [A-Za-z0-9_].
|
|
743
779
|
static isWordRune(r) {
|
|
744
|
-
return
|
|
780
|
+
return r < FAST_PATH_TABLE_SIZE ? WORD_RUNE_TABLE[r] === 1 : false;
|
|
745
781
|
}
|
|
746
782
|
|
|
747
783
|
// emptyOpContext returns the zero-width assertions satisfied at the position
|
|
@@ -754,21 +790,24 @@ class Utils {
|
|
|
754
790
|
static emptyOpContext(r1, r2) {
|
|
755
791
|
let op = 0;
|
|
756
792
|
if (r1 < 0) {
|
|
757
|
-
op |=
|
|
793
|
+
op |= Utils.EMPTY_BEGIN_TEXT | Utils.EMPTY_BEGIN_LINE;
|
|
758
794
|
}
|
|
759
|
-
|
|
760
|
-
|
|
795
|
+
// Hardcode 10 for '\n'
|
|
796
|
+
if (r1 === 10) {
|
|
797
|
+
op |= Utils.EMPTY_BEGIN_LINE;
|
|
761
798
|
}
|
|
762
799
|
if (r2 < 0) {
|
|
763
|
-
op |=
|
|
800
|
+
op |= Utils.EMPTY_END_TEXT | Utils.EMPTY_END_LINE;
|
|
764
801
|
}
|
|
765
|
-
|
|
766
|
-
|
|
802
|
+
|
|
803
|
+
// Hardcode 10 for '\n'
|
|
804
|
+
if (r2 === 10) {
|
|
805
|
+
op |= Utils.EMPTY_END_LINE;
|
|
767
806
|
}
|
|
768
|
-
if (
|
|
769
|
-
op |=
|
|
807
|
+
if (Utils.isWordRune(r1) !== Utils.isWordRune(r2)) {
|
|
808
|
+
op |= Utils.EMPTY_WORD_BOUNDARY;
|
|
770
809
|
} else {
|
|
771
|
-
op |=
|
|
810
|
+
op |= Utils.EMPTY_NO_WORD_BOUNDARY;
|
|
772
811
|
}
|
|
773
812
|
return op;
|
|
774
813
|
}
|
|
@@ -783,7 +822,7 @@ class Utils {
|
|
|
783
822
|
static quoteMeta(str) {
|
|
784
823
|
return str.split('') // A char loop is correct because all metacharacters fit in one UTF-16 code.
|
|
785
824
|
.map(s => {
|
|
786
|
-
if (
|
|
825
|
+
if (Utils.METACHARACTERS.indexOf(s) >= 0) {
|
|
787
826
|
return `\\${s}`;
|
|
788
827
|
}
|
|
789
828
|
return s;
|
|
@@ -792,9 +831,23 @@ class Utils {
|
|
|
792
831
|
static charCount(codePoint) {
|
|
793
832
|
return codePoint > Unicode.MAX_BMP ? 2 : 1;
|
|
794
833
|
}
|
|
834
|
+
|
|
835
|
+
/**
|
|
836
|
+
* High-speed conversion from TypedArrays to standard JS Arrays.
|
|
837
|
+
* Bypasses the expensive Symbol.iterator overhead of Array.from()
|
|
838
|
+
*/
|
|
839
|
+
static toArray(typedArray) {
|
|
840
|
+
const len = typedArray.length;
|
|
841
|
+
const res = new Array(len);
|
|
842
|
+
for (let i = 0; i < len; i++) {
|
|
843
|
+
res[i] = typedArray[i];
|
|
844
|
+
}
|
|
845
|
+
return res;
|
|
846
|
+
}
|
|
795
847
|
static stringToUtf8ByteArray(str) {
|
|
796
848
|
if (globalThis.TextEncoder) {
|
|
797
|
-
|
|
849
|
+
if (!cachedNativeEncoder) cachedNativeEncoder = new TextEncoder();
|
|
850
|
+
return Utils.toArray(cachedNativeEncoder.encode(str));
|
|
798
851
|
} else {
|
|
799
852
|
// fallback, if no TextEncoder
|
|
800
853
|
let out = [],
|
|
@@ -824,7 +877,9 @@ class Utils {
|
|
|
824
877
|
}
|
|
825
878
|
static utf8ByteArrayToString(bytes) {
|
|
826
879
|
if (globalThis.TextDecoder) {
|
|
827
|
-
|
|
880
|
+
if (!cachedNativeDecoder) cachedNativeDecoder = new TextDecoder('utf-8');
|
|
881
|
+
const view = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
|
|
882
|
+
return cachedNativeDecoder.decode(view);
|
|
828
883
|
} else {
|
|
829
884
|
// fallback, if no TextDecoder
|
|
830
885
|
let out = [],
|
|
@@ -1121,15 +1176,34 @@ class MachineUTF8Input extends MachineInputBase {
|
|
|
1121
1176
|
if (targetLength === 0) {
|
|
1122
1177
|
return fromIndex <= this.end ? fromIndex : -1;
|
|
1123
1178
|
}
|
|
1179
|
+
const firstByte = target[0];
|
|
1124
1180
|
let limit = this.end - targetLength;
|
|
1125
|
-
|
|
1126
|
-
|
|
1181
|
+
// Feature detection: Native TypedArray indexOf (ES2015)
|
|
1182
|
+
const hasNativeIndexOf = typeof source.indexOf === 'function';
|
|
1183
|
+
let i = fromIndex;
|
|
1184
|
+
while (i <= limit) {
|
|
1185
|
+
// Fast-forward to the first matching byte using C++ bindings if available
|
|
1186
|
+
if (hasNativeIndexOf) {
|
|
1187
|
+
i = source.indexOf(firstByte, i);
|
|
1188
|
+
if (i === -1 || i > limit) return -1;
|
|
1189
|
+
} else {
|
|
1190
|
+
// Fallback: Manual loop
|
|
1191
|
+
while (i <= limit && source[i] !== firstByte) i++;
|
|
1192
|
+
if (i > limit) return -1;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
// First byte matches, verify the rest of the target sequence
|
|
1196
|
+
let match = true;
|
|
1197
|
+
for (let j = 1; j < targetLength; j++) {
|
|
1127
1198
|
if (source[i + j] !== target[j]) {
|
|
1199
|
+
match = false;
|
|
1128
1200
|
break;
|
|
1129
|
-
} else if (j === targetLength - 1) {
|
|
1130
|
-
return i;
|
|
1131
1201
|
}
|
|
1132
1202
|
}
|
|
1203
|
+
if (match) {
|
|
1204
|
+
return i;
|
|
1205
|
+
}
|
|
1206
|
+
i++;
|
|
1133
1207
|
}
|
|
1134
1208
|
return -1;
|
|
1135
1209
|
}
|
|
@@ -1201,8 +1275,10 @@ class MachineUTF16Input extends MachineInputBase {
|
|
|
1201
1275
|
// Returns a bitmask of EMPTY_* flags.
|
|
1202
1276
|
context(pos) {
|
|
1203
1277
|
pos += this.start;
|
|
1204
|
-
|
|
1205
|
-
|
|
1278
|
+
|
|
1279
|
+
// We only care about ASCII word runes and newlines for context boundaries
|
|
1280
|
+
const r1 = pos > this.start && pos <= this.end ? this.charSequence.charCodeAt(pos - 1) : -1;
|
|
1281
|
+
const r2 = pos < this.end ? this.charSequence.charCodeAt(pos) : -1;
|
|
1206
1282
|
return Utils.emptyOpContext(r1, r2);
|
|
1207
1283
|
}
|
|
1208
1284
|
prefixLength(re2) {
|
|
@@ -2209,7 +2285,7 @@ class Machine {
|
|
|
2209
2285
|
return Utils.emptyInts();
|
|
2210
2286
|
}
|
|
2211
2287
|
// Use subarray() to create a zero-allocation view before converting
|
|
2212
|
-
return
|
|
2288
|
+
return Utils.toArray(this.matchcap.subarray(0, this.ncap));
|
|
2213
2289
|
}
|
|
2214
2290
|
|
|
2215
2291
|
// alloc() allocates a new thread with the given instruction.
|
|
@@ -3171,7 +3247,7 @@ class Backtracker {
|
|
|
3171
3247
|
}
|
|
3172
3248
|
|
|
3173
3249
|
// Must slice so we don't accidentally leak trailing arrays from previously recycled typed arrays
|
|
3174
|
-
const result = ncap === 0 ? [] :
|
|
3250
|
+
const result = ncap === 0 ? [] : Utils.toArray(b.matchcap.subarray(0, ncap));
|
|
3175
3251
|
bitStatePool.push(b);
|
|
3176
3252
|
return result;
|
|
3177
3253
|
}
|
|
@@ -3547,7 +3623,7 @@ class OnePass {
|
|
|
3547
3623
|
matchcap[0] = 0;
|
|
3548
3624
|
matchcap[1] = pos;
|
|
3549
3625
|
}
|
|
3550
|
-
return ncap === 0 ? [] :
|
|
3626
|
+
return ncap === 0 ? [] : Utils.toArray(matchcap);
|
|
3551
3627
|
}
|
|
3552
3628
|
case Inst.RUNE:
|
|
3553
3629
|
if (!inst.matchRune(rune)) return null;
|
|
@@ -3596,7 +3672,7 @@ class OnePass {
|
|
|
3596
3672
|
}
|
|
3597
3673
|
}
|
|
3598
3674
|
if (!matched) return null;
|
|
3599
|
-
return ncap === 0 ? [] :
|
|
3675
|
+
return ncap === 0 ? [] : Utils.toArray(matchcap);
|
|
3600
3676
|
}
|
|
3601
3677
|
}
|
|
3602
3678
|
|
|
@@ -5350,7 +5426,7 @@ class StringIterator {
|
|
|
5350
5426
|
return r;
|
|
5351
5427
|
}
|
|
5352
5428
|
lookingAt(s) {
|
|
5353
|
-
return this.
|
|
5429
|
+
return this.str.startsWith(s, this.position);
|
|
5354
5430
|
}
|
|
5355
5431
|
|
|
5356
5432
|
// Returns the rest of the pattern as a Java UTF-16 string.
|