Support dynamic import calls (#4652)

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2021-07-24 09:26:46 +02:00
committed by GitHub
parent d9360f51d0
commit d4178ae386
21 changed files with 698 additions and 114 deletions
+76
View File
@@ -1371,6 +1371,82 @@ error:
return ECMA_VALUE_ERROR;
} /* ecma_module_link */
/**
* Compute the result of 'import()' calls
*
* @return promise object representing the result of the operation
*/
ecma_value_t
ecma_module_import (ecma_value_t specifier, /**< module specifier */
ecma_value_t user_value) /**< user value assigned to the script */
{
ecma_string_t *specifier_p = ecma_op_to_string (specifier);
if (JERRY_UNLIKELY (specifier_p == NULL))
{
goto error;
}
if (JERRY_CONTEXT (module_import_callback_p) == NULL)
{
ecma_deref_ecma_string (specifier_p);
goto error_module_instantiate;
}
jerry_value_t result;
result = JERRY_CONTEXT (module_import_callback_p) (ecma_make_string_value (specifier_p),
user_value,
JERRY_CONTEXT (module_import_callback_user_p));
ecma_deref_ecma_string (specifier_p);
if (JERRY_UNLIKELY (ecma_is_value_error_reference (result)))
{
ecma_raise_error_from_error_reference (result);
goto error;
}
if (ecma_is_value_object (result)
&& ecma_is_promise (ecma_get_object_from_value (result)))
{
return result;
}
ecma_module_t *module_p = ecma_module_get_resolved_module (result);
if (module_p == NULL)
{
ecma_free_value (result);
goto error_module_instantiate;
}
if (module_p->header.u.cls.u1.module_state != JERRY_MODULE_STATE_EVALUATED)
{
ecma_deref_object (&module_p->header.object);
goto error_module_instantiate;
}
result = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED, NULL);
ecma_fulfill_promise (result, ecma_make_object_value (module_p->namespace_object_p));
ecma_deref_object (&module_p->header.object);
return result;
error_module_instantiate:
ecma_raise_range_error (ECMA_ERR_MSG ("Module cannot be instantiated"));
error:
if (jcontext_has_pending_abort ())
{
return ECMA_VALUE_ERROR;
}
ecma_value_t exception = jcontext_take_exception ();
ecma_value_t promise = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED, NULL);
ecma_reject_promise (promise, exception);
ecma_free_value (exception);
return promise;
} /* ecma_module_import */
/**
* Cleans up and releases a module structure including all referenced modules.
*/
+1
View File
@@ -120,6 +120,7 @@ ecma_value_t ecma_module_link (ecma_module_t *module_p,
jerry_module_resolve_callback_t callback_p,
void *user_p);
ecma_value_t ecma_module_evaluate (ecma_module_t *module_p);
ecma_value_t ecma_module_import (ecma_value_t specifier, ecma_value_t user_value);
ecma_module_t *ecma_module_create (void);
void ecma_module_cleanup_context (void);