@react-native-quickjs/quickjs 1.0.0-alpha.1 → 1.0.0-alpha.3

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/CHANGELOG.md CHANGED
@@ -1,36 +1,194 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ All notable changes to this project are documented here.
4
4
 
5
- Nothing has been published yet. This section becomes the first release entry.
5
+ The format is based on [Keep a Changelog][keep-a-changelog],
6
+ and this project adheres to [Semantic Versioning][semver].
7
+
8
+ ## [Unreleased]
6
9
 
7
10
  ### Added
11
+ - Update the embedded [quickjs-ng][ng] engine to v0.16.2.
12
+
13
+ ### Changed
14
+ - Patch `0008`: faster eager `JSON.parse` through direct ASCII key-to-atom
15
+ parsing, optimized numeric arrays, integer-aware number parsing, and owned
16
+ dense-array construction.
17
+ - Patch `0009`: faster `JSON.stringify` through direct atom enumeration,
18
+ efficient key/string quoting, and direct primitive formatting.
19
+ - Patch `0010`: faster JSON tokenization with a dedicated common-punctuation
20
+ fast path for brackets, braces, commas and colons.
21
+ - Patch `0011`: opt-in lazy `JSON.parse` for documents at least 4 KiB, using a
22
+ shared source document, structural tape, direct tape-node markers and
23
+ repeated-layout materialization. Application builds remain eager by default;
24
+ opt in from the existing `package.json` with
25
+ `react-native-quickjs.lazyJson: true`. Reviver calls remain eager, and
26
+ embedders can opt out per runtime with `JS_SetJSONLazyEnabled()`.
27
+ - Patch `0012`: caches shapes for eligible repeated static object literals.
28
+ Representative object-literal workloads are approximately 12–52% faster.
29
+ - Patch `0013`: accelerates forward `String.prototype.indexOf` and `includes`
30
+ searches with `memchr` and same-width `memcmp`; representative mixed
31
+ short/long searches are approximately 8–9% faster.
32
+ - Patch `0014`: reclaims an opcode slot with a compact escape prefix for
33
+ debugger traps, preserving malformed-bytecode rejection.
34
+ - Patch `0015`: adds foundational monomorphic inline caches for property reads,
35
+ writable overwrites, and transition stores, with lazy tables and a cheap
36
+ megamorphic call-site guard. In local paired release measurements,
37
+ constructor stores were 1.36× faster, React fiber allocation 1.92× faster,
38
+ tree rendering 1.29× faster, and RN commit performance was neutral.
39
+ - Patch `0015` hardens serialized-bytecode and IC metadata validation, moves
40
+ prototype-watchpoint invalidation after successful mutations, and preserves
41
+ non-throwing lazy allocation and correct transition OOM unwinding.
42
+ - Patch `0016`: composes explicitly enabled four-entry polymorphic sites,
43
+ guarded depth-two prototype reads, and a weak direct-mapped megamorphic
44
+ fallback cache. Width 1 remains the shipping default; the width-4 default
45
+ change is reserved for a later patch.
46
+ - Patch `0016` validation covers weak fallback shape reuse, prototype mutation
47
+ invalidation, runtime destruction, width-4 ASan/OOM/differential paths, and
48
+ malformed serialized bytecode. Release CTest passed 15/15; host timings are
49
+ smoke results, with device performance based on the selected 1095 evidence.
50
+ - Patch `0016` paired host Octane smoke results improved the geomean by 7.3%
51
+ over the IC-disabled baseline across three runs. The largest gains were
52
+ DeltaBlue (+34.1%), Richards (+24.3%), Raytrace (+19.7%), and Box2D
53
+ (+14.5%); Crypto, RegExp, Splay, Navier-Stokes, PDF.js, and Mandreel were
54
+ within neutral-to-small-regression noise. The full reference data is in
55
+ `tools/benchmark/octane/octane-results.json`.
56
+ - Patch `0017`: makes four-entry inline-cache sites the shipping default after
57
+ the width-4 validation of the composed cache.
58
+ - Patch `0018`: stores bounded literal, prefix, and first-set metadata
59
+ alongside compiled regexp bytecode.
60
+ - Patch `0019`: adds the runtime-width backtracking matcher with computed-goto
61
+ dispatch and register-based execution.
62
+ - Patch `0020`: analyzes patterns for literal, prefix, and first-set candidate
63
+ searches before entering the full matcher.
64
+ - Patch `0021`: connects compiled search metadata to RegExp compilation and
65
+ execution.
66
+ - Patch `0022`: adds direct candidate scans and stack storage for small capture
67
+ sets, reducing the work needed for common matches.
68
+ - Patch `0023`: keeps `RegExp.prototype.test` result-free and streamlines
69
+ successful match handling.
70
+ - Patch `0024`: accelerates split scanning and improves first-set handling for
71
+ whitespace-led patterns.
72
+ - Patch `0025`: interns RegExp flag names as atoms for consistent reuse during
73
+ compilation.
74
+ - Patch `0026`: serves eligible `.flags` reads from validated compiled flags
75
+ while preserving the generic observable path.
76
+ - Patch `0027`: keeps the regexp fixture and bounds-accounting coverage aligned
77
+ with the matcher.
78
+ - Patch `0028`: hardens serialized RegExp validation with safe opcode, operand,
79
+ target, metadata, allocator, and interrupt checks.
80
+ - Patch `0029`: adds table-driven malformed-bytecode coverage and preserves
81
+ runtime serialization round-trip coverage through the embedding allocator.
82
+ - Patch `0030`: replaces the serialized-bytecode checksum with portable
83
+ CRC-32C, using arm64 and x86-64 hardware instructions when available while
84
+ retaining a software fallback and corruption detection. This reduces the
85
+ checksum portion of bytecode loading without changing the application-facing
86
+ bytecode API. Hardware availability is probed per call, avoiding shared
87
+ runtime state, and bytecode tests cover the standard CRC-32C vector plus
88
+ empty, short, unaligned-length, and larger inputs.
89
+ - Patch `0031`: frames serialized function bodies and adds copied lazy
90
+ function-body loading. The reader validates and owns the copied payload;
91
+ body parsing and reconstruction move to first use.
92
+ - Patch `0032`: adds explicit borrowed lazy-bytecode input for embedders that
93
+ can keep their immutable payload alive for the required lifetime. It is not
94
+ used by the React Native runtime.
95
+ - Patch `0033`: defers interning non-constant bytecode atoms until they are
96
+ first referenced, while preserving eager validation of their serialized
97
+ lengths and boundaries.
98
+ - The React Native runtime integration enables copied lazy loading; it is an
99
+ integration change layered on top of patches `0031`–`0033`, not part of
100
+ patch `0031` itself.
101
+ - In the isolated atom comparison, deferred interning saved 0.330 ms in the
102
+ host load-only median. The Android `bundleLoaded` median was 0.736 ms slower
103
+ with deferred atoms; the observed `appLoaded` difference is not conclusive
104
+ without variance measurements, so no device loading improvement is claimed.
105
+ - JSON benchmark reporting now separates checksum-free parse-only timing from
106
+ traversal and parse-plus-consume timing. The lazy path reduces the
107
+ repeated-object parse-only workload from about 199 µs eager to about 43 µs.
108
+
109
+ ## [v1.0.0-alpha.2] — 2026-09-05
110
+
111
+ ### Changed
112
+ - Updated the example app and tooling to React Native 0.85.3.
113
+ - Bumped the `@react-native-quickjs/text-encoding` dependency to v1.0.1.
114
+
115
+ ## [v1.0.0-alpha.1] — 2026-09-05
116
+
117
+ ### Added
118
+ - Native modules now fold into the engine's single `.so` on Android and iOS:
119
+ - `Intl` and `TextEncoding` native code compile into `libquickjsinstancejni.so`.
120
+ - A generated module registry is compiled into the app target on iOS, so
121
+ autolinked modules register without a separate registration step.
122
+ - `@react-native-quickjs/intl` and `@react-native-quickjs/text-encoding` now
123
+ install as a dependency and ship their bytecode embedded in the engine binary.
124
+ - New `scripts/release-module.js` and per-module CI workflows for publishing
125
+ the module workspace.
126
+ - The engine now stringifies a bytecode function whose source was stripped as
127
+ `[stripped source]` instead of `[native code]` (new engine patch `0007`).
128
+ - Release bundles compile to QuickJS bytecode on both platforms.
129
+
130
+ ### Changed
131
+ - Prefer the root project's NDK version on Android.
132
+ - `Intl`: memoized `supportedLocalesOf`, skip `String()` conversion, and an LRU
133
+ cache for `NumberFormatter`.
134
+ - `text-encoding` module bumped to v1.0.1 (see below).
8
135
 
