diff --git node/common.gypi node/common.gypi index cbf9c3810d..991792324e 100644 --- node/common.gypi +++ node/common.gypi @@ -179,7 +179,7 @@ 'MSVC_runtimeType': 2 # MultiThreadedDLL (/MD) }], ['llvm_version=="0.0"', { - 'lto': ' -flto=4 -fuse-linker-plugin -ffat-lto-objects ', # GCC + 'lto': ' -flto=4 -ffat-lto-objects ', # GCC }, { 'lto': ' -flto ', # Clang }], diff --git node/configure.py node/configure.py index 1d0a1741ce..342ade8435 100755 --- node/configure.py +++ node/configure.py @@ -1241,10 +1241,6 @@ def configure_node(o): o['variables']['want_separate_host_toolset'] = int(cross_compiling) - # Enable branch protection for arm64 - if target_arch == 'arm64': - o['cflags']+=['-msign-return-address=all'] - if options.node_snapshot_main is not None: if options.shared: # This should be possible to fix, but we will need to refactor the diff --git node/deps/v8/include/v8.h node/deps/v8/include/v8.h index eacdaae7f5..601fd94947 100644 --- node/deps/v8/include/v8.h +++ node/deps/v8/include/v8.h @@ -10092,6 +10092,10 @@ class V8_EXPORT V8 { char** argv, bool remove_flags); + static void EnableCompilationForSourcelessUse(); + static void DisableCompilationForSourcelessUse(); + static void FixSourcelessScript(Isolate* v8_isolate, Local 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 1632be8f62..e222ed00d7 100644 --- node/deps/v8/src/api/api.cc +++ node/deps/v8/src/api/api.cc @@ -647,6 +647,29 @@ 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::FLAG_lazy; + i::FLAG_lazy = false; + save_predictable = i::FLAG_predictable; + i::FLAG_predictable = true; +} + +void V8::DisableCompilationForSourcelessUse() { + i::FLAG_lazy = save_lazy; + i::FLAG_predictable = save_predictable; +} + +void V8::FixSourcelessScript(Isolate* v8_isolate, Local unbound_script) { + auto isolate = reinterpret_cast(v8_isolate); + auto function_info = + i::Handle::cast(Utils::OpenHandle(*unbound_script)); + i::Handle script(i::Script::cast(function_info->script()), isolate); + script->set_source(i::ReadOnlyRoots(isolate).undefined_value()); +} + RegisteredExtension* RegisteredExtension::first_extension_ = nullptr; RegisteredExtension::RegisteredExtension(std::unique_ptr extension) diff --git node/deps/v8/src/codegen/compiler.cc node/deps/v8/src/codegen/compiler.cc index 5c368c474e..4707995c12 100644 --- node/deps/v8/src/codegen/compiler.cc +++ node/deps/v8/src/codegen/compiler.cc @@ -2840,7 +2840,7 @@ MaybeHandle Compiler::GetSharedFunctionInfoForScript( // First check per-isolate compilation cache. maybe_result = compilation_cache->LookupScript(source, script_details, language_mode); - 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/objects/js-function.cc node/deps/v8/src/objects/js-function.cc index b2d086814f..52ba0bc9bc 100644 --- node/deps/v8/src/objects/js-function.cc +++ node/deps/v8/src/objects/js-function.cc @@ -953,6 +953,9 @@ Handle JSFunction::ToString(Handle function) { Handle maybe_class_positions = JSReceiver::GetDataProperty( function, isolate->factory()->class_positions_symbol()); if (maybe_class_positions->IsClassPositions()) { + if (String::cast(Script::cast(shared_info->script()).source()).IsUndefined(isolate)) { + return isolate->factory()->NewStringFromAsciiChecked("class {}"); + } ClassPositions class_positions = ClassPositions::cast(*maybe_class_positions); int start_position = class_positions.start(); diff --git node/deps/v8/src/objects/shared-function-info-inl.h node/deps/v8/src/objects/shared-function-info-inl.h index 583ca8dccf..83fc199993 100644 --- node/deps/v8/src/objects/shared-function-info-inl.h +++ node/deps/v8/src/objects/shared-function-info-inl.h @@ -631,6 +631,14 @@ bool SharedFunctionInfo::ShouldFlushCode( } if (!data.IsBytecodeArray()) return false; + Object script_obj = script(); + if (!script_obj.IsUndefined()) { + Script script = Script::cast(script_obj); + if (script.source().IsUndefined()) { + return false; + } + } + if (IsStressFlushingEnabled(code_flush_mode)) return true; BytecodeArray bytecode = BytecodeArray::cast(data); diff --git node/deps/v8/src/parsing/parsing.cc node/deps/v8/src/parsing/parsing.cc index 53f6cf045b..bc4ba3499f 100644 --- node/deps/v8/src/parsing/parsing.cc +++ node/deps/v8/src/parsing/parsing.cc @@ -42,6 +42,7 @@ bool ParseProgram(ParseInfo* info, Handle