wasmer-napi 0.702.0-alpha.3

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

#include "internal/napi_env.h"

napi_external_backing_store_hint__::napi_external_backing_store_hint__(
    napi_env env,
    void *external_data,
    node_api_basic_finalize finalize_cb,
    void *finalize_hint)
    : env_{env},
      rt_{env == nullptr || env->context() == nullptr ? nullptr : JS_GetRuntime(env->context())},
      external_data_{external_data},
      finalize_cb_{finalize_cb},
      finalize_hint_{finalize_hint}
{
}

napi_external_backing_store_hint__::~napi_external_backing_store_hint__()
{
  env_ = nullptr;
  rt_ = nullptr;
  external_data_ = nullptr;
  finalize_cb_ = nullptr;
  finalize_hint_ = nullptr;
  finalize_invoked_ = false;
  detaching_ = false;
  weak_target_ = JS_UNDEFINED;
}

napi_external_backing_store_hint__ *napi_external_backing_store_hint__::create(
    napi_env env,
    void *external_data,
    node_api_basic_finalize finalize_cb,
    void *finalize_hint)
{
  if (env == nullptr || env->context() == nullptr)
    return nullptr;
  return env->create_external_backing_store(external_data, finalize_cb, finalize_hint);
}

void napi_external_backing_store_hint__::destroy(napi_external_backing_store_hint__ *hint)
{
  if (hint == nullptr)
    return;

  destroy_with_runtime(hint->rt_, hint);
}

void napi_external_backing_store_hint__::destroy_with_runtime(
    JSRuntime *rt,
    napi_external_backing_store_hint__ *hint)
{
  if (hint == nullptr)
    return;

  (void)rt;
  napi_env env = hint->env_;
  if (env != nullptr)
    env->destroy_external_backing_store(hint);
}

void napi_external_backing_store_hint__::invoke_finalizer()
{
  if (finalize_invoked_)
    return;
  finalize_invoked_ = true;
  if (finalize_cb_ != nullptr)
    finalize_cb_(env_, external_data_, finalize_hint_);
}

void napi_external_backing_store_hint__::begin_detach()
{
  detaching_ = true;
}

void napi_external_backing_store_hint__::end_detach()
{
  detaching_ = false;
}

bool napi_external_backing_store_hint__::is_detaching() const
{
  return detaching_;
}

napi_env napi_external_backing_store_hint__::env() const
{
  return env_;
}

JSRuntime *napi_external_backing_store_hint__::runtime() const
{
  return rt_;
}

void *napi_external_backing_store_hint__::external_data() const
{
  return external_data_;
}

JSValue napi_external_backing_store_hint__::weak_target() const
{
  return weak_target_;
}

JSValue napi_external_backing_store_hint__::finalizer_target(JSValue fallback) const
{
  return JS_IsUndefined(weak_target_) ? fallback : weak_target_;
}

void napi_external_backing_store_hint__::set_weak_target(JSValue weak_target)
{
  weak_target_ = weak_target;
}