• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright JS Foundation and other contributors, http://js.foundation
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "config.h"
17 #include "jerryscript.h"
18 #include "jerryscript-port.h"
19 #include "jerryscript-port-default.h"
20 #include "test-common.h"
21 #include <gtest/gtest.h>
22 
23 static jerry_value_t
callback_func(const jerry_value_t function_obj,const jerry_value_t this_val,const jerry_value_t args_p[],const jerry_length_t args_count)24 callback_func (const jerry_value_t function_obj,
25                const jerry_value_t this_val,
26                const jerry_value_t args_p[],
27                const jerry_length_t args_count)
28 {
29   JERRY_UNUSED (function_obj);
30   JERRY_UNUSED (this_val);
31   JERRY_UNUSED (args_p);
32   JERRY_UNUSED (args_count);
33 
34   jerry_value_t value = jerry_create_string ((jerry_char_t *) "Abort run!");
35   value = jerry_create_abort_from_value (value, true);
36   return value;
37 } /* callback_func */
38 class AportTest : public testing::Test{
39 public:
SetUpTestCase()40     static void SetUpTestCase()
41     {
42         GTEST_LOG_(INFO) << "AportTest SetUpTestCase";
43     }
44 
TearDownTestCase()45     static void TearDownTestCase()
46     {
47         GTEST_LOG_(INFO) << "AportTest TearDownTestCase";
48     }
49 
SetUp()50     void SetUp() override {}
TearDown()51     void TearDown() override {}
52 
53 };
54 
55 static constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024;
context_alloc_fn(size_t size,void * cb_data)56 static void* context_alloc_fn(size_t size, void* cb_data)
57 {
58     (void)cb_data;
59     size_t newSize = size > JERRY_SCRIPT_MEM_SIZE ? JERRY_SCRIPT_MEM_SIZE : size;
60     return malloc(newSize);
61 }
62 
63 HWTEST_F(AportTest, Test001, testing::ext::TestSize.Level1)
64 {
65   jerry_context_t* ctx_p = jerry_create_context(1024 * 1024 * 50, context_alloc_fn, NULL);
66   jerry_port_default_set_current_context(ctx_p);
67   TEST_INIT ();
68 
69   jerry_init (JERRY_INIT_EMPTY);
70 
71   jerry_value_t global = jerry_get_global_object ();
72   jerry_value_t callback_name = jerry_create_string ((jerry_char_t *) "callback");
73   jerry_value_t func = jerry_create_external_function (callback_func);
74   jerry_value_t res = jerry_set_property (global, callback_name, func);
75   TEST_ASSERT (!jerry_value_is_error (res));
76 
77   jerry_release_value (res);
78   jerry_release_value (func);
79   jerry_release_value (callback_name);
80   jerry_release_value (global);
81 
82   const jerry_char_t inf_loop_code_src1[] = TEST_STRING_LITERAL (
83     "while(true) {\n"
84     "  with ({}) {\n"
85     "    try {\n"
86     "      callback();\n"
87     "    } catch (e) {\n"
88     "    } finally {\n"
89     "    }\n"
90     "  }\n"
91     "}"
92   );
93 
94   jerry_value_t parsed_code_val = jerry_parse (NULL,
95                                                0,
96                                                inf_loop_code_src1,
97                                                sizeof (inf_loop_code_src1) - 1,
98                                                JERRY_PARSE_NO_OPTS);
99 
100   TEST_ASSERT (!jerry_value_is_error (parsed_code_val));
101   res = jerry_run (parsed_code_val);
102 
103   TEST_ASSERT (jerry_value_is_abort (res));
104 
105   jerry_release_value (res);
106   jerry_release_value (parsed_code_val);
107 
108   const jerry_char_t inf_loop_code_src2[] = TEST_STRING_LITERAL (
109     "function f() {"
110     "  while(true) {\n"
111     "    with ({}) {\n"
112     "      try {\n"
113     "        callback();\n"
114     "      } catch (e) {\n"
115     "      } finally {\n"
116     "      }\n"
117     "    }\n"
118     "  }"
119     "}\n"
120     "function g() {\n"
121     "  for (a in { x:5 })\n"
122     "    f();\n"
123     "}\n"
124     "\n"
125     "with({})\n"
126     " f();\n"
127   );
128 
129   parsed_code_val = jerry_parse (NULL,
130                                  0,
131                                  inf_loop_code_src2,
132                                  sizeof (inf_loop_code_src2) - 1,
133                                  JERRY_PARSE_NO_OPTS);
134 
135   TEST_ASSERT (!jerry_value_is_error (parsed_code_val));
136   res = jerry_run (parsed_code_val);
137 
138   TEST_ASSERT (jerry_value_is_abort (res));
139 
140   jerry_release_value (res);
141   jerry_release_value (parsed_code_val);
142 
143   /* Test flag overwrites. */
144   jerry_value_t value = jerry_create_string ((jerry_char_t *) "Error description");
145   TEST_ASSERT (!jerry_value_is_abort (value));
146   TEST_ASSERT (!jerry_value_is_error (value));
147 
148   value = jerry_create_abort_from_value (value, true);
149   TEST_ASSERT (jerry_value_is_abort (value));
150   TEST_ASSERT (jerry_value_is_error (value));
151 
152   value = jerry_create_error_from_value (value, true);
153   TEST_ASSERT (!jerry_value_is_abort (value));
154   TEST_ASSERT (jerry_value_is_error (value));
155 
156   value = jerry_create_abort_from_value (value, true);
157   TEST_ASSERT (jerry_value_is_abort (value));
158   TEST_ASSERT (jerry_value_is_error (value));
159 
160   jerry_release_value (value);
161 
162   jerry_cleanup ();
163   free (ctx_p);
164 }
165