mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
Create a class `PersistentToLocal` which contains three methods, `Strong`, `Weak`, and `Default`: * `Strong` returns a `Local` from a strong persistent reference, * `Weak` returns a `Local` from a weak persistent reference, and * `Default` decides based on `IsWeak()` which of the above two to call. These replace `node::StrongPersistentToLocal()`, `node::WeakPersistentToLocal()`, and `node::PersistentToLocal()`, respectively. PR-URL: https://github.com/nodejs/node/pull/24276 Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com>
67 lines
2.1 KiB
C++
67 lines
2.1 KiB
C++
#ifndef SRC_NODE_PERSISTENT_H_
|
|
#define SRC_NODE_PERSISTENT_H_
|
|
|
|
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
|
|
#include "v8.h"
|
|
|
|
namespace node {
|
|
|
|
template <typename T>
|
|
struct ResetInDestructorPersistentTraits {
|
|
static const bool kResetInDestructor = true;
|
|
template <typename S, typename M>
|
|
// Disallow copy semantics by leaving this unimplemented.
|
|
inline static void Copy(
|
|
const v8::Persistent<S, M>&,
|
|
v8::Persistent<T, ResetInDestructorPersistentTraits<T>>*);
|
|
};
|
|
|
|
// v8::Persistent does not reset the object slot in its destructor. That is
|
|
// acknowledged as a flaw in the V8 API and expected to change in the future
|
|
// but for now node::Persistent is the easier and safer alternative.
|
|
template <typename T>
|
|
using Persistent = v8::Persistent<T, ResetInDestructorPersistentTraits<T>>;
|
|
|
|
class PersistentToLocal {
|
|
public:
|
|
// If persistent.IsWeak() == false, then do not call persistent.Reset()
|
|
// while the returned Local<T> is still in scope, it will destroy the
|
|
// reference to the object.
|
|
template <class TypeName>
|
|
static inline v8::Local<TypeName> Default(
|
|
v8::Isolate* isolate,
|
|
const Persistent<TypeName>& persistent) {
|
|
if (persistent.IsWeak()) {
|
|
return PersistentToLocal::Weak(isolate, persistent);
|
|
} else {
|
|
return PersistentToLocal::Strong(persistent);
|
|
}
|
|
}
|
|
|
|
// Unchecked conversion from a non-weak Persistent<T> to Local<T>,
|
|
// use with care!
|
|
//
|
|
// Do not call persistent.Reset() while the returned Local<T> is still in
|
|
// scope, it will destroy the reference to the object.
|
|
template <class TypeName>
|
|
static inline v8::Local<TypeName> Strong(
|
|
const Persistent<TypeName>& persistent) {
|
|
return *reinterpret_cast<v8::Local<TypeName>*>(
|
|
const_cast<Persistent<TypeName>*>(&persistent));
|
|
}
|
|
|
|
template <class TypeName>
|
|
static inline v8::Local<TypeName> Weak(
|
|
v8::Isolate* isolate,
|
|
const Persistent<TypeName>& persistent) {
|
|
return v8::Local<TypeName>::New(isolate, persistent);
|
|
}
|
|
};
|
|
|
|
} // namespace node
|
|
|
|
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
|
|
#endif // SRC_NODE_PERSISTENT_H_
|