@@ -898,26 +898,92 @@ napi_status napi_define_class(napi_env env,
898
898
napi_status napi_get_property_names (napi_env env,
899
899
napi_value object,
900
900
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) {
901
917
NAPI_PREAMBLE (env);
902
918
CHECK_ARG (env, result);
903
919
904
920
v8::Local<v8::Context> context = env->context ();
905
921
v8::Local<v8::Object> obj;
906
922
CHECK_TO_OBJECT (env, context, obj, object);
907
923
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
+ }
916
963
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
+ }
918
974
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 ());
921
987
return GET_RETURN_STATUS (env);
922
988
}
923
989
0 commit comments