@@ -935,26 +935,92 @@ napi_status napi_define_class(napi_env env,
935935napi_status napi_get_property_names (napi_env env,
936936 napi_value object,
937937 napi_value* result) {
938+ return napi_get_all_property_names (
939+ env,
940+ object,
941+ napi_key_include_prototypes,
942+ static_cast <napi_key_filter>(napi_key_enumerable |
943+ napi_key_skip_symbols),
944+ napi_key_numbers_to_strings,
945+ result);
946+ }
947+
948+ napi_status napi_get_all_property_names (napi_env env,
949+ napi_value object,
950+ napi_key_collection_mode key_mode,
951+ napi_key_filter key_filter,
952+ napi_key_conversion key_conversion,
953+ napi_value* result) {
938954 NAPI_PREAMBLE (env);
939955 CHECK_ARG (env, result);
940956
941957 v8::Local<v8::Context> context = env->context ();
942958 v8::Local<v8::Object> obj;
943959 CHECK_TO_OBJECT (env, context, obj, object);
944960
945- v8::MaybeLocal<v8::Array> maybe_propertynames = obj->GetPropertyNames (
946- context,
947- v8::KeyCollectionMode::kIncludePrototypes ,
948- static_cast <v8::PropertyFilter>(
949- v8::PropertyFilter::ONLY_ENUMERABLE |
950- v8::PropertyFilter::SKIP_SYMBOLS),
951- v8::IndexFilter::kIncludeIndices ,
952- v8::KeyConversionMode::kConvertToString );
961+ v8::PropertyFilter filter = v8::PropertyFilter::ALL_PROPERTIES;
962+ if (key_filter & napi_key_writable) {
963+ filter =
964+ static_cast <v8::PropertyFilter>(filter |
965+ v8::PropertyFilter::ONLY_WRITABLE);
966+ }
967+ if (key_filter & napi_key_enumerable) {
968+ filter =
969+ static_cast <v8::PropertyFilter>(filter |
970+ v8::PropertyFilter::ONLY_ENUMERABLE);
971+ }
972+ if (key_filter & napi_key_configurable) {
973+ filter =
974+ static_cast <v8::PropertyFilter>(filter |
975+ v8::PropertyFilter::ONLY_WRITABLE);
976+ }
977+ if (key_filter & napi_key_skip_strings) {
978+ filter =
979+ static_cast <v8::PropertyFilter>(filter |
980+ v8::PropertyFilter::SKIP_STRINGS);
981+ }
982+ if (key_filter & napi_key_skip_symbols) {
983+ filter =
984+ static_cast <v8::PropertyFilter>(filter |
985+ v8::PropertyFilter::SKIP_SYMBOLS);
986+ }
987+ v8::KeyCollectionMode collection_mode;
988+ v8::KeyConversionMode conversion_mode;
989+
990+ switch (key_mode) {
991+ case napi_key_include_prototypes:
992+ collection_mode = v8::KeyCollectionMode::kIncludePrototypes ;
993+ break ;
994+ case napi_key_own_only:
995+ collection_mode = v8::KeyCollectionMode::kOwnOnly ;
996+ break ;
997+ default :
998+ return napi_set_last_error (env, napi_invalid_arg);
999+ }
9531000
954- CHECK_MAYBE_EMPTY (env, maybe_propertynames, napi_generic_failure);
1001+ switch (key_conversion) {
1002+ case napi_key_keep_numbers:
1003+ conversion_mode = v8::KeyConversionMode::kKeepNumbers ;
1004+ break ;
1005+ case napi_key_numbers_to_strings:
1006+ conversion_mode = v8::KeyConversionMode::kConvertToString ;
1007+ break ;
1008+ default :
1009+ return napi_set_last_error (env, napi_invalid_arg);
1010+ }
9551011
956- *result = v8impl::JsValueFromV8LocalValue (
957- maybe_propertynames.ToLocalChecked ());
1012+ v8::MaybeLocal<v8::Array> maybe_all_propertynames =
1013+ obj->GetPropertyNames (context,
1014+ collection_mode,
1015+ filter,
1016+ v8::IndexFilter::kIncludeIndices ,
1017+ conversion_mode);
1018+
1019+ CHECK_MAYBE_EMPTY_WITH_PREAMBLE (
1020+ env, maybe_all_propertynames, napi_generic_failure);
1021+
1022+ *result =
1023+ v8impl::JsValueFromV8LocalValue (maybe_all_propertynames.ToLocalChecked ());
9581024 return GET_RETURN_STATUS (env);
9591025}
9601026
0 commit comments