@@ -898,26 +898,92 @@ napi_status napi_define_class(napi_env env,
898898napi_status napi_get_property_names (napi_env env,
899899 napi_value object,
900900 napi_value* result) {
901+ return napi_get_all_property_names (
902+ env,
903+ object,
904+ napi_key_include_prototypes,
905+ static_cast <napi_key_filter>(napi_key_enumerable |
906+ napi_key_skip_symbols),
907+ napi_key_numbers_to_strings,
908+ result);
909+ }
910+
911+ napi_status napi_get_all_property_names (napi_env env,
912+ napi_value object,
913+ napi_key_collection_mode key_mode,
914+ napi_key_filter key_filter,
915+ napi_key_conversion key_conversion,
916+ napi_value* result) {
901917 NAPI_PREAMBLE (env);
902918 CHECK_ARG (env, result);
903919
904920 v8::Local<v8::Context> context = env->context ();
905921 v8::Local<v8::Object> obj;
906922 CHECK_TO_OBJECT (env, context, obj, object);
907923
908- v8::MaybeLocal<v8::Array> maybe_propertynames = obj->GetPropertyNames (
909- context,
910- v8::KeyCollectionMode::kIncludePrototypes ,
911- static_cast <v8::PropertyFilter>(
912- v8::PropertyFilter::ONLY_ENUMERABLE |
913- v8::PropertyFilter::SKIP_SYMBOLS),
914- v8::IndexFilter::kIncludeIndices ,
915- v8::KeyConversionMode::kConvertToString );
924+ v8::PropertyFilter filter = v8::PropertyFilter::ALL_PROPERTIES;
925+ if (key_filter & napi_key_writable) {
926+ filter =
927+ static_cast <v8::PropertyFilter>(filter |
928+ v8::PropertyFilter::ONLY_WRITABLE);
929+ }
930+ if (key_filter & napi_key_enumerable) {
931+ filter =
932+ static_cast <v8::PropertyFilter>(filter |
933+ v8::PropertyFilter::ONLY_ENUMERABLE);
934+ }
935+ if (key_filter & napi_key_configurable) {
936+ filter =
937+ static_cast <v8::PropertyFilter>(filter |
938+ v8::PropertyFilter::ONLY_WRITABLE);
939+ }
940+ if (key_filter & napi_key_skip_strings) {
941+ filter =
942+ static_cast <v8::PropertyFilter>(filter |
943+ v8::PropertyFilter::SKIP_STRINGS);
944+ }
945+ if (key_filter & napi_key_skip_symbols) {
946+ filter =
947+ static_cast <v8::PropertyFilter>(filter |
948+ v8::PropertyFilter::SKIP_SYMBOLS);
949+ }
950+ v8::KeyCollectionMode collection_mode;
951+ v8::KeyConversionMode conversion_mode;
952+
953+ switch (key_mode) {
954+ case napi_key_include_prototypes:
955+ collection_mode = v8::KeyCollectionMode::kIncludePrototypes ;
956+ break ;
957+ case napi_key_own_only:
958+ collection_mode = v8::KeyCollectionMode::kOwnOnly ;
959+ break ;
960+ default :
961+ return napi_set_last_error (env, napi_invalid_arg);
962+ }
916963
917- CHECK_MAYBE_EMPTY (env, maybe_propertynames, napi_generic_failure);
964+ switch (key_conversion) {
965+ case napi_key_keep_numbers:
966+ conversion_mode = v8::KeyConversionMode::kKeepNumbers ;
967+ break ;
968+ case napi_key_numbers_to_strings:
969+ conversion_mode = v8::KeyConversionMode::kConvertToString ;
970+ break ;
971+ default :
972+ return napi_set_last_error (env, napi_invalid_arg);
973+ }
918974
919- *result = v8impl::JsValueFromV8LocalValue (
920- maybe_propertynames.ToLocalChecked ());
975+ v8::MaybeLocal<v8::Array> maybe_all_propertynames =
976+ obj->GetPropertyNames (context,
977+ collection_mode,
978+ filter,
979+ v8::IndexFilter::kIncludeIndices ,
980+ conversion_mode);
981+
982+ CHECK_MAYBE_EMPTY_WITH_PREAMBLE (
983+ env, maybe_all_propertynames, napi_generic_failure);
984+
985+ *result =
986+ v8impl::JsValueFromV8LocalValue (maybe_all_propertynames.ToLocalChecked ());
921987 return GET_RETURN_STATUS (env);
922988}
923989
0 commit comments