feat!: upgrade V8 to 14.9.207.39 - #1987
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughV8 is upgraded to 14.9 with NDK r29. Prebuilt libraries and headers are downloaded and verified, Android ABI selection is configurable, runtime bindings are migrated to updated V8 APIs, inspector sources are refreshed, and supporting Abseil headers are vendored. ChangesV8 14.9 migration
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Reproduces the prebuilt libv8_monolith.a from source: - fetch_v8.sh pins 14.9.207.39 and applies the patches - build_v8_source.sh builds an ABI and vendors the matching headers - build_v8_linux_docker.sh covers the two 32-bit ABIs, which cannot be built on macOS -- mksnapshot has to run V8's simulator for a 32-bit target and v8config.h only permits that from an ia32 host - vendor_inspector_sources.py refreshes the V8 internals that the inspector glue compiles against, by transitive closure from what it actually includes v8_resurrecting_finalizers.patch restores WeakCallbackType::kFinalizer, removed upstream right after 10.3.22; ObjectManager depends on it. android_build_on_macos.patch relaxes chromium's linux-host assert and makes android_ndk_root selectable.
Refreshed wholesale from the pinned checkout by build_v8_source.sh. The deletions are 10.3-era headers that no longer exist upstream; nothing includes them. zip.h/zipconf.h belong to libzip and inspector/ holds the generated protocol headers, so both are left alone by the vendoring step.
JsV8InspectorClient and ns-v8-tracing-agent-impl compile against src/inspector, which is not public API, so this copy has to move with libv8_monolith.a or it is an ABI mismatch. Regenerated by transitive closure from the six headers the runtime actually includes. src/common/globals.h now reaches abseil through base/numbers/double.h, so the needed absl headers come along and land at the top of the tree, where the "absl/..." spelling already resolves.
Mechanical, except where noted: - Context/Object/Function/Promise/Message::GetIsolate() removed -> Isolate::GetCurrent() - External::New/Value() and the aligned internal-field accessors take a type tag - Object::CreationContext() -> GetCreationContext(isolate) - ScriptOrigin no longer takes an isolate; AccessControl is gone - GetInternalField returns Local<Data> - V8Inspector::connect takes a trust level; createForConsoleAPI takes a span - FunctionCallbackInfo is no longer copyable, so ArgsWrapper holds a reference -- every instance is a local in the callback it wraps Accessors are the part that is not mechanical. PropertyCallbackInfo no longer exposes the receiver at all, and SetNativeDataProperty is not a drop-in for SetAccessor on anything that is inherited from. Six MetadataNode accessors live on an object other than the one they are read through -- class, nullObject and static fields on the constructor, super on the implementation object, instance fields and properties on the prototype template -- and are now SetAccessorProperty with FunctionTemplate-backed callbacks, whose This() is still the receiver. Static fields matter most: they have a setter, and a data-like property would let Derived.baseField = x shadow the base and silently never reach it. The field accessors used thiz->StrictEquals(info.Holder()) to detect an instance field read straight off the prototype. Function-backed accessors have no holder, so that is now !IsJsRuntimeObject(thiz) -- being a runtime-managed object is what actually separates an instance from the prototype. The array wrapper's indexed handler returns v8::Intercepted; both paths handle the access completely and neither ever fell through. V8::Initialize() freezes the flag list and changing a flag afterwards aborts, so the app's v8Flags are applied once in InitializeV8() rather than per isolate. unistd.h is included explicitly where usleep/read used to arrive transitively.
V8 14.9's src/base/atomicops.h uses std::atomic_ref unconditionally, and r27d ships libc++ 18, which does not implement it. The runtime compiles that header because v8_inspector vendors V8 internals, so the bump is forced rather than opportunistic. r29 is the first released NDK new enough. minSdk is unchanged at 21. V8 has to be built against the same NDK: libc++ is only ABI-compatible with itself across a static link, and V8's bundled NDK is newer than any released one -- mixing them fails the link on std::__ndk1::__hash_memory. -Pabis=arm64-v8a,x86_64 restricts abiFilters, which is needed while the 32-bit monoliths can only be produced on a linux/amd64 host.
The 32-bit build runs for hours. With stdin attached the container died along with whatever shell started it, losing the work. It now starts detached and the logs are followed separately, so interrupting the script leaves the build running; --attach picks the stream back up.
Only the host assert in that patch is macOS-specific, and widening it is a no-op on Linux. The API 21 floor and the android_ndk_root gn arg are needed everywhere -- gating the whole patch on Darwin broke the linux container at gn gen with "default_min_sdk_version (21) must be >= min_supported_sdk_version (23)". Renamed to match what it actually does.
depot_tools and the ~3GB NDK were fetched into the container filesystem, so every retry re-downloaded them; they now live in the same volume as the V8 checkout. The mounted build script also moves off mktemp and loses its cleanup trap. bash reads a script incrementally, so deleting it when the launching shell exits could break a container that is still running -- the whole point of detaching.
Building a 32-bit Android target makes mksnapshot and the bytecode builtins generator 32-bit x86 host binaries. Without i386 multiarch they link and then fail to run, which surfaces as a failed generate_bytecode_builtins_list action rather than anything mentioning architecture.
The libraries and the headers that must match them now come from a pinned release of NativeScript/v8-buildscripts, installed by tools/v8/fetch_prebuilt_v8.sh and verified against the SHA256SUMS published with it. tools/v8/V8_RELEASE is the pin. Two reasons they cannot stay in git. The arm64-v8a and x86_64 monoliths are 100.7 MiB and 106.1 MiB, over GitHub's hard 100 MiB per-file push limit. More importantly the full matrix cannot be produced on any single machine -- the 32-bit ABIs need an ia32-capable host, the Apple variants need macOS -- so hand-assembled binaries are neither reproducible nor verifiable. The vendored headers are ignored along with the libraries, not just the binaries. Keeping a copy in git is how it drifts out of step with the libraries it describes; the iOS runtime was carrying 10.3 crdtp headers against a 14.9 libcrdtp for exactly that reason. Sourcing both from one verified artifact makes the mismatch impossible. libzip.a and zip.h stay tracked -- they are not V8.
Moved to a root-level download_v8.sh rather than a Gradle task, so it is a prerequisite you run once, a no-op when the artifacts are already in place, and trivial to skip. V8_SKIP_DOWNLOAD=1 makes it exit immediately, which is what you want when you have built V8 yourself and do not want a pinned release overwriting it. Keeping it out of Gradle also means a stale or unreachable release cannot wedge an otherwise working build -- you just skip it.
fetch_v8.sh, build_v8_source.sh, build_v8_linux_docker.sh and both patches now live in NativeScript/v8-buildscripts, which owns producing V8 for both runtimes. Keeping a second copy here means two sets of gn args that can disagree -- the same drift this whole change removes, and these are the args where disagreeing is expensive (v8_array_buffer_internal_field_count silently breaks ArrayBuffer marshalling). vendor_inspector_sources.py stays: the closure roots are what this runtime's glue includes, which is not the build repo's business. iOS has five roots, this has six.
Alongside error-handling.md they read like current instructions; they are a record of a completed migration. Lowercase-hyphenated to match the neighbours.
CI invokes gradle directly rather than build.sh, so nothing installed the V8 libraries and every ABI failed with "libv8_monolith.a ... missing and no known rule to make it". Both workflows now run ./download_v8.sh before the first gradle invocation. NDK_VERSION also moves r27d -> r29. V8 14.9 uses std::atomic_ref, which r27d's libc++ 18 does not implement, and the runtime compiles that header because v8_inspector vendors V8 internals. download_v8.sh picks sha256sum or shasum depending on what the host has; it was written on macOS, where only the latter exists.
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (2)
tools/v8/vendor_inspector_sources.py (2)
80-93: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winSibling resolution can vendor paths outside
VENDORED_PREFIXES.
siblingisnormpath'd from the including file's directory, so a relative include like../../include/v8.hresolves toinclude/v8.hand gets queued and copied even though it is not underVENDORED_PREFIXES. Line 87 only wipessrc,third_party, andabsl, so such a tree also survives future runs as stale state. Consider constraining the sibling fallback to vendored prefixes.♻️ Proposed guard
# The crdtp headers include their siblings by bare name. sibling = os.path.normpath(os.path.join(os.path.dirname(rel), inc)) - if resolve(sibling) is not None: + if sibling.startswith(VENDORED_PREFIXES) and resolve(sibling) is not None: queue.append(sibling)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tools/v8/vendor_inspector_sources.py` around lines 80 - 93, Constrain sibling fallback resolution in the include-discovery logic to paths under VENDORED_PREFIXES before queuing them in queue. Ensure out-of-prefix normalized paths are ignored and are not copied into dest, while preserving resolution for valid vendored siblings.
75-75: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueUse a context manager and reuse the resolved path.
Line 75 leaks the handle outside CPython's refcounting, and line 93 re-runs
resolve()for every file already resolved in the walk. Caching the resolved path in a dict keyed byrelfixes both.♻️ Proposed refactor
- seen, queue, missing = set(), list(ROOTS), [] + resolved, queue, missing = {}, list(ROOTS), [] while queue: rel = queue.pop() - if rel in seen: + if rel in resolved: continue src = resolve(rel) if src is None: missing.append(rel) continue - seen.add(rel) - text = open(src, encoding="utf-8", errors="replace").read() + resolved[rel] = src + with open(src, encoding="utf-8", errors="replace") as f: + text = f.read()- for rel in sorted(seen): + for rel in sorted(resolved): out = os.path.join(dest, rel) os.makedirs(os.path.dirname(out), exist_ok=True) - shutil.copyfile(resolve(rel), out) + shutil.copyfile(resolved[rel], out) - print(f"vendored {len(seen)} files into {dest}") + print(f"vendored {len(resolved)} files into {dest}")🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tools/v8/vendor_inspector_sources.py` at line 75, Update the source-reading logic in the vendor inspection walk to open files through a context manager, ensuring handles close on all Python implementations. Reuse each file’s already resolved path by caching it in a dict keyed by rel, and use that cached path at the later read site instead of calling resolve() again.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/knowledge/v8-14-migration.md`:
- Around line 214-217: Update the “Known follow-ups” bullet to state that the
32-bit ABIs require Linux x64 builders, replacing the outdated claim that
armeabi-v7a and x86 still contain V8 10.3 libraries. Preserve the existing
reference to the builder details above.
In `@download_v8.sh`:
- Around line 70-73: Update the early-return check in download_v8.sh to store
the selected ABI set in STAMP and require it to match the current request.
Before skipping, validate that every requested ABI library and its generated
header tree exists; otherwise continue the download, while preserving --force
behavior and refreshing the stamp after a successful installation.
- Around line 87-112: Authenticate the downloaded SHA256SUMS manifest
independently before using it in the checksum verification flow. Update the
download logic around fetch SHA256SUMS and the subsequent ASSETS verification to
validate a pinned trusted digest/signature or independent release attestation,
failing before any archive is unpacked when authentication fails.
In `@test-app/app/build.gradle`:
- Around line 45-47: Centralize `-Pabis` parsing and validation in a shared
helper used by both Gradle modules, trimming entries and rejecting empty,
invalid, or project-unsupported ABIs before they reach native configuration.
Update the `selectedAbis` logic at test-app/app/build.gradle:45-47 and
test-app/runtime/build.gradle:14-16, then apply the validated values in each
`abiFilters` branch at test-app/app/build.gradle:231-233 and
test-app/runtime/build.gradle:126-131; preserve the existing behavior when no
property is supplied.
---
Nitpick comments:
In `@tools/v8/vendor_inspector_sources.py`:
- Around line 80-93: Constrain sibling fallback resolution in the
include-discovery logic to paths under VENDORED_PREFIXES before queuing them in
queue. Ensure out-of-prefix normalized paths are ignored and are not copied into
dest, while preserving resolution for valid vendored siblings.
- Line 75: Update the source-reading logic in the vendor inspection walk to open
files through a context manager, ensuring handles close on all Python
implementations. Reuse each file’s already resolved path by caching it in a dict
keyed by rel, and use that cached path at the later read site instead of calling
resolve() again.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 01825bed-80f2-45a6-897d-7aa3f4b33d66
📒 Files selected for processing (332)
.github/workflows/npm_release.yml.github/workflows/pull_request.yml.gitignoreV8_RELEASEbuild.shdocs/README.mddocs/knowledge/v8-14-migration.mddownload_v8.shpackage.jsontest-app/app/build.gradletest-app/runtime/build.gradletest-app/runtime/src/main/cpp/ArgConverter.cpptest-app/runtime/src/main/cpp/ArgsWrapper.htest-app/runtime/src/main/cpp/ArrayBufferHelper.cpptest-app/runtime/src/main/cpp/ArrayElementAccessor.cpptest-app/runtime/src/main/cpp/ArrayHelper.cpptest-app/runtime/src/main/cpp/CallbackHandlers.cpptest-app/runtime/src/main/cpp/ErrorEvents.cpptest-app/runtime/src/main/cpp/Events.cpptest-app/runtime/src/main/cpp/Interop.cpptest-app/runtime/src/main/cpp/JSONObjectHelper.cpptest-app/runtime/src/main/cpp/JsArgToArrayConverter.cpptest-app/runtime/src/main/cpp/JsV8InspectorClient.cpptest-app/runtime/src/main/cpp/MessageLoopTimer.cpptest-app/runtime/src/main/cpp/MetadataNode.cpptest-app/runtime/src/main/cpp/MetadataNode.htest-app/runtime/src/main/cpp/MethodCache.cpptest-app/runtime/src/main/cpp/ModuleInternal.cpptest-app/runtime/src/main/cpp/ModuleInternalCallbacks.cpptest-app/runtime/src/main/cpp/NativeScriptException.cpptest-app/runtime/src/main/cpp/NumericCasts.cpptest-app/runtime/src/main/cpp/ObjectManager.cpptest-app/runtime/src/main/cpp/Profiler.cpptest-app/runtime/src/main/cpp/Runtime.cpptest-app/runtime/src/main/cpp/Timers.cpptest-app/runtime/src/main/cpp/URLImpl.cpptest-app/runtime/src/main/cpp/URLImpl.htest-app/runtime/src/main/cpp/URLPatternImpl.cpptest-app/runtime/src/main/cpp/URLSearchParamsImpl.cpptest-app/runtime/src/main/cpp/URLSearchParamsImpl.htest-app/runtime/src/main/cpp/Util.cpptest-app/runtime/src/main/cpp/V8GlobalHelpers.cpptest-app/runtime/src/main/cpp/WorkerInspectorClient.cpptest-app/runtime/src/main/cpp/WorkerMessage.cpptest-app/runtime/src/main/cpp/WorkerWrapper.cpptest-app/runtime/src/main/cpp/console/Console.cpptest-app/runtime/src/main/cpp/console/Console.htest-app/runtime/src/main/cpp/include/APIDesign.mdtest-app/runtime/src/main/cpp/include/DEPStest-app/runtime/src/main/cpp/include/DIR_METADATAtest-app/runtime/src/main/cpp/include/OWNERStest-app/runtime/src/main/cpp/include/cppgc/DEPStest-app/runtime/src/main/cpp/include/cppgc/OWNERStest-app/runtime/src/main/cpp/include/cppgc/README.mdtest-app/runtime/src/main/cpp/include/cppgc/allocation.htest-app/runtime/src/main/cpp/include/cppgc/common.htest-app/runtime/src/main/cpp/include/cppgc/cross-thread-persistent.htest-app/runtime/src/main/cpp/include/cppgc/custom-space.htest-app/runtime/src/main/cpp/include/cppgc/default-platform.htest-app/runtime/src/main/cpp/include/cppgc/ephemeron-pair.htest-app/runtime/src/main/cpp/include/cppgc/explicit-management.htest-app/runtime/src/main/cpp/include/cppgc/garbage-collected.htest-app/runtime/src/main/cpp/include/cppgc/heap-consistency.htest-app/runtime/src/main/cpp/include/cppgc/heap-state.htest-app/runtime/src/main/cpp/include/cppgc/heap-statistics.htest-app/runtime/src/main/cpp/include/cppgc/heap.htest-app/runtime/src/main/cpp/include/cppgc/internal/api-constants.htest-app/runtime/src/main/cpp/include/cppgc/internal/atomic-entry-flag.htest-app/runtime/src/main/cpp/include/cppgc/internal/caged-heap-local-data.htest-app/runtime/src/main/cpp/include/cppgc/internal/compiler-specific.htest-app/runtime/src/main/cpp/include/cppgc/internal/finalizer-trait.htest-app/runtime/src/main/cpp/include/cppgc/internal/gc-info.htest-app/runtime/src/main/cpp/include/cppgc/internal/logging.htest-app/runtime/src/main/cpp/include/cppgc/internal/name-trait.htest-app/runtime/src/main/cpp/include/cppgc/internal/persistent-node.htest-app/runtime/src/main/cpp/include/cppgc/internal/pointer-policies.htest-app/runtime/src/main/cpp/include/cppgc/internal/write-barrier.htest-app/runtime/src/main/cpp/include/cppgc/liveness-broker.htest-app/runtime/src/main/cpp/include/cppgc/macros.htest-app/runtime/src/main/cpp/include/cppgc/member.htest-app/runtime/src/main/cpp/include/cppgc/name-provider.htest-app/runtime/src/main/cpp/include/cppgc/object-size-trait.htest-app/runtime/src/main/cpp/include/cppgc/persistent.htest-app/runtime/src/main/cpp/include/cppgc/platform.htest-app/runtime/src/main/cpp/include/cppgc/prefinalizer.htest-app/runtime/src/main/cpp/include/cppgc/process-heap-statistics.htest-app/runtime/src/main/cpp/include/cppgc/sentinel-pointer.htest-app/runtime/src/main/cpp/include/cppgc/source-location.htest-app/runtime/src/main/cpp/include/cppgc/testing.htest-app/runtime/src/main/cpp/include/cppgc/trace-trait.htest-app/runtime/src/main/cpp/include/cppgc/type-traits.htest-app/runtime/src/main/cpp/include/cppgc/visitor.htest-app/runtime/src/main/cpp/include/inspector/Debugger.htest-app/runtime/src/main/cpp/include/inspector/Runtime.htest-app/runtime/src/main/cpp/include/inspector/Schema.htest-app/runtime/src/main/cpp/include/js_protocol-1.2.jsontest-app/runtime/src/main/cpp/include/js_protocol-1.3.jsontest-app/runtime/src/main/cpp/include/js_protocol.pdltest-app/runtime/src/main/cpp/include/libplatform/DEPStest-app/runtime/src/main/cpp/include/libplatform/libplatform-export.htest-app/runtime/src/main/cpp/include/libplatform/libplatform.htest-app/runtime/src/main/cpp/include/libplatform/v8-tracing.htest-app/runtime/src/main/cpp/include/v8-array-buffer.htest-app/runtime/src/main/cpp/include/v8-callbacks.htest-app/runtime/src/main/cpp/include/v8-container.htest-app/runtime/src/main/cpp/include/v8-context.htest-app/runtime/src/main/cpp/include/v8-cppgc.htest-app/runtime/src/main/cpp/include/v8-data.htest-app/runtime/src/main/cpp/include/v8-date.htest-app/runtime/src/main/cpp/include/v8-debug.htest-app/runtime/src/main/cpp/include/v8-embedder-heap.htest-app/runtime/src/main/cpp/include/v8-embedder-state-scope.htest-app/runtime/src/main/cpp/include/v8-exception.htest-app/runtime/src/main/cpp/include/v8-extension.htest-app/runtime/src/main/cpp/include/v8-external.htest-app/runtime/src/main/cpp/include/v8-fast-api-calls.htest-app/runtime/src/main/cpp/include/v8-forward.htest-app/runtime/src/main/cpp/include/v8-function-callback.htest-app/runtime/src/main/cpp/include/v8-function.htest-app/runtime/src/main/cpp/include/v8-initialization.htest-app/runtime/src/main/cpp/include/v8-inspector-protocol.htest-app/runtime/src/main/cpp/include/v8-inspector.htest-app/runtime/src/main/cpp/include/v8-internal.htest-app/runtime/src/main/cpp/include/v8-isolate.htest-app/runtime/src/main/cpp/include/v8-json.htest-app/runtime/src/main/cpp/include/v8-local-handle.htest-app/runtime/src/main/cpp/include/v8-locker.htest-app/runtime/src/main/cpp/include/v8-maybe.htest-app/runtime/src/main/cpp/include/v8-memory-span.htest-app/runtime/src/main/cpp/include/v8-message.htest-app/runtime/src/main/cpp/include/v8-metrics.htest-app/runtime/src/main/cpp/include/v8-microtask-queue.htest-app/runtime/src/main/cpp/include/v8-microtask.htest-app/runtime/src/main/cpp/include/v8-object.htest-app/runtime/src/main/cpp/include/v8-persistent-handle.htest-app/runtime/src/main/cpp/include/v8-platform.htest-app/runtime/src/main/cpp/include/v8-primitive-object.htest-app/runtime/src/main/cpp/include/v8-primitive.htest-app/runtime/src/main/cpp/include/v8-profiler.htest-app/runtime/src/main/cpp/include/v8-promise.htest-app/runtime/src/main/cpp/include/v8-proxy.htest-app/runtime/src/main/cpp/include/v8-regexp.htest-app/runtime/src/main/cpp/include/v8-script.htest-app/runtime/src/main/cpp/include/v8-snapshot.htest-app/runtime/src/main/cpp/include/v8-statistics.htest-app/runtime/src/main/cpp/include/v8-template.htest-app/runtime/src/main/cpp/include/v8-traced-handle.htest-app/runtime/src/main/cpp/include/v8-typed-array.htest-app/runtime/src/main/cpp/include/v8-unwinder-state.htest-app/runtime/src/main/cpp/include/v8-unwinder.htest-app/runtime/src/main/cpp/include/v8-util.htest-app/runtime/src/main/cpp/include/v8-value-serializer-version.htest-app/runtime/src/main/cpp/include/v8-value-serializer.htest-app/runtime/src/main/cpp/include/v8-value.htest-app/runtime/src/main/cpp/include/v8-version-string.htest-app/runtime/src/main/cpp/include/v8-version.htest-app/runtime/src/main/cpp/include/v8-wasm-trap-handler-posix.htest-app/runtime/src/main/cpp/include/v8-wasm-trap-handler-win.htest-app/runtime/src/main/cpp/include/v8-wasm.htest-app/runtime/src/main/cpp/include/v8-weak-callback-info.htest-app/runtime/src/main/cpp/include/v8.htest-app/runtime/src/main/cpp/include/v8config.htest-app/runtime/src/main/cpp/v8_inspector/Utils.cpptest-app/runtime/src/main/cpp/v8_inspector/absl/base/attributes.htest-app/runtime/src/main/cpp/v8_inspector/absl/base/config.htest-app/runtime/src/main/cpp/v8_inspector/absl/base/macros.htest-app/runtime/src/main/cpp/v8_inspector/absl/base/optimization.htest-app/runtime/src/main/cpp/v8_inspector/absl/base/options.htest-app/runtime/src/main/cpp/v8_inspector/absl/base/policy_checks.htest-app/runtime/src/main/cpp/v8_inspector/absl/base/port.htest-app/runtime/src/main/cpp/v8_inspector/absl/meta/type_traits.htest-app/runtime/src/main/cpp/v8_inspector/absl/numeric/int128.htest-app/runtime/src/main/cpp/v8_inspector/absl/numeric/int128_have_intrinsic.inctest-app/runtime/src/main/cpp/v8_inspector/absl/numeric/int128_no_intrinsic.inctest-app/runtime/src/main/cpp/v8_inspector/absl/types/compare.htest-app/runtime/src/main/cpp/v8_inspector/ns-v8-tracing-agent-impl.cpptest-app/runtime/src/main/cpp/v8_inspector/src/base/address-region.htest-app/runtime/src/main/cpp/v8_inspector/src/base/atomic-utils.htest-app/runtime/src/main/cpp/v8_inspector/src/base/atomicops.htest-app/runtime/src/main/cpp/v8_inspector/src/base/base-export.htest-app/runtime/src/main/cpp/v8_inspector/src/base/bit-field.htest-app/runtime/src/main/cpp/v8_inspector/src/base/bits-iterator.htest-app/runtime/src/main/cpp/v8_inspector/src/base/bits.htest-app/runtime/src/main/cpp/v8_inspector/src/base/bounded-page-allocator.htest-app/runtime/src/main/cpp/v8_inspector/src/base/bounds.htest-app/runtime/src/main/cpp/v8_inspector/src/base/build_config.htest-app/runtime/src/main/cpp/v8_inspector/src/base/compiler-specific.htest-app/runtime/src/main/cpp/v8_inspector/src/base/cpu.htest-app/runtime/src/main/cpp/v8_inspector/src/base/division-by-constant.htest-app/runtime/src/main/cpp/v8_inspector/src/base/emulated-virtual-address-subspace.htest-app/runtime/src/main/cpp/v8_inspector/src/base/enum-set.htest-app/runtime/src/main/cpp/v8_inspector/src/base/export-template.htest-app/runtime/src/main/cpp/v8_inspector/src/base/file-utils.htest-app/runtime/src/main/cpp/v8_inspector/src/base/flags.htest-app/runtime/src/main/cpp/v8_inspector/src/base/free_deleter.htest-app/runtime/src/main/cpp/v8_inspector/src/base/functional.htest-app/runtime/src/main/cpp/v8_inspector/src/base/hashmap-entry.htest-app/runtime/src/main/cpp/v8_inspector/src/base/hashmap.htest-app/runtime/src/main/cpp/v8_inspector/src/base/ieee754.htest-app/runtime/src/main/cpp/v8_inspector/src/base/immediate-crash.htest-app/runtime/src/main/cpp/v8_inspector/src/base/iterator.htest-app/runtime/src/main/cpp/v8_inspector/src/base/lazy-instance.htest-app/runtime/src/main/cpp/v8_inspector/src/base/logging.htest-app/runtime/src/main/cpp/v8_inspector/src/base/macros.htest-app/runtime/src/main/cpp/v8_inspector/src/base/memory.htest-app/runtime/src/main/cpp/v8_inspector/src/base/once.htest-app/runtime/src/main/cpp/v8_inspector/src/base/optional.htest-app/runtime/src/main/cpp/v8_inspector/src/base/overflowing-math.htest-app/runtime/src/main/cpp/v8_inspector/src/base/page-allocator.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/condition-variable.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/elapsed-timer.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/mutex.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-linux.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-posix-time.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-posix.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/semaphore.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/time.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/wrappers.htest-app/runtime/src/main/cpp/v8_inspector/src/base/platform/yield-processor.htest-app/runtime/src/main/cpp/v8_inspector/src/base/pointer-with-payload.htest-app/runtime/src/main/cpp/v8_inspector/src/base/qnx-math.htest-app/runtime/src/main/cpp/v8_inspector/src/base/region-allocator.htest-app/runtime/src/main/cpp/v8_inspector/src/base/ring-buffer.htest-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions.htest-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions_arm_impl.htest-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions_impl.htest-app/runtime/src/main/cpp/v8_inspector/src/base/small-vector.htest-app/runtime/src/main/cpp/v8_inspector/src/base/strings.htest-app/runtime/src/main/cpp/v8_inspector/src/base/sys-info.htest-app/runtime/src/main/cpp/v8_inspector/src/base/template-utils.htest-app/runtime/src/main/cpp/v8_inspector/src/base/threaded-list.htest-app/runtime/src/main/cpp/v8_inspector/src/base/timezone-cache.htest-app/runtime/src/main/cpp/v8_inspector/src/base/v8-fallthrough.htest-app/runtime/src/main/cpp/v8_inspector/src/base/vector.htest-app/runtime/src/main/cpp/v8_inspector/src/base/virtual-address-space-page-allocator.htest-app/runtime/src/main/cpp/v8_inspector/src/base/virtual-address-space.htest-app/runtime/src/main/cpp/v8_inspector/src/base/vlq-base64.htest-app/runtime/src/main/cpp/v8_inspector/src/base/vlq.htest-app/runtime/src/main/cpp/v8_inspector/src/base/win32-headers.htest-app/runtime/src/main/cpp/v8_inspector/src/common/allow-deprecated.htest-app/runtime/src/main/cpp/v8_inspector/src/common/assert-scope.htest-app/runtime/src/main/cpp/v8_inspector/src/common/checks.htest-app/runtime/src/main/cpp/v8_inspector/src/common/code-memory-access-inl.htest-app/runtime/src/main/cpp/v8_inspector/src/common/code-memory-access.htest-app/runtime/src/main/cpp/v8_inspector/src/common/globals.htest-app/runtime/src/main/cpp/v8_inspector/src/common/high-allocation-throughput-scope.htest-app/runtime/src/main/cpp/v8_inspector/src/common/message-template.htest-app/runtime/src/main/cpp/v8_inspector/src/common/operation.htest-app/runtime/src/main/cpp/v8_inspector/src/common/ptr-compr-inl.htest-app/runtime/src/main/cpp/v8_inspector/src/common/ptr-compr.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-coverage.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-evaluate.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-frames.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-interface.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-property-iterator.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-scope-iterator.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-scopes.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-stack-trace-iterator.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-type-profile.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-wasm-objects-inl.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-wasm-objects.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/debug.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/interface-types.htest-app/runtime/src/main/cpp/v8_inspector/src/debug/liveedit.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/custom-preview.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/injected-script.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/inspected-context.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/inspector_protocol_config.jsontest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Console.cpptest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Console.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.cpptest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Forward.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.cpptest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.cpptest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Protocol.cpptest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Protocol.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Runtime.cpptest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Runtime.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Schema.cpptest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Schema.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/base_string_adapter.cctest-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/base_string_adapter.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/remote-object-id.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/search-util.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/string-16.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/string-util.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/test-interface.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-console-agent-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-console-message.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-console.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-debugger-agent-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-debugger-id.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-debugger-script.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-debugger.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-inspector-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-inspector-session-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-profiler-agent-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-regex.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-runtime-agent-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-schema-agent-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-stack-trace-impl.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-string-conversions.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-value-utils.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-webdriver-serializer.htest-app/runtime/src/main/cpp/v8_inspector/src/inspector/value-mirror.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/cbor.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/dispatch.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/error_support.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/export.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/find_by_first.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/frontend_channel.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/glue.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/json.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/json_platform.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/maybe.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/parser_handler.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/protocol_core.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/serializable.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/span.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/status.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/status_test_support.htest-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/test_platform.htest-app/runtime/src/main/libs/arm64-v8a/libv8_monolith.atest-app/runtime/src/main/libs/armeabi-v7a/libv8_monolith.atest-app/runtime/src/main/libs/x86/libv8_monolith.atest-app/runtime/src/main/libs/x86_64/libv8_monolith.atools/v8/vendor_inspector_sources.py
💤 Files with no reviewable changes (220)
- test-app/runtime/src/main/cpp/include/DIR_METADATA
- test-app/runtime/src/main/cpp/include/v8-local-handle.h
- test-app/runtime/src/main/cpp/include/cppgc/README.md
- test-app/runtime/src/main/cpp/include/v8-value.h
- test-app/runtime/src/main/cpp/include/v8-value-serializer-version.h
- test-app/runtime/src/main/cpp/include/OWNERS
- test-app/runtime/src/main/cpp/include/libplatform/DEPS
- test-app/runtime/src/main/cpp/include/cppgc/common.h
- test-app/runtime/src/main/cpp/include/APIDesign.md
- test-app/runtime/src/main/cpp/v8_inspector/src/common/high-allocation-throughput-scope.h
- test-app/runtime/src/main/cpp/include/cppgc/heap-state.h
- test-app/runtime/src/main/cpp/include/v8-memory-span.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/atomic-entry-flag.h
- test-app/runtime/src/main/cpp/include/v8-extension.h
- test-app/runtime/src/main/cpp/include/cppgc/allocation.h
- test-app/runtime/src/main/cpp/include/v8.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/vlq-base64.h
- test-app/runtime/src/main/cpp/include/v8-version.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/error_support.h
- test-app/runtime/src/main/cpp/include/cppgc/explicit-management.h
- test-app/runtime/src/main/cpp/include/libplatform/libplatform-export.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/export.h
- test-app/runtime/src/main/cpp/include/v8-wasm-trap-handler-posix.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/compiler-specific.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-linux.h
- test-app/runtime/src/main/cpp/include/cppgc/name-provider.h
- test-app/runtime/src/main/cpp/include/cppgc/prefinalizer.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.cpp
- test-app/runtime/src/main/cpp/include/cppgc/liveness-broker.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/yield-processor.h
- test-app/runtime/src/main/cpp/include/cppgc/sentinel-pointer.h
- test-app/runtime/src/main/cpp/include/v8-unwinder-state.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/maybe.h
- test-app/runtime/src/main/cpp/include/v8-util.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/v8-fallthrough.h
- test-app/runtime/src/main/cpp/include/cppgc/OWNERS
- test-app/runtime/src/main/cpp/include/v8-proxy.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-webdriver-serializer.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/glue.h
- test-app/runtime/src/main/cpp/include/cppgc/platform.h
- test-app/runtime/src/main/cpp/include/cppgc/custom-space.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-stack-trace-iterator.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-scope-iterator.h
- test-app/runtime/src/main/cpp/include/v8-json.h
- test-app/runtime/src/main/cpp/include/v8-microtask.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-posix-time.h
- test-app/runtime/src/main/cpp/include/v8-data.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/operation.h
- test-app/runtime/src/main/cpp/include/inspector/Runtime.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-schema-agent-impl.h
- test-app/runtime/src/main/cpp/include/v8-forward.h
- test-app/runtime/src/main/cpp/include/v8-embedder-state-scope.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/json_platform.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/liveedit.h
- test-app/runtime/src/main/cpp/include/cppgc/DEPS
- test-app/runtime/src/main/cpp/include/cppgc/heap-statistics.h
- test-app/runtime/src/main/cpp/include/DEPS
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.cpp
- test-app/runtime/src/main/cpp/include/cppgc/ephemeron-pair.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/find_by_first.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions_arm_impl.h
- test-app/runtime/src/main/cpp/include/v8-locker.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-regex.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/memory.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/iterator.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-posix.h
- test-app/runtime/src/main/cpp/include/v8-metrics.h
- test-app/runtime/src/main/cpp/include/v8-weak-callback-info.h
- test-app/runtime/src/main/cpp/include/inspector/Debugger.h
- test-app/runtime/src/main/cpp/include/v8-primitive-object.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/gc-info.h
- test-app/runtime/src/main/cpp/include/v8-function-callback.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/small-vector.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-frames.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-profiler-agent-impl.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/code-memory-access.h
- test-app/runtime/src/main/cpp/include/cppgc/source-location.h
- test-app/runtime/src/main/cpp/include/v8-promise.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/elapsed-timer.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/pointer-with-payload.h
- test-app/runtime/src/main/cpp/include/v8-date.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/logging.h
- test-app/runtime/src/main/cpp/include/v8-microtask-queue.h
- test-app/runtime/src/main/cpp/include/cppgc/object-size-trait.h
- test-app/runtime/src/main/cpp/include/v8-template.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/caged-heap-local-data.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/sys-info.h
- test-app/runtime/src/main/cpp/include/v8-version-string.h
- test-app/runtime/src/main/cpp/include/v8-debug.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/ptr-compr.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/api-constants.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/qnx-math.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/virtual-address-space-page-allocator.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/wrappers.h
- test-app/runtime/src/main/cpp/include/cppgc/process-heap-statistics.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-string-conversions.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/page-allocator.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/overflowing-math.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/status_test_support.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/code-memory-access-inl.h
- test-app/runtime/src/main/cpp/include/v8-initialization.h
- test-app/runtime/src/main/cpp/include/v8-statistics.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/custom-preview.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/name-trait.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/allow-deprecated.h
- test-app/runtime/src/main/cpp/include/v8-wasm-trap-handler-win.h
- test-app/runtime/src/main/cpp/include/v8-function.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/test_platform.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/ring-buffer.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/threaded-list.h
- test-app/runtime/src/main/cpp/include/v8-persistent-handle.h
- test-app/runtime/src/main/cpp/include/cppgc/macros.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-type-profile.h
- test-app/runtime/src/main/cpp/include/v8-array-buffer.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/once.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-wasm-objects.h
- test-app/runtime/src/main/cpp/include/cppgc/trace-trait.h
- test-app/runtime/src/main/cpp/include/v8-exception.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/span.h
- test-app/runtime/src/main/cpp/include/cppgc/type-traits.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/ptr-compr-inl.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/optional.h
- test-app/runtime/src/main/cpp/include/cppgc/persistent.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/pointer-policies.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/inspected-context.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-wasm-objects-inl.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/message-template.h
- test-app/runtime/src/main/cpp/include/js_protocol.pdl
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/inspector_protocol_config.json
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/frontend_channel.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/condition-variable.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-runtime-agent-impl.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/finalizer-trait.h
- test-app/runtime/src/main/cpp/include/v8-inspector-protocol.h
- test-app/runtime/src/main/cpp/include/libplatform/libplatform.h
- test-app/runtime/src/main/cpp/include/v8-container.h
- test-app/runtime/src/main/cpp/include/cppgc/garbage-collected.h
- test-app/runtime/src/main/cpp/include/cppgc/default-platform.h
- test-app/runtime/src/main/cpp/include/cppgc/member.h
- test-app/runtime/src/main/cpp/include/cppgc/heap.h
- test-app/runtime/src/main/cpp/include/v8-value-serializer.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-value-utils.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/timezone-cache.h
- test-app/runtime/src/main/cpp/include/v8-regexp.h
- test-app/runtime/src/main/cpp/include/v8config.h
- test-app/runtime/src/main/cpp/include/cppgc/testing.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/template-utils.h
- test-app/runtime/src/main/cpp/include/v8-unwinder.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/persistent-node.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/strings.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/parser_handler.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-property-iterator.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/logging.h
- test-app/runtime/src/main/cpp/include/cppgc/cross-thread-persistent.h
- test-app/runtime/src/main/cpp/include/cppgc/heap-consistency.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/semaphore.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/dispatch.h
- test-app/runtime/src/main/cpp/include/v8-message.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-stack-trace-impl.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-evaluate.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/value-mirror.h
- test-app/runtime/src/main/cpp/include/v8-primitive.h
- test-app/runtime/src/main/cpp/include/js_protocol-1.3.json
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/protocol_core.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform.h
- test-app/runtime/src/main/cpp/include/libplatform/v8-tracing.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/globals.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-interface.h
- test-app/runtime/src/main/cpp/include/v8-wasm.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-scopes.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/assert-scope.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/serializable.h
- test-app/runtime/src/main/cpp/include/cppgc/internal/write-barrier.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/region-allocator.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Console.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/vector.h
- test-app/runtime/src/main/cpp/include/js_protocol-1.2.json
- test-app/runtime/src/main/cpp/include/v8-maybe.h
- test-app/runtime/src/main/cpp/include/v8-snapshot.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/vlq.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/lazy-instance.h
- test-app/runtime/src/main/cpp/include/v8-external.h
- test-app/runtime/src/main/cpp/include/cppgc/visitor.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-inspector-session-impl.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/mutex.h
- test-app/runtime/src/main/cpp/include/inspector/Schema.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Forward.h
- test-app/runtime/src/main/cpp/include/v8-callbacks.h
- test-app/runtime/src/main/cpp/include/v8-platform.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/status.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/time.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/interface-types.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/json.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/injected-script.h
- test-app/runtime/src/main/cpp/include/v8-traced-handle.h
- test-app/runtime/src/main/cpp/include/v8-profiler.h
- test-app/runtime/src/main/cpp/v8_inspector/src/common/checks.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions_impl.h
- test-app/runtime/src/main/cpp/include/v8-object.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions.h
- test-app/runtime/src/main/cpp/include/v8-fast-api-calls.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Console.cpp
- test-app/runtime/src/main/cpp/include/v8-inspector.h
- test-app/runtime/src/main/cpp/include/v8-embedder-heap.h
- test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.cpp
- test-app/runtime/src/main/cpp/include/v8-isolate.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/win32-headers.h
- test-app/runtime/src/main/cpp/include/v8-context.h
- test-app/runtime/src/main/cpp/include/v8-typed-array.h
- test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/cbor.h
- test-app/runtime/src/main/cpp/include/v8-cppgc.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/macros.h
- test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-coverage.h
- test-app/runtime/src/main/cpp/include/v8-internal.h
- test-app/runtime/src/main/cpp/v8_inspector/src/base/virtual-address-space.h
- test-app/runtime/src/main/cpp/include/v8-script.h
| if [ "$FORCE" = "0" ] && [ -f "$STAMP" ] && [ "$(cat "$STAMP")" = "$RELEASE" ]; then | ||
| echo "V8 $RELEASE already installed. Use --force to reinstall." | ||
| exit 0 | ||
| fi |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Record and validate the installed ABI set in the stamp.
The stamp stores only RELEASE, so ./download_v8.sh --abi arm64-v8a can mark the release installed; a later default invocation then skips downloading the other three ABIs. It also skips when files are missing after a partial or deleted installation. Store the selected ABI set and validate every requested library and generated header tree before returning early.
Also applies to: 147-147
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@download_v8.sh` around lines 70 - 73, Update the early-return check in
download_v8.sh to store the selected ABI set in STAMP and require it to match
the current request. Before skipping, validate that every requested ABI library
and its generated header tree exists; otherwise continue the download, while
preserving --force behavior and refreshing the stamp after a successful
installation.
| echo "Installing V8 $RELEASE from $UPSTREAM" | ||
| fetch SHA256SUMS | ||
|
|
||
| ASSETS=() | ||
| for ABI in "${ABIS[@]}"; do | ||
| ASSETS+=("$(grep -oE "v8-[^ ]*-android-$ABI\.tar\.gz" "$DL/SHA256SUMS" | head -1)") | ||
| done | ||
| ASSETS+=("$(grep -oE 'v8-[^ ]*-src-headers\.tar\.gz' "$DL/SHA256SUMS" | head -1)") | ||
|
|
||
| for a in "${ASSETS[@]}"; do | ||
| [ -n "$a" ] || { echo "Release $RELEASE is missing an expected asset." >&2; exit 1; } | ||
| fetch "$a" | ||
| done | ||
|
|
||
| # Verify before unpacking anything. A release is only trustworthy because the | ||
| # archive matches the checksum published with it. | ||
| # | ||
| # Linux has sha256sum, macOS has shasum; neither has both reliably. | ||
| if command -v sha256sum > /dev/null 2>&1; then | ||
| SHA256_CHECK="sha256sum -c -" | ||
| else | ||
| SHA256_CHECK="shasum -a 256 -c -" | ||
| fi | ||
| echo "Verifying checksums" | ||
| ( cd "$DL" && grep -E "$(printf '%s|' "${ASSETS[@]}" | sed 's/|$//')" SHA256SUMS | $SHA256_CHECK ) \ | ||
| || { echo "Checksum verification FAILED for $RELEASE" >&2; exit 1; } |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== files =="
git ls-files | sed -n '1,120p'
echo
echo "== download_v8.sh outline/size =="
wc -l download_v8.sh 2>/dev/null || true
ast-grep outline download_v8.sh 2>/dev/null || true
echo
echo "== relevant section =="
nl -ba download_v8.sh | sed -n '1,150p'
echo
echo "== search for release signing/auth related terms =="
rg -n "SHA256SUMS|sign|signature|gpg|github|release|V8|fetch|checksum|attestation|provenance" . || trueRepository: NativeScript/android
Length of output: 6128
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== download_v8.sh =="
awk '{ printf "%6d %s\n", NR, $0 }' download_v8.sh
echo
echo "== related references =="
grep -En "SHA256SUMS|sign|signature|gpg|github|release|V8|fetch|checksum|attestation|provenance" . || true
echo
echo "== workflow references =="
grep -En "download_v8|V8_RELEASE|fetch|curl|gh release|assets|SHA256SUMS|v8" .github scripts 2>/dev/null || trueRepository: NativeScript/android
Length of output: 6537
Authenticate SHA256SUMS independently.
SHA256SUMS is fetched from the same GitHub release before checksums are checked, so a compromised release can replace the manifest and archive together and still pass verification. Pin a trusted digest/signature for SHA256SUMS, or verify an independent release attestation before unpacking.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@download_v8.sh` around lines 87 - 112, Authenticate the downloaded SHA256SUMS
manifest independently before using it in the checksum verification flow. Update
the download logic around fetch SHA256SUMS and the subsequent ASSETS
verification to validate a pinned trusted digest/signature or independent
release attestation, failing before any archive is unpacked when authentication
fails.
| // -Pabis=arm64-v8a,x86_64 restricts the build to those ABIs. Needed because the | ||
| // 32-bit V8 monoliths can only be produced on a Linux x64 host. | ||
| def selectedAbis = project.hasProperty("abis") ? project.property("abis").split(",").collect { it.trim() } : null |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "## candidate build.gradle files"
fd -a 'build\.gradle$' . | sed 's#^\./##' | head -50
echo
echo "## test-app/app/build.gradle relevant sections"
if [ -f test-app/app/build.gradle ]; then
wc -l test-app/app/build.gradle
sed -n '1,70p;210,245p' test-app/app/build.gradle | cat -n
fi
echo
echo "## test-app/runtime/build.gradle relevant sections"
if [ -f test-app/runtime/build.gradle ]; then
wc -l test-app/runtime/build.gradle
sed -n '1,30p;115,140p' test-app/runtime/build.gradle | cat -n
fi
echo
echo "## search for abiFilters/selectors and abis property"
rg -n "abiFilters|selectedAbis|onlyX86|hasProperty\\(\"abis\"\\)|property\\(\"abis\"\\)" test-app || trueRepository: NativeScript/android
Length of output: 8834
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "## candidate build.gradle files"
fd -a 'build\.gradle$' . | sed 's#^\./##' | head -50
echo
echo "## test-app/app/build.gradle relevant sections"
if [ -f test-app/app/build.gradle ]; then
wc -l test-app/app/build.gradle
sed -n '1,70p;210,245p' test-app/app/build.gradle | cat -n
fi
echo
echo "## test-app/runtime/build.gradle relevant sections"
if [ -f test-app/runtime/build.gradle ]; then
wc -l test-app/runtime/build.gradle
sed -n '1,30p;115,140p' test-app/runtime/build.gradle | cat -n
fi
echo
echo "## search for abis property selectors and abiFilters"
rg -n "abiFilters|selectedAbis|onlyX86|hasProperty\\(\"abis\"\\)|property\\(\"abis\"\\)" test-app || trueRepository: NativeScript/android
Length of output: 8834
Validate and centralize -Pabis before applying abiFilters.
Both modules independently parse user-controlled -Pabis values and pass them into native abiFilters; normalized entries such as "", invalid ABIs, or unsupported ABIs (for this project) can block or produce invalid native builds. Move a shared validation helper to both Gradle modules and reject empty/unsupported values in each abiFilters branch.
📍 Affects 2 files
test-app/app/build.gradle#L45-L47(this comment)test-app/app/build.gradle#L231-L233test-app/runtime/build.gradle#L14-L16test-app/runtime/build.gradle#L126-L131
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@test-app/app/build.gradle` around lines 45 - 47, Centralize `-Pabis` parsing
and validation in a shared helper used by both Gradle modules, trimming entries
and rejecting empty, invalid, or project-unsupported ABIs before they reach
native configuration. Update the `selectedAbis` logic at
test-app/app/build.gradle:45-47 and test-app/runtime/build.gradle:14-16, then
apply the validated values in each `abiFilters` branch at
test-app/app/build.gradle:231-233 and test-app/runtime/build.gradle:126-131;
preserve the existing behavior when no property is supplied.
The stamp records only the release, so `--abi arm64-v8a` marked it installed and the next bare run -- which is what build.sh and every CI call site does -- skipped the other three ABIs, surfacing as a CMake link error rather than a message. The installed files are now the check.
`-Pabis=` split to a single empty string rather than an empty list, so it reached abiFilters and failed in AGP as "ABIs [] are not supported".
All four ABIs come from the pinned release now; what survives is the constraint that only an ia32-capable Linux host can build the 32-bit two.
From v8-14.9.207.39-2 the shared patch also lifts the DisallowJavascriptExecution scope V8 14.9 holds across a collection. This runtime does not depend on it, but it shares the patch, so the note says which release carries it and why iOS needs it.
Upgrades the runtime from V8 10.3.22 → 14.9.207.39. Companion to NativeScript/ios#412.
Status
The five skips are the pre-existing
xit()s already in the suite.The libraries are no longer committed
./download_v8.shinstalls them from the release pinned inV8_RELEASE, verifying every archive against theSHA256SUMSpublished with it. It is a no-op once they are in place,V8_SKIP_DOWNLOAD=1skips it entirely, andbuild.shcalls it — deliberately not a Gradle task, matching how the iOS runtime treatsdownload_llvm.sh. Keeping it out of the build means a stale or unreachable release cannot wedge an otherwise working build.Two reasons this had to change:
arm64-v8aandx86_64monoliths are 100.7 MiB and 106.1 MiB, over GitHub's hard 100 MiB per-file push limit. Stripping recovers ~2%, leaving x86_64 still over.v8config.hrefuses anything else — and the Apple variants need macOS. Hand-assembled artifacts are therefore neither reproducible nor verifiable.The vendored headers are ignored along with the libraries, not just the binaries. Keeping a copy in git is how it drifts out of step with the libraries it describes — the iOS runtime was carrying 10.3 crdtp headers against a 14.9
libcrdtp.afor exactly that reason. Sourcing both from one verified artifact makes the mismatch impossible.libzip.aandzip.hstay tracked; they are not V8.tools/v8/vendor_inspector_sources.pystays too: it recomputes the inspector's internals by closure from the release'ssrc-headersartifact. What the glue includes is this repo's business, not the build repo's.V8_RELEASEpinsv8-14.9.207.39-1. Contributors with a local V8 build can useV8_SKIP_DOWNLOAD=1.What changed
Build config. JIT and WebAssembly stay on, i18n stays off — same shape as the 10.3 build. The gn args live in buildscripts now; the reasoning is in
docs/knowledge/v8-14-migration.md. The one worth repeating here:v8_array_buffer_internal_field_count/..._view_...defaulted to 2 in 10.3 and default to 0 in 14.9.JSToJavaObjectsConvertermarshals an ArrayBuffer/SharedArrayBuffer/typed array to a Java NIO buffer by callingObjectManager::Linkon the buffer object itself, andLinkstores itsJSInstanceInfoin internal field 0. With zero fields every such conversion throws "Trying to link invalid 'this' to a Java object" — this was the only test failure in the first full run.v8-array-buffer.hstill falls back to2when the macro is undefined, so the gn default also put V8 and the embedder silently out of agreement.NDK r27d → r29. Forced: V8 14.9's
src/base/atomicops.husesstd::atomic_refunconditionally and r27d ships libc++ 18, which does not implement it. The runtime compiles that header becausev8_inspectorvendors V8 internals.minSdkis unchanged at 21. V8 must be built against the same NDK — libc++ is only ABI-compatible with itself across a static link, and V8's bundled NDK is newer than any released one (mixing fails onstd::__ndk1::__hash_memory).API migration. Mostly mechanical — full table in the doc. The one part that is not:
PropertyCallbackInfono longer exposes the receiver at all, andSetNativeDataPropertyis not a drop-in forSetAccessoron anything inherited from. SixMetadataNodeaccessors live on an object other than the one they are read through —class,nullObjectand static fields on the constructor,superon the implementation object, instance fields and properties on the prototype template — and are nowSetAccessorPropertywithFunctionTemplate-backed callbacks, whoseThis()is still the receiver. Static fields are the sharp edge: they have a setter, and a data-like property would letDerived.baseField = xshadow the base with an own property and silently never reach the native setter.One guard could not be translated directly. The field accessors used
thiz->StrictEquals(info.Holder())to catch an instance field read straight off the prototype; function-backed accessors have no holder, so that is now!objectManager->IsJsRuntimeObject(thiz)— being a runtime-managed object is what actually separates an instance from the prototype. The two agree for every receiver the old check could see.Flags.
V8::Initialize()freezes the flag list and changing a flag afterwards aborts the process, sov8Flagsis applied once inInitializeV8()instead of per isolate.Size impact
Optimized, stripped, arm64-v8a
libNativeScript.so, against the publishednativescript-optimized.aar:Roughly half of that is V8's two new compiler tiers, which did not exist in 10.3: Turboshaft 6.1 MiB + Maglev 3.4 MiB. Levers, if size matters more than warm-up:
v8_enable_maglev=false(no feature loss — pure new cost since 10.3), orv8_enable_webassembly=false, measured at −9.9 MiB raw / −2.5 MB gzip, which would halve the upgrade's download cost. WASM is left on here to preserve current behaviour; turning it off would also needMessageLoopTimer::Initguarded, since its proxy script references the bareWebAssemblyidentifier at every isolate startup.JIT is confirmed working on 14.9: a hot loop runs at 0.82 ns/iteration against 356 ns/iteration for the same body wrapped in
with(o){}to block optimisation.Notes for review
docs/knowledge/v8-14-migration.mdcarries the full API table and the reasoning behind every build-config pin.V8_STATIC_ROOTSis deliberately not defined by the runtime. V8 is built with it and it would letValue::IsUndefined()/IsNull()use the inline static-root comparison, but the root addresses are hardcoded constants inv8-internal.hthat must match the library exactly. 10.3 had no such fast path, so this is parity; enabling it is a separate, measurable change.SomeClass.nullpermanently breaks that class's staticvalueOf(). Confirmed pre-existing on 10.3, filed as ReadingSomeClass.nullpermanently breaks that class's staticvalueOf()#1986.Summary by CodeRabbit