## Node.js Patch Update to v22.20.0
This PR updates the Node.js patch to version 22.20.0.
The workflow automatically attempts to resolve patch conflicts using AI
when the OpenAI API key is available.
### AI Resolution Details
Processing section 1/1 for ./src/node_options.cc...
Found 1 reject files to process
Processing: ./src/node_options.cc.rej -> ./src/node_options.cc
Prompt for OpenAI API:
I have a Git patch that failed to apply. Here's the specific section
that needs to be fixed:
REJECTED PATCH HUNK:
```
@@ -319,6 +319,7 @@
// TODO(addaleax): Make that unnecessary.
DebugOptionsParser::DebugOptionsParser() {
+ return;
#ifndef DISABLE_SINGLE_EXECUTABLE_APPLICATION
if (sea::IsSingleExecutable()) return;
#endif
```
CURRENT FILE SECTION (lines 314-329):
```
args, exec_args, v8_args, options, required_env_settings, errors);
}
// XXX: If you add an option here, please also add it to doc/node.1 and
// doc/api/cli.md
// TODO(addaleax): Make that unnecessary.
DebugOptionsParser::DebugOptionsParser() {
AddOption("--inspect-port",
"set host:port for inspector",
&DebugOptions::host_port,
kAllowedInEnvvar);
AddAlias("--debug-port", "--inspect-port");
AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
```
Please apply the intended changes from the rejected hunk to this file
section. Return ONLY the corrected file section content, preserving the
exact line structure and formatting. Do not add explanations or markdown
formatting.
RESOLVED CONTENT for ./src/node_options.cc:
```
args, exec_args, v8_args, options, required_env_settings, errors);
}
// XXX: If you add an option here, please also add it to doc/node.1 and
// doc/api/cli.md
// TODO(addaleax): Make that unnecessary.
DebugOptionsParser::DebugOptionsParser() {
return;
AddOption("--inspect-port",
"set host:port for inspector",
&DebugOptions::host_port,
kAllowedInEnvvar);
AddAlias("--debug-port", "--inspect-port");
AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
```
✅ Successfully resolved ./src/node_options.cc
CONFLICTS_RESOLVED=1
TOTAL_CONFLICTS=1
HAS_UNRESOLVED=False
Resolution summary: 1/1 conflicts resolved
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
731 lines
27 KiB
Diff
731 lines
27 KiB
Diff
diff --git node/common.gypi node/common.gypi
|
|
index ae31b372b9..b7baff1762 100644
|
|
--- node/common.gypi
|
|
+++ node/common.gypi
|
|
@@ -192,7 +192,7 @@
|
|
['clang==1', {
|
|
'lto': ' -flto ', # Clang
|
|
}, {
|
|
- 'lto': ' -flto=4 -fuse-linker-plugin -ffat-lto-objects ', # GCC
|
|
+ 'lto': ' -flto=4 -ffat-lto-objects ', # GCC
|
|
}],
|
|
],
|
|
},
|
|
diff --git node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c
|
|
index 7d3ab39bf8..67a48dee53 100644
|
|
--- node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c
|
|
+++ node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c
|
|
@@ -34,10 +34,7 @@
|
|
#include "nghttp3_macro.h"
|
|
|
|
static int ispow2(size_t n) {
|
|
-#if defined(_MSC_VER) && !defined(__clang__) && \
|
|
- (defined(_M_ARM) || (defined(_M_ARM64) && _MSC_VER < 1941))
|
|
- return n && !(n & (n - 1));
|
|
-#elif defined(WIN32)
|
|
+#if defined(WIN32)
|
|
return 1 == __popcnt((unsigned int)n);
|
|
#else /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \
|
|
(defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */
|
|
diff --git node/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c node/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c
|
|
index 353afca4d4..dea944aed5 100644
|
|
--- node/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c
|
|
+++ node/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c
|
|
@@ -33,10 +33,7 @@
|
|
|
|
#ifndef NDEBUG
|
|
static int ispow2(size_t n) {
|
|
-# if defined(_MSC_VER) && !defined(__clang__) && \
|
|
- (defined(_M_ARM) || (defined(_M_ARM64) && _MSC_VER < 1941))
|
|
- return n && !(n & (n - 1));
|
|
-# elif defined(WIN32)
|
|
+#if defined(WIN32)
|
|
return 1 == __popcnt((unsigned int)n);
|
|
# else /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \
|
|
(defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */
|
|
diff --git node/deps/v8/include/v8-initialization.h node/deps/v8/include/v8-initialization.h
|
|
index d3e35d6ec5..6e9bbe3849 100644
|
|
--- node/deps/v8/include/v8-initialization.h
|
|
+++ node/deps/v8/include/v8-initialization.h
|
|
@@ -89,6 +89,10 @@ class V8_EXPORT V8 {
|
|
static void SetFlagsFromCommandLine(int* argc, char** argv,
|
|
bool remove_flags);
|
|
|
|
+ static void EnableCompilationForSourcelessUse();
|
|
+ static void DisableCompilationForSourcelessUse();
|
|
+ static void FixSourcelessScript(Isolate* v8_isolate, Local<UnboundScript> script);
|
|
+
|
|
/** Get the version string. */
|
|
static const char* GetVersion();
|
|
|
|
diff --git node/deps/v8/src/api/api.cc node/deps/v8/src/api/api.cc
|
|
index 2dd476dda3..8a51f25b57 100644
|
|
--- node/deps/v8/src/api/api.cc
|
|
+++ node/deps/v8/src/api/api.cc
|
|
@@ -624,6 +624,28 @@ void V8::SetFlagsFromCommandLine(int* argc, char** argv, bool remove_flags) {
|
|
HelpOptions(HelpOptions::kDontExit));
|
|
}
|
|
|
|
+bool save_lazy;
|
|
+bool save_predictable;
|
|
+
|
|
+void V8::EnableCompilationForSourcelessUse() {
|
|
+ save_lazy = i::v8_flags.lazy;
|
|
+ i::v8_flags.lazy = false;
|
|
+ save_predictable = i::v8_flags.predictable;
|
|
+ i::v8_flags.predictable = true;
|
|
+}
|
|
+
|
|
+void V8::DisableCompilationForSourcelessUse() {
|
|
+ i::v8_flags.lazy = save_lazy;
|
|
+ i::v8_flags.predictable = save_predictable;
|
|
+}
|
|
+
|
|
+void V8::FixSourcelessScript(Isolate* v8_isolate, Local<UnboundScript> unbound_script) {
|
|
+ auto isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
|
|
+ auto function_info = i::Handle<i::SharedFunctionInfo>::cast(Utils::OpenHandle(*unbound_script));
|
|
+ i::Handle<i::Script> script(i::Script::cast(function_info->script()), isolate);
|
|
+ script->SetSource(isolate, script, isolate->factory()->empty_string());
|
|
+}
|
|
+
|
|
RegisteredExtension* RegisteredExtension::first_extension_ = nullptr;
|
|
|
|
RegisteredExtension::RegisteredExtension(std::unique_ptr<Extension> extension)
|
|
diff --git node/deps/v8/src/codegen/code-stub-assembler.h node/deps/v8/src/codegen/code-stub-assembler.h
|
|
index b082bb8dc7..285683ecdc 100644
|
|
--- node/deps/v8/src/codegen/code-stub-assembler.h
|
|
+++ node/deps/v8/src/codegen/code-stub-assembler.h
|
|
@@ -286,7 +286,8 @@ enum class PrimitiveType { kBoolean, kNumber, kString, kSymbol };
|
|
|
|
// This is a check that always calls into the runtime if it aborts.
|
|
// This also exits silently when --hole-fuzzing is enabled.
|
|
-#define CSA_HOLE_SECURITY_CHECK(csa, x) CSA_CHECK_WITH_ABORT(csa, x)
|
|
+#define CSA_HOLE_SECURITY_CHECK(csa, x) \
|
|
+ (csa)->Check([&]() -> TNode<BoolT> { return x; }, #x, "placeholder", 1)
|
|
|
|
#ifdef DEBUG
|
|
// CSA_DCHECK_ARGS generates an
|
|
diff --git node/deps/v8/src/codegen/compiler.cc node/deps/v8/src/codegen/compiler.cc
|
|
index 9048655363..ab81c326fc 100644
|
|
--- node/deps/v8/src/codegen/compiler.cc
|
|
+++ node/deps/v8/src/codegen/compiler.cc
|
|
@@ -3634,7 +3634,7 @@ MaybeHandle<SharedFunctionInfo> GetSharedFunctionInfoForScriptImpl(
|
|
maybe_script = lookup_result.script();
|
|
maybe_result = lookup_result.toplevel_sfi();
|
|
is_compiled_scope = lookup_result.is_compiled_scope();
|
|
- if (!maybe_result.is_null()) {
|
|
+ if (!maybe_result.is_null() && source->length()) {
|
|
compile_timer.set_hit_isolate_cache();
|
|
} else if (can_consume_code_cache) {
|
|
compile_timer.set_consuming_code_cache();
|
|
diff --git node/deps/v8/src/compiler/wasm-compiler.cc node/deps/v8/src/compiler/wasm-compiler.cc
|
|
index 16f1f1470b..4bfeca49e6 100644
|
|
--- node/deps/v8/src/compiler/wasm-compiler.cc
|
|
+++ node/deps/v8/src/compiler/wasm-compiler.cc
|
|
@@ -8613,12 +8613,13 @@ wasm::WasmCompilationResult CompileWasmImportCallWrapper(
|
|
'-');
|
|
|
|
auto compile_with_turboshaft = [&]() {
|
|
+ wasm::WrapperCompilationInfo info;
|
|
+ info.code_kind = CodeKind::WASM_TO_JS_FUNCTION;
|
|
+ info.import_info.import_kind = kind;
|
|
+ info.import_info.expected_arity = expected_arity;
|
|
+ info.import_info.suspend = suspend;
|
|
return Pipeline::GenerateCodeForWasmNativeStubFromTurboshaft(
|
|
- env->module, sig,
|
|
- wasm::WrapperCompilationInfo{
|
|
- .code_kind = CodeKind::WASM_TO_JS_FUNCTION,
|
|
- .import_info = {kind, expected_arity, suspend}},
|
|
- func_name, WasmStubAssemblerOptions(), nullptr);
|
|
+ env->module, sig, info, func_name, WasmStubAssemblerOptions(), nullptr);
|
|
};
|
|
auto compile_with_turbofan = [&]() {
|
|
//--------------------------------------------------------------------------
|
|
@@ -8774,13 +8775,15 @@ MaybeHandle<Code> CompileWasmToJSWrapper(Isolate* isolate,
|
|
base::VectorOf(name_buffer.get(), kMaxNameLen) + kNamePrefixLen, sig);
|
|
|
|
auto compile_with_turboshaft = [&]() {
|
|
+ wasm::WrapperCompilationInfo info;
|
|
+ info.code_kind = CodeKind::WASM_TO_JS_FUNCTION;
|
|
+ info.import_info.import_kind = kind;
|
|
+ info.import_info.expected_arity = expected_arity;
|
|
+ info.import_info.suspend = suspend;
|
|
std::unique_ptr<turboshaft::TurboshaftCompilationJob> job =
|
|
Pipeline::NewWasmTurboshaftWrapperCompilationJob(
|
|
- isolate, sig,
|
|
- wasm::WrapperCompilationInfo{
|
|
- .code_kind = CodeKind::WASM_TO_JS_FUNCTION,
|
|
- .import_info = {kind, expected_arity, suspend}},
|
|
- nullptr, std::move(name_buffer), WasmAssemblerOptions());
|
|
+ isolate, sig, info, nullptr, std::move(name_buffer),
|
|
+ WasmAssemblerOptions());
|
|
|
|
// Compile the wrapper
|
|
if (job->ExecuteJob(isolate->counters()->runtime_call_stats()) ==
|
|
diff --git node/deps/v8/src/heap/marking-visitor-inl.h node/deps/v8/src/heap/marking-visitor-inl.h
|
|
index 39a5bbd22c..4b860f55d5 100644
|
|
--- node/deps/v8/src/heap/marking-visitor-inl.h
|
|
+++ node/deps/v8/src/heap/marking-visitor-inl.h
|
|
@@ -329,6 +329,13 @@ bool MarkingVisitorBase<ConcreteVisitor>::HasBytecodeArrayForFlushing(
|
|
template <typename ConcreteVisitor>
|
|
bool MarkingVisitorBase<ConcreteVisitor>::ShouldFlushCode(
|
|
Tagged<SharedFunctionInfo> sfi) const {
|
|
+ auto script_obj = sfi->script();
|
|
+ if (!IsUndefined(script_obj)) {
|
|
+ auto script = i::Script::cast(script_obj);
|
|
+ if (IsUndefined(script->source())) {
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
return IsStressFlushingEnabled(code_flush_mode_) || IsOld(sfi);
|
|
}
|
|
|
|
diff --git node/deps/v8/src/objects/js-function.cc node/deps/v8/src/objects/js-function.cc
|
|
index 529e283bbf..c997c53a18 100644
|
|
--- node/deps/v8/src/objects/js-function.cc
|
|
+++ node/deps/v8/src/objects/js-function.cc
|
|
@@ -1308,6 +1308,10 @@ Handle<String> JSFunction::ToString(Handle<JSFunction> function) {
|
|
Handle<Object> maybe_class_positions = JSReceiver::GetDataProperty(
|
|
isolate, function, isolate->factory()->class_positions_symbol());
|
|
if (IsClassPositions(*maybe_class_positions)) {
|
|
+ if (IsUndefined(
|
|
+ String::cast(Script::cast(shared_info->script())->source()))) {
|
|
+ return isolate->factory()->NewStringFromAsciiChecked("class {}");
|
|
+ }
|
|
Tagged<ClassPositions> class_positions =
|
|
ClassPositions::cast(*maybe_class_positions);
|
|
int start_position = class_positions->start();
|
|
diff --git node/deps/v8/src/objects/objects.cc node/deps/v8/src/objects/objects.cc
|
|
index 8e013c2544..7ac03149d8 100644
|
|
--- node/deps/v8/src/objects/objects.cc
|
|
+++ node/deps/v8/src/objects/objects.cc
|
|
@@ -4263,7 +4263,12 @@ void Script::InitLineEndsInternal(IsolateT* isolate, Handle<Script> script) {
|
|
|
|
void Script::SetSource(Isolate* isolate, Handle<Script> script,
|
|
Handle<String> source) {
|
|
- script->set_source(*source);
|
|
+ if (source->length() > 0) {
|
|
+ script->set_source(*source);
|
|
+ } else {
|
|
+ Tagged<PrimitiveHeapObject> und = *isolate->factory()->undefined_value();
|
|
+ script->set_source(und);
|
|
+ }
|
|
if (isolate->NeedsSourcePositions()) InitLineEnds(isolate, script);
|
|
}
|
|
|
|
diff --git node/deps/v8/src/parsing/parsing.cc node/deps/v8/src/parsing/parsing.cc
|
|
index f160b27ea4..748452ba45 100644
|
|
--- node/deps/v8/src/parsing/parsing.cc
|
|
+++ node/deps/v8/src/parsing/parsing.cc
|
|
@@ -42,6 +42,7 @@ bool ParseProgram(ParseInfo* info, Handle<Script> script,
|
|
DCHECK(info->flags().is_toplevel());
|
|
DCHECK_NULL(info->literal());
|
|
|
|
+ if (IsUndefined(String::cast(script->source()))) return false;
|
|
VMState<PARSER> state(isolate);
|
|
|
|
// Create a character stream for the parser.
|
|
@@ -74,6 +75,8 @@ bool ParseFunction(ParseInfo* info, Handle<SharedFunctionInfo> shared_info,
|
|
|
|
// Create a character stream for the parser.
|
|
Handle<Script> script(Script::cast(shared_info->script()), isolate);
|
|
+ if (IsUndefined(String::cast(script->source()))) return false;
|
|
+
|
|
Handle<String> source(String::cast(script->source()), isolate);
|
|
std::unique_ptr<Utf16CharacterStream> stream(
|
|
ScannerStream::For(isolate, source, shared_info->StartPosition(),
|
|
diff --git node/deps/v8/src/snapshot/code-serializer.cc node/deps/v8/src/snapshot/code-serializer.cc
|
|
index ec69ad5123..5bc92af5aa 100644
|
|
--- node/deps/v8/src/snapshot/code-serializer.cc
|
|
+++ node/deps/v8/src/snapshot/code-serializer.cc
|
|
@@ -703,10 +703,6 @@ SerializedCodeSanityCheckResult SerializedCodeData::SanityCheck(
|
|
|
|
SerializedCodeSanityCheckResult SerializedCodeData::SanityCheckJustSource(
|
|
uint32_t expected_source_hash) const {
|
|
- uint32_t source_hash = GetHeaderValue(kSourceHashOffset);
|
|
- if (source_hash != expected_source_hash) {
|
|
- return SerializedCodeSanityCheckResult::kSourceMismatch;
|
|
- }
|
|
return SerializedCodeSanityCheckResult::kSuccess;
|
|
}
|
|
|
|
@@ -723,13 +719,12 @@ SerializedCodeSanityCheckResult SerializedCodeData::SanityCheckWithoutSource(
|
|
if (version_hash != Version::Hash()) {
|
|
return SerializedCodeSanityCheckResult::kVersionMismatch;
|
|
}
|
|
- uint32_t flags_hash = GetHeaderValue(kFlagHashOffset);
|
|
- if (flags_hash != FlagList::Hash()) {
|
|
- return SerializedCodeSanityCheckResult::kFlagsMismatch;
|
|
- }
|
|
uint32_t ro_snapshot_checksum =
|
|
GetHeaderValue(kReadOnlySnapshotChecksumOffset);
|
|
if (ro_snapshot_checksum != expected_ro_snapshot_checksum) {
|
|
+ // for debugging snapshot checkum issues
|
|
+ // PrintF("[pkg] ReadOnlySnapshotChecksum mismatch: code=%08x built=%08x\n",
|
|
+ // ro_snapshot_checksum, expected_ro_snapshot_checksum);
|
|
return SerializedCodeSanityCheckResult::kReadOnlySnapshotChecksumMismatch;
|
|
}
|
|
uint32_t payload_length = GetHeaderValue(kPayloadLengthOffset);
|
|
diff --git node/deps/v8/src/snapshot/read-only-serializer.cc node/deps/v8/src/snapshot/read-only-serializer.cc
|
|
index 29c69a782e..4431cd14ac 100644
|
|
--- node/deps/v8/src/snapshot/read-only-serializer.cc
|
|
+++ node/deps/v8/src/snapshot/read-only-serializer.cc
|
|
@@ -237,6 +237,9 @@ class EncodeRelocationsVisitor final : public ObjectVisitor {
|
|
|
|
// Encode:
|
|
ro::EncodedTagged encoded = Encode(isolate_, o.GetHeapObject());
|
|
+ #ifndef V8_COMPRESS_POINTERS
|
|
+ memset(segment_->contents.get() + slot_offset, 0, kTaggedSize);
|
|
+ #endif
|
|
memcpy(segment_->contents.get() + slot_offset, &encoded,
|
|
ro::EncodedTagged::kSize);
|
|
|
|
diff --git node/lib/child_process.js node/lib/child_process.js
|
|
index 960ecd25eb..1b34323375 100644
|
|
--- node/lib/child_process.js
|
|
+++ node/lib/child_process.js
|
|
@@ -171,7 +171,7 @@ function fork(modulePath, args = [], options) {
|
|
throw new ERR_CHILD_PROCESS_IPC_REQUIRED('options.stdio');
|
|
}
|
|
|
|
- return spawn(options.execPath, args, options);
|
|
+ return module.exports.spawn(options.execPath, args, options);
|
|
}
|
|
|
|
function _forkChild(fd, serializationMode) {
|
|
diff --git node/lib/internal/bootstrap/pkg.js node/lib/internal/bootstrap/pkg.js
|
|
new file mode 100644
|
|
index 0000000000..a697294fdf
|
|
--- /dev/null
|
|
+++ node/lib/internal/bootstrap/pkg.js
|
|
@@ -0,0 +1,49 @@
|
|
+'use strict';
|
|
+
|
|
+const {
|
|
+ prepareWorkerThreadExecution,
|
|
+ prepareMainThreadExecution
|
|
+} = require('internal/process/pre_execution');
|
|
+
|
|
+if (internalBinding('worker').isMainThread) {
|
|
+ prepareMainThreadExecution(true);
|
|
+} else {
|
|
+ prepareWorkerThreadExecution();
|
|
+}
|
|
+
|
|
+(function () {
|
|
+ var __require__ = require;
|
|
+ var fs = __require__('fs');
|
|
+ var vm = __require__('vm');
|
|
+ function readPrelude (fd) {
|
|
+ var PAYLOAD_POSITION = '// PAYLOAD_POSITION //' | 0;
|
|
+ var PAYLOAD_SIZE = '// PAYLOAD_SIZE //' | 0;
|
|
+ var PRELUDE_POSITION = '// PRELUDE_POSITION //' | 0;
|
|
+ var PRELUDE_SIZE = '// PRELUDE_SIZE //' | 0;
|
|
+ if (!PRELUDE_POSITION) {
|
|
+ // no prelude - remove entrypoint from argv[1]
|
|
+ process.argv.splice(1, 1);
|
|
+ return { undoPatch: true };
|
|
+ }
|
|
+ var prelude = Buffer.alloc(PRELUDE_SIZE);
|
|
+ var read = fs.readSync(fd, prelude, 0, PRELUDE_SIZE, PRELUDE_POSITION);
|
|
+ if (read !== PRELUDE_SIZE) {
|
|
+ console.error('Pkg: Error reading from file.');
|
|
+ process.exit(1);
|
|
+ }
|
|
+ var s = new vm.Script(prelude, { filename: 'pkg/prelude/bootstrap.js' });
|
|
+ var fn = s.runInThisContext();
|
|
+ return fn(process, __require__,
|
|
+ console, fd, PAYLOAD_POSITION, PAYLOAD_SIZE);
|
|
+ }
|
|
+ (function () {
|
|
+ var fd = fs.openSync(process.execPath, 'r');
|
|
+ var result = readPrelude(fd);
|
|
+ if (result && result.undoPatch) {
|
|
+ var bindingFs = process.binding('fs');
|
|
+ fs.internalModuleStat = bindingFs.internalModuleStat;
|
|
+ fs.internalModuleReadJSON = bindingFs.internalModuleReadJSON;
|
|
+ fs.closeSync(fd);
|
|
+ }
|
|
+ }());
|
|
+}());
|
|
diff --git node/lib/internal/modules/cjs/loader.js node/lib/internal/modules/cjs/loader.js
|
|
index a7d8fa1139..bffe5a8a53 100644
|
|
--- node/lib/internal/modules/cjs/loader.js
|
|
+++ node/lib/internal/modules/cjs/loader.js
|
|
@@ -252,14 +252,18 @@ function stat(filename) {
|
|
// Guard against internal bugs where a non-string filename is passed in by mistake.
|
|
assert(typeof filename === 'string');
|
|
|
|
+ const origFilename = filename;
|
|
filename = path.toNamespacedPath(filename);
|
|
if (statCache !== null) {
|
|
const result = statCache.get(filename);
|
|
if (result !== undefined) { return result; }
|
|
}
|
|
- const result = internalFsBinding.internalModuleStat(filename);
|
|
+ const fs = require('fs');
|
|
+ const result = fs.existsSync(origFilename) ?
|
|
+ (fs.statSync(origFilename).isDirectory() ? 1 : 0) : -1;
|
|
+
|
|
if (statCache !== null && result >= 0) {
|
|
- // Only set cache when `internalModuleStat(filename)` succeeds.
|
|
+ // Only set cache when `internalModuleStat(internalFsBinding, filename)` succeeds.
|
|
statCache.set(filename, result);
|
|
}
|
|
return result;
|
|
diff --git node/lib/internal/modules/package_json_reader.js node/lib/internal/modules/package_json_reader.js
|
|
index fb669ea12e..6ad993581b 100644
|
|
--- node/lib/internal/modules/package_json_reader.js
|
|
+++ node/lib/internal/modules/package_json_reader.js
|
|
@@ -108,17 +108,20 @@ const requiresJSONParse = (value) => (value !== undefined && (value[0] === '[' |
|
|
* @returns {PackageConfig}
|
|
*/
|
|
function read(jsonPath, { base, specifier, isESM } = kEmptyObject) {
|
|
- // This function will be called by both CJS and ESM, so we need to make sure
|
|
- // non-null attributes are converted to strings.
|
|
- const parsed = modulesBinding.readPackageJSON(
|
|
- jsonPath,
|
|
- isESM,
|
|
- base == null ? undefined : `${base}`,
|
|
- specifier == null ? undefined : `${specifier}`,
|
|
- );
|
|
-
|
|
- const result = deserializePackageJSON(jsonPath, parsed);
|
|
-
|
|
+ const fs = require('fs');
|
|
+ let result;
|
|
+ if (fs.existsSync(jsonPath)) {
|
|
+ const json = JSONParse(fs.readFileSync(jsonPath, { encoding: "utf8" }).trim());
|
|
+ result = deserializePackageJSON(jsonPath, [
|
|
+ json['name'],
|
|
+ json['main'],
|
|
+ json['type'],
|
|
+ json['imports'],
|
|
+ json['exports'],
|
|
+ ]);
|
|
+ } else {
|
|
+ result = deserializePackageJSON(jsonPath, undefined);
|
|
+ }
|
|
return {
|
|
__proto__: null,
|
|
...result.data,
|
|
diff --git node/lib/internal/process/pre_execution.js node/lib/internal/process/pre_execution.js
|
|
index 98ed40e307..f9da878ea0 100644
|
|
--- node/lib/internal/process/pre_execution.js
|
|
+++ node/lib/internal/process/pre_execution.js
|
|
@@ -50,7 +50,11 @@ const {
|
|
runDeserializeCallbacks,
|
|
} = require('internal/v8/startup_snapshot');
|
|
|
|
+let _alreadyPrepared = false;
|
|
+
|
|
function prepareMainThreadExecution(expandArgv1 = false, initializeModules = true) {
|
|
+ if (_alreadyPrepared === true) return;
|
|
+ _alreadyPrepared = true;
|
|
return prepareExecution({
|
|
expandArgv1,
|
|
initializeModules,
|
|
@@ -243,7 +247,8 @@ function patchProcessObject(expandArgv1) {
|
|
let mainEntry;
|
|
// If requested, update process.argv[1] to replace whatever the user provided with the resolved absolute file path of
|
|
// the entry point.
|
|
- if (expandArgv1 && process.argv[1] && process.argv[1][0] !== '-') {
|
|
+ if (expandArgv1 && process.argv[1] && process.argv[1][0] !== '-' &&
|
|
+ process.argv[1] !== 'PKG_DUMMY_ENTRYPOINT') {
|
|
// Expand process.argv[1] into a full path.
|
|
const path = require('path');
|
|
try {
|
|
@@ -725,6 +730,7 @@ function loadPreloadModules() {
|
|
// For user code, we preload modules if `-r` is passed
|
|
const preloadModules = getOptionValue('--require');
|
|
if (preloadModules && preloadModules.length > 0) {
|
|
+ assert(false, '--require is not supported');
|
|
const {
|
|
Module: {
|
|
_preloadModules,
|
|
diff --git node/lib/vm.js node/lib/vm.js
|
|
index ae71080620..b05638de75 100644
|
|
--- node/lib/vm.js
|
|
+++ node/lib/vm.js
|
|
@@ -98,6 +98,7 @@ class Script extends ContextifyScript {
|
|
produceCachedData = false,
|
|
importModuleDynamically,
|
|
[kParsingContext]: parsingContext,
|
|
+ sourceless = false,
|
|
} = options;
|
|
|
|
validateString(filename, 'options.filename');
|
|
@@ -121,7 +122,8 @@ class Script extends ContextifyScript {
|
|
cachedData,
|
|
produceCachedData,
|
|
parsingContext,
|
|
- hostDefinedOptionId);
|
|
+ hostDefinedOptionId,
|
|
+ sourceless);
|
|
} catch (e) {
|
|
throw e; /* node-do-not-add-exception-line */
|
|
}
|
|
diff --git node/src/inspector_agent.cc node/src/inspector_agent.cc
|
|
index 2318c4e0df..fb998531a7 100644
|
|
--- node/src/inspector_agent.cc
|
|
+++ node/src/inspector_agent.cc
|
|
@@ -832,11 +832,6 @@ bool Agent::Start(const std::string& path,
|
|
StartIoThreadAsyncCallback));
|
|
uv_unref(reinterpret_cast<uv_handle_t*>(&start_io_thread_async));
|
|
start_io_thread_async.data = this;
|
|
- if (parent_env_->should_start_debug_signal_handler()) {
|
|
- // Ignore failure, SIGUSR1 won't work, but that should not block node
|
|
- // start.
|
|
- StartDebugSignalHandler();
|
|
- }
|
|
|
|
parent_env_->AddCleanupHook([](void* data) {
|
|
Environment* env = static_cast<Environment*>(data);
|
|
diff --git node/src/node.cc node/src/node.cc
|
|
index 07684482f8..0262de1cd8 100644
|
|
--- node/src/node.cc
|
|
+++ node/src/node.cc
|
|
@@ -404,6 +404,8 @@ MaybeLocal<Value> StartExecution(Environment* env, StartExecutionCallback cb) {
|
|
return env->RunSnapshotDeserializeMain();
|
|
}
|
|
|
|
+ StartExecution(env, "internal/bootstrap/pkg");
|
|
+
|
|
if (env->worker_context() != nullptr) {
|
|
return StartExecution(env, "internal/main/worker_thread");
|
|
}
|
|
@@ -628,14 +630,6 @@ static void PlatformInit(ProcessInitializationFlags::Flags flags) {
|
|
}
|
|
|
|
if (!(flags & ProcessInitializationFlags::kNoDefaultSignalHandling)) {
|
|
-#if HAVE_INSPECTOR
|
|
- sigset_t sigmask;
|
|
- sigemptyset(&sigmask);
|
|
- sigaddset(&sigmask, SIGUSR1);
|
|
- const int err = pthread_sigmask(SIG_SETMASK, &sigmask, nullptr);
|
|
- CHECK_EQ(err, 0);
|
|
-#endif // HAVE_INSPECTOR
|
|
-
|
|
ResetSignalHandlers();
|
|
}
|
|
|
|
diff --git node/src/node_contextify.cc node/src/node_contextify.cc
|
|
index 21a08a738e..ba529c2737 100644
|
|
--- node/src/node_contextify.cc
|
|
+++ node/src/node_contextify.cc
|
|
@@ -86,6 +86,7 @@ using v8::Symbol;
|
|
using v8::Uint32;
|
|
using v8::UnboundScript;
|
|
using v8::Value;
|
|
+using v8::V8;
|
|
|
|
// The vm module executes code in a sandboxed environment with a different
|
|
// global object than the rest of the code. This is achieved by applying
|
|
@@ -993,13 +994,13 @@ void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
|
|
Local<ArrayBufferView> cached_data_buf;
|
|
bool produce_cached_data = false;
|
|
Local<Context> parsing_context = context;
|
|
-
|
|
+ bool sourceless = false;
|
|
Local<Symbol> id_symbol;
|
|
if (argc > 2) {
|
|
// new ContextifyScript(code, filename, lineOffset, columnOffset,
|
|
// cachedData, produceCachedData, parsingContext,
|
|
- // hostDefinedOptionId)
|
|
- CHECK_EQ(argc, 8);
|
|
+ // hostDefinedOptionId, sourceless)
|
|
+ CHECK_GE(argc, 8);
|
|
CHECK(args[2]->IsNumber());
|
|
line_offset = args[2].As<Int32>()->Value();
|
|
CHECK(args[3]->IsNumber());
|
|
@@ -1020,6 +1021,10 @@ void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
|
|
}
|
|
CHECK(args[7]->IsSymbol());
|
|
id_symbol = args[7].As<Symbol>();
|
|
+ if (argc > 8) {
|
|
+ CHECK(args[8]->IsBoolean());
|
|
+ sourceless = args[8]->IsTrue();
|
|
+ }
|
|
}
|
|
|
|
ContextifyScript* contextify_script =
|
|
@@ -1067,6 +1072,10 @@ void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
|
|
ShouldNotAbortOnUncaughtScope no_abort_scope(env);
|
|
Context::Scope scope(parsing_context);
|
|
|
|
+ if (sourceless && produce_cached_data) {
|
|
+ V8::EnableCompilationForSourcelessUse();
|
|
+ }
|
|
+
|
|
MaybeLocal<UnboundScript> maybe_v8_script =
|
|
ScriptCompiler::CompileUnboundScript(isolate, &source, compile_options);
|
|
|
|
@@ -1081,6 +1090,12 @@ void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
|
|
return;
|
|
}
|
|
|
|
+ if (sourceless && compile_options == ScriptCompiler::kConsumeCodeCache) {
|
|
+ if (!source.GetCachedData()->rejected) {
|
|
+ V8::FixSourcelessScript(env->isolate(), v8_script);
|
|
+ }
|
|
+ }
|
|
+
|
|
contextify_script->script_.Reset(isolate, v8_script);
|
|
contextify_script->script_.SetWeak();
|
|
contextify_script->object()->SetInternalField(kUnboundScriptSlot, v8_script);
|
|
@@ -1120,6 +1135,10 @@ void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
|
|
.IsNothing())
|
|
return;
|
|
|
|
+ if (sourceless && produce_cached_data) {
|
|
+ V8::DisableCompilationForSourcelessUse();
|
|
+ }
|
|
+
|
|
TRACE_EVENT_END0(TRACING_CATEGORY_NODE2(vm, script), "ContextifyScript::New");
|
|
}
|
|
|
|
diff --git node/src/node_main.cc node/src/node_main.cc
|
|
index f66099a557..4048f6bd93 100644
|
|
--- node/src/node_main.cc
|
|
+++ node/src/node_main.cc
|
|
@@ -22,6 +22,8 @@
|
|
#include "node.h"
|
|
#include <cstdio>
|
|
|
|
+int reorder(int argc, char** argv);
|
|
+
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#include <VersionHelpers.h>
|
|
@@ -88,12 +90,95 @@ int wmain(int argc, wchar_t* wargv[]) {
|
|
}
|
|
argv[argc] = nullptr;
|
|
// Now that conversion is done, we can finally start.
|
|
- return node::Start(argc, argv);
|
|
+ return reorder(argc, argv);
|
|
}
|
|
#else
|
|
// UNIX
|
|
|
|
int main(int argc, char* argv[]) {
|
|
+ return reorder(argc, argv);
|
|
+}
|
|
+#endif
|
|
+
|
|
+#include <string.h>
|
|
+
|
|
+int strlen2 (char* s) {
|
|
+ int len = 0;
|
|
+ while (*s) {
|
|
+ len += 1;
|
|
+ s += 1;
|
|
+ }
|
|
+ return len;
|
|
+}
|
|
+
|
|
+bool should_set_dummy() {
|
|
+#ifdef _WIN32
|
|
+ #define MAX_ENV_LENGTH 32767
|
|
+ wchar_t execpath_env[MAX_ENV_LENGTH];
|
|
+ DWORD result = GetEnvironmentVariableW(L"PKG_EXECPATH", execpath_env, MAX_ENV_LENGTH);
|
|
+ if (result == 0 && GetLastError() != ERROR_SUCCESS) return true;
|
|
+ return wcscmp(execpath_env, L"PKG_INVOKE_NODEJS") != 0;
|
|
+#else
|
|
+ const char* execpath_env = getenv("PKG_EXECPATH");
|
|
+ if (!execpath_env) return true;
|
|
+ return strcmp(execpath_env, "PKG_INVOKE_NODEJS") != 0;
|
|
+#endif
|
|
+}
|
|
+
|
|
+// for uv_setup_args
|
|
+int adjacent(int argc, char** argv) {
|
|
+ size_t size = 0;
|
|
+ for (int i = 0; i < argc; i++) {
|
|
+ size += strlen(argv[i]) + 1;
|
|
+ }
|
|
+ char* args = new char[size];
|
|
+ size_t pos = 0;
|
|
+ for (int i = 0; i < argc; i++) {
|
|
+ memcpy(&args[pos], argv[i], strlen(argv[i]) + 1);
|
|
+ argv[i] = &args[pos];
|
|
+ pos += strlen(argv[i]) + 1;
|
|
+ }
|
|
return node::Start(argc, argv);
|
|
}
|
|
+
|
|
+volatile char* BAKERY = (volatile char*) "\0// BAKERY // BAKERY " \
|
|
+ "// BAKERY // BAKERY // BAKERY // BAKERY // BAKERY // BAKERY " \
|
|
+ "// BAKERY // BAKERY // BAKERY // BAKERY // BAKERY // BAKERY " \
|
|
+ "// BAKERY // BAKERY // BAKERY // BAKERY // BAKERY // BAKERY ";
|
|
+
|
|
+#ifdef __clang__
|
|
+__attribute__((optnone))
|
|
+#elif defined(__GNUC__)
|
|
+__attribute__((optimize(0)))
|
|
#endif
|
|
+
|
|
+int load_baked(char** nargv) {
|
|
+ int c = 1;
|
|
+
|
|
+ char* bakery = (char*) BAKERY;
|
|
+ while (true) {
|
|
+ size_t width = strlen2(bakery);
|
|
+ if (width == 0) break;
|
|
+ nargv[c++] = bakery;
|
|
+ bakery += width + 1;
|
|
+ }
|
|
+
|
|
+ return c;
|
|
+}
|
|
+
|
|
+int reorder(int argc, char** argv) {
|
|
+ char** nargv = new char*[argc + 64];
|
|
+
|
|
+ nargv[0] = argv[0];
|
|
+ int c = load_baked(nargv);
|
|
+
|
|
+ if (should_set_dummy()) {
|
|
+ nargv[c++] = (char*) "PKG_DUMMY_ENTRYPOINT";
|
|
+ }
|
|
+
|
|
+ for (int i = 1; i < argc; i++) {
|
|
+ nargv[c++] = argv[i];
|
|
+ }
|
|
+
|
|
+ return adjacent(c, nargv);
|
|
+}
|
|
diff --git node/src/node_options.cc node/src/node_options.cc
|
|
index ed85bf11f6..e5208d5821 100644
|
|
--- node/src/node_options.cc
|
|
+++ node/src/node_options.cc
|
|
@@ -311,7 +311,7 @@ void Parse(
|
|
PerProcessOptions* const options,
|
|
OptionEnvvarSettings required_env_settings, StringVector* const errors) {
|
|
_ppop_instance.Parse(
|
|
- args, exec_args, v8_args, options, required_env_settings, errors);
|
|
+args, exec_args, v8_args, options, required_env_settings, errors);
|
|
}
|
|
|
|
// XXX: If you add an option here, please also add it to doc/node.1 and
|
|
@@ -319,6 +319,7 @@ void Parse(
|
|
// TODO(addaleax): Make that unnecessary.
|
|
|
|
DebugOptionsParser::DebugOptionsParser() {
|
|
+ return;
|
|
AddOption("--inspect-port",
|
|
"set host:port for inspector",
|
|
&DebugOptions::host_port,
|
|
diff --git node/tools/icu/icu-generic.gyp node/tools/icu/icu-generic.gyp
|
|
index f007c65232..002a00a6ae 100644
|
|
--- node/tools/icu/icu-generic.gyp
|
|
+++ node/tools/icu/icu-generic.gyp
|
|
@@ -52,7 +52,7 @@
|
|
'conditions': [
|
|
[ 'os_posix == 1 and OS != "mac" and OS != "ios"', {
|
|
'cflags': [ '-Wno-deprecated-declarations', '-Wno-strict-aliasing' ],
|
|
- 'cflags_cc': [ '-frtti' ],
|
|
+ 'cflags_cc': [ '-frtti', '-fno-lto' ],
|
|
'cflags_cc!': [ '-fno-rtti' ],
|
|
}],
|
|
[ 'OS == "mac" or OS == "ios"', {
|