Allow changing the 'this' binding of a realm (#4357)

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2020-12-14 10:05:30 +01:00
committed by GitHub
parent 7e135b04ed
commit fe29bf7390
15 changed files with 198 additions and 45 deletions
+1 -2
View File
@@ -844,8 +844,7 @@ opfunc_resume_executable_object (vm_executable_object_t *executable_object_p, /*
#if ENABLED (JERRY_BUILTIN_REALMS)
ecma_global_object_t *saved_global_object_p = JERRY_CONTEXT (global_object_p);
ecma_value_t realm_value = ecma_op_function_get_realm (bytecode_header_p);
JERRY_CONTEXT (global_object_p) = (ecma_global_object_t *) ecma_get_object_from_value (realm_value);
JERRY_CONTEXT (global_object_p) = ecma_op_function_get_realm (bytecode_header_p);
#endif /* ENABLED (JERRY_BUILTIN_REALMS) */
ecma_value_t result = vm_execute (&executable_object_p->frame_ctx);
+13 -9
View File
@@ -302,11 +302,9 @@ ecma_value_t
vm_run_global (const ecma_compiled_code_t *bytecode_p) /**< pointer to bytecode to run */
{
#if ENABLED (JERRY_BUILTIN_REALMS)
ecma_value_t realm_value = ecma_op_function_get_realm (bytecode_p);
ecma_object_t *global_obj_p = ecma_get_object_from_value (realm_value);
ecma_object_t *global_obj_p = (ecma_object_t *) ecma_op_function_get_realm (bytecode_p);
#else /* !ENABLED (JERRY_BUILTIN_REALMS) */
ecma_object_t *global_obj_p = ecma_builtin_get_global ();
ecma_value_t realm_value = ecma_make_object_value (global_obj_p);
#endif /* ENABLED (JERRY_BUILTIN_REALMS) */
#if ENABLED (JERRY_ESNEXT)
@@ -343,7 +341,13 @@ vm_run_global (const ecma_compiled_code_t *bytecode_p) /**< pointer to bytecode
shared.bytecode_header_p = bytecode_p;
shared.status_flags = 0;
return vm_run (&shared, realm_value, global_scope_p);
#if ENABLED (JERRY_BUILTIN_REALMS)
ecma_value_t this_binding = ((ecma_global_object_t *) global_obj_p)->this_binding;
#else /* !ENABLED (JERRY_BUILTIN_REALMS) */
ecma_value_t this_binding = ecma_make_object_value (global_obj_p);
#endif /* ENABLED (JERRY_BUILTIN_REALMS) */
return vm_run (&shared, this_binding, global_scope_p);
} /* vm_run_global */
/**
@@ -388,14 +392,14 @@ vm_run_eval (ecma_compiled_code_t *bytecode_data_p, /**< byte-code data */
else
{
#if ENABLED (JERRY_BUILTIN_REALMS)
ecma_value_t realm_value = ecma_op_function_get_realm (bytecode_data_p);
ecma_object_t *global_obj_p = ecma_get_object_from_value (realm_value);
ecma_object_t *global_obj_p = (ecma_object_t *) ecma_op_function_get_realm (bytecode_data_p);
this_binding = ((ecma_global_object_t *) global_obj_p)->this_binding;
ecma_ref_object (ecma_get_object_from_value (this_binding));
#else /* !ENABLED (JERRY_BUILTIN_REALMS) */
ecma_object_t *global_obj_p = ecma_builtin_get_global ();
ecma_value_t realm_value = ecma_make_object_value (global_obj_p);
#endif /* ENABLED (JERRY_BUILTIN_REALMS) */
this_binding = realm_value;
ecma_ref_object (global_obj_p);
this_binding = ecma_make_object_value (global_obj_p);
#endif /* ENABLED (JERRY_BUILTIN_REALMS) */
lex_env_p = ecma_get_global_scope (global_obj_p);
}