136
+ ## [intl-v1.0.0] — 2026-09-05
137
+
138
+ ### Added
139
+ - `@react-native-quickjs/intl` 1.0.0:
140
+ - ECMA-402 `Intl` backed by the operating system's CLDR data (like Hermes),
141
+ with no locale data in your bundle.
142
+ - Lazy, bytecode-embedded implementation; materializes on first read.
143
+ - Covers `Intl.DateTimeFormat`, `NumberFormat`, `Collator`, `PluralRules`,
144
+ `RelativeTimeFormat`, `ListFormat`, `DisplayNames`, `Segmenter`, `Locale`,
145
+ `DurationFormat`, `getCanonicalLocales`, `supportedValuesOf`, and the
146
+ ECMAScript-side `toLocaleString` family.
147
+ - Platform backends for Android (`android.icu`) and Apple (`NSLocale`/friends),
148
+ plus a host stub for tests and benchmarks.
149
+
150
+ ## [text-encoding-v1.0.1] — 2026-09-05
151
+
152
+ ### Changed
153
+ - `@react-native-quickjs/text-encoding` 1.0.1:
154
+ - Folded the Android module into the engine's single `.so`, so the package
155
+ ships no native code of its own on Android.
156
+ - Added `<jsi/jsi.h>` linkage to the CMake config so it builds against
157
+ `ReactAndroid::jsi` (Android) or `jsi` (host).
158
+ - Fixed `JNI_OnLoad` handling when folded (one `JNI_OnLoad` per `.so`).
159
+
160
+ ## [v1.0.0-alpha.0] — 2026-09-03
161
+
162
+ ### Added
9
163
  - QuickJS as a React Native JavaScript engine, compiled from source in the app
