From 9676500addbcc5974bf81f7b3726230d26f5c1a5 Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Fri, 18 Dec 2020 10:58:48 +0100 Subject: [PATCH] Implement get proxy target (#4367) JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com --- docs/02.API-REFERENCE.md | 56 +++++++++++++++++++++++++++ jerry-core/api/jerry.c | 34 ++++++++++++++++ jerry-core/include/jerryscript-core.h | 5 +++ tests/unit-core/test-proxy.c | 20 ++++++++++ 4 files changed, 115 insertions(+) diff --git a/docs/02.API-REFERENCE.md b/docs/02.API-REFERENCE.md index d26f27c8c..f51041d88 100644 --- a/docs/02.API-REFERENCE.md +++ b/docs/02.API-REFERENCE.md @@ -4494,6 +4494,62 @@ main (void) - [jerry_get_bigint_size_in_digits](#jerry_get_bigint_size_in_digits) +# Functions for Proxy objects + +These APIs all depend on build option (`JERRY_BUILTIN_PROXY`). + +## jerry_get_proxy_target + +**Summary** + +Gets the target object of a Proxy object + +*Notes*: +- This API depends on a build option (`JERRY_BUILTIN_PROXY`) and can be checked + in runtime with the `JERRY_FEATURE_PROXY` feature enum value, + see: [jerry_is_feature_enabled](#jerry_is_feature_enabled). +- The es.next profile enables this by default. + + +**Prototype** + +```c +jerry_value_t +jerry_get_proxy_target (jerry_value_t proxy_value) +``` + +- `proxy_value` - Proxy object value +- return value + - type error - if proxy_value is not a Proxy object + - target object - otherwise + +*New in version [[NEXT_RELEASE]]*. + +**Example** + +```c +{ + jerry_value_t target = jerry_create_object (); + jerry_value_t handler = jerry_create_object (); + jerry_value_t proxy = jerry_create_proxy (target, handler); + + jerry_release_value (target); + jerry_release_value (handler); + + target = jerry_get_proxy_target (proxy); + + // ... usage of the target + + jerry_release_value (target); + jerry_release_value (proxy); +} +``` + +**See also** + +- [jerry_create_proxy](#jerry_create_proxy) + + # Acquire and release API values ## jerry_acquire_value diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index 1b56eff54..99f15fafb 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -4337,6 +4337,40 @@ jerry_get_bigint_digits (jerry_value_t value, /**< BigInt value */ #endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ } /* jerry_get_bigint_digits */ +/** + * Get the target object of a Proxy object + * + * @return type error - if proxy_value is not a Proxy object + * target object - otherwise + */ +jerry_value_t +jerry_get_proxy_target (jerry_value_t proxy_value) /**< proxy value */ +{ + jerry_assert_api_available (); + +#if ENABLED (JERRY_BUILTIN_PROXY) + if (ecma_is_value_object (proxy_value)) + { + ecma_object_t *object_p = ecma_get_object_from_value (proxy_value); + + if (ECMA_OBJECT_IS_PROXY (object_p)) + { + ecma_proxy_object_t *proxy_object_p = (ecma_proxy_object_t *) object_p; + + if (!ecma_is_value_null (proxy_object_p->target)) + { + ecma_ref_object (ecma_get_object_from_value (proxy_object_p->target)); + } + return proxy_object_p->target; + } + } +#else /* !ENABLED (JERRY_BUILTIN_PROXY) */ + JERRY_UNUSED (proxy_value); +#endif /* ENABLED (JERRY_BUILTIN_PROXY) */ + + return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("Passed value is not a proxy object"))); +} /* jerry_get_proxy_target */ + /** * Validate UTF-8 string * diff --git a/jerry-core/include/jerryscript-core.h b/jerry-core/include/jerryscript-core.h index 780f41532..e9265a4f1 100644 --- a/jerry-core/include/jerryscript-core.h +++ b/jerry-core/include/jerryscript-core.h @@ -723,6 +723,11 @@ jerry_value_t jerry_realm_set_this (jerry_value_t realm_value, jerry_value_t thi uint32_t jerry_get_bigint_size_in_digits (jerry_value_t value); void jerry_get_bigint_digits (jerry_value_t value, uint64_t *digits_p, uint32_t size, bool *sign_p); +/** + * Proxy functions. + */ +jerry_value_t jerry_get_proxy_target (jerry_value_t proxy_value); + /** * Input validator functions. */ diff --git a/tests/unit-core/test-proxy.c b/tests/unit-core/test-proxy.c index fb0e344ee..6346387a7 100644 --- a/tests/unit-core/test-proxy.c +++ b/tests/unit-core/test-proxy.c @@ -272,6 +272,26 @@ main (void) jerry_release_value (property); } + target = jerry_create_object (); + handler = jerry_create_object (); + proxy = jerry_create_proxy (target, handler); + jerry_release_value (handler); + + { + jerry_value_t res = jerry_get_proxy_target (proxy); + TEST_ASSERT (res == target); + jerry_release_value (res); + + res = jerry_get_proxy_target (target); + TEST_ASSERT (jerry_value_is_error (res)); + res = jerry_get_value_from_error (res, true); + TEST_ASSERT (jerry_get_error_type (res) == JERRY_ERROR_TYPE); + jerry_release_value (res); + } + + jerry_release_value (proxy); + jerry_release_value (target); + jerry_cleanup (); return 0; } /* main */