Skip to content

Commit e2be8f4

Browse files
authored
Get the 'this' binding of a realm value (#4365)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 6083259 commit e2be8f4

File tree

4 files changed

+139
-9
lines changed

4 files changed

+139
-9
lines changed

docs/02.API-REFERENCE.md

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9125,6 +9125,10 @@ main (int argc, char** argv)
91259125

91269126
- [jerry_construct_object](#jerry_construct_object)
91279127

9128+
# Functions for realm objects
9129+
9130+
These APIs all depend on build option (`JERRY_BUILTIN_REALMS`).
9131+
91289132
## jerry_set_realm
91299133

91309134
**Summary**
@@ -9146,6 +9150,7 @@ which was active when the code was parsed or loaded regardless of the current re
91469150
- This feature depends on build option (`JERRY_BUILTIN_REALMS`) and can be checked
91479151
in runtime with the `JERRY_FEATURE_REALM` feature enum value,
91489152
see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
9153+
- The es.next profile enables this by default.
91499154

91509155
**Prototype**
91519156

@@ -9178,6 +9183,53 @@ jerry_set_realm (jerry_value_t realm_value);
91789183

91799184
- [jerry_create_realm](#jerry_create_realm)
91809185

9186+
## jerry_realm_get_this
9187+
9188+
**Summary**
9189+
9190+
Gets the 'this' binding of a realm. The 'this' binding is always an object.
9191+
By default the 'this' binding is the same as the realm object and can be
9192+
changed by [jerry_realm_set_this](#jerry_realm_set_this).
9193+
9194+
*Notes*:
9195+
- This feature depends on build option (`JERRY_BUILTIN_REALMS`) and can be checked
9196+
in runtime with the `JERRY_FEATURE_REALM` feature enum value,
9197+
see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
9198+
- The es.next profile enables this by default.
9199+
9200+
**Prototype**
9201+
9202+
```c
9203+
jerry_value_t
9204+
jerry_realm_get_this (jerry_value_t realm_value)
9205+
```
9206+
- `realm_value` - realm value
9207+
- return
9208+
- type error - if realm_value is not a realm
9209+
- 'this' binding object - otherwise
9210+
9211+
*New in version [[NEXT_RELEASE]]*.
9212+
9213+
**Example**
9214+
9215+
```c
9216+
{
9217+
jerry_value_t realm_value = jerry_create_realm ();
9218+
9219+
jerry_value_t this_value = jerry_realm_get_this (realm_value);
9220+
9221+
... // usage of the this_value
9222+
9223+
jerry_release_value (this_value);
9224+
jerry_release_value (realm_value);
9225+
}
9226+
```
9227+
9228+
**See also**
9229+
9230+
- [jerry_create_realm](#jerry_create_realm)
9231+
- [jerry_realm_set_this](#jerry_realm_set_this)
9232+
91819233
## jerry_realm_set_this
91829234

91839235
**Summary**
@@ -9189,6 +9241,7 @@ any script on the realm. Otherwise the operation is undefined.
91899241
- This feature depends on build option (`JERRY_BUILTIN_REALMS`) and can be checked
91909242
in runtime with the `JERRY_FEATURE_REALM` feature enum value,
91919243
see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
9244+
- The es.next profile enables this by default.
91929245

91939246
**Prototype**
91949247

@@ -9199,7 +9252,7 @@ jerry_realm_set_this (jerry_value_t realm_value, jerry_value_t this_value)
91999252
- `realm_value` - realm value
92009253
- `this_value` - new this value
92019254
- return
9202-
- exception - if any error is happened
9255+
- type error - if realm_value is not a realm or this_value is not object
92039256
- true - otherwise
92049257

92059258
*New in version [[NEXT_RELEASE]]*.
@@ -9225,6 +9278,7 @@ jerry_realm_set_this (jerry_value_t realm_value, jerry_value_t this_value)
92259278

92269279
- [jerry_create_realm](#jerry_create_realm)
92279280
- [jerry_set_realm](#jerry_set_realm)
9281+
- [jerry_realm_get_this](#jerry_realm_get_this)
92289282

92299283
# ArrayBuffer and TypedArray functions
92309284

jerry-core/api/jerry.c

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4608,13 +4608,52 @@ jerry_set_realm (jerry_value_t realm_value) /**< jerry api value */
46084608
#endif /* ENABLED (JERRY_BUILTIN_REALMS) */
46094609
} /* jerry_set_realm */
46104610

4611+
/**
4612+
* Gets the 'this' binding of a realm
4613+
*
4614+
* @return type error - if realm_value is not a realm
4615+
* this value - otherwise
4616+
*/
4617+
jerry_value_t
4618+
jerry_realm_get_this (jerry_value_t realm_value) /**< realm value */
4619+
{
4620+
jerry_assert_api_available ();
4621+
4622+
#if ENABLED (JERRY_BUILTIN_REALMS)
4623+
if (ecma_is_value_object (realm_value))
4624+
{
4625+
ecma_object_t *object_p = ecma_get_object_from_value (realm_value);
4626+
4627+
if (ecma_get_object_is_builtin (object_p)
4628+
&& ecma_builtin_is_global (object_p))
4629+
{
4630+
ecma_global_object_t *global_object_p = (ecma_global_object_t *) object_p;
4631+
4632+
ecma_ref_object (ecma_get_object_from_value (global_object_p->this_binding));
4633+
return global_object_p->this_binding;
4634+
}
4635+
}
4636+
4637+
#else /* !ENABLED (JERRY_BUILTIN_REALMS) */
4638+
ecma_object_t *global_object_p = ecma_builtin_get_global ();
4639+
4640+
if (realm_value == ecma_make_object_value (global_object_p))
4641+
{
4642+
ecma_ref_object (global_object_p);
4643+
return realm_value;
4644+
}
4645+
#endif /* ENABLED (JERRY_BUILTIN_REALMS) */
4646+
4647+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("Passed argument is not a realm")));
4648+
} /* jerry_realm_get_this */
4649+
46114650
/**
46124651
* Sets the 'this' binding of a realm
46134652
*
46144653
* This function must be called before executing any script on the realm.
46154654
* Otherwise the operation is undefined.
46164655
*
4617-
* @return thrown error - if any error is happened
4656+
* @return type error - if realm_value is not a realm or this_value is not object
46184657
* true - otherwise
46194658
*/
46204659
jerry_value_t

jerry-core/include/jerryscript-core.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,13 @@ jerry_value_t jerry_get_well_known_symbol (jerry_well_known_symbol_t symbol);
710710
jerry_value_t jerry_get_symbol_description (const jerry_value_t symbol);
711711
jerry_value_t jerry_get_symbol_descriptive_string (const jerry_value_t symbol);
712712

713+
/**
714+
* Realm functions.
715+
*/
716+
jerry_value_t jerry_set_realm (jerry_value_t realm_value);
717+
jerry_value_t jerry_realm_get_this (jerry_value_t realm_value);
718+
jerry_value_t jerry_realm_set_this (jerry_value_t realm_value, jerry_value_t this_value);
719+
713720
/**
714721
* BigInt functions.
715722
*/
@@ -740,8 +747,6 @@ void jerry_set_vm_exec_stop_callback (jerry_vm_exec_stop_callback_t stop_cb, voi
740747
jerry_value_t jerry_get_backtrace (uint32_t max_depth);
741748
jerry_value_t jerry_get_resource_name (const jerry_value_t value);
742749
jerry_value_t jerry_get_new_target (void);
743-
jerry_value_t jerry_set_realm (jerry_value_t realm_value);
744-
jerry_value_t jerry_realm_set_this (jerry_value_t realm_value, jerry_value_t this_value);
745750

746751
/**
747752
* Array buffer components.

tests/unit-core/test-realm.c

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ eval_and_get_number (char *script_p) /**< script source */
6161
return result;
6262
} /* eval_and_get_number */
6363

64+
static void
65+
check_type_error (jerry_value_t result_value) /**< result value */
66+
{
67+
TEST_ASSERT (jerry_value_is_error (result_value));
68+
result_value = jerry_get_value_from_error (result_value, true);
69+
TEST_ASSERT (jerry_get_error_type (result_value) == JERRY_ERROR_TYPE);
70+
jerry_release_value (result_value);
71+
} /* check_type_error */
72+
6473
/**
6574
* Unit test's main function.
6675
*/
@@ -71,13 +80,21 @@ main (void)
7180

7281
jerry_init (JERRY_INIT_EMPTY);
7382

83+
jerry_value_t global_value = jerry_get_global_object ();
84+
jerry_value_t result_value = jerry_realm_get_this (global_value);
85+
TEST_ASSERT (global_value == result_value);
86+
jerry_release_value (global_value);
87+
88+
jerry_value_t number_value = jerry_create_number (3);
89+
check_type_error (jerry_realm_get_this (number_value));
90+
jerry_release_value (number_value);
91+
7492
if (!jerry_is_feature_enabled (JERRY_FEATURE_REALM))
7593
{
7694
printf ("Skipping test, Realms not enabled\n");
7795
return 0;
7896
}
7997

80-
jerry_value_t global_value = jerry_get_global_object ();
8198
jerry_value_t realm_value = jerry_create_realm ();
8299

83100
create_number_property (global_value, "a", 3.5);
@@ -87,7 +104,7 @@ main (void)
87104

88105
TEST_ASSERT (eval_and_get_number ("a") == 3.5);
89106

90-
jerry_value_t result_value = jerry_set_realm (realm_value);
107+
result_value = jerry_set_realm (realm_value);
91108
TEST_ASSERT (result_value == global_value);
92109
TEST_ASSERT (eval_and_get_number ("a") == -1.25);
93110

@@ -103,21 +120,32 @@ main (void)
103120
TEST_ASSERT (result_value == realm_value);
104121

105122
jerry_value_t object_value = jerry_create_object ();
106-
result_value = jerry_set_realm (object_value);
107-
TEST_ASSERT (jerry_value_is_error (result_value));
108-
jerry_release_value (result_value);
123+
check_type_error (jerry_set_realm (object_value));
109124
jerry_release_value (object_value);
110125

126+
number_value = jerry_create_number (5);
127+
check_type_error (jerry_set_realm (number_value));
128+
jerry_release_value (number_value);
129+
111130
jerry_release_value (global_value);
112131
jerry_release_value (realm_value);
113132

114133
realm_value = jerry_create_realm ();
115134

135+
result_value = jerry_realm_get_this (realm_value);
136+
TEST_ASSERT (result_value == realm_value);
137+
jerry_release_value (result_value);
138+
116139
result_value = jerry_set_realm (realm_value);
117140
TEST_ASSERT (!jerry_value_is_error (result_value));
118141
object_value = jerry_create_object ();
119142
jerry_set_realm (result_value);
120143

144+
number_value = jerry_create_number (7);
145+
check_type_error (jerry_realm_set_this (realm_value, number_value));
146+
check_type_error (jerry_realm_set_this (number_value, object_value));
147+
jerry_release_value (number_value);
148+
121149
result_value = jerry_realm_set_this (realm_value, object_value);
122150
TEST_ASSERT (jerry_value_is_boolean (result_value) && jerry_get_boolean_value (result_value));
123151
jerry_release_value (result_value);
@@ -132,6 +160,10 @@ main (void)
132160

133161
TEST_ASSERT (get_number_property (object_value, "z") == -5.5);
134162

163+
result_value = jerry_realm_get_this (realm_value);
164+
TEST_ASSERT (result_value == object_value);
165+
jerry_release_value (result_value);
166+
135167
jerry_release_value (object_value);
136168
jerry_release_value (realm_value);
137169

0 commit comments

Comments
 (0)