wasmer-napi 0.702.0

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

#include <new>

#include "internal/napi_v8_env.h"

v8::Local<v8::External> napi_external_wrapper__::New(napi_env__* env,
                                                     void* data) {
  auto* wrapper = env->allocate<napi_external_wrapper__>(env, data);
  if (wrapper == nullptr) {
    return v8::Local<v8::External>();
  }
  v8::Local<v8::External> external = v8::External::New(env->isolate, wrapper);
  wrapper->handle_.Reset(env->isolate, external);
  wrapper->handle_.SetWeak(wrapper, WeakCallback, v8::WeakCallbackType::kParameter);
  return external;
}

napi_external_wrapper__* napi_external_wrapper__::From(
    v8::Local<v8::External> external) {
  return static_cast<napi_external_wrapper__*>(external->Value());
}

bool napi_external_wrapper__::TypeTag(const napi_type_tag* tag) {
  if (has_type_tag_) return false;
  type_tag_ = *tag;
  has_type_tag_ = true;
  return true;
}

bool napi_external_wrapper__::CheckTypeTag(const napi_type_tag* tag) const {
  return has_type_tag_ && tag->lower == type_tag_.lower &&
         tag->upper == type_tag_.upper;
}

void napi_external_wrapper__::WeakCallback(
    const v8::WeakCallbackInfo<napi_external_wrapper__>& info) {
  napi_external_wrapper__* wrapper = info.GetParameter();
  if (wrapper != nullptr && wrapper->env_ != nullptr) {
    wrapper->env_->release(wrapper);
  }
}