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:
SaeHie Park
2015-04-30 22:27:22 +03:00
committed by Ruben Ayrapetyan
parent b496e68d27
commit 17036c854e
+116
View File
@@ -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 */