@@ -935,26 +935,92 @@ napi_status napi_define_class(napi_env env,
935
935
napi_status napi_get_property_names (napi_env env,
936
936
napi_value object,
937
937
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) {
938
954
NAPI_PREAMBLE (env);
939
955
CHECK_ARG (env, result);
940
956
941
957
v8::Local<v8::Context> context = env->context ();
942
958
v8::Local<v8::Object> obj;
943
959
CHECK_TO_OBJECT (env, context, obj, object);
944
960
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
+ }
953
1000
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
+ }
955
1011
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 ());
958
1024
return GET_RETURN_STATUS (env);
959
1025
}
960
1026
0 commit comments