Rework external string free operation (#4690)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
+14
-4
@@ -2700,9 +2700,9 @@ jerry_create_string_sz (const jerry_char_t *str_p, /**< pointer to string */
|
||||
*/
|
||||
jerry_value_t
|
||||
jerry_create_external_string (const jerry_char_t *str_p, /**< pointer to string */
|
||||
jerry_value_free_callback_t free_cb) /**< free callback */
|
||||
void *user_p) /**< user pointer passed to the callback when the string is freed */
|
||||
{
|
||||
return jerry_create_external_string_sz (str_p, lit_zt_utf8_string_size ((lit_utf8_byte_t *) str_p), free_cb);
|
||||
return jerry_create_external_string_sz (str_p, lit_zt_utf8_string_size ((lit_utf8_byte_t *) str_p), user_p);
|
||||
} /* jerry_create_external_string */
|
||||
|
||||
/**
|
||||
@@ -2716,13 +2716,13 @@ jerry_create_external_string (const jerry_char_t *str_p, /**< pointer to string
|
||||
jerry_value_t
|
||||
jerry_create_external_string_sz (const jerry_char_t *str_p, /**< pointer to string */
|
||||
jerry_size_t str_size, /**< string size */
|
||||
jerry_value_free_callback_t free_cb) /**< free callback */
|
||||
void *user_p) /**< user pointer passed to the callback when the string is freed */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
ecma_string_t *ecma_str_p = ecma_new_ecma_external_string_from_cesu8 ((lit_utf8_byte_t *) str_p,
|
||||
(lit_utf8_size_t) str_size,
|
||||
free_cb);
|
||||
user_p);
|
||||
return ecma_make_string_value (ecma_str_p);
|
||||
} /* jerry_create_external_string_sz */
|
||||
|
||||
@@ -3107,6 +3107,16 @@ jerry_substring_to_utf8_char_buffer (const jerry_value_t value, /**< input strin
|
||||
buffer_size);
|
||||
} /* jerry_substring_to_utf8_char_buffer */
|
||||
|
||||
/**
|
||||
* Sets the global callback which is called when an external string is freed.
|
||||
*/
|
||||
void
|
||||
jerry_string_set_external_string_free_callback (jerry_external_string_free_callback_t callback_p) /**< free
|
||||
* callback */
|
||||
{
|
||||
JERRY_CONTEXT (external_string_free_callback_p) = callback_p;
|
||||
} /* jerry_string_set_external_string_free_callback */
|
||||
|
||||
/**
|
||||
* Checks whether the object or it's prototype objects have the given property.
|
||||
*
|
||||
|
||||
@@ -1804,8 +1804,8 @@ typedef struct
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
ecma_long_string_t header;
|
||||
jerry_value_free_callback_t free_cb; /**< free callback */
|
||||
ecma_long_string_t header; /**< long string header */
|
||||
void *user_p; /**< user pointer passed to the callback when the string is freed */
|
||||
} ecma_external_string_t;
|
||||
|
||||
/**
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "ecma-gc.h"
|
||||
#include "ecma-globals.h"
|
||||
#include "ecma-helpers.h"
|
||||
#include "jcontext.h"
|
||||
#include "jrt.h"
|
||||
#include "jrt-libc-includes.h"
|
||||
#include "lit-char-helpers.h"
|
||||
@@ -455,7 +456,8 @@ ecma_new_ecma_string_from_utf8_converted_to_cesu8 (const lit_utf8_byte_t *string
|
||||
ecma_string_t *
|
||||
ecma_new_ecma_external_string_from_cesu8 (const lit_utf8_byte_t *string_p, /**< cesu-8 string */
|
||||
lit_utf8_size_t string_size, /**< string size */
|
||||
jerry_value_free_callback_t free_cb) /**< free callback */
|
||||
void *user_p) /**< user pointer passed to the callback
|
||||
* when the string is freed */
|
||||
{
|
||||
JERRY_ASSERT (string_p != NULL || string_size == 0);
|
||||
JERRY_ASSERT (lit_is_valid_cesu8_string (string_p, string_size));
|
||||
@@ -465,9 +467,11 @@ ecma_new_ecma_external_string_from_cesu8 (const lit_utf8_byte_t *string_p, /**<
|
||||
/* Normal strings are created for short strings. */
|
||||
ecma_string_t *string_desc_p = ecma_new_ecma_string_from_utf8 (string_p, string_size);
|
||||
|
||||
jerry_external_string_free_callback_t free_cb = JERRY_CONTEXT (external_string_free_callback_p);
|
||||
|
||||
if (free_cb != NULL)
|
||||
{
|
||||
free_cb ((void *) string_p);
|
||||
free_cb ((lit_utf8_byte_t *) string_p, string_size, user_p);
|
||||
}
|
||||
return string_desc_p;
|
||||
}
|
||||
@@ -476,9 +480,11 @@ ecma_new_ecma_external_string_from_cesu8 (const lit_utf8_byte_t *string_p, /**<
|
||||
|
||||
if (string_desc_p != NULL)
|
||||
{
|
||||
jerry_external_string_free_callback_t free_cb = JERRY_CONTEXT (external_string_free_callback_p);
|
||||
|
||||
if (free_cb != NULL)
|
||||
{
|
||||
free_cb ((void *) string_p);
|
||||
free_cb ((lit_utf8_byte_t *) string_p, string_size, user_p);
|
||||
}
|
||||
return string_desc_p;
|
||||
}
|
||||
@@ -491,7 +497,7 @@ ecma_new_ecma_external_string_from_cesu8 (const lit_utf8_byte_t *string_p, /**<
|
||||
long_string_p->string_p = string_p;
|
||||
long_string_p->size = string_size;
|
||||
long_string_p->length = lit_utf8_string_length (string_p, string_size);
|
||||
external_string_p->free_cb = free_cb;
|
||||
external_string_p->user_p = user_p;
|
||||
|
||||
return (ecma_string_t *) external_string_p;
|
||||
} /* ecma_new_ecma_external_string_from_cesu8 */
|
||||
@@ -961,10 +967,13 @@ ecma_destroy_ecma_string (ecma_string_t *string_p) /**< ecma-string */
|
||||
}
|
||||
|
||||
ecma_external_string_t *external_string_p = (ecma_external_string_t *) string_p;
|
||||
jerry_external_string_free_callback_t free_cb = JERRY_CONTEXT (external_string_free_callback_p);
|
||||
|
||||
if (external_string_p->free_cb != NULL)
|
||||
if (free_cb != NULL)
|
||||
{
|
||||
external_string_p->free_cb ((void *) external_string_p->header.string_p);
|
||||
free_cb ((lit_utf8_byte_t *) external_string_p->header.string_p,
|
||||
external_string_p->header.size,
|
||||
external_string_p->user_p);
|
||||
}
|
||||
|
||||
ecma_dealloc_external_string (external_string_p);
|
||||
|
||||
@@ -303,7 +303,7 @@ ecma_string_t *ecma_new_ecma_string_from_utf8 (const lit_utf8_byte_t *string_p,
|
||||
ecma_string_t *ecma_new_ecma_string_from_utf8_converted_to_cesu8 (const lit_utf8_byte_t *string_p,
|
||||
lit_utf8_size_t string_size);
|
||||
ecma_string_t *ecma_new_ecma_external_string_from_cesu8 (const lit_utf8_byte_t *string_p, lit_utf8_size_t string_size,
|
||||
jerry_value_free_callback_t free_cb);
|
||||
void *user_p);
|
||||
ecma_string_t *ecma_new_ecma_string_from_code_unit (ecma_char_t code_unit);
|
||||
#if JERRY_ESNEXT
|
||||
ecma_string_t *ecma_new_ecma_string_from_code_units (ecma_char_t first_code_unit, ecma_char_t second_code_unit);
|
||||
|
||||
@@ -135,6 +135,7 @@ jerry_size_t jerry_substring_to_utf8_char_buffer (const jerry_value_t value,
|
||||
jerry_length_t end_pos,
|
||||
jerry_char_t *buffer_p,
|
||||
jerry_size_t buffer_size);
|
||||
void jerry_string_set_external_string_free_callback (jerry_external_string_free_callback_t callback_p);
|
||||
|
||||
/**
|
||||
* Functions for array object values.
|
||||
@@ -188,10 +189,8 @@ jerry_value_t jerry_create_string_from_utf8 (const jerry_char_t *str_p);
|
||||
jerry_value_t jerry_create_string_sz_from_utf8 (const jerry_char_t *str_p, jerry_size_t str_size);
|
||||
jerry_value_t jerry_create_string (const jerry_char_t *str_p);
|
||||
jerry_value_t jerry_create_string_sz (const jerry_char_t *str_p, jerry_size_t str_size);
|
||||
jerry_value_t jerry_create_external_string (const jerry_char_t *str_p,
|
||||
jerry_value_free_callback_t free_cb);
|
||||
jerry_value_t jerry_create_external_string_sz (const jerry_char_t *str_p, jerry_size_t str_size,
|
||||
jerry_value_free_callback_t free_cb);
|
||||
jerry_value_t jerry_create_external_string (const jerry_char_t *str_p, void *user_p);
|
||||
jerry_value_t jerry_create_external_string_sz (const jerry_char_t *str_p, jerry_size_t str_size, void *user_p);
|
||||
jerry_value_t jerry_create_symbol (const jerry_value_t value);
|
||||
jerry_value_t jerry_create_bigint (const uint64_t *digits_p, uint32_t size, bool sign);
|
||||
jerry_value_t jerry_create_undefined (void);
|
||||
|
||||
@@ -291,6 +291,12 @@ struct jerry_object_native_info_t;
|
||||
*/
|
||||
typedef void (*jerry_object_native_free_callback_t) (void *native_p, struct jerry_object_native_info_t *info_p);
|
||||
|
||||
/**
|
||||
* Free callback for external strings.
|
||||
*/
|
||||
typedef void (*jerry_external_string_free_callback_t) (jerry_char_t *string_p, jerry_size_t string_size,
|
||||
void *user_p);
|
||||
|
||||
/**
|
||||
* Decorator callback for Error objects. The decorator can create
|
||||
* or update any properties of the newly created Error object.
|
||||
|
||||
@@ -158,6 +158,7 @@ struct jerry_context_t
|
||||
|
||||
vm_frame_ctx_t *vm_top_context_p; /**< top (current) interpreter context */
|
||||
jerry_context_data_header_t *context_data_p; /**< linked list of user-provided context-specific pointers */
|
||||
jerry_external_string_free_callback_t external_string_free_callback_p; /**< free callback for external strings */
|
||||
void *error_object_created_callback_user_p; /**< user pointer for error_object_update_callback_p */
|
||||
jerry_error_object_created_callback_t error_object_created_callback_p; /**< decorator callback for Error objects */
|
||||
size_t ecma_gc_objects_number; /**< number of currently allocated objects */
|
||||
|
||||
Reference in New Issue
Block a user