https://github.com/yao-pkg/pkg-fetch/raw/refs/tags/v3.5.23/patches/node.v20.19.1.cpp.patch + local FreeBSD patches --- yao-pkg/node_modules/@yao-pkg/pkg-fetch/patches/node.v20.19.1.cpp.patch +++ yao-pkg/node_modules/@yao-pkg/pkg-fetch/patches/node.v20.19.1.cpp.patch @@ -11,6 +11,24 @@ index d3c17d47bc..7970af6ea4 100644 }], ], }, +@@ -426,7 +426,7 @@ + 'ldflags': [ '-m32' ], + }], + [ 'host_arch=="ppc64" and OS not in "aix os400"', { +- 'cflags': [ '-m64', '-mminimal-toc' ], ++ 'cflags': [ '-m64' ], + 'ldflags': [ '-m64' ], + }], + [ 'host_arch=="s390x" and OS=="linux"', { +@@ -450,7 +450,7 @@ + 'ldflags': [ '-m32' ], + }], + [ 'target_arch=="ppc64" and OS not in "aix os400"', { +- 'cflags': [ '-m64', '-mminimal-toc' ], ++ 'cflags': [ '-m64' ], + 'ldflags': [ '-m64' ], + }], + [ 'target_arch=="s390x" and OS=="linux"', { diff --git node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c index 5e7775f1a5..eeebf67796 100644 --- node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c @@ -600,3 +618,375 @@ index 2655b9e694..1d951571c7 100644 'cflags_cc!': [ '-fno-rtti' ], }], [ 'OS == "mac" or OS == "ios"', { +--- node/Makefile.orig 2025-05-14 12:22:41 UTC ++++ node/Makefile +@@ -171,8 +171,7 @@ out/Makefile: config.gypi common.gypi node.gyp \ + $(warning '$@' target is a noop) + + out/Makefile: config.gypi common.gypi node.gyp \ +- deps/uv/uv.gyp deps/llhttp/llhttp.gyp deps/zlib/zlib.gyp \ +- deps/simdutf/simdutf.gyp deps/ada/ada.gyp \ ++ deps/*/*.gyp \ + tools/v8_gypfiles/toolchain.gypi tools/v8_gypfiles/features.gypi \ + tools/v8_gypfiles/inspector.gypi tools/v8_gypfiles/v8.gyp + $(PYTHON) tools/gyp_node.py -f make +--- node/deps/openssl/config/archs/linux-elf/no-asm/openssl-cl.gypi.orig 2023-05-16 06:58:19 UTC ++++ node/deps/openssl/config/archs/linux-elf/no-asm/openssl-cl.gypi +@@ -13,7 +13,7 @@ + '-Wall -O3 -fomit-frame-pointer', + ], + 'openssl_ex_libs_linux-elf': [ +- '-ldl -pthread', ++ '-pthread', + ], + 'openssl_cli_srcs_linux-elf': [ + 'openssl/apps/lib/cmp_mock_srv.c', +--- node/deps/openssl/config/archs/linux-elf/no-asm/openssl.gypi.orig 2023-05-16 06:58:19 UTC ++++ node/deps/openssl/config/archs/linux-elf/no-asm/openssl.gypi +@@ -977,7 +977,7 @@ + '-Wall -O3 -fomit-frame-pointer', + ], + 'openssl_ex_libs_linux-elf': [ +- '-ldl -pthread', ++ '-pthread', + ], + }, + 'include_dirs': [ +--- node/deps/openssl/openssl-cl_no_asm.gypi.orig 2023-11-22 10:13:54 UTC ++++ node/deps/openssl/openssl-cl_no_asm.gypi +@@ -1,4 +1,5 @@ + { ++ 'defines': ['OPENSSL_NO_ASM'], + 'conditions': [ + ['target_arch=="ppc64" and OS in ("aix", "os400")', { + 'includes': ['config/archs/aix64-gcc-as/no-asm/openssl-cl.gypi'], +@@ -45,7 +46,7 @@ + 'includes': ['config/archs/linux64-loongarch64/no-asm/openssl-cl.gypi'], + }, { + # Other architectures don't use assembly +- 'includes': ['config/archs/linux-x86_64/no-asm/openssl-cl.gypi'], ++ 'includes': ['config/archs/linux-elf/no-asm/openssl-cl.gypi'], + }], + ], + } +--- node/deps/openssl/openssl_no_asm.gypi.orig 2023-05-16 06:58:20 UTC ++++ node/deps/openssl/openssl_no_asm.gypi +@@ -44,7 +44,7 @@ + 'includes': ['config/archs/linux64-riscv64/no-asm/openssl.gypi'], + }, { + # Other architectures don't use assembly +- 'includes': ['config/archs/linux-x86_64/no-asm/openssl.gypi'], ++ 'includes': ['config/archs/linux-elf/no-asm/openssl.gypi'], + }], + ], + } +--- node/deps/v8/src/base/macros.h.orig 2021-04-12 21:00:33.000000000 +0000 ++++ node/deps/v8/src/base/macros.h 2025-06-20 09:42:18.838769000 +0000 +@@ -203,7 +203,8 @@ + // base::is_trivially_copyable will differ for these cases. + template + struct is_trivially_copyable { +-#if V8_CC_MSVC ++#if V8_CC_MSVC || (__GNUC__ == 12 && __GNUC_MINOR__ <= 2) || \ ++ (defined(__clang__) && __clang_major__ <= 17) + // Unfortunately, MSVC 2015 is broken in that std::is_trivially_copyable can + // be false even though it should be true according to the standard. + // (status at 2018-02-26, observed on the msvc waterfall bot). +--- node/deps/v8/src/base/platform/platform-freebsd.cc.orig 2023-05-16 06:58:20 UTC ++++ node/deps/v8/src/base/platform/platform-freebsd.cc +@@ -82,8 +82,8 @@ std::vector OS::GetSharedLib + lib_name = std::string(path); + } + result.push_back(SharedLibraryAddress( +- lib_name, reinterpret_cast(map->kve_start), +- reinterpret_cast(map->kve_end))); ++ lib_name, static_cast(map->kve_start), ++ static_cast(map->kve_end))); + } + + start += ssize; +--- node/deps/v8/src/codegen/arm/cpu-arm.cc.orig 2023-05-16 06:58:20 UTC ++++ node/deps/v8/src/codegen/arm/cpu-arm.cc +@@ -2,12 +2,15 @@ + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + ++#include "include/v8config.h" ++ + // CPU specific code for arm independent of OS goes here. + #ifdef __arm__ + #ifdef __QNXNTO__ + #include // for cache flushing. + #undef MAP_TYPE + #elif V8_OS_FREEBSD ++#include + #include // for cache flushing + #include + #elif V8_OS_STARBOARD +--- node/deps/v8/src/codegen/ppc/constants-ppc.h.orig 2023-05-16 06:58:20 UTC ++++ node/deps/v8/src/codegen/ppc/constants-ppc.h +@@ -36,7 +36,7 @@ + #endif + + #if !(V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) || !V8_TARGET_ARCH_PPC64 || \ +- V8_TARGET_LITTLE_ENDIAN || (defined(_CALL_ELF) && _CALL_ELF == 2) ++ (defined(_CALL_ELF) && _CALL_ELF == 2) + #define ABI_RETURNS_OBJECT_PAIRS_IN_REGS 1 + #else + #define ABI_RETURNS_OBJECT_PAIRS_IN_REGS 0 +@@ -44,7 +44,7 @@ + + #if !(V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) || \ + (V8_TARGET_ARCH_PPC64 && \ +- (V8_TARGET_LITTLE_ENDIAN || (defined(_CALL_ELF) && _CALL_ELF == 2))) ++ (defined(_CALL_ELF) && _CALL_ELF == 2)) + #define ABI_CALL_VIA_IP 1 + #else + #define ABI_CALL_VIA_IP 0 +--- node/deps/v8/src/libsampler/sampler.cc.orig 2023-05-16 06:58:20 UTC ++++ node/deps/v8/src/libsampler/sampler.cc +@@ -511,6 +511,10 @@ void SignalHandler::FillRegisterState(void* context, R + state->pc = reinterpret_cast(mcontext.__gregs[_REG_PC]); + state->sp = reinterpret_cast(mcontext.__gregs[_REG_SP]); + state->fp = reinterpret_cast(mcontext.__gregs[_REG_FP]); ++#elif V8_TARGET_ARCH_PPC64 ++ state->pc = reinterpret_cast(mcontext.mc_srr0); ++ state->sp = reinterpret_cast(mcontext.mc_frame[1]); ++ state->fp = reinterpret_cast(mcontext.mc_frame[31]); + #endif // V8_HOST_ARCH_* + #elif V8_OS_NETBSD + #if V8_HOST_ARCH_IA32 +Obtained from: https://chromium.googlesource.com/v8/v8.git/+/182d9c05e78b1ddb1cb8242cd3628a7855a0336f + +commit 182d9c05e78b1ddb1cb8242cd3628a7855a0336f +Author: Andrey Kosyakov +Date: 2023-08-17T13:50:11-07:00 + + Define UChar as char16_t + + We used to have UChar defined as uint16_t which does not go along + with STL these days if you try to have an std::basic_string<> of it, + as there are no standard std::char_traits<> specialization for uint16_t. + + This switches UChar to char16_t where practical, introducing a few + compatibility shims to keep CL size small, as (1) this would likely + have to be back-ported and (2) crdtp extensively uses uint16_t for + wide chars. + + Bug: b:296390693 + Change-Id: I66a32d8f0050915225b187de56896c26dd76163d + Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4789966 + Reviewed-by: Jaroslav Sevcik + Commit-Queue: Jaroslav Sevcik + Auto-Submit: Andrey Kosyakov + Cr-Commit-Position: refs/heads/main@{#89559} + +diff --git node/deps/v8/src/inspector/string-16.cc node/deps/v8/src/inspector/string-16.cc +index a8b786a8166..6df9963e970 100644 +--- node/deps/v8/src/inspector/string-16.cc ++++ node/deps/v8/src/inspector/string-16.cc +@@ -27,7 +27,7 @@ bool isSpaceOrNewLine(UChar c) { + return isASCII(c) && c <= ' ' && (c == ' ' || (c <= 0xD && c >= 0x9)); + } + +-int64_t charactersToInteger(const UChar* characters, size_t length, ++int64_t charactersToInteger(const uint16_t* characters, size_t length, + bool* ok = nullptr) { + std::vector buffer; + buffer.reserve(length + 1); +@@ -50,6 +50,8 @@ int64_t charactersToInteger(const UChar* characters, size_t length, + + String16::String16(const UChar* characters, size_t size) + : m_impl(characters, size) {} ++String16::String16(const uint16_t* characters, size_t size) ++ : m_impl(reinterpret_cast(characters), size) {} + + String16::String16(const UChar* characters) : m_impl(characters) {} + +@@ -241,6 +243,10 @@ String16 String16::fromUTF16LE(const UChar* stringStart, size_t length) { + #endif // V8_TARGET_BIG_ENDIAN + } + ++String16 String16::fromUTF16LE(const uint16_t* stringStart, size_t length) { ++ return fromUTF16LE(reinterpret_cast(stringStart), length); ++} ++ + std::string String16::utf8() const { + return UTF16ToUTF8(m_impl.data(), m_impl.size()); + } +diff --git node/deps/v8/src/inspector/string-16.h node/deps/v8/src/inspector/string-16.h +index 1678ffb2e1e..d9f6c466ab1 100644 +--- node/deps/v8/src/inspector/string-16.h ++++ node/deps/v8/src/inspector/string-16.h +@@ -6,6 +6,7 @@ + #define V8_INSPECTOR_STRING_16_H_ + + #include ++#include + + #include + #include +@@ -18,7 +19,7 @@ + + namespace v8_inspector { + +-using UChar = uint16_t; ++using UChar = char16_t; + + class String16 { + public: +@@ -28,6 +29,7 @@ class String16 { + String16(const String16&) V8_NOEXCEPT = default; + String16(String16&&) V8_NOEXCEPT = default; + String16(const UChar* characters, size_t size); ++ String16(const uint16_t* characters, size_t size); + V8_EXPORT String16(const UChar* characters); + V8_EXPORT String16(const char* characters); + String16(const char* characters, size_t size); +@@ -49,7 +51,9 @@ class String16 { + int toInteger(bool* ok = nullptr) const; + std::pair getTrimmedOffsetAndLength() const; + String16 stripWhiteSpace() const; +- const UChar* characters16() const { return m_impl.c_str(); } ++ const uint16_t* characters16() const { ++ return reinterpret_cast(m_impl.c_str()); ++ } + size_t length() const { return m_impl.length(); } + bool isEmpty() const { return !m_impl.length(); } + UChar operator[](size_t index) const { return m_impl[index]; } +@@ -79,6 +83,8 @@ class String16 { + // On Big endian architectures, byte order needs to be flipped. + V8_EXPORT static String16 fromUTF16LE(const UChar* stringStart, + size_t length); ++ V8_EXPORT static String16 fromUTF16LE(const uint16_t* stringStart, ++ size_t length); + + std::size_t hash() const { + if (!hash_code) { +diff --git node/deps/v8/src/inspector/v8-string-conversions.cc node/deps/v8/src/inspector/v8-string-conversions.cc +index 0c75e66b972..8cf19be816c 100644 +--- node/deps/v8/src/inspector/v8-string-conversions.cc ++++ node/deps/v8/src/inspector/v8-string-conversions.cc +@@ -12,7 +12,7 @@ + + namespace v8_inspector { + namespace { +-using UChar = uint16_t; ++using UChar = char16_t; + using UChar32 = uint32_t; + + bool isASCII(UChar c) { return !(c & ~0x7F); } +@@ -386,7 +386,7 @@ std::string UTF16ToUTF8(const UChar* stringStart, size_t length) { + + std::basic_string UTF8ToUTF16(const char* stringStart, size_t length) { + if (!stringStart || !length) return std::basic_string(); +- std::vector buffer(length); ++ std::vector buffer(length); + UChar* bufferStart = buffer.data(); + + UChar* bufferCurrent = bufferStart; +@@ -395,7 +395,7 @@ std::basic_string UTF8ToUTF16(const char* stringStart, size_t length) { + reinterpret_cast(stringStart + length), + &bufferCurrent, bufferCurrent + buffer.size(), nullptr, + true) != conversionOK) +- return std::basic_string(); ++ return std::basic_string(); + size_t utf16Length = bufferCurrent - bufferStart; + return std::basic_string(bufferStart, bufferStart + utf16Length); + } +diff --git node/deps/v8/src/inspector/v8-string-conversions.h node/deps/v8/src/inspector/v8-string-conversions.h +index eb33c6816a5..1126255dac2 100644 +--- node/deps/v8/src/inspector/v8-string-conversions.h ++++ node/deps/v8/src/inspector/v8-string-conversions.h +@@ -5,14 +5,16 @@ + #ifndef V8_INSPECTOR_V8_STRING_CONVERSIONS_H_ + #define V8_INSPECTOR_V8_STRING_CONVERSIONS_H_ + ++#include ++ + #include + #include + + // Conversion routines between UT8 and UTF16, used by string-16.{h,cc}. You may + // want to use string-16.h directly rather than these. + namespace v8_inspector { +-std::basic_string UTF8ToUTF16(const char* stringStart, size_t length); +-std::string UTF16ToUTF8(const uint16_t* stringStart, size_t length); ++std::basic_string UTF8ToUTF16(const char* stringStart, size_t length); ++std::string UTF16ToUTF8(const char16_t* stringStart, size_t length); + } // namespace v8_inspector + + #endif // V8_INSPECTOR_V8_STRING_CONVERSIONS_H_ +diff --git node/deps/v8/third_party/inspector_protocol/crdtp/test_platform_v8.cc node/deps/v8/third_party/inspector_protocol/crdtp/test_platform_v8.cc +index c9d89eaa42f..1a46d781b89 100644 +--- node/deps/v8/third_party/inspector_protocol/crdtp/test_platform_v8.cc ++++ node/deps/v8/third_party/inspector_protocol/crdtp/test_platform_v8.cc +@@ -11,13 +11,16 @@ + namespace v8_crdtp { + + std::string UTF16ToUTF8(span in) { +- return v8_inspector::UTF16ToUTF8(in.data(), in.size()); ++ return v8_inspector::UTF16ToUTF8(reinterpret_cast(in.data()), ++ in.size()); + } + + std::vector UTF8ToUTF16(span in) { +- std::basic_string utf16 = v8_inspector::UTF8ToUTF16( ++ std::basic_string utf16 = v8_inspector::UTF8ToUTF16( + reinterpret_cast(in.data()), in.size()); +- return std::vector(utf16.begin(), utf16.end()); ++ return std::vector( ++ reinterpret_cast(utf16.data()), ++ reinterpret_cast(utf16.data()) + utf16.size()); + } + + } // namespace v8_crdtp +--- node/node.gypi.orig 2023-05-16 06:58:21 UTC ++++ node/node.gypi +@@ -349,6 +349,9 @@ + [ 'node_use_openssl=="true"', { + 'defines': [ 'HAVE_OPENSSL=1' ], + 'conditions': [ ++ ['openssl_no_asm==1', { ++ 'defines': [ 'OPENSSL_NO_ASM' ], ++ }], + [ 'node_shared_openssl=="false"', { + 'defines': [ 'OPENSSL_API_COMPAT=0x10100000L', ], + 'dependencies': [ +--- node/src/crypto/crypto_util.cc.orig 2023-05-16 06:58:21 UTC ++++ node/src/crypto/crypto_util.cc +@@ -205,10 +205,12 @@ void InitCryptoOnce() { + // No-op with OPENSSL_NO_COMP builds of OpenSSL. + sk_SSL_COMP_zero(SSL_COMP_get_compression_methods()); + ++#if OPENSSL_VERSION_MAJOR < 3 + #ifndef OPENSSL_NO_ENGINE + ERR_load_ENGINE_strings(); + ENGINE_load_builtin_engines(); + #endif // !OPENSSL_NO_ENGINE ++#endif + } + + void GetFipsCrypto(const FunctionCallbackInfo& args) { +--- node/src/cares_wrap.h.orig 2023-05-16 06:58:21 UTC ++++ node/src/cares_wrap.h +@@ -23,7 +23,7 @@ + # include + #endif // __POSIX__ + +-# include ++# include + + namespace node { + namespace cares_wrap { +--- node/tools/v8_gypfiles/v8.gyp.orig 2023-05-16 06:58:22 UTC ++++ node/tools/v8_gypfiles/v8.gyp +@@ -1091,7 +1091,7 @@ + }], + # Platforms that don't have Compare-And-Swap (CAS) support need to link atomic library + # to implement atomic memory access +- ['v8_current_cpu in ["mips64", "mips64el", "ppc", "arm", "riscv64", "loong64"]', { ++ ['v8_current_cpu in ["mips64", "mips64el", "ppc", "riscv64", "loong64"]', { + 'link_settings': { + 'libraries': ['-latomic', ], + }, diff --git a/node_modules/@yao-pkg/pkg-fetch/patches/node.v20.19.1.cpp.patch.orig b/node_modules/@yao-pkg/pkg-fetch/patches/node.v20.19.1.cpp.patch.orig new file mode 100644 index 0000000..6b9de6d --- /dev/null +++ b/node_modules/@yao-pkg/pkg-fetch/patches/node.v20.19.1.cpp.patch.orig @@ -0,0 +1,602 @@ +diff --git node/common.gypi node/common.gypi +index d3c17d47bc..7970af6ea4 100644 +--- node/common.gypi ++++ node/common.gypi +@@ -184,7 +184,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 5e7775f1a5..eeebf67796 100644 +--- node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c ++++ node/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c +@@ -33,16 +33,6 @@ + + #include "nghttp3_macro.h" + +-#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || defined(_M_ARM64)) +-unsigned int __popcnt(unsigned int x) { +- unsigned int c = 0; +- for (; x; ++c) { +- x &= x - 1; +- } +- return c; +-} +-#endif +- + int nghttp3_ringbuf_init(nghttp3_ringbuf *rb, size_t nmemb, size_t size, + const nghttp3_mem *mem) { + if (nmemb) { +diff --git node/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c node/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c +index 74e488bce7..36ca05e80e 100644 +--- node/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c ++++ node/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c +@@ -31,16 +31,6 @@ + + #include "ngtcp2_macro.h" + +-#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || defined(_M_ARM64)) +-unsigned int __popcnt(unsigned int x) { +- unsigned int c = 0; +- for (; x; ++c) { +- x &= x - 1; +- } +- return c; +-} +-#endif +- + int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, + const ngtcp2_mem *mem) { + uint8_t *buf = ngtcp2_mem_malloc(mem, nmemb * size); +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 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 a06394e6c1..154b7a82a8 100644 +--- node/deps/v8/src/api/api.cc ++++ node/deps/v8/src/api/api.cc +@@ -806,6 +806,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 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 31c5acceeb..56cad8671f 100644 +--- node/deps/v8/src/codegen/compiler.cc ++++ node/deps/v8/src/codegen/compiler.cc +@@ -3475,7 +3475,7 @@ MaybeHandle 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/objects/js-function.cc node/deps/v8/src/objects/js-function.cc +index 94f7a672a7..57bb3fc7f1 100644 +--- node/deps/v8/src/objects/js-function.cc ++++ node/deps/v8/src/objects/js-function.cc +@@ -1280,6 +1280,9 @@ Handle JSFunction::ToString(Handle function) { + Handle maybe_class_positions = JSReceiver::GetDataProperty( + isolate, 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 5621b15d98..722e1d18cb 100644 +--- node/deps/v8/src/objects/shared-function-info-inl.h ++++ node/deps/v8/src/objects/shared-function-info-inl.h +@@ -635,6 +635,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 8c55a6fb6e..70bf82a57d 100644 +--- node/deps/v8/src/parsing/parsing.cc ++++ node/deps/v8/src/parsing/parsing.cc +@@ -42,6 +42,7 @@ bool ParseProgram(ParseInfo* info, Handle