10
164
  build on Android and iOS. The engine is [quickjs-ng][ng], pre-patched with the
11
- six changes described in `engine/patches/README.md`.
165
+ changes described in `engine/patches/README.md`.
12
166
  - `npx react-native-quickjs install`, plus `revert` and `doctor`, and an Expo
13
167
  config plugin for `npx expo prebuild`.
14
168
  - Release bundles compile to QuickJS bytecode on both platforms.
15
169
  - Chrome DevTools debugging: breakpoints, stepping, the call stack, variable
16
170
  inspection and expression evaluation.
17
- - A Hermes compatibility shim, so libraries that link against Hermes -- most
171
+ - A Hermes compatibility shim, so libraries that link against Hermes most
18
172
  importantly `react-native-worklets`, and through it `react-native-reanimated`
19
- -- run unmodified. It is built only for an app that has left Hermes.
173
+ run unmodified. It is built only for an app that has left Hermes.
20
174
  - `TextEncoder` and `TextDecoder`, as `@react-native-quickjs/text-encoding`,
21
175
  a dependency of this package so every app has them.
176
+ - A JSI implementation covering host objects, functions, arrays, arraybuffers,
177
+ strings, symbols, bigints, weak references, native state, microtasks,
178
+ deferred GC scheduling and safepoints, exceptions, and bytecode compilation
179
+ (`qjsc`).
22
180
 
23
- ### Known limitations
181
+ ## [text-encoding-v1.0.0] — 2026-09-03
24
182
 
