Skip to content
Merged
Prev Previous commit
fixup! update Symbol::For
  • Loading branch information
legendecas committed Jul 14, 2021
commit 68facc75b323b1a39759586cf80e18901597fa87
32 changes: 24 additions & 8 deletions napi-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -1080,25 +1080,41 @@ inline MaybeOrValue<Symbol> Symbol::WellKnown(napi_env env,
#endif
}

inline Symbol Symbol::For(napi_env env, const std::string& description) {
inline MaybeOrValue<Symbol> Symbol::For(napi_env env,
const std::string& description) {
napi_value descriptionValue = String::New(env, description);
return Symbol::For(env, descriptionValue);
}

inline Symbol Symbol::For(napi_env env, const char* description) {
inline MaybeOrValue<Symbol> Symbol::For(napi_env env, const char* description) {
napi_value descriptionValue = String::New(env, description);
return Symbol::For(env, descriptionValue);
}

inline Symbol Symbol::For(napi_env env, String description) {
inline MaybeOrValue<Symbol> Symbol::For(napi_env env, String description) {
return Symbol::For(env, static_cast<napi_value>(description));
}

inline Symbol Symbol::For(napi_env env, napi_value description) {
Object symbObject = Napi::Env(env).Global().Get("Symbol").As<Object>();
auto forSymb =
symbObject.Get("for").As<Function>().Call(symbObject, {description});
return forSymb.As<Symbol>();
inline MaybeOrValue<Symbol> Symbol::For(napi_env env, napi_value description) {
#if defined(NODE_ADDON_API_ENABLE_MAYBE)
Value symbol_obj;
Value symbol_for_value;
Value symbol_value;
if (Napi::Env(env).Global().Get("Symbol").UnwrapTo(&symbol_obj) &&
symbol_obj.As<Object>().Get("for").UnwrapTo(&symbol_for_value) &&
symbol_for_value.As<Function>()
.Call(symbol_obj, {description})
.UnwrapTo(&symbol_value)) {
return Just<Symbol>(symbol_value.As<Symbol>());
}
return Nothing<Symbol>();
#else
Object symbol_obj = Napi::Env(env).Global().Get("Symbol").As<Object>();
return symbol_obj.Get("for")
.As<Function>()
.Call(symbol_obj, {description})
.As<Symbol>();
#endif
}

inline Symbol::Symbol() : Name() {
Expand Down
9 changes: 5 additions & 4 deletions napi.h
Original file line number Diff line number Diff line change
Expand Up @@ -630,16 +630,17 @@ namespace Napi {
static MaybeOrValue<Symbol> WellKnown(napi_env, const std::string& name);

// Create a symbol in the global registry, UTF-8 Encoded cpp string
static Symbol For(napi_env env, const std::string& description);
static MaybeOrValue<Symbol> For(napi_env env,
const std::string& description);

// Create a symbol in the global registry, C style string (null terminated)
static Symbol For(napi_env env, const char* description);
static MaybeOrValue<Symbol> For(napi_env env, const char* description);

// Create a symbol in the global registry, String value describing the symbol
static Symbol For(napi_env env, String description);
static MaybeOrValue<Symbol> For(napi_env env, String description);

// Create a symbol in the global registry, napi_value describing the symbol
static Symbol For(napi_env env, napi_value description);
static MaybeOrValue<Symbol> For(napi_env env, napi_value description);

Symbol(); ///< Creates a new _empty_ Symbol instance.
Symbol(napi_env env,
Expand Down
16 changes: 9 additions & 7 deletions test/symbol.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <napi.h>
#include "test_helper.h"
using namespace Napi;

Symbol CreateNewSymbolWithNoArgs(const Napi::CallbackInfo&) {
Expand All @@ -22,33 +23,34 @@ Symbol CreateNewSymbolWithNapiString(const Napi::CallbackInfo& info) {

Symbol GetWellknownSymbol(const Napi::CallbackInfo& info) {
String registrySymbol = info[0].As<String>();
return Napi::Symbol::WellKnown(info.Env(),
registrySymbol.Utf8Value().c_str());
return MaybeUnwrap(
Napi::Symbol::WellKnown(info.Env(), registrySymbol.Utf8Value().c_str()));
}

Symbol FetchSymbolFromGlobalRegistry(const Napi::CallbackInfo& info) {
String registrySymbol = info[0].As<String>();
return Napi::Symbol::For(info.Env(), registrySymbol);
return MaybeUnwrap(Napi::Symbol::For(info.Env(), registrySymbol));
}

Symbol FetchSymbolFromGlobalRegistryWithCppKey(const Napi::CallbackInfo& info) {
String cppStringKey = info[0].As<String>();
return Napi::Symbol::For(info.Env(), cppStringKey.Utf8Value());
return MaybeUnwrap(Napi::Symbol::For(info.Env(), cppStringKey.Utf8Value()));
}

Symbol FetchSymbolFromGlobalRegistryWithCKey(const Napi::CallbackInfo& info) {
String cppStringKey = info[0].As<String>();
return Napi::Symbol::For(info.Env(), cppStringKey.Utf8Value().c_str());
return MaybeUnwrap(
Napi::Symbol::For(info.Env(), cppStringKey.Utf8Value().c_str()));
}

Symbol TestUndefinedSymbolsCanBeCreated(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
return Napi::Symbol::For(env, env.Undefined());
return MaybeUnwrap(Napi::Symbol::For(env, env.Undefined()));
}

Symbol TestNullSymbolsCanBeCreated(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
return Napi::Symbol::For(env, env.Null());
return MaybeUnwrap(Napi::Symbol::For(env, env.Null()));
}

Object InitSymbol(Env env) {
Expand Down