Skip to content

Commit 9676500

Browse files
authored
Implement get proxy target (#4367)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 1937f82 commit 9676500

File tree

4 files changed

+115
-0
lines changed

4 files changed

+115
-0
lines changed

docs/02.API-REFERENCE.md

+56
Original file line numberDiff line numberDiff line change
@@ -4494,6 +4494,62 @@ main (void)
44944494
- [jerry_get_bigint_size_in_digits](#jerry_get_bigint_size_in_digits)
44954495

44964496

4497+
# Functions for Proxy objects
4498+
4499+
These APIs all depend on build option (`JERRY_BUILTIN_PROXY`).
4500+
4501+
## jerry_get_proxy_target
4502+
4503+
**Summary**
4504+
4505+
Gets the target object of a Proxy object
4506+
4507+
*Notes*:
4508+
- This API depends on a build option (`JERRY_BUILTIN_PROXY`) and can be checked
4509+
in runtime with the `JERRY_FEATURE_PROXY` feature enum value,
4510+
see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
4511+
- The es.next profile enables this by default.
4512+
4513+
4514+
**Prototype**
4515+
4516+
```c
4517+
jerry_value_t
4518+
jerry_get_proxy_target (jerry_value_t proxy_value)
4519+
```
4520+
4521+
- `proxy_value` - Proxy object value
4522+
- return value
4523+
- type error - if proxy_value is not a Proxy object
4524+
- target object - otherwise
4525+
4526+
*New in version [[NEXT_RELEASE]]*.
4527+
4528+
**Example**
4529+
4530+
```c
4531+
{
4532+
jerry_value_t target = jerry_create_object ();
4533+
jerry_value_t handler = jerry_create_object ();
4534+
jerry_value_t proxy = jerry_create_proxy (target, handler);
4535+
4536+
jerry_release_value (target);
4537+
jerry_release_value (handler);
4538+
4539+
target = jerry_get_proxy_target (proxy);
4540+
4541+
// ... usage of the target
4542+
4543+
jerry_release_value (target);
4544+
jerry_release_value (proxy);
4545+
}
4546+
```
4547+
4548+
**See also**
4549+
4550+
- [jerry_create_proxy](#jerry_create_proxy)
4551+
4552+
44974553
# Acquire and release API values
44984554

44994555
## jerry_acquire_value

jerry-core/api/jerry.c

+34
Original file line numberDiff line numberDiff line change
@@ -4337,6 +4337,40 @@ jerry_get_bigint_digits (jerry_value_t value, /**< BigInt value */
43374337
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
43384338
} /* jerry_get_bigint_digits */
43394339

4340+
/**
4341+
* Get the target object of a Proxy object
4342+
*
4343+
* @return type error - if proxy_value is not a Proxy object
4344+
* target object - otherwise
4345+
*/
4346+
jerry_value_t
4347+
jerry_get_proxy_target (jerry_value_t proxy_value) /**< proxy value */
4348+
{
4349+
jerry_assert_api_available ();
4350+
4351+
#if ENABLED (JERRY_BUILTIN_PROXY)
4352+
if (ecma_is_value_object (proxy_value))
4353+
{
4354+
ecma_object_t *object_p = ecma_get_object_from_value (proxy_value);
4355+
4356+
if (ECMA_OBJECT_IS_PROXY (object_p))
4357+
{
4358+
ecma_proxy_object_t *proxy_object_p = (ecma_proxy_object_t *) object_p;
4359+
4360+
if (!ecma_is_value_null (proxy_object_p->target))
4361+
{
4362+
ecma_ref_object (ecma_get_object_from_value (proxy_object_p->target));
4363+
}
4364+
return proxy_object_p->target;
4365+
}
4366+
}
4367+
#else /* !ENABLED (JERRY_BUILTIN_PROXY) */
4368+
JERRY_UNUSED (proxy_value);
4369+
#endif /* ENABLED (JERRY_BUILTIN_PROXY) */
4370+
4371+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("Passed value is not a proxy object")));
4372+
} /* jerry_get_proxy_target */
4373+
43404374
/**
43414375
* Validate UTF-8 string
43424376
*

jerry-core/include/jerryscript-core.h

+5
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,11 @@ jerry_value_t jerry_realm_set_this (jerry_value_t realm_value, jerry_value_t thi
723723
uint32_t jerry_get_bigint_size_in_digits (jerry_value_t value);
724724
void jerry_get_bigint_digits (jerry_value_t value, uint64_t *digits_p, uint32_t size, bool *sign_p);
725725

726+
/**
727+
* Proxy functions.
728+
*/
729+
jerry_value_t jerry_get_proxy_target (jerry_value_t proxy_value);
730+
726731
/**
727732
* Input validator functions.
728733
*/

tests/unit-core/test-proxy.c

+20
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,26 @@ main (void)
272272
jerry_release_value (property);
273273
}
274274

275+
target = jerry_create_object ();
276+
handler = jerry_create_object ();
277+
proxy = jerry_create_proxy (target, handler);
278+
jerry_release_value (handler);
279+
280+
{
281+
jerry_value_t res = jerry_get_proxy_target (proxy);
282+
TEST_ASSERT (res == target);
283+
jerry_release_value (res);
284+
285+
res = jerry_get_proxy_target (target);
286+
TEST_ASSERT (jerry_value_is_error (res));
287+
res = jerry_get_value_from_error (res, true);
288+
TEST_ASSERT (jerry_get_error_type (res) == JERRY_ERROR_TYPE);
289+
jerry_release_value (res);
290+
}
291+
292+
jerry_release_value (proxy);
293+
jerry_release_value (target);
294+
275295
jerry_cleanup ();
276296
return 0;
277297
} /* main */

0 commit comments

Comments
 (0)