OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // TODO(jochen): Remove this after the setting is turned on globally. | 5 // TODO(jochen): Remove this after the setting is turned on globally. |
6 #define V8_IMMINENT_DEPRECATION_WARNINGS | 6 #define V8_IMMINENT_DEPRECATION_WARNINGS |
7 | 7 |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "src/compiler/pipeline.h" | 10 #include "src/compiler/pipeline.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 // Ensure handler table is generated. | 81 // Ensure handler table is generated. |
82 isolate->interpreter()->Initialize(); | 82 isolate->interpreter()->Initialize(); |
83 } | 83 } |
84 virtual ~BytecodeGraphTester() {} | 84 virtual ~BytecodeGraphTester() {} |
85 | 85 |
86 template <class... A> | 86 template <class... A> |
87 BytecodeGraphCallable<A...> GetCallable() { | 87 BytecodeGraphCallable<A...> GetCallable() { |
88 return BytecodeGraphCallable<A...>(isolate_, GetFunction()); | 88 return BytecodeGraphCallable<A...>(isolate_, GetFunction()); |
89 } | 89 } |
90 | 90 |
| 91 Local<Message> CheckThrowsReturnMessage() { |
| 92 TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate_)); |
| 93 auto callable = GetCallable<>(); |
| 94 MaybeHandle<Object> no_result = callable(); |
| 95 CHECK(isolate_->has_pending_exception()); |
| 96 CHECK(try_catch.HasCaught()); |
| 97 CHECK(no_result.is_null()); |
| 98 isolate_->OptionalRescheduleException(true); |
| 99 CHECK(!try_catch.Message().IsEmpty()); |
| 100 return try_catch.Message(); |
| 101 } |
| 102 |
91 static Handle<Object> NewObject(const char* script) { | 103 static Handle<Object> NewObject(const char* script) { |
92 return v8::Utils::OpenHandle(*CompileRun(script)); | 104 return v8::Utils::OpenHandle(*CompileRun(script)); |
93 } | 105 } |
94 | 106 |
95 private: | 107 private: |
96 Isolate* isolate_; | 108 Isolate* isolate_; |
97 Zone* zone_; | 109 Zone* zone_; |
98 const char* script_; | 110 const char* script_; |
99 | 111 |
100 Handle<JSFunction> GetFunction() { | 112 Handle<JSFunction> GetFunction() { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 SEP() \ | 159 SEP() \ |
148 REPEAT_32(SEP, __VA_ARGS__) \ | 160 REPEAT_32(SEP, __VA_ARGS__) \ |
149 SEP() \ | 161 SEP() \ |
150 REPEAT_16(SEP, __VA_ARGS__) \ | 162 REPEAT_16(SEP, __VA_ARGS__) \ |
151 SEP() \ | 163 SEP() \ |
152 REPEAT_8(SEP, __VA_ARGS__) \ | 164 REPEAT_8(SEP, __VA_ARGS__) \ |
153 SEP() \ | 165 SEP() \ |
154 REPEAT_4(SEP, __VA_ARGS__) SEP() REPEAT_2(SEP, __VA_ARGS__) SEP() __VA_ARGS__ | 166 REPEAT_4(SEP, __VA_ARGS__) SEP() REPEAT_2(SEP, __VA_ARGS__) SEP() __VA_ARGS__ |
155 | 167 |
156 | 168 |
157 template <int N> | 169 template <int N, typename T = Handle<Object>> |
158 struct ExpectedSnippet { | 170 struct ExpectedSnippet { |
159 const char* code_snippet; | 171 const char* code_snippet; |
160 Handle<Object> return_value_and_parameters[N + 1]; | 172 T return_value_and_parameters[N + 1]; |
161 | 173 |
162 inline Handle<Object> return_value() const { | 174 inline T return_value() const { return return_value_and_parameters[0]; } |
163 return return_value_and_parameters[0]; | |
164 } | |
165 | 175 |
166 inline Handle<Object> parameter(int i) const { | 176 inline T parameter(int i) const { |
167 DCHECK_GE(i, 0); | 177 DCHECK_GE(i, 0); |
168 DCHECK_LT(i, N); | 178 DCHECK_LT(i, N); |
169 return return_value_and_parameters[1 + i]; | 179 return return_value_and_parameters[1 + i]; |
170 } | 180 } |
171 }; | 181 }; |
172 | 182 |
173 | 183 |
174 TEST(BytecodeGraphBuilderReturnStatements) { | 184 TEST(BytecodeGraphBuilderReturnStatements) { |
175 HandleAndZoneScope scope; | 185 HandleAndZoneScope scope; |
176 Isolate* isolate = scope.main_isolate(); | 186 Isolate* isolate = scope.main_isolate(); |
(...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 .ToHandleChecked(); | 954 .ToHandleChecked(); |
945 CHECK(return_value->SameValue(*snippets[i].return_value())); | 955 CHECK(return_value->SameValue(*snippets[i].return_value())); |
946 } | 956 } |
947 } | 957 } |
948 | 958 |
949 | 959 |
950 TEST(BytecodeGraphBuilderTestInstanceOf) { | 960 TEST(BytecodeGraphBuilderTestInstanceOf) { |
951 // TODO(mythria): Add tests when CreateLiterals/CreateClousre are supported. | 961 // TODO(mythria): Add tests when CreateLiterals/CreateClousre are supported. |
952 } | 962 } |
953 | 963 |
| 964 |
| 965 TEST(BytecodeGraphBuilderThrow) { |
| 966 HandleAndZoneScope scope; |
| 967 Isolate* isolate = scope.main_isolate(); |
| 968 Zone* zone = scope.main_zone(); |
| 969 |
| 970 // TODO(mythria): Add more tests when real try-catch and deoptimization |
| 971 // information are supported. |
| 972 ExpectedSnippet<0, const char*> snippets[] = { |
| 973 {"throw undefined;", {"Uncaught undefined"}}, |
| 974 {"throw 1;", {"Uncaught 1"}}, |
| 975 {"throw 'Error';", {"Uncaught Error"}}, |
| 976 {"throw 'Error1'; throw 'Error2'", {"Uncaught Error1"}}, |
| 977 // TODO(mythria): Enable these tests when JumpIfTrue is supported. |
| 978 // {"var a = true; if (a) { throw 'Error'; }", {"Error"}}, |
| 979 }; |
| 980 |
| 981 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 982 for (size_t i = 0; i < num_snippets; i++) { |
| 983 ScopedVector<char> script(1024); |
| 984 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 985 snippets[i].code_snippet, kFunctionName); |
| 986 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 987 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); |
| 988 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); |
| 989 CHECK( |
| 990 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) |
| 991 .FromJust()); |
| 992 } |
| 993 } |
| 994 |
954 } // namespace compiler | 995 } // namespace compiler |
955 } // namespace internal | 996 } // namespace internal |
956 } // namespace v8 | 997 } // namespace v8 |
OLD | NEW |