@@ -896,6 +896,16 @@ inline T Value::As() const {
896
896
return T (_env, _value);
897
897
}
898
898
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
+
899
909
inline MaybeOrValue<Boolean> Value::ToBoolean () const {
900
910
napi_value result;
901
911
napi_status status = napi_coerce_to_bool (_env, _value, &result);
@@ -1303,12 +1313,15 @@ inline Symbol Symbol::New(napi_env env, napi_value description) {
1303
1313
1304
1314
inline MaybeOrValue<Symbol> Symbol::WellKnown (napi_env env,
1305
1315
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.
1306
1319
#if defined(NODE_ADDON_API_ENABLE_MAYBE)
1307
1320
Value symbol_obj;
1308
1321
Value symbol_value;
1309
1322
if (Napi::Env (env).Global ().Get (" Symbol" ).UnwrapTo (&symbol_obj) &&
1310
1323
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>());
1312
1325
}
1313
1326
return Nothing<Symbol>();
1314
1327
#else
@@ -1317,7 +1330,7 @@ inline MaybeOrValue<Symbol> Symbol::WellKnown(napi_env env,
1317
1330
.Get (" Symbol" )
1318
1331
.As <Object>()
1319
1332
.Get (name)
1320
- .As <Symbol>();
1333
+ .UnsafeAs <Symbol>();
1321
1334
#endif
1322
1335
}
1323
1336
@@ -1535,7 +1548,10 @@ inline void Object::CheckCast(napi_env env, napi_value value) {
1535
1548
napi_valuetype type;
1536
1549
napi_status status = napi_typeof (env, value, &type);
1537
1550
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);
1539
1555
}
1540
1556
1541
1557
inline Object::Object () : TypeTaggable() {}
0 commit comments