Skip to content

Commit 3c512d9

Browse files
authored
Add getter for Proxy handler objects (#4676)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 67a61bc commit 3c512d9

File tree

6 files changed

+109
-4
lines changed

6 files changed

+109
-4
lines changed

docs/02.API-REFERENCE.md

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5791,7 +5791,7 @@ These APIs all depend on build option (`JERRY_BUILTIN_PROXY`).
57915791

57925792
**Summary**
57935793

5794-
Gets the target object of a Proxy object
5794+
Gets the target object of a Proxy object.
57955795

57965796
*Notes*:
57975797
- This API depends on a build option (`JERRY_BUILTIN_PROXY`) and can be checked
@@ -5804,7 +5804,7 @@ Gets the target object of a Proxy object
58045804

58055805
```c
58065806
jerry_value_t
5807-
jerry_get_proxy_target (jerry_value_t proxy_value)
5807+
jerry_get_proxy_target (jerry_value_t proxy_value);
58085808
```
58095809

58105810
- `proxy_value` - Proxy object value
@@ -5838,6 +5838,60 @@ jerry_get_proxy_target (jerry_value_t proxy_value)
58385838

58395839
- [jerry_create_proxy](#jerry_create_proxy)
58405840
- [jerry_create_special_proxy](#jerry_create_special_proxy)
5841+
- [jerry_get_proxy_handler](#jerry_get_proxy_handler)
5842+
5843+
## jerry_get_proxy_handler
5844+
5845+
**Summary**
5846+
5847+
Gets the handler object of a Proxy object.
5848+
5849+
*Notes*:
5850+
- This API depends on a build option (`JERRY_BUILTIN_PROXY`) and can be checked
5851+
in runtime with the `JERRY_FEATURE_PROXY` feature enum value,
5852+
see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
5853+
- The es.next profile enables this by default.
5854+
5855+
5856+
**Prototype**
5857+
5858+
```c
5859+
jerry_value_t
5860+
jerry_get_proxy_handler (jerry_value_t proxy_value);
5861+
```
5862+
5863+
- `proxy_value` - Proxy object value
5864+
- return value
5865+
- type error - if proxy_value is not a Proxy object
5866+
- handler object - otherwise
5867+
5868+
*New in version [[NEXT_RELEASE]]*.
5869+
5870+
**Example**
5871+
5872+
```c
5873+
{
5874+
jerry_value_t target = jerry_create_object ();
5875+
jerry_value_t handler = jerry_create_object ();
5876+
jerry_value_t proxy = jerry_create_proxy (target, handler);
5877+
5878+
jerry_release_value (target);
5879+
jerry_release_value (handler);
5880+
5881+
handler = jerry_get_proxy_handler (proxy);
5882+
5883+
// ... usage of the handler
5884+
5885+
jerry_release_value (handler);
5886+
jerry_release_value (proxy);
5887+
}
5888+
```
5889+
5890+
**See also**
5891+
5892+
- [jerry_create_proxy](#jerry_create_proxy)
5893+
- [jerry_create_special_proxy](#jerry_create_special_proxy)
5894+
- [jerry_get_proxy_target](#jerry_get_proxy_target)
58415895

58425896

58435897
# Acquire and release API values

jerry-core/api/jerry.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5023,9 +5023,43 @@ jerry_get_proxy_target (jerry_value_t proxy_value) /**< proxy value */
50235023
JERRY_UNUSED (proxy_value);
50245024
#endif /* JERRY_BUILTIN_PROXY */
50255025

5026-
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("Passed value is not a proxy object")));
5026+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_argument_is_not_a_proxy)));
50275027
} /* jerry_get_proxy_target */
50285028

5029+
/**
5030+
* Get the handler object of a Proxy object
5031+
*
5032+
* @return type error - if proxy_value is not a Proxy object
5033+
* handler object - otherwise
5034+
*/
5035+
jerry_value_t
5036+
jerry_get_proxy_handler (jerry_value_t proxy_value) /**< proxy value */
5037+
{
5038+
jerry_assert_api_available ();
5039+
5040+
#if JERRY_BUILTIN_PROXY
5041+
if (ecma_is_value_object (proxy_value))
5042+
{
5043+
ecma_object_t *object_p = ecma_get_object_from_value (proxy_value);
5044+
5045+
if (ECMA_OBJECT_IS_PROXY (object_p))
5046+
{
5047+
ecma_proxy_object_t *proxy_object_p = (ecma_proxy_object_t *) object_p;
5048+
5049+
if (!ecma_is_value_null (proxy_object_p->handler))
5050+
{
5051+
ecma_ref_object (ecma_get_object_from_value (proxy_object_p->handler));
5052+
}
5053+
return proxy_object_p->handler;
5054+
}
5055+
}
5056+
#else /* !JERRY_BUILTIN_PROXY */
5057+
JERRY_UNUSED (proxy_value);
5058+
#endif /* JERRY_BUILTIN_PROXY */
5059+
5060+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_argument_is_not_a_proxy)));
5061+
} /* jerry_get_proxy_handler */
5062+
50295063
/**
50305064
* Validate UTF-8 string
50315065
*

jerry-core/ecma/base/ecma-errors.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ const char * const ecma_error_class_is_non_configurable = "Prototype property of
118118
*/
119119
const char * const ecma_error_argument_is_not_an_object = "Argument is not an object";
120120

