Skip to content

Commit dfc0757

Browse files
Istvan Miklosyichoi
authored andcommitted
Fix jerry_create_error_from_value (#2403)
Fixed the release issue, added some test cases for the function JerryScript-DCO-1.0-Signed-off-by: Istvan Miklos imiklos2@inf.u-szeged.hu
1 parent e326588 commit dfc0757

File tree

2 files changed

+89
-6
lines changed

2 files changed

+89
-6
lines changed

jerry-core/api/jerry.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -954,20 +954,19 @@ jerry_create_error_from_value (jerry_value_t value, /**< api value */
954954
* binary size rather than performance. */
955955
if (!jerry_value_is_abort (value))
956956
{
957-
return (release ? value : jerry_acquire_value (value));
957+
return release ? value : jerry_acquire_value (value);
958958
}
959959

960960
value = jerry_get_value_from_error (value, release);
961961
release = true;
962962
}
963963

964-
jerry_value_t ret_val = ecma_create_error_reference (value, true);
965-
if (release)
964+
if (!release)
966965
{
967-
jerry_release_value (value);
966+
value = ecma_copy_value (value);
968967
}
969968

970-
return ret_val;
969+
return ecma_create_error_reference (value, true);
971970
} /* jerry_create_error_from_value */
972971

973972
/**

tests/unit-core/test-api-set-and-clear-error-flag.c

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@
1616
#include "jerryscript.h"
1717
#include "test-common.h"
1818

19+
static void
20+
compare_str (jerry_value_t value, const char *str_p, size_t str_len)
21+
{
22+
jerry_size_t size = jerry_get_string_size (value);
23+
JERRY_ASSERT (str_len == size);
24+
JERRY_VLA (jerry_char_t, str_buff, size);
25+
jerry_string_to_utf8_char_buffer (value, str_buff, size);
26+
JERRY_ASSERT (!memcmp (str_p, str_buff, str_len));
27+
} /* compare_str */
28+
1929
int
2030
main (void)
2131
{
@@ -31,6 +41,80 @@ main (void)
3141

3242
JERRY_ASSERT (obj_val != err_val);
3343
jerry_release_value (err_val);
44+
jerry_release_value (obj_val);
45+
46+
const char *pterodactylus_p = "Pterodactylus";
47+
const size_t pterodactylus_size = strlen (pterodactylus_p);
48+
49+
jerry_value_t str = jerry_create_string ((jerry_char_t *) pterodactylus_p);
50+
jerry_value_t error = jerry_create_error_from_value (str, true);
51+
str = jerry_get_value_from_error (error, true);
52+
53+
compare_str (str, pterodactylus_p, pterodactylus_size);
54+
jerry_release_value (str);
55+
56+
str = jerry_create_string ((jerry_char_t *) pterodactylus_p);
57+
error = jerry_create_error_from_value (str, false);
58+
jerry_release_value (str);
59+
str = jerry_get_value_from_error (error, true);
60+
61+
compare_str (str, pterodactylus_p, pterodactylus_size);
62+
jerry_release_value (str);
63+
64+
double test_num = 3.1415926;
65+
jerry_value_t num = jerry_create_number (test_num);
66+
jerry_value_t num2 = jerry_create_error_from_value (num, false);
67+
JERRY_ASSERT (jerry_value_is_error (num2));
68+
jerry_release_value (num);
69+
num2 = jerry_get_value_from_error (num2, true);
70+
JERRY_ASSERT (jerry_get_number_value (num2) == test_num);
71+
jerry_release_value (num2);
72+
73+
num = jerry_create_number (test_num);
74+
num2 = jerry_create_error_from_value (num, true);
75+
JERRY_ASSERT (jerry_value_is_error (num2));
76+
num2 = jerry_get_value_from_error (num2, true);
77+
JERRY_ASSERT (jerry_get_number_value (num2) == test_num);
78+
jerry_release_value (num2);
79+
80+
num = jerry_create_number (test_num);
81+
num2 = jerry_create_error_from_value (num, false);
82+
JERRY_ASSERT (jerry_value_is_error (num2));
83+
jerry_release_value (num);
84+
jerry_value_t num3 = jerry_create_error_from_value (num2, false);
85+
JERRY_ASSERT (jerry_value_is_error (num3));
86+
jerry_release_value (num2);
87+
num2 = jerry_get_value_from_error (num3, true);
88+
JERRY_ASSERT (jerry_get_number_value (num2) == test_num);
89+
jerry_release_value (num2);
90+
91+
num = jerry_create_number (test_num);
92+
num2 = jerry_create_error_from_value (num, true);
93+
JERRY_ASSERT (jerry_value_is_error (num2));
94+
num3 = jerry_create_error_from_value (num2, true);
95+
JERRY_ASSERT (jerry_value_is_error (num3));
96+
num2 = jerry_get_value_from_error (num3, true);
97+
JERRY_ASSERT (jerry_get_number_value (num2) == test_num);
98+
jerry_release_value (num2);
99+
100+
num = jerry_create_number (test_num);
101+
jerry_value_set_abort_flag (&num);
102+
JERRY_ASSERT (jerry_value_is_abort (num));
103+
num2 = jerry_create_error_from_value (num, true);
104+
JERRY_ASSERT (jerry_value_is_error (num2));
105+
num = jerry_get_value_from_error (num2, true);
106+
JERRY_ASSERT (jerry_get_number_value (num) == test_num);
107+
jerry_release_value (num);
108+
109+
num = jerry_create_number (test_num);
110+
jerry_value_set_abort_flag (&num);
111+
JERRY_ASSERT (jerry_value_is_abort (num));
112+
num2 = jerry_create_error_from_value (num, false);
113+
jerry_release_value (num);
114+
JERRY_ASSERT (jerry_value_is_error (num2));
115+
num = jerry_get_value_from_error (num2, true);
116+
JERRY_ASSERT (jerry_get_number_value (num) == test_num);
117+
jerry_release_value (num);
34118

35119
jerry_value_t value = jerry_create_number (42);
36120
value = jerry_get_value_from_error (value, true);
@@ -42,7 +126,7 @@ main (void)
42126
jerry_release_value (value2);
43127

44128
value = jerry_create_number (42);
45-
jerry_value_t error = jerry_create_error_from_value (value, true);
129+
error = jerry_create_error_from_value (value, true);
46130
error = jerry_create_error_from_value (error, true);
47131
jerry_release_value (error);
48132

0 commit comments

Comments
 (0)