25
- - iOS compiles React Native core from source: removing Hermes removes the JSI
26
- implementation that ships inside `hermesvm.framework`.
27
- - Conditional breakpoints stop unconditionally; the condition is stored and
28
- reported but never evaluated.
29
- - React Native's non-Hermes path is patched at `pod install`. Each workaround
30
- fails with a named error if React Native changes.
31
- - Expo's `getDefaultReactHost` hardcodes Hermes, so the config plugin edits
32
- `node_modules`. Until [expo#49686][expo-pr] lands, an `npm install` reverts
33
- that edit and the app silently launches on Hermes.
183
+ ### Added
184
+ - `@react-native-quickjs/text-encoding` 1.0.0:
185
+ - `TextEncoder` and `TextDecoder` per the WHATWG Encoding spec, as direct
186
+ QuickJS bindings the package `@react-native-quickjs/quickjs` depends on.
187
+ - Behaviour: unpaired surrogates encode as U+FFFD; a leading BOM is stripped
188
+ unless `ignoreBOM` is set; `fatal: true` throws on ill-formed input;
189
+ `encodeInto` stops on character boundaries.
34
190
 
191
+ [keep-a-changelog]: https://keepachangelog.com/en/1.1.0/
192
+ [semver]: https://semver.org/
35
193
  [ng]: https://github.com/quickjs-ng/quickjs
36
194
  [expo-pr]: https://github.com/expo/expo/pull/49686
package/README.md CHANGED
@@ -94,6 +94,23 @@ class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate {
94
94
 
95
95
  Then run `pod install`.
96
96
 
97
+ ### Lazy JSON parsing
98
+
99
+ Lazy JSON parsing is disabled by default. To opt in without editing a Podfile
100
+ or Gradle file, add this to the app's existing `package.json`:
101
+
102
+ ```json
103
+ {
104
+ "react-native-quickjs": {
105
+ "lazyJson": true
106
+ }
107
+ }
108
+ ```
109
+
110
+ The iOS Podspec and Android CMake integration read the same setting. The
111
+ low-level compile definition and `JS_SetJSONLazyEnabled()` API remain available
112
+ to embedders; `QJS_JSON_LAZY=0/1` remains useful for tests.
113
+
97
114
  ## Android
98
115
 
99
116
  **1. `android/gradle.properties`**
@@ -2,6 +2,17 @@ require "json"
2
2
 
3
3
  package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
4
 
5
+ # The consuming app's existing package.json is the cross-platform opt-in. The
6
+ # package's own manifest describes the library, so read from CocoaPods'
7
+ # installation root rather than __dir__ here.
8
+ consumer_roots = [Pathname.new(Pod::Config.instance.installation_root.to_s)]
9
+ consumer_roots << consumer_roots[0].parent
10
+ consumer_roots << consumer_roots[0].parent.parent
11
+ consumer_manifest = consumer_roots.map { |root| root.join("package.json") }
12
+ .find { |manifest| manifest.file? }
13
+ consumer_package = consumer_manifest ? JSON.parse(File.read(consumer_manifest)) : {}
14
+ json_lazy_default = consumer_package.dig("react-native-quickjs", "lazyJson") == true
15
+
5
16
  # The engine compiled here is engine/quickjs-rel: the committed, pre-patched
6
17
  # projection of the engine/quickjs-ng submodule, generated by
7
18
  # scripts/sync-quickjs-rel.js. The submodule cannot be what ships -- our patches
@@ -111,7 +122,8 @@ Pod::Spec.new do |s|
111
122
  # RNQJS_ENABLE_CDP is absent on purpose: undefined means no DevTools
112
123
  # backend, and react_native_quickjs_post_install defines it for debug only.
113
124
  "GCC_PREPROCESSOR_DEFINITIONS" =>
114
- "$(inherited) _GNU_SOURCE=1 JS_ENABLE_DEBUGGER=1",
125
+ "$(inherited) _GNU_SOURCE=1 JS_ENABLE_DEBUGGER=1" \
126
+ + (json_lazy_default ? " RNQJS_JSON_LAZY_DEFAULT=1" : ""),
115
127
  "USE_HEADERMAP" => "YES",
116
128
  }
117
129
 
@@ -94,6 +94,12 @@ endif()
94
94
 
95
95
  add_library(quickjsinstancejni SHARED ${RNQJS_QUICKJSINSTANCE_SOURCES})
96
96
 
97
+ if(RNQJS_BYTECODE_LAZY)
98
+ target_compile_definitions(quickjsinstancejni PRIVATE RNQJS_BYTECODE_LAZY=1)
99
+ else()
100
+ target_compile_definitions(quickjsinstancejni PRIVATE RNQJS_BYTECODE_LAZY=0)
101
+ endif()
102
+
97
103
  target_include_directories(quickjsinstancejni PRIVATE
98
104
  "${RNQJS_ROOT}/src/bytecode"
99
105
  "${RNQJS_ROOT}/src/module"
@@ -54,7 +54,9 @@ android {
54
54
  // off by default, r28 turns it on, and no host build can see it.
55
55
  arguments "-DANDROID_STL=c++_shared",
56
56
  "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON",
57
- "-DREACT_NATIVE_DIR=${reactNativeDir()}"
57
+ "-DREACT_NATIVE_DIR=${reactNativeDir()}",
58
+ "-DRNQJS_JSON_LAZY_DEFAULT=${jsonLazyEnabled() ? 'ON' : 'OFF'}",
59
+ "-DRNQJS_BYTECODE_LAZY=${quickjsLazyEnabled() ? 'ON' : 'OFF'}"
58
60
  if (quickjsModuleDirs().size() > 0) {
59
61
  arguments "-DRNQJS_QUICKJS_MODULES=${quickjsModuleDirs().join(';')}"
60
62
  }
@@ -141,6 +143,26 @@ def reactNativeArchitectures() {
141
143
  return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
142
144
  }
143
145
 
146
+ // The app's existing package.json is the single cross-platform opt-in. A
147
+ // Gradle property remains useful for CI and local experiments without adding
148
+ // another project file.
149
+ def jsonLazyEnabled() {
150
+ if (project.hasProperty('rnqjsJsonLazy')) {
151
+ return project.property('rnqjsJsonLazy').toString() != 'false'
152
+ }
153
+ def manifest = new File(rootProject.projectDir.parentFile, "package.json")
154
+ if (!manifest.exists()) return false
155
+ def json = new groovy.json.JsonSlurper().parse(manifest)
156
+ return json["react-native-quickjs"]?.lazyJson == true
157
+ }
158
+
159
+ def quickjsLazyEnabled() {
160
+ if (project.hasProperty('rnqjsLazy')) {
161
+ return project.property('rnqjsLazy').toString() != 'false'
162
+ }
163
+ return true
164
+ }
165
+
144
166
  // Autolinked QuickJS modules (@react-native-quickjs/* declaring
145
167
  // reactNativeQuickJSModule with an android/ dir), folded into this engine's
146
168
  // single .so.
@@ -195,9 +217,8 @@ gradle.projectsEvaluated {
195
217
  }
196
218
  }
197
219
 
198
- // Compile the release bundle to QuickJS bytecode, after React Native has
199
- // written it. Debug builds load JavaScript from Metro and never produce a
200
- // bundle, so there is nothing to compile. -PrnqjsBytecode=false turns it off.
220
+ // Compile each QuickJS bundle after React Native has written it.
221
+ // -PrnqjsBytecode=false turns this off.
201
222
 
202
223
  // ExecOperations is how a Gradle 9 build spawns a process; project.exec was
203
224
  // removed. A plain ProcessBuilder also runs, but not identically: under a
@@ -224,9 +245,15 @@ gradle.projectsEvaluated {
224
245
  app.tasks.matching { it.name ==~ /createBundle.*JsAndAssets/ }.configureEach { bundleTask ->
225
246
  bundleTask.doLast {
226
247
  // Found by name rather than by reading the task's own properties,
227
- // which are React Native Gradle plugin internals.
248
+ // which are React Native Gradle plugin internals. Restrict the scan
249
+ // to this task's variant so a prior variant's bytecode is not passed
250
+ // back through qjsc as if it were source JavaScript.
251
+ def variant = bundleTask.name - 'createBundle' - 'JsAndAssets'
252
+ def variantDir = variant.substring(0, 1).toLowerCase() + variant.substring(1)
228
253
  def assets = app.layout.buildDirectory.dir("generated/assets").get().asFile
229
- app.fileTree(assets).matching { include '**/index.android.bundle' }.each { bundle ->
254
+ app.fileTree(assets).matching {
255
+ include "**/${variantDir}/index.android.bundle"
256
+ }.each { bundle ->
230
257
  process.exec {
231
258
  commandLine(*node, compiler.absolutePath, bundle.absolutePath)
232
259
  workingDir app.rootDir
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -57,6 +57,15 @@ add_library(quickjs STATIC
57
57
  target_include_directories(quickjs PUBLIC "${QUICKJS_DIR}")
58
58
  target_compile_definitions(quickjs PRIVATE _GNU_SOURCE)
59
59
 
60
+ # Lazy JSON is opt-in for applications. Android and CocoaPods derive this
61
+ # option from the consuming app's package.json; host builds can override it
62
+ # with -DRNQJS_JSON_LAZY_DEFAULT=ON or QJS_JSON_LAZY at runtime for tests.
63
+ option(RNQJS_JSON_LAZY_DEFAULT
64
+ "Enable lazy JSON parsing by default for this build" OFF)
65
+ if(RNQJS_JSON_LAZY_DEFAULT)
66
+ target_compile_definitions(quickjs PRIVATE QJS_JSON_LAZY_DEFAULT=1)
67
+ endif()
68
+
60
69
  # The maths functions are in libSystem on Apple and in a separate libm
61
70
  # elsewhere, so a macOS host build links clean while Linux fails at the link
62
71
  # step on round, floor, pow and friends. Detected rather than assumed, the way
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_comment": "Generated by scripts/sync-quickjs-rel.js. Do not edit. These files are engine/quickjs-ng at the commit below, with the patches below applied.",
3
- "upstreamCommit": "3d3cf3d86b66551403745a5b06acbed2b0f31dfd",
3
+ "upstreamCommit": "df836d1f4490dfc6a65dbceda8a71d14ddc7f45c",
4
4
  "patches": [
5
5
  {
6
6
  "name": "0001-runtime-malloc-size-accessor.patch",
@@ -12,7 +12,7 @@
12
12
  },
13
13
  {
14
14
  "name": "0003-debugger-interface.patch",
15
- "sha256": "eb0e05d2449685768cdd44c8458c3ffb13efa47a92994363ba040ecef46b22e4"
15
+ "sha256": "ab36772fcde3abe2e2d53f7dd9eb3fe11d7644f4300e7c7d0933c39dbc458fa2"
16
16
  },
17
17
  {
18
18
  "name": "0004-debugger-frame-info.patch",
@@ -30,30 +30,135 @@
30
30
  "name": "0007-stripped-source-tostring.patch",
31
31
  "sha256": "5543d3f33108b3666ccc2317b65afc3ae132a8a12e223ed9f6defeaef2367b8b"
32
32
  },
33
+ {
34
+ "name": "0008-json-fast-paths.patch",
35
+ "sha256": "2e91ce53e8df08296a4a1fb978e1a52175587af12452cce6677f83fc8837e73c"
36
+ },
37
+ {
38
+ "name": "0009-json-stringify-fast-paths.patch",
39
+ "sha256": "dfde7e3637b3277f602a0c0c84bc5bcf3a29f63dddd7d355c5e929028fc4fabb"
40
+ },
41
+ {
42
+ "name": "0010-json-tokenizer-punctuation.patch",
43
+ "sha256": "4fca4da49b5f985224f32353a270c3208897a1c49148e7d708f9f663f4dacb5c"
44
+ },
45
+ {
46
+ "name": "0011-lazy-json-markers.patch",
47
+ "sha256": "75ef0fea774eeb4d839d0f114344dd4aa105a10089a18ba65566a39a551b06b7"
48
+ },
49
+ {
50
+ "name": "0012-object-literal-shape-templates.patch",
51
+ "sha256": "2537a703361646275ab8426bbc77291222dee112e8e921a76e6c30e28ed4374e"
52
+ },
53
+ {
54
+ "name": "0013-string-memchr-search.patch",
55
+ "sha256": "e23816f01dc98dea510a7d85f20ac803f5708c19276216f33d97e3775c0deb3d"
56
+ },
57
+ {
58
+ "name": "0014-opcode-space.patch",
59
+ "sha256": "ec17da3ec906c5fe49ca0d9800e84befd5e3ab11cc6fa88b09948becf5aab1e9"
60
+ },
61
+ {
62
+ "name": "0015-inline-caches.patch",
63
+ "sha256": "24decd2b7639b67644a078289c5b8d3bb207e0d4e00d65b2d0d1b3d908ab56cb"
64
+ },
65
+ {
66
+ "name": "0016-composed-ic-4wide-depth2-mega.patch",
67
+ "sha256": "ff52e5ffa26106f0de611acdbff82e119285cc23384cf4ea41f22bc40c76d02a"
68
+ },
69
+ {
70
+ "name": "0017-ic4-width-4-inline-cache-default-on.patch",
71
+ "sha256": "c8527464beb2a05afab4948edee31a419b149d2a6e76797f7d7524ee4813e2fd"
72
+ },
73
+ {
74
+ "name": "0018-regexp-metadata.patch",
75
+ "sha256": "674bb67c6cfd8ee1129d05cca528f97507d37e7f1303a2129b51db87ce6ce5c0"
76
+ },
77
+ {
78
+ "name": "0019-regexp-matcher-core.patch",
79
+ "sha256": "f71c6efc193f7805f0cdd2af940721673c331b01a8306c36eda02eee4ab6527a"
80
+ },
81
+ {
82
+ "name": "0020-regexp-prefilter-analysis.patch",
83
+ "sha256": "8cd48dd0ed65a0bcc43b97f0e5b6e1e0e70cbabd5543e4ebd0b990a9297e10ae"
84
+ },
85
+ {
86
+ "name": "0021-regexp-prefilter-integration.patch",
87
+ "sha256": "6fc4b32b0f26c597ae308dc8f82f4a4f7d25486b4a18f415cc815bfb2f9ca05c"
88
+ },
89
+ {
90
+ "name": "0022-regexp-exec-fast-paths.patch",
91
+ "sha256": "26b6151109f20d3f1e960d69f9f0078405d62afc609f415e0a1cffabd220850b"
92
+ },
93
+ {
94
+ "name": "0023-regexp-result-optimization.patch",
95
+ "sha256": "a688acc0aec07ae143457860843234a47afbac947696f873c48aff2b444af4af"
96
+ },
97
+ {
98
+ "name": "0024-regexp-split-scan-and-space-first-set.patch",
99
+ "sha256": "f8564a1336bc656bdf4b5e8093f8a0c625d234c5396ae3b020a8c559d82cb80e"
100
+ },
101
+ {
102
+ "name": "0025-regexp-flag-name-atoms.patch",
103
+ "sha256": "55dcc10393c2d84375e460219b2f5a739f0be04aee26c41ed47ac1dcf1f6b133"
104
+ },
105
+ {
106
+ "name": "0026-regexp-flags-from-bytecode.patch",
107
+ "sha256": "fa087ea4c14a5d86d04df7fda2e80842dc7ab47a04d161a5c1f6cb58063cfa41"
108
+ },
109
+ {
110
+ "name": "0027-regexp-test-fixture-correctness.patch",
111
+ "sha256": "da90adbb88285da1d37ac14c6611f60fbf44ec4098a23775a8c3bd5dab37cc3a"
112
+ },
113
+ {
114
+ "name": "0028-regexp-metadata-hardening.patch",
115
+ "sha256": "82d5fa08ddba839bc98f2acb001bb995ceef605f95a91b85a4f1e6a4bf682a7d"
116
+ },
117
+ {
118
+ "name": "0029-regexp-metadata-tests.patch",
119
+ "sha256": "32f31ab67f340b0c94f54ab64bf158a47189bd03625934a639b9ed4b0f92a1f9"
120
+ },
121
+ {
122
+ "name": "0030-crc32c-bytecode-checksum.patch",
123
+ "sha256": "b0f244db173181a94b7d7a090f61da9ff66e6cb3c2a93eac4991af1adec72388"
124
+ },
125
+ {
126
+ "name": "0031-lazy-bytecode-function-bodies.patch",
127
+ "sha256": "54c8f8e79d4832e73adfa3acb33cf667b33bacec0d6cb0331d7d267e46906c5a"
128
+ },
129
+ {
130
+ "name": "0032-borrowed-lazy-bytecode-input.patch",
131
+ "sha256": "e282fa2687a1cf5ed042bcc91478ec7de0d68b5165e33cb4a5eadd0085eed6c3"
132
+ },
133
+ {
134
+ "name": "0033-deferred-bytecode-atoms.patch",
135
+ "sha256": "bc5d8aba4747e808f9dcc0e0150db5cbbc34edbafa5624430ba8fb78fedc0242"
136
+ },
33
137
  {
34
138
  "name": "9999-bc-version-bump.patch",
35
- "sha256": "1a89bc63c09a7411d3f5d8cacbccbb7c525ad37ec4f7f07ee130f5ade736d428"
139
+ "sha256": "06463ac103bea52a86b1cc413ac056ec19980640ff6d57af5444a1728d4d5aad"
36
140
  }
37
141
  ],
38
142
  "files": {
39
- "quickjs.c": "9016fa1b5e6682c0c45fef8d1b057aa44cfad95ff1eb50e3432ad520187a86e1",
40
- "libregexp.c": "27cd5fb4f4f0d8c05fea4cb0ddcd4dede7f39364e87f0f5610cfc25a89908158",
41
- "libunicode.c": "d88f53190ad772dd09b2beb93ffb8fc3097852f4987485aac8663a00189c43eb",
143
+ "quickjs.c": "aab1e3ae19a8ee2b320814e3eb7054866f20b682680efeccf1edb3904025b950",
144
+ "libregexp.c": "98d43216a43bd02950168529fd8962558c9dda612eed7ce93d3cba40e1223232",
145
+ "libunicode.c": "d755606498ff707dc3a93826713c749f77b9222d8a6b066621d72a308460bf2d",
42
146
  "dtoa.c": "a8d2cf2d04db406e0c16acdd95ab0e709d309902865722f41dac07a1ba5676af",
43
- "builtin-array-fromasync.h": "f41eb2eb028832cff9a5f8d8d2cb438c27771a9d7d85c30dfd16aa78f34fe6de",
44
- "builtin-iterator-zip-keyed.h": "b44cb8065f2eb2d4689b426bbc08fdf24ac996065cd909a09748566ce0b6a446",
45
- "builtin-iterator-zip.h": "8d30bc2ebbc77f18754059444ee1e2686a6b2229cedfadcc0c593baa656acec2",
147
+ "builtin-array-fromasync.h": "d826a4f17d0674dffb10f31b57e9ef054dd9dcb95fe9f1947b80cbc256c75aaa",
148
+ "builtin-iterator-zip-keyed.h": "ec83ae715ba78bd52d7ce3fe7245cec656a4ba3c248d31dbcdf78b2838ac4913",
149
+ "builtin-iterator-zip.h": "9fcae978ad59a328defaa4be372bc2a24387e67a8ee42779ddddaf6a5a4aca01",
46
150
  "cutils.h": "810709e35fe0ece09321ad4c207dba9973aa19f91fa909e00754896b39cc3201",
47
151
  "dtoa.h": "1c4a4540c0038632c8a4c225472fbc21bd476fb35c4da4a857a11965b58231b9",
48
152
  "libregexp-opcode.h": "2a98d646089f3a72f25480116297c5fdb5b28fd9f815447273951f4ade4a115e",
49
- "libregexp.h": "53ff95a038f7001b752c455d195d998e2955f0ae4ed62a002c13eca798db3ceb",
50
- "libunicode-table.h": "2ec1c935e1268c1bd76ac10cad63e6e0f1f4bb3f125e69ddcfc2b9123582b8db",
153
+ "libregexp-backtrack.c.inc": "c0048b115cb43a46f9e3688b962fd2c95188acc528d65cfd7191f73c787c861a",
154
+ "libregexp.h": "2e6fca80aace54a614b5a3f65912f2d6b03dd0d87a7ed3f25f064d997e6eb557",
155
+ "libunicode-table.h": "5840a921ac11664b505ee37b1219f518fff2a04972fe848b4bdf1e85c5a0bd83",
51
156
  "libunicode.h": "ad13f66aaea3fab1616e84b9c048f2a315e1bdbab628b966617a7a3e55bcba2b",
52
157
  "list.h": "cb6e24e8ee54bccdd66234fe54cd702d1160b9841db2b9b9adeb5003afe301d5",
53
158
  "quickjs-atom.h": "66654ae6533d15073ea527979c453709d7ed83162142c656095a10dcef737a60",
54
159
  "quickjs-c-atomics.h": "29883c742a5c512278fce54d19b1b9af949006e1d7dfc9ffa2e0946b184d8c5c",
55
- "quickjs-opcode.h": "c5b3354ae71cd209e8ebe3234768ac906b7f541fb0ab7fac5d69ef66210250bc",
56
- "quickjs.h": "bdda3829c255b663e6db572f63e5a40dcde529b28c2c10806e419d99dbdb27b0",
160
+ "quickjs-opcode.h": "ede502651cd914c9cf44ecf1202c5ac33263286a31c06065e2b0ea985463fb82",
161
+ "quickjs.h": "a532b83c8c37cc79fedff1846ed2469478fc4f1ca1e6197cb402443c66a8996d",
57
162
  "LICENSE": "96f73f9d2a16c21a36b418f06073be26e7d6d5e7c1bc99756b21a4f2c74ef171"
58
163
  }
59
164
  }