new jerry_assert_api_available for APIs that need to disable re-enter jerry_api
JerryScript-DCO-1.0-Signed-off-by: SaeHie Park saehie.park@samsung.com
This commit is contained in:
committed by
Ruben Ayrapetyan
parent
b496e68d27
commit
17036c854e
@@ -56,6 +56,11 @@ const char *jerry_branch_name = JERRY_BRANCH_NAME;
|
||||
*/
|
||||
static jerry_flag_t jerry_flags;
|
||||
|
||||
/**
|
||||
* Jerry API availability flag
|
||||
*/
|
||||
static bool jerry_api_available;
|
||||
|
||||
/** \addtogroup jerry Jerry engine extension interface
|
||||
* @{
|
||||
*/
|
||||
@@ -65,6 +70,50 @@ static jerry_flag_t jerry_flags;
|
||||
*/
|
||||
char jerry_extension_characters_buffer [CONFIG_EXTENSION_CHAR_BUFFER_SIZE];
|
||||
|
||||
/**
|
||||
* Assert that it is correct to call API in current state.
|
||||
*
|
||||
* Note:
|
||||
* By convention, there can be some states when API could not be invoked.
|
||||
*
|
||||
* While, API can be invoked jerry_api_available flag is set,
|
||||
* and while it is incorrect to invoke API - it is not set.
|
||||
*
|
||||
* The procedure checks that it is correct to invoke API in current state.
|
||||
* If it is correct, procedure just returns; otherwise - engine is stopped.
|
||||
*
|
||||
* Note:
|
||||
* TODO: Add states when API could not be invoked, when they would appear.
|
||||
* // "API could not be invoked in the following cases:"
|
||||
* // - ... .
|
||||
*/
|
||||
static void
|
||||
jerry_assert_api_available (void)
|
||||
{
|
||||
if (!jerry_api_available)
|
||||
{
|
||||
JERRY_UNREACHABLE ();
|
||||
}
|
||||
} /* jerry_assert_api_available */
|
||||
|
||||
/**
|
||||
* Turn on API availability
|
||||
*/
|
||||
static void
|
||||
jerry_make_api_available (void)
|
||||
{
|
||||
jerry_api_available = true;
|
||||
} /* jerry_make_api_available */
|
||||
|
||||
/**
|
||||
* Turn off API availability
|
||||
*/
|
||||
static void
|
||||
jerry_make_api_unavailable (void)
|
||||
{
|
||||
jerry_api_available = false;
|
||||
} /* jerry_make_api_unavailable */
|
||||
|
||||
/**
|
||||
* Convert ecma-value to Jerry API value representation
|
||||
*
|
||||
@@ -79,6 +128,8 @@ jerry_api_convert_ecma_value_to_api_value (jerry_api_value_t *out_value_p, /**<
|
||||
* null, boolean, number,
|
||||
* string or object */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_ASSERT (out_value_p != NULL);
|
||||
|
||||
if (ecma_is_value_undefined (value))
|
||||
@@ -220,6 +271,8 @@ jerry_api_convert_api_value_to_ecma_value (ecma_value_t *out_value_p, /**< out:
|
||||
bool
|
||||
jerry_extend_with (jerry_extension_descriptor_t *desc_p) /**< description of the extension object */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_extension_register (desc_p);
|
||||
} /* jerry_extend_with */
|
||||
|
||||
@@ -239,6 +292,8 @@ jerry_api_string_to_char_buffer (const jerry_api_string_t *string_p, /**< string
|
||||
char *buffer_p, /**< output characters buffer */
|
||||
ssize_t buffer_size) /**< size of output buffer */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_string_to_zt_string (string_p, (ecma_char_t*) buffer_p, buffer_size);
|
||||
} /* jerry_api_string_to_char_buffer */
|
||||
|
||||
@@ -254,6 +309,8 @@ jerry_api_string_to_char_buffer (const jerry_api_string_t *string_p, /**< string
|
||||
jerry_api_string_t*
|
||||
jerry_api_acquire_string (jerry_api_string_t *string_p) /**< pointer passed to function */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_copy_or_ref_ecma_string (string_p);
|
||||
} /* jerry_api_acquire_string */
|
||||
|
||||
@@ -268,6 +325,8 @@ jerry_api_acquire_string (jerry_api_string_t *string_p) /**< pointer passed to f
|
||||
void
|
||||
jerry_api_release_string (jerry_api_string_t *string_p) /**< pointer acquired through jerry_api_acquire_string */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
ecma_deref_ecma_string (string_p);
|
||||
} /* jerry_api_release_string */
|
||||
|
||||
@@ -283,6 +342,8 @@ jerry_api_release_string (jerry_api_string_t *string_p) /**< pointer acquired th
|
||||
jerry_api_object_t*
|
||||
jerry_api_acquire_object (jerry_api_object_t *object_p) /**< pointer passed to function */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
ecma_ref_object (object_p);
|
||||
|
||||
return object_p;
|
||||
@@ -299,6 +360,8 @@ jerry_api_acquire_object (jerry_api_object_t *object_p) /**< pointer passed to f
|
||||
void
|
||||
jerry_api_release_object (jerry_api_object_t *object_p) /**< pointer acquired through jerry_api_acquire_object */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
ecma_deref_object (object_p);
|
||||
} /* jerry_api_release_object */
|
||||
|
||||
@@ -308,6 +371,8 @@ jerry_api_release_object (jerry_api_object_t *object_p) /**< pointer acquired th
|
||||
void
|
||||
jerry_api_release_value (jerry_api_value_t *value_p) /**< API value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
if (value_p->type == JERRY_API_DATA_TYPE_STRING)
|
||||
{
|
||||
jerry_api_release_string (value_p->v_string);
|
||||
@@ -329,6 +394,8 @@ jerry_api_release_value (jerry_api_value_t *value_p) /**< API value */
|
||||
jerry_api_string_t*
|
||||
jerry_api_create_string (const char *v) /**< string value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_new_ecma_string ((const ecma_char_t*) v);
|
||||
} /* jerry_api_create_string */
|
||||
|
||||
@@ -343,6 +410,8 @@ jerry_api_create_string (const char *v) /**< string value */
|
||||
jerry_api_object_t*
|
||||
jerry_api_create_object (void)
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_op_create_object_object_noarg ();
|
||||
} /* jerry_api_create_object */
|
||||
|
||||
@@ -358,6 +427,8 @@ jerry_api_object_t*
|
||||
jerry_api_create_external_function (jerry_external_handler_t handler_p) /**< pointer to native handler
|
||||
* for the function */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_op_create_external_function_object ((ecma_external_pointer_t) handler_p);
|
||||
} /* jerry_api_create_external_function */
|
||||
|
||||
@@ -378,6 +449,8 @@ jerry_dispatch_external_function (ecma_object_t *function_object_p, /**< externa
|
||||
const ecma_value_t args_p [], /**< arguments list */
|
||||
ecma_length_t args_count) /**< number of arguments */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_STATIC_ASSERT (sizeof (args_count) == sizeof (uint16_t));
|
||||
|
||||
ecma_completion_value_t completion_value;
|
||||
@@ -435,6 +508,8 @@ jerry_dispatch_external_function (ecma_object_t *function_object_p, /**< externa
|
||||
bool
|
||||
jerry_api_is_function (const jerry_api_object_t* object_p) /**< an object */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_ASSERT (object_p != NULL);
|
||||
|
||||
ecma_value_t obj_val = ecma_make_object_value (object_p);
|
||||
@@ -451,6 +526,8 @@ jerry_api_is_function (const jerry_api_object_t* object_p) /**< an object */
|
||||
bool
|
||||
jerry_api_is_constructor (const jerry_api_object_t* object_p) /**< an object */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_ASSERT (object_p != NULL);
|
||||
|
||||
ecma_value_t obj_val = ecma_make_object_value (object_p);
|
||||
@@ -472,6 +549,8 @@ jerry_api_add_object_field (jerry_api_object_t *object_p, /**< object to add fie
|
||||
const jerry_api_value_t *field_value_p, /**< value of the field */
|
||||
bool is_writable) /**< flag indicating whether the created field should be writable */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
bool is_successful = false;
|
||||
|
||||
if (ecma_get_object_extensible (object_p))
|
||||
@@ -514,6 +593,8 @@ bool
|
||||
jerry_api_delete_object_field (jerry_api_object_t *object_p, /**< object to delete field at */
|
||||
const char *field_name_p) /**< name of the field */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
bool is_successful = true;
|
||||
|
||||
ecma_string_t* field_name_str_p = ecma_new_ecma_string ((const ecma_char_t*) field_name_p);
|
||||
@@ -552,6 +633,8 @@ jerry_api_get_object_field_value (jerry_api_object_t *object_p, /**< object */
|
||||
const char *field_name_p, /**< name of the field */
|
||||
jerry_api_value_t *field_value_p) /**< out: field value, if retrieved successfully */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
bool is_successful = true;
|
||||
|
||||
ecma_string_t* field_name_str_p = ecma_new_ecma_string ((const ecma_char_t*) field_name_p);
|
||||
@@ -591,6 +674,8 @@ jerry_api_set_object_field_value (jerry_api_object_t *object_p, /**< object */
|
||||
const char *field_name_p, /**< name of the field */
|
||||
const jerry_api_value_t *field_value_p) /**< field value to set */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
bool is_successful = true;
|
||||
|
||||
ecma_string_t* field_name_str_p = ecma_new_ecma_string ((const ecma_char_t*) field_name_p);
|
||||
@@ -628,6 +713,8 @@ bool
|
||||
jerry_api_get_object_native_handle (jerry_api_object_t *object_p, /**< object to get handle from */
|
||||
uintptr_t* out_handle_p) /**< out: handle value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
uintptr_t handle_value;
|
||||
|
||||
bool does_exist = ecma_get_external_pointer_value (object_p,
|
||||
@@ -649,6 +736,8 @@ void
|
||||
jerry_api_set_object_native_handle (jerry_api_object_t *object_p, /**< object to set handle in */
|
||||
uintptr_t handle) /**< handle value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
ecma_create_external_pointer_property (object_p,
|
||||
ECMA_INTERNAL_PROPERTY_NATIVE_HANDLE,
|
||||
handle);
|
||||
@@ -785,6 +874,8 @@ jerry_api_call_function (jerry_api_object_t *function_object_p, /**< function ob
|
||||
* (NULL if arguments number is zero) */
|
||||
uint16_t args_count) /**< number of the arguments */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
if (jerry_api_is_function (function_object_p))
|
||||
{
|
||||
return jerry_api_invoke_function (false, function_object_p, this_arg_p, retval_p, args_p, args_count);
|
||||
@@ -814,6 +905,8 @@ jerry_api_construct_object (jerry_api_object_t *function_object_p, /**< function
|
||||
* (NULL if arguments number is zero) */
|
||||
uint16_t args_count) /**< number of the arguments */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
if (jerry_api_is_constructor (function_object_p))
|
||||
{
|
||||
return jerry_api_invoke_function (true, function_object_p, NULL, retval_p, args_p, args_count);
|
||||
@@ -835,6 +928,8 @@ jerry_api_construct_object (jerry_api_object_t *function_object_p, /**< function
|
||||
jerry_api_object_t*
|
||||
jerry_api_get_global (void)
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
|
||||
} /* jerry_api_get_global */
|
||||
|
||||
@@ -855,6 +950,8 @@ jerry_api_eval (const char *source_p, /**< source code */
|
||||
bool is_strict, /**< perform eval as it is called from strict mode code */
|
||||
jerry_api_value_t *retval_p) /**< out: returned value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
ecma_string_t *code_p = ecma_new_ecma_string ((const ecma_char_t*) source_p);
|
||||
(void) source_size;
|
||||
|
||||
@@ -922,6 +1019,9 @@ jerry_init (jerry_flag_t flags) /**< combination of Jerry flags */
|
||||
|
||||
jerry_flags = flags;
|
||||
|
||||
jerry_make_api_unavailable (); /* TODO remove this line when it's called somewhere else */
|
||||
jerry_make_api_available ();
|
||||
|
||||
mem_init ();
|
||||
serializer_init ();
|
||||
ecma_init ();
|
||||
@@ -933,6 +1033,8 @@ jerry_init (jerry_flag_t flags) /**< combination of Jerry flags */
|
||||
void
|
||||
jerry_cleanup (void)
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
bool is_show_mem_stats = ((jerry_flags & JERRY_FLAG_MEM_STATS) != 0);
|
||||
|
||||
ecma_finalize ();
|
||||
@@ -958,6 +1060,8 @@ jerry_get_memory_limits (size_t *out_data_bss_brk_limit_p, /**< out: Jerry's max
|
||||
void
|
||||
jerry_reg_err_callback (jerry_error_callback_t callback) /**< pointer to callback function */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_UNIMPLEMENTED_REF_UNUSED_VARS ("Error callback is not implemented", callback);
|
||||
} /* jerry_reg_err_callback */
|
||||
|
||||
@@ -968,6 +1072,8 @@ bool
|
||||
jerry_parse (const char* source_p, /**< script source */
|
||||
size_t source_size) /**< script source size */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
bool is_show_opcodes = ((jerry_flags & JERRY_FLAG_SHOW_OPCODES) != 0);
|
||||
|
||||
parser_init (source_p, source_size, is_show_opcodes);
|
||||
@@ -1001,6 +1107,8 @@ jerry_parse (const char* source_p, /**< script source */
|
||||
jerry_completion_code_t
|
||||
jerry_run (void)
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return run_int ();
|
||||
} /* jerry_run */
|
||||
/**
|
||||
@@ -1044,6 +1152,8 @@ jerry_run_simple (const char *script_source, /**< script source */
|
||||
jerry_ctx_t*
|
||||
jerry_new_ctx (void)
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_UNIMPLEMENTED ("Run contexts are not implemented");
|
||||
} /* jerry_new_ctx */
|
||||
|
||||
@@ -1053,6 +1163,8 @@ jerry_new_ctx (void)
|
||||
void
|
||||
jerry_cleanup_ctx (jerry_ctx_t* ctx_p) /**< run context */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_UNIMPLEMENTED_REF_UNUSED_VARS ("Run contexts are not implemented", ctx_p);
|
||||
} /* jerry_cleanup_ctx */
|
||||
|
||||
@@ -1062,6 +1174,8 @@ jerry_cleanup_ctx (jerry_ctx_t* ctx_p) /**< run context */
|
||||
void
|
||||
jerry_push_ctx (jerry_ctx_t *ctx_p) /**< run context */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_UNIMPLEMENTED_REF_UNUSED_VARS ("Run contexts are not implemented", ctx_p);
|
||||
} /* jerry_push_ctx */
|
||||
|
||||
@@ -1074,6 +1188,8 @@ jerry_push_ctx (jerry_ctx_t *ctx_p) /**< run context */
|
||||
void
|
||||
jerry_pop_ctx (void)
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
JERRY_UNIMPLEMENTED ("Run contexts are not implemented");
|
||||
} /* jerry_pop_ctx */
|
||||
#endif /* CONFIG_JERRY_ENABLE_CONTEXTS */
|
||||
|
||||
Reference in New Issue
Block a user