summaryrefslogtreecommitdiff
path: root/src/js_native_api_v8.cc
diff options
context:
space:
mode:
authorhimself65 <himself65@outlook.com>2019-10-17 14:13:57 +0800
committerRich Trott <rtrott@gmail.com>2020-01-11 18:50:28 -0800
commit6219f1fb447042106177efcb61e75b6e89bd0e03 (patch)
tree454853ffac3a0b01daf868fc38f4e048c9e4c3a0 /src/js_native_api_v8.cc
parent57351b628cae6167f03c0417a5e2334da574a743 (diff)
downloadnode-new-6219f1fb447042106177efcb61e75b6e89bd0e03.tar.gz
n-api: add napi_get_all_property_names
Co-Authored-By: Gabriel Schulhof <gabriel.schulhof@intel.com> PR-URL: https://github.com/nodejs/node/pull/30006 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Gabriel Schulhof <gabriel.schulhof@intel.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'src/js_native_api_v8.cc')
-rw-r--r--src/js_native_api_v8.cc88
1 files changed, 77 insertions, 11 deletions
diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc
index 52e2d7f582..392f77ce63 100644
--- a/src/js_native_api_v8.cc
+++ b/src/js_native_api_v8.cc
@@ -898,6 +898,22 @@ napi_status napi_define_class(napi_env env,
napi_status napi_get_property_names(napi_env env,
napi_value object,
napi_value* result) {
+ return napi_get_all_property_names(
+ env,
+ object,
+ napi_key_include_prototypes,
+ static_cast<napi_key_filter>(napi_key_enumerable |
+ napi_key_skip_symbols),
+ napi_key_numbers_to_strings,
+ result);
+}
+
+napi_status napi_get_all_property_names(napi_env env,
+ napi_value object,
+ napi_key_collection_mode key_mode,
+ napi_key_filter key_filter,
+ napi_key_conversion key_conversion,
+ napi_value* result) {
NAPI_PREAMBLE(env);
CHECK_ARG(env, result);
@@ -905,19 +921,69 @@ napi_status napi_get_property_names(napi_env env,
v8::Local<v8::Object> obj;
CHECK_TO_OBJECT(env, context, obj, object);
- v8::MaybeLocal<v8::Array> maybe_propertynames = obj->GetPropertyNames(
- context,
- v8::KeyCollectionMode::kIncludePrototypes,
- static_cast<v8::PropertyFilter>(
- v8::PropertyFilter::ONLY_ENUMERABLE |
- v8::PropertyFilter::SKIP_SYMBOLS),
- v8::IndexFilter::kIncludeIndices,
- v8::KeyConversionMode::kConvertToString);
+ v8::PropertyFilter filter = v8::PropertyFilter::ALL_PROPERTIES;
+ if (key_filter & napi_key_writable) {
+ filter =
+ static_cast<v8::PropertyFilter>(filter |
+ v8::PropertyFilter::ONLY_WRITABLE);
+ }
+ if (key_filter & napi_key_enumerable) {
+ filter =
+ static_cast<v8::PropertyFilter>(filter |
+ v8::PropertyFilter::ONLY_ENUMERABLE);
+ }
+ if (key_filter & napi_key_configurable) {
+ filter =
+ static_cast<v8::PropertyFilter>(filter |
+ v8::PropertyFilter::ONLY_WRITABLE);
+ }
+ if (key_filter & napi_key_skip_strings) {
+ filter =
+ static_cast<v8::PropertyFilter>(filter |
+ v8::PropertyFilter::SKIP_STRINGS);
+ }
+ if (key_filter & napi_key_skip_symbols) {
+ filter =
+ static_cast<v8::PropertyFilter>(filter |
+ v8::PropertyFilter::SKIP_SYMBOLS);
+ }
+ v8::KeyCollectionMode collection_mode;
+ v8::KeyConversionMode conversion_mode;
+
+ switch (key_mode) {
+ case napi_key_include_prototypes:
+ collection_mode = v8::KeyCollectionMode::kIncludePrototypes;
+ break;
+ case napi_key_own_only:
+ collection_mode = v8::KeyCollectionMode::kOwnOnly;
+ break;
+ default:
+ return napi_set_last_error(env, napi_invalid_arg);
+ }
- CHECK_MAYBE_EMPTY(env, maybe_propertynames, napi_generic_failure);
+ switch (key_conversion) {
+ case napi_key_keep_numbers:
+ conversion_mode = v8::KeyConversionMode::kKeepNumbers;
+ break;
+ case napi_key_numbers_to_strings:
+ conversion_mode = v8::KeyConversionMode::kConvertToString;
+ break;
+ default:
+ return napi_set_last_error(env, napi_invalid_arg);
+ }
- *result = v8impl::JsValueFromV8LocalValue(
- maybe_propertynames.ToLocalChecked());
+ v8::MaybeLocal<v8::Array> maybe_all_propertynames =
+ obj->GetPropertyNames(context,
+ collection_mode,
+ filter,
+ v8::IndexFilter::kIncludeIndices,
+ conversion_mode);
+
+ CHECK_MAYBE_EMPTY_WITH_PREAMBLE(
+ env, maybe_all_propertynames, napi_generic_failure);
+
+ *result =
+ v8impl::JsValueFromV8LocalValue(maybe_all_propertynames.ToLocalChecked());
return GET_RETURN_STATUS(env);
}