@@ -896,6 +896,16 @@ inline T Value::As() const {
896896 return T (_env, _value);
897897}
898898
899+ template <typename T>
900+ inline T Value::UnsafeAs () const {
901+ return T (_env, _value);
902+ }
903+
904+ // static
905+ inline void Value::CheckCast (napi_env /* env */ , napi_value value) {
906+ NAPI_CHECK (value != nullptr , " Value::CheckCast" , " empty value" );
907+ }
908+
899909inline MaybeOrValue<Boolean> Value::ToBoolean () const {
900910 napi_value result;
901911 napi_status status = napi_coerce_to_bool (_env, _value, &result);
@@ -1303,12 +1313,15 @@ inline Symbol Symbol::New(napi_env env, napi_value description) {
13031313
13041314inline MaybeOrValue<Symbol> Symbol::WellKnown (napi_env env,
13051315 const std::string& name) {
1316+ // No need to check if the return value is a symbol or undefined.
1317+ // Well known symbols are definite and it is an develop time error
1318+ // if the symbol does not exist.
13061319#if defined(NODE_ADDON_API_ENABLE_MAYBE)
13071320 Value symbol_obj;
13081321 Value symbol_value;
13091322 if (Napi::Env (env).Global ().Get (" Symbol" ).UnwrapTo (&symbol_obj) &&
13101323 symbol_obj.As <Object>().Get (name).UnwrapTo (&symbol_value)) {
1311- return Just<Symbol>(symbol_value.As <Symbol>());
1324+ return Just<Symbol>(symbol_value.UnsafeAs <Symbol>());
13121325 }
13131326 return Nothing<Symbol>();
13141327#else
@@ -1317,7 +1330,7 @@ inline MaybeOrValue<Symbol> Symbol::WellKnown(napi_env env,
13171330 .Get (" Symbol" )
13181331 .As <Object>()
13191332 .Get (name)
1320- .As <Symbol>();
1333+ .UnsafeAs <Symbol>();
13211334#endif
13221335}
13231336
@@ -1535,7 +1548,10 @@ inline void Object::CheckCast(napi_env env, napi_value value) {
15351548 napi_valuetype type;
15361549 napi_status status = napi_typeof (env, value, &type);
15371550 NAPI_CHECK (status == napi_ok, " Object::CheckCast" , " napi_typeof failed" );
1538- NAPI_INTERNAL_CHECK_EQ (type, napi_object, " %d" , " Object::CheckCast" );
1551+ NAPI_INTERNAL_CHECK (type == napi_object || type == napi_function,
1552+ " Object::CheckCast" ,
1553+ " Expect napi_object or napi_function, but got %d." ,
1554+ type);
15391555}
15401556
15411557inline Object::Object () : TypeTaggable() {}
0 commit comments