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