Add notification callback for module state changes (#4656)

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2021-04-16 17:50:57 +02:00
committed by GitHub
parent a7a4cb29e4
commit 1f2a8d4ac1
7 changed files with 252 additions and 6 deletions
+18
View File
@@ -755,6 +755,24 @@ jerry_module_get_state (const jerry_value_t module_val) /**< module object */
#endif /* JERRY_MODULE_SYSTEM */
} /* jerry_module_get_state */
/**
* Sets a callback which is called after a module state is changed to linked, evaluated, or error.
*/
void
jerry_module_set_state_changed_callback (jerry_module_state_changed_callback_t callback, /**< callback */
void *user_p) /**< pointer passed to the callback */
{
jerry_assert_api_available ();
#if JERRY_MODULE_SYSTEM
JERRY_CONTEXT (module_state_changed_callback_p) = callback;
JERRY_CONTEXT (module_state_changed_callback_user_p) = user_p;
#else /* !JERRY_MODULE_SYSTEM */
JERRY_UNUSED (callback);
JERRY_UNUSED (user_p);
#endif /* JERRY_MODULE_SYSTEM */
} /* jerry_module_set_state_changed_callback */
/**
* Returns the number of import/export requests of a module
*
+44 -5
View File
@@ -59,7 +59,7 @@ ecma_module_create (void)
} /* ecma_module_create */
/**
* cleanup context variables for the root module.
* Cleanup context variables for the root module.
*/
void
ecma_module_cleanup_context (void)
@@ -70,6 +70,27 @@ ecma_module_cleanup_context (void)
#endif /* JERRY_NDEBUG */
} /* ecma_module_cleanup_context */
/**
* Sets module state to error.
*/
static void
ecma_module_set_error_state (ecma_module_t *module_p) /**< module */
{
module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_ERROR;
if (JERRY_CONTEXT (module_state_changed_callback_p) != NULL
&& !jcontext_has_pending_abort ())
{
jerry_value_t exception = jcontext_take_exception ();
JERRY_CONTEXT (module_state_changed_callback_p) (JERRY_MODULE_STATE_ERROR,
ecma_make_object_value (&module_p->header.object),
exception,
JERRY_CONTEXT (module_state_changed_callback_user_p));
jcontext_raise_exception (exception);
}
} /* ecma_module_set_error_state */
/**
* Gets the internal module pointer of a module
*
@@ -398,11 +419,21 @@ ecma_module_evaluate (ecma_module_t *module_p) /**< module */
ret_value = vm_run_module (module_p);
}
module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_ERROR;
if (!ECMA_IS_VALUE_ERROR (ret_value))
if (JERRY_LIKELY (!ECMA_IS_VALUE_ERROR (ret_value)))
{
module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_EVALUATED;
if (JERRY_CONTEXT (module_state_changed_callback_p) != NULL)
{
JERRY_CONTEXT (module_state_changed_callback_p) (JERRY_MODULE_STATE_EVALUATED,
ecma_make_object_value (&module_p->header.object),
ret_value,
JERRY_CONTEXT (module_state_changed_callback_user_p));
}
}
else
{
ecma_module_set_error_state (module_p);
}
if (!(module_p->header.u.cls.u2.module_flags & ECMA_MODULE_IS_NATIVE))
@@ -943,7 +974,7 @@ restart:
if (ECMA_IS_VALUE_ERROR (result))
{
current_module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_ERROR;
ecma_module_set_error_state (current_module_p);
goto error;
}
@@ -974,6 +1005,14 @@ restart:
JERRY_ASSERT (last_p->module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_LINKING);
last_p->module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_LINKED;
if (JERRY_CONTEXT (module_state_changed_callback_p) != NULL)
{
JERRY_CONTEXT (module_state_changed_callback_p) (JERRY_MODULE_STATE_LINKED,
ecma_make_object_value (&last_p->module_p->header.object),
ECMA_VALUE_UNDEFINED,
JERRY_CONTEXT (module_state_changed_callback_user_p));
}
jmem_heap_free_block (last_p, sizeof (ecma_module_stack_item_t));
last_p = prev_p;
}
+1
View File
@@ -269,6 +269,7 @@ jerry_value_t jerry_module_link (const jerry_value_t module_val,
jerry_module_resolve_callback_t callback_p, void *user_p);
jerry_value_t jerry_module_evaluate (const jerry_value_t module_val);
jerry_module_state_t jerry_module_get_state (const jerry_value_t module_val);
void jerry_module_set_state_changed_callback (jerry_module_state_changed_callback_t callback, void *user_p);
size_t jerry_module_get_number_of_requests (const jerry_value_t module_val);
jerry_value_t jerry_module_get_request (const jerry_value_t module_val, size_t request_index);
jerry_value_t jerry_module_get_namespace (const jerry_value_t module_val);
+6
View File
@@ -550,6 +550,12 @@ typedef jerry_value_t (*jerry_module_resolve_callback_t) (const jerry_value_t sp
const jerry_value_t referrer,
void *user_p);
/**
* Callback which is called after the module enters into linked, evaluated or error state.
*/
typedef void (*jerry_module_state_changed_callback_t) (jerry_module_state_t new_state, const jerry_value_t module,
const jerry_value_t value, void *user_p);
/**
* Callback which is called by jerry_module_evaluate to evaluate the native module.
*/
+4 -1
View File
@@ -148,7 +148,10 @@ struct jerry_context_t
#endif /* JERRY_ESNEXT */
#if JERRY_MODULE_SYSTEM
ecma_module_t *module_current_p; /**< current module context */
ecma_module_t *module_current_p; /**< current module context */
jerry_module_state_changed_callback_t module_state_changed_callback_p; /**< callback which is called after the
* state of a module is changed */
void *module_state_changed_callback_user_p; /**< user pointer for module_state_changed_callback_p */
#endif /* JERRY_MODULE_SYSTEM */
vm_frame_ctx_t *vm_top_context_p; /**< top (current) interpreter context */