|
| 1 | +#ifndef SRC_CPPGC_HELPERS_H_ |
| 2 | +#define SRC_CPPGC_HELPERS_H_ |
| 3 | + |
| 4 | +#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS |
| 5 | + |
| 6 | +#include "cppgc/garbage-collected.h" |
| 7 | +#include "env.h" |
| 8 | +#include "memory_tracker.h" |
| 9 | +#include "v8-cppgc.h" |
| 10 | +#include "v8.h" |
| 11 | + |
| 12 | +namespace node { |
| 13 | + |
| 14 | +#define ASSIGN_OR_RETURN_UNWRAP_CPPGC(ptr, obj, ...) \ |
| 15 | + do { \ |
| 16 | + DCHECK_GE(obj->InternalFieldCount(), kInternalFieldCount); \ |
| 17 | + *ptr = static_cast<typename std::remove_reference<decltype(*ptr)>::type>( \ |
| 18 | + obj->GetAlignedPointerFromInternalField(kSlot)); \ |
| 19 | + if (*ptr == nullptr) return __VA_ARGS__; \ |
| 20 | + } while (0) |
| 21 | + |
| 22 | +#define CPPGC_MIXIN_FIELDS() \ |
| 23 | + Environment* env_; \ |
| 24 | + v8::TracedReference<v8::Object> traced_reference_; |
| 25 | + |
| 26 | +class CppgcMixin { |
| 27 | + public: |
| 28 | + enum { kEmbedderType, kSlot, kInternalFieldCount }; |
| 29 | + template <typename T> |
| 30 | + static T* Unwrap(v8::Local<v8::Object> obj) { |
| 31 | + DCHECK_GE(obj->InternalFieldCount(), T::kInternalFieldCount); |
| 32 | + T* ptr = static_cast<T*>(obj->GetAlignedPointerFromInternalField(T::kSlot)); |
| 33 | + return ptr; |
| 34 | + } |
| 35 | +}; |
| 36 | + |
| 37 | +#define CPPGC_MIXIN_METHODS() \ |
| 38 | + v8::Local<v8::Object> object() const { \ |
| 39 | + return traced_reference_.Get(env_->isolate()); \ |
| 40 | + } \ |
| 41 | + Environment* env() const { return env_; } |
| 42 | + |
| 43 | +#define TRACE_CPPGC_OBJECT(visitor) visitor->Trace(traced_reference_); |
| 44 | + |
| 45 | +#define INITIALIZE_CPPGC_OBJECT(env, obj, ptr) \ |
| 46 | + env_ = env; \ |
| 47 | + traced_reference_ = v8::TracedReference<v8::Object>(env->isolate(), obj); \ |
| 48 | + SetCppgcReference(env->isolate(), obj, ptr); |
| 49 | + |
| 50 | +#define DEFAULT_CPPGC_TRACE() \ |
| 51 | + void Trace(cppgc::Visitor* visitor) const { TRACE_CPPGC_OBJECT(visitor) } |
| 52 | + |
| 53 | +} // namespace node |
| 54 | + |
| 55 | +#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS |
| 56 | + |
| 57 | +#endif // SRC_BASE_OBJECT_H_ |
0 commit comments