diff options
-rw-r--r-- | jerry-core/api/jerry.c | 9 | ||||
-rw-r--r-- | tests/unit-core/test-api-set-and-clear-error-flag.c | 86 |
2 files changed, 89 insertions, 6 deletions
diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index 52aa341e..79af048c 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -954,20 +954,19 @@ jerry_create_error_from_value (jerry_value_t value, /**< api value */ * binary size rather than performance. */ if (!jerry_value_is_abort (value)) { - return (release ? value : jerry_acquire_value (value)); + return release ? value : jerry_acquire_value (value); } value = jerry_get_value_from_error (value, release); release = true; } - jerry_value_t ret_val = ecma_create_error_reference (value, true); - if (release) + if (!release) { - jerry_release_value (value); + value = ecma_copy_value (value); } - return ret_val; + return ecma_create_error_reference (value, true); } /* jerry_create_error_from_value */ /** diff --git a/tests/unit-core/test-api-set-and-clear-error-flag.c b/tests/unit-core/test-api-set-and-clear-error-flag.c index f16a65a0..c5fb153f 100644 --- a/tests/unit-core/test-api-set-and-clear-error-flag.c +++ b/tests/unit-core/test-api-set-and-clear-error-flag.c @@ -16,6 +16,16 @@ #include "jerryscript.h" #include "test-common.h" +static void +compare_str (jerry_value_t value, const char *str_p, size_t str_len) +{ + jerry_size_t size = jerry_get_string_size (value); + JERRY_ASSERT (str_len == size); + JERRY_VLA (jerry_char_t, str_buff, size); + jerry_string_to_utf8_char_buffer (value, str_buff, size); + JERRY_ASSERT (!memcmp (str_p, str_buff, str_len)); +} /* compare_str */ + int main (void) { @@ -31,6 +41,80 @@ main (void) JERRY_ASSERT (obj_val != err_val); jerry_release_value (err_val); + jerry_release_value (obj_val); + + const char *pterodactylus_p = "Pterodactylus"; + const size_t pterodactylus_size = strlen (pterodactylus_p); + + jerry_value_t str = jerry_create_string ((jerry_char_t *) pterodactylus_p); + jerry_value_t error = jerry_create_error_from_value (str, true); + str = jerry_get_value_from_error (error, true); + + compare_str (str, pterodactylus_p, pterodactylus_size); + jerry_release_value (str); + + str = jerry_create_string ((jerry_char_t *) pterodactylus_p); + error = jerry_create_error_from_value (str, false); + jerry_release_value (str); + str = jerry_get_value_from_error (error, true); + + compare_str (str, pterodactylus_p, pterodactylus_size); + jerry_release_value (str); + + double test_num = 3.1415926; + jerry_value_t num = jerry_create_number (test_num); + jerry_value_t num2 = jerry_create_error_from_value (num, false); + JERRY_ASSERT (jerry_value_is_error (num2)); + jerry_release_value (num); + num2 = jerry_get_value_from_error (num2, true); + JERRY_ASSERT (jerry_get_number_value (num2) == test_num); + jerry_release_value (num2); + + num = jerry_create_number (test_num); + num2 = jerry_create_error_from_value (num, true); + JERRY_ASSERT (jerry_value_is_error (num2)); + num2 = jerry_get_value_from_error (num2, true); + JERRY_ASSERT (jerry_get_number_value (num2) == test_num); + jerry_release_value (num2); + + num = jerry_create_number (test_num); + num2 = jerry_create_error_from_value (num, false); + JERRY_ASSERT (jerry_value_is_error (num2)); + jerry_release_value (num); + jerry_value_t num3 = jerry_create_error_from_value (num2, false); + JERRY_ASSERT (jerry_value_is_error (num3)); + jerry_release_value (num2); + num2 = jerry_get_value_from_error (num3, true); + JERRY_ASSERT (jerry_get_number_value (num2) == test_num); + jerry_release_value (num2); + + num = jerry_create_number (test_num); + num2 = jerry_create_error_from_value (num, true); + JERRY_ASSERT (jerry_value_is_error (num2)); + num3 = jerry_create_error_from_value (num2, true); + JERRY_ASSERT (jerry_value_is_error (num3)); + num2 = jerry_get_value_from_error (num3, true); + JERRY_ASSERT (jerry_get_number_value (num2) == test_num); + jerry_release_value (num2); + + num = jerry_create_number (test_num); + jerry_value_set_abort_flag (&num); + JERRY_ASSERT (jerry_value_is_abort (num)); + num2 = jerry_create_error_from_value (num, true); + JERRY_ASSERT (jerry_value_is_error (num2)); + num = jerry_get_value_from_error (num2, true); + JERRY_ASSERT (jerry_get_number_value (num) == test_num); + jerry_release_value (num); + + num = jerry_create_number (test_num); + jerry_value_set_abort_flag (&num); + JERRY_ASSERT (jerry_value_is_abort (num)); + num2 = jerry_create_error_from_value (num, false); + jerry_release_value (num); + JERRY_ASSERT (jerry_value_is_error (num2)); + num = jerry_get_value_from_error (num2, true); + JERRY_ASSERT (jerry_get_number_value (num) == test_num); + jerry_release_value (num); jerry_value_t value = jerry_create_number (42); value = jerry_get_value_from_error (value, true); @@ -42,7 +126,7 @@ main (void) jerry_release_value (value2); value = jerry_create_number (42); - jerry_value_t error = jerry_create_error_from_value (value, true); + error = jerry_create_error_from_value (value, true); error = jerry_create_error_from_value (error, true); jerry_release_value (error); |