wasmer-napi 0.702.0

NAPI library for Wasmer WebAssembly runtime
#include "internal/napi_ref_with_finalizer.h"

#include <new>

#include "internal/napi_v8_env.h"

napi_ref_with_finalizer__* napi_ref_with_finalizer__::New(
    napi_env__* env,
    v8::Local<v8::Value> value,
    uint32_t initial_refcount,
    napi_ref_ownership__ ownership,
    node_api_basic_finalize finalize_cb,
    void* finalize_data,
    void* finalize_hint) {
  napi_ref_with_finalizer__* reference =
      env->allocate<napi_ref_with_finalizer__>(
          env,
          value,
          initial_refcount,
          ownership,
          finalize_cb,
          finalize_data,
          finalize_hint);
  if (reference != nullptr) {
    reference->Link(&env->finalizing_reflist);
  }
  return reference;
}

napi_ref_with_finalizer__::napi_ref_with_finalizer__(
    napi_env__* env,
    v8::Local<v8::Value> value,
    uint32_t initial_refcount,
    napi_ref_ownership__ ownership,
    node_api_basic_finalize finalize_cb,
    void* finalize_data,
    void* finalize_hint)
    : napi_ref__(env, value, initial_refcount, ownership),
      finalize_cb_(finalize_cb),
      finalize_data_(finalize_data),
      finalize_hint_(finalize_hint) {}

napi_ref_with_finalizer__::~napi_ref_with_finalizer__() {
  if (env_ != nullptr) {
    env_->DequeueFinalizer(this);
  }
  ResetFinalizer();
}

void napi_ref_with_finalizer__::ResetFinalizer() {
  finalize_cb_ = nullptr;
  finalize_data_ = nullptr;
  finalize_hint_ = nullptr;
}

void napi_ref_with_finalizer__::Destroy() {
  napi_env__* env = env_;
  if (env != nullptr) {
    env->release(this);
  }
}

void napi_ref_with_finalizer__::CallUserFinalizer() {
  node_api_basic_finalize cb = finalize_cb_;
  void* cb_data = finalize_data_;
  void* cb_hint = finalize_hint_;
  ResetFinalizer();
  if (cb != nullptr) {
    if (env_ != nullptr) {
      env_->CallFinalizer(cb, cb_data, cb_hint);
    } else {
      cb(nullptr, cb_data, cb_hint);
    }
  }
}

void napi_ref_with_finalizer__::InvokeFinalizerFromGC() {
  if (env_ != nullptr) {
    env_->InvokeFinalizerFromGC(this);
  } else {
    Finalize();
  }
}