@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 +173 -15
- package/README.md +17 -0
- package/ReactNativeQuickJS.podspec +13 -1
- package/android/CMakeLists.txt +6 -0
- package/android/build.gradle +33 -6
- package/bin/qjsc/darwin-arm64/qjsc +0 -0
- package/bin/qjsc/darwin-x64/qjsc +0 -0
- package/bin/qjsc/linux-arm64/qjsc +0 -0
- package/bin/qjsc/linux-x64/qjsc +0 -0
- package/bin/qjsc/win32-x64/qjsc.exe +0 -0
- package/cmake/quickjs.cmake +9 -0
- package/engine/quickjs-rel/MANIFEST.json +118 -13
- package/engine/quickjs-rel/builtin-array-fromasync.h +100 -92
- package/engine/quickjs-rel/builtin-iterator-zip-keyed.h +288 -273
- package/engine/quickjs-rel/builtin-iterator-zip.h +293 -276
- package/engine/quickjs-rel/libregexp-backtrack.c.inc +583 -0
- package/engine/quickjs-rel/libregexp.c +1021 -573
- package/engine/quickjs-rel/libregexp.h +54 -2
- package/engine/quickjs-rel/libunicode-table.h +71 -84
- package/engine/quickjs-rel/libunicode.c +5 -0
- package/engine/quickjs-rel/quickjs-opcode.h +15 -6
- package/engine/quickjs-rel/quickjs.c +6581 -734
- package/engine/quickjs-rel/quickjs.h +43 -9
- package/package.json +15 -3
- package/src/runtime/QuickJSRuntime.cpp +18 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,36 +1,194 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
All notable changes to this project are documented here.
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
181
|
+
## [text-encoding-v1.0.0] — 2026-09-03
|
|
24
182
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
package/android/CMakeLists.txt
CHANGED
|
@@ -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"
|
package/android/build.gradle
CHANGED
|
@@ -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
|
|
199
|
-
//
|
|
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 {
|
|
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
|
package/bin/qjsc/darwin-x64/qjsc
CHANGED
|
Binary file
|
|
Binary file
|
package/bin/qjsc/linux-x64/qjsc
CHANGED
|
Binary file
|
|
Binary file
|
package/cmake/quickjs.cmake
CHANGED
|
@@ -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": "
|
|
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": "
|
|
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": "
|
|
139
|
+
"sha256": "06463ac103bea52a86b1cc413ac056ec19980640ff6d57af5444a1728d4d5aad"
|
|
36
140
|
}
|
|
37
141
|
],
|
|
38
142
|
"files": {
|
|
39
|
-
"quickjs.c": "
|
|
40
|
-
"libregexp.c": "
|
|
41
|
-
"libunicode.c": "
|
|
143
|
+
"quickjs.c": "aab1e3ae19a8ee2b320814e3eb7054866f20b682680efeccf1edb3904025b950",
|
|
144
|
+
"libregexp.c": "98d43216a43bd02950168529fd8962558c9dda612eed7ce93d3cba40e1223232",
|
|
145
|
+
"libunicode.c": "d755606498ff707dc3a93826713c749f77b9222d8a6b066621d72a308460bf2d",
|
|
42
146
|
"dtoa.c": "a8d2cf2d04db406e0c16acdd95ab0e709d309902865722f41dac07a1ba5676af",
|
|
43
|
-
"builtin-array-fromasync.h": "
|
|
44
|
-
"builtin-iterator-zip-keyed.h": "
|
|
45
|
-
"builtin-iterator-zip.h": "
|
|
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.
|
|
50
|
-
"
|
|
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": "
|
|
56
|
-
"quickjs.h": "
|
|
160
|
+
"quickjs-opcode.h": "ede502651cd914c9cf44ecf1202c5ac33263286a31c06065e2b0ea985463fb82",
|
|
161
|
+
"quickjs.h": "a532b83c8c37cc79fedff1846ed2469478fc4f1ca1e6197cb402443c66a8996d",
|
|
57
162
|
"LICENSE": "96f73f9d2a16c21a36b418f06073be26e7d6d5e7c1bc99756b21a4f2c74ef171"
|
|
58
163
|
}
|
|
59
164
|
}
|