diff options
author | Zoltan Herczeg <zherczeg.u-szeged@partner.samsung.com> | 2021-08-30 14:04:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-30 14:04:13 +0200 |
commit | 8cbe1b59c14959c1855958af08acacd7776a4472 (patch) | |
tree | 5cc465299ac1746568d35ef311fe95873f87cc4e | |
parent | 4175037fb0ad16b7839014a486bb31ff1f316c3f (diff) |
Implement getter function for external string user pointer (#4742)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
-rw-r--r-- | docs/02.API-REFERENCE.md | 71 | ||||
-rw-r--r-- | jerry-core/api/jerry.c | 44 | ||||
-rw-r--r-- | jerry-core/include/jerryscript-core.h | 1 | ||||
-rw-r--r-- | tests/unit-core/test-external-string.c | 28 |
4 files changed, 143 insertions, 1 deletions
diff --git a/docs/02.API-REFERENCE.md b/docs/02.API-REFERENCE.md index af5a4d0e..2e774955 100644 --- a/docs/02.API-REFERENCE.md +++ b/docs/02.API-REFERENCE.md @@ -4283,6 +4283,77 @@ main (void) **See also** - [jerry_external_string_free_callback_t](#jerry_external_string_free_callback_t) +- [jerry_string_get_external_user_pointer](#jerry_string_get_external_user_pointer) +- [jerry_create_external_string](#jerry_create_external_string) +- [jerry_create_external_string_sz](#jerry_create_external_string_sz) + + +# jerry_string_get_external_user_pointer + +**Summary** + +Returns the user pointer assigned to an external string. + +*Note*: + - In some cases (e.g. when the string is also a magic string registered by + [jerry_register_magic_strings](#jerry_register_magic_strings)), the + string is a normal string without a user pointer even if it is created + by [jerry_create_external_string](#jerry_create_external_string). + +**Prototype** + +```c +void *jerry_string_get_external_user_pointer (const jerry_value_t value, + bool *is_external); +``` + +- `value` - string value. +- `is_external` - when `is_external` is non-NULL, the referenced boolean value is set + to true, if `value` is an external string, and set to false otherwise +- return value + - user pointer - if `value` argument is an external string + - NULL - otherwise + +*New in version [[NEXT_RELEASE]]*. + +**Example** + +[doctest]: # () + +```c +#include "jerryscript.h" +#include <stdio.h> + +static int user_value = 1; + +int +main (void) +{ + jerry_init (JERRY_INIT_EMPTY); + + const char *string_p = "This is a long external string, should not be duplicated!"; + + jerry_value_t external_string = jerry_create_external_string ((jerry_char_t *) string_p, (void *) &user_value); + + bool is_external; + void *user_p = jerry_string_get_external_user_pointer (external_string, &is_external); + + if (is_external) + { + /* Prints the address of user_value. */ + printf("User pointer of an external string: %p\n", user_p); + } + + jerry_release_value (external_string); + + jerry_cleanup (); + return 0; +} +``` + +**See also** + +- [jerry_string_set_external_string_free_callback](#jerry_string_set_external_string_free_callback) - [jerry_create_external_string](#jerry_create_external_string) - [jerry_create_external_string_sz](#jerry_create_external_string_sz) diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index 13bc3a69..cb0079da 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -3117,6 +3117,50 @@ jerry_string_set_external_free_callback (jerry_external_string_free_callback_t c } /* jerry_string_set_external_free_callback */ /** + * Returns the user pointer assigned to an external string. + * + * @return user pointer, if value is an external string + * NULL, otherwise + */ +void * +jerry_string_get_external_user_pointer (const jerry_value_t value, /**< string value */ + bool *is_external) /**< [out] true - if value is an external string, + * false - otherwise */ +{ + if (is_external != NULL) + { + *is_external = false; + } + + if (!ecma_is_value_string (value)) + { + return NULL; + } + + ecma_string_t *string_p = ecma_get_string_from_value (value); + + if (ECMA_IS_DIRECT_STRING (string_p) + || ECMA_STRING_GET_CONTAINER (string_p) != ECMA_STRING_CONTAINER_LONG_OR_EXTERNAL_STRING) + { + return NULL; + } + + ecma_long_string_t *long_string_p = (ecma_long_string_t *) string_p; + + if (long_string_p->string_p == ECMA_LONG_STRING_BUFFER_START (long_string_p)) + { + return NULL; + } + + if (is_external != NULL) + { + *is_external = true; + } + + return ((ecma_external_string_t *) string_p)->user_p; +} /* jerry_string_get_external_user_pointer */ + +/** * Checks whether the object or it's prototype objects have the given property. * * @return raised error - if the operation fail diff --git a/jerry-core/include/jerryscript-core.h b/jerry-core/include/jerryscript-core.h index 3c09d877..f45c76a3 100644 --- a/jerry-core/include/jerryscript-core.h +++ b/jerry-core/include/jerryscript-core.h @@ -136,6 +136,7 @@ jerry_size_t jerry_substring_to_utf8_char_buffer (const jerry_value_t value, jerry_char_t *buffer_p, jerry_size_t buffer_size); void jerry_string_set_external_free_callback (jerry_external_string_free_callback_t callback_p); +void *jerry_string_get_external_user_pointer (const jerry_value_t value, bool *is_external); /** * Functions for array object values. diff --git a/tests/unit-core/test-external-string.c b/tests/unit-core/test-external-string.c index 81574a16..5821c3da 100644 --- a/tests/unit-core/test-external-string.c +++ b/tests/unit-core/test-external-string.c @@ -64,40 +64,56 @@ main (void) jerry_init (JERRY_INIT_EMPTY); + bool is_external; + /* Test external callback calls. */ jerry_string_set_external_free_callback (external_string_free_callback_1); jerry_value_t external_string = jerry_create_external_string ((jerry_char_t *) external_1, NULL); TEST_ASSERT (free_count == 0); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, &is_external) == NULL); + TEST_ASSERT (is_external); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, NULL) == NULL); jerry_release_value (external_string); TEST_ASSERT (free_count == 1); jerry_string_set_external_free_callback (NULL); - external_string = jerry_create_external_string ((jerry_char_t *) external_1, NULL); + external_string = jerry_create_external_string ((jerry_char_t *) external_1, (void *) &free_count); TEST_ASSERT (free_count == 1); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, &is_external) == (void *) &free_count); + TEST_ASSERT (is_external); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, NULL) == (void *) &free_count); jerry_release_value (external_string); TEST_ASSERT (free_count == 1); jerry_string_set_external_free_callback (external_string_free_callback_2); external_string = jerry_create_external_string ((jerry_char_t *) external_2, (void *) &free_count); TEST_ASSERT (free_count == 2); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, &is_external) == NULL); + TEST_ASSERT (!is_external); jerry_release_value (external_string); TEST_ASSERT (free_count == 2); jerry_string_set_external_free_callback (NULL); external_string = jerry_create_external_string ((jerry_char_t *) external_2, (void *) &free_count); TEST_ASSERT (free_count == 2); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, &is_external) == NULL); + TEST_ASSERT (!is_external); jerry_release_value (external_string); TEST_ASSERT (free_count == 2); jerry_string_set_external_free_callback (external_string_free_callback_3); external_string = jerry_create_external_string ((jerry_char_t *) external_3, (void *) external_3); TEST_ASSERT (free_count == 3); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, &is_external) == NULL); + TEST_ASSERT (!is_external); jerry_release_value (external_string); TEST_ASSERT (free_count == 3); jerry_string_set_external_free_callback (NULL); external_string = jerry_create_external_string ((jerry_char_t *) external_3, (void *) external_3); TEST_ASSERT (free_count == 3); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, &is_external) == NULL); + TEST_ASSERT (!is_external); jerry_release_value (external_string); TEST_ASSERT (free_count == 3); @@ -176,6 +192,16 @@ main (void) jerry_release_value (external_string); jerry_release_value (other_string); + external_string = jerry_create_boolean (true); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, &is_external) == NULL); + TEST_ASSERT (!is_external); + jerry_release_value (external_string); + + external_string = jerry_create_object (); + TEST_ASSERT (jerry_string_get_external_user_pointer (external_string, &is_external) == NULL); + TEST_ASSERT (!is_external); + jerry_release_value (external_string); + jerry_cleanup (); return 0; } /* main */ |