From d62bec6797d7d1b504b14767cf6622bfd430055f Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Mon, 7 Aug 2023 17:04:56 +0200 Subject: [PATCH] src: remove C++ WeakReference implementation --- node.gyp | 1 - src/base_object_types.h | 1 - src/inspector/node_string.cc | 1 - src/node_snapshotable.cc | 1 - src/node_util.cc | 117 ----------------------------------- src/node_util.h | 52 ---------------- src/util.cc | 1 - 7 files changed, 174 deletions(-) delete mode 100644 src/node_util.h diff --git a/node.gyp b/node.gyp index db6d7455bf1dbd..cba41bc160a8c4 100644 --- a/node.gyp +++ b/node.gyp @@ -253,7 +253,6 @@ 'src/node_stat_watcher.h', 'src/node_union_bytes.h', 'src/node_url.h', - 'src/node_util.h', 'src/node_version.h', 'src/node_v8.h', 'src/node_v8_platform-inl.h', diff --git a/src/base_object_types.h b/src/base_object_types.h index bb7a0e064b0b72..97ae94f10aa743 100644 --- a/src/base_object_types.h +++ b/src/base_object_types.h @@ -29,7 +29,6 @@ namespace node { // SET_OBJECT_ID(), the second argument should match the C++ class // name. #define SERIALIZABLE_NON_BINDING_TYPES(V) \ - V(util_weak_reference, util::WeakReference) // Helper list of all binding data wrapper types. #define BINDING_TYPES(V) \ diff --git a/src/inspector/node_string.cc b/src/inspector/node_string.cc index 6b59cd73f9742d..0f780f46c8ebdd 100644 --- a/src/inspector/node_string.cc +++ b/src/inspector/node_string.cc @@ -1,6 +1,5 @@ #include "node_string.h" #include "node/inspector/protocol/Protocol.h" -#include "node_util.h" #include "simdutf.h" #include "util-inl.h" diff --git a/src/node_snapshotable.cc b/src/node_snapshotable.cc index e2d98eb3139740..b03d63ae972d0d 100644 --- a/src/node_snapshotable.cc +++ b/src/node_snapshotable.cc @@ -21,7 +21,6 @@ #include "node_process.h" #include "node_snapshot_builder.h" #include "node_url.h" -#include "node_util.h" #include "node_v8.h" #include "node_v8_platform-inl.h" #include "timers.h" diff --git a/src/node_util.cc b/src/node_util.cc index 2af3b5a7276aae..868923ec87316c 100644 --- a/src/node_util.cc +++ b/src/node_util.cc @@ -1,4 +1,3 @@ -#include "node_util.h" #include "base_object-inl.h" #include "node_errors.h" #include "node_external_reference.h" @@ -181,109 +180,6 @@ void ArrayBufferViewHasBuffer(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(args[0].As()->HasBuffer()); } -WeakReference::WeakReference(Realm* realm, - Local object, - Local target) - : WeakReference(realm, object, target, 0) {} - -WeakReference::WeakReference(Realm* realm, - Local object, - Local target, - uint64_t reference_count) - : SnapshotableObject(realm, object, type_int), - reference_count_(reference_count) { - MakeWeak(); - if (!target.IsEmpty()) { - target_.Reset(realm->isolate(), target); - if (reference_count_ == 0) { - target_.SetWeak(); - } - } -} - -bool WeakReference::PrepareForSerialization(Local context, - v8::SnapshotCreator* creator) { - if (target_.IsEmpty()) { - target_index_ = 0; - return true; - } - - // Users can still hold strong references to target in addition to the - // reference that we manage here, and they could expect that the referenced - // object remains the same as long as that external strong reference - // is alive. Since we have no way to know if there is any other reference - // keeping the target alive, the best we can do to maintain consistency is to - // simply save a reference to the target in the snapshot (effectively making - // it strong) during serialization, and restore it during deserialization. - // If there's no known counted reference from our side, we'll make the - // reference here weak upon deserialization so that it can be GC'ed if users - // do not hold additional references to it. - Local target = target_.Get(context->GetIsolate()); - target_index_ = creator->AddData(context, target); - DCHECK_NE(target_index_, 0); - target_.Reset(); - return true; -} - -InternalFieldInfoBase* WeakReference::Serialize(int index) { - DCHECK_EQ(index, BaseObject::kEmbedderType); - InternalFieldInfo* info = - InternalFieldInfoBase::New(type()); - info->target = target_index_; - info->reference_count = reference_count_; - return info; -} - -void WeakReference::Deserialize(Local context, - Local holder, - int index, - InternalFieldInfoBase* info) { - DCHECK_EQ(index, BaseObject::kEmbedderType); - HandleScope scope(context->GetIsolate()); - - InternalFieldInfo* weak_info = reinterpret_cast(info); - Local target; - if (weak_info->target != 0) { - target = context->GetDataFromSnapshotOnce(weak_info->target) - .ToLocalChecked(); - } - new WeakReference( - Realm::GetCurrent(context), holder, target, weak_info->reference_count); -} - -void WeakReference::New(const FunctionCallbackInfo& args) { - Realm* realm = Realm::GetCurrent(args); - CHECK(args.IsConstructCall()); - CHECK(args[0]->IsObject()); - new WeakReference(realm, args.This(), args[0].As()); -} - -void WeakReference::Get(const FunctionCallbackInfo& args) { - WeakReference* weak_ref = Unwrap(args.Holder()); - Isolate* isolate = args.GetIsolate(); - if (!weak_ref->target_.IsEmpty()) - args.GetReturnValue().Set(weak_ref->target_.Get(isolate)); -} - -void WeakReference::IncRef(const FunctionCallbackInfo& args) { - WeakReference* weak_ref = Unwrap(args.Holder()); - weak_ref->reference_count_++; - if (weak_ref->target_.IsEmpty()) return; - if (weak_ref->reference_count_ == 1) weak_ref->target_.ClearWeak(); - args.GetReturnValue().Set( - v8::Number::New(args.GetIsolate(), weak_ref->reference_count_)); -} - -void WeakReference::DecRef(const FunctionCallbackInfo& args) { - WeakReference* weak_ref = Unwrap(args.Holder()); - CHECK_GE(weak_ref->reference_count_, 1); - weak_ref->reference_count_--; - if (weak_ref->target_.IsEmpty()) return; - if (weak_ref->reference_count_ == 0) weak_ref->target_.SetWeak(); - args.GetReturnValue().Set( - v8::Number::New(args.GetIsolate(), weak_ref->reference_count_)); -} - static void GuessHandleType(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); int fd; @@ -400,10 +296,6 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(GetExternalValue); registry->Register(Sleep); registry->Register(ArrayBufferViewHasBuffer); - registry->Register(WeakReference::New); - registry->Register(WeakReference::Get); - registry->Register(WeakReference::IncRef); - registry->Register(WeakReference::DecRef); registry->Register(GuessHandleType); registry->Register(FastGuessHandleType); registry->Register(fast_guess_handle_type_.GetTypeInfo()); @@ -515,15 +407,6 @@ void Initialize(Local target, env->should_abort_on_uncaught_toggle().GetJSArray()) .FromJust()); - Local weak_ref = - NewFunctionTemplate(isolate, WeakReference::New); - weak_ref->InstanceTemplate()->SetInternalFieldCount( - WeakReference::kInternalFieldCount); - SetProtoMethod(isolate, weak_ref, "get", WeakReference::Get); - SetProtoMethod(isolate, weak_ref, "incRef", WeakReference::IncRef); - SetProtoMethod(isolate, weak_ref, "decRef", WeakReference::DecRef); - SetConstructorFunction(context, target, "WeakReference", weak_ref); - SetFastMethodNoSideEffect(context, target, "guessHandleType", diff --git a/src/node_util.h b/src/node_util.h deleted file mode 100644 index 715686856db879..00000000000000 --- a/src/node_util.h +++ /dev/null @@ -1,52 +0,0 @@ - -#ifndef SRC_NODE_UTIL_H_ -#define SRC_NODE_UTIL_H_ - -#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS -#include "base_object.h" -#include "node_snapshotable.h" -#include "v8.h" - -namespace node { -namespace util { - -class WeakReference : public SnapshotableObject { - public: - SERIALIZABLE_OBJECT_METHODS() - - SET_OBJECT_ID(util_weak_reference) - - WeakReference(Realm* realm, - v8::Local object, - v8::Local target); - static void New(const v8::FunctionCallbackInfo& args); - static void Get(const v8::FunctionCallbackInfo& args); - static void IncRef(const v8::FunctionCallbackInfo& args); - static void DecRef(const v8::FunctionCallbackInfo& args); - - SET_MEMORY_INFO_NAME(WeakReference) - SET_SELF_SIZE(WeakReference) - SET_NO_MEMORY_INFO() - - struct InternalFieldInfo : public node::InternalFieldInfoBase { - SnapshotIndex target; - uint64_t reference_count; - }; - - private: - WeakReference(Realm* realm, - v8::Local object, - v8::Local target, - uint64_t reference_count); - v8::Global target_; - uint64_t reference_count_ = 0; - - SnapshotIndex target_index_ = 0; // 0 means target_ is not snapshotted -}; - -} // namespace util -} // namespace node - -#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS - -#endif // SRC_NODE_UTIL_H_ diff --git a/src/util.cc b/src/util.cc index 0523a3c8e00847..0fb66faac0de1a 100644 --- a/src/util.cc +++ b/src/util.cc @@ -27,7 +27,6 @@ #include "node_buffer.h" #include "node_errors.h" #include "node_internals.h" -#include "node_util.h" #include "node_v8_platform-inl.h" #include "string_bytes.h" #include "uv.h"