diff options
author | himself65 <himself65@outlook.com> | 2019-10-17 14:13:57 +0800 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2020-01-11 18:50:28 -0800 |
commit | 6219f1fb447042106177efcb61e75b6e89bd0e03 (patch) | |
tree | 454853ffac3a0b01daf868fc38f4e048c9e4c3a0 /src/js_native_api_v8.cc | |
parent | 57351b628cae6167f03c0417a5e2334da574a743 (diff) | |
download | node-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.cc | 88 |
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); } |