121+
/**
122+
* Error message, argument is not a Proxy object
123+
*/
124+
const char * const ecma_error_argument_is_not_a_proxy = "Argument is not a Proxy object";
125+
121126
/**
122127
* Error message, target is not a constructor
123128
*/

jerry-core/ecma/base/ecma-errors.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ extern const char * const ecma_error_arraybuffer_is_detached;
6363
extern const char * const ecma_error_cannot_convert_to_object;
6464
extern const char * const ecma_error_class_is_non_configurable;
6565
extern const char * const ecma_error_argument_is_not_an_object;
66+
extern const char * const ecma_error_argument_is_not_a_proxy;
6667
extern const char * const ecma_error_target_is_not_a_constructor;
6768
extern const char * const ecma_error_argument_is_not_an_regexp;
6869
extern const char * const ecma_error_invalid_array_length;

jerry-core/include/jerryscript-core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ void jerry_get_bigint_digits (jerry_value_t value, uint64_t *digits_p, uint32_t
324324
* Proxy functions.
325325
*/
326326
jerry_value_t jerry_get_proxy_target (jerry_value_t proxy_value);
327+
jerry_value_t jerry_get_proxy_handler (jerry_value_t proxy_value);
327328

328329
/**
329330
* Input validator functions.

tests/unit-core/test-proxy.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,21 +340,31 @@ main (void)
340340
target = jerry_create_object ();
341341
handler = jerry_create_object ();
342342
proxy = jerry_create_proxy (target, handler);
343-
jerry_release_value (handler);
344343

345344
{
346345
jerry_value_t res = jerry_get_proxy_target (proxy);
347346
TEST_ASSERT (res == target);
348347
jerry_release_value (res);
349348

349+
res = jerry_get_proxy_handler (proxy);
350+
TEST_ASSERT (res == handler);
351+
jerry_release_value (res);
352+
350353
res = jerry_get_proxy_target (target);
351354
TEST_ASSERT (jerry_value_is_error (res));
352355
res = jerry_get_value_from_error (res, true);
353356
TEST_ASSERT (jerry_get_error_type (res) == JERRY_ERROR_TYPE);
354357
jerry_release_value (res);
358+
359+
res = jerry_get_proxy_handler (handler);
360+
TEST_ASSERT (jerry_value_is_error (res));
361+
res = jerry_get_value_from_error (res, true);
362+
TEST_ASSERT (jerry_get_error_type (res) == JERRY_ERROR_TYPE);
363+
jerry_release_value (res);
355364
}
356365

357366
jerry_release_value (proxy);
367+
jerry_release_value (handler);
358368
jerry_release_value (target);
359369

360370
test_proxy_native ();

0 commit comments

Comments
 (0)