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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/execution.h" | 7 #include "src/execution.h" |
8 #include "src/handles.h" | 8 #include "src/handles.h" |
9 #include "src/interpreter/bytecode-array-builder.h" | 9 #include "src/interpreter/bytecode-array-builder.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 2246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2257 }; | 2257 }; |
2258 | 2258 |
2259 InterpreterTester tester(handles.main_isolate(), create_args[i].first); | 2259 InterpreterTester tester(handles.main_isolate(), create_args[i].first); |
2260 auto callable = | 2260 auto callable = |
2261 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 2261 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
2262 Handle<Object> return_val = | 2262 Handle<Object> return_val = |
2263 callable(args[0], args[1], args[2]).ToHandleChecked(); | 2263 callable(args[0], args[1], args[2]).ToHandleChecked(); |
2264 CHECK(return_val->SameValue(*args[create_args[i].second])); | 2264 CHECK(return_val->SameValue(*args[create_args[i].second])); |
2265 } | 2265 } |
2266 } | 2266 } |
| 2267 |
| 2268 |
| 2269 TEST(InterpreterForIn) { |
| 2270 HandleAndZoneScope handles; |
| 2271 |
| 2272 // TODO(oth): Add a test here for delete mid-loop when delete is ready. |
| 2273 std::pair<const char*, int> for_in_samples[] = { |
| 2274 {"function f() {\n" |
| 2275 " var r = -1;\n" |
| 2276 " for (var a in null) { r = a; }\n" |
| 2277 " return r;\n" |
| 2278 "}", |
| 2279 -1}, |
| 2280 {"function f() {\n" |
| 2281 " var r = -1;\n" |
| 2282 " for (var a in undefined) { r = a; }\n" |
| 2283 " return r;\n" |
| 2284 "}", |
| 2285 -1}, |
| 2286 {"function f() {\n" |
| 2287 " var r = 0;\n" |
| 2288 " for (var a in [0,6,7,9]) { r = r + (1 << a); }\n" |
| 2289 " return r;\n" |
| 2290 "}", |
| 2291 0xf}, |
| 2292 {"function f() {\n" |
| 2293 " var r = 0;\n" |
| 2294 " for (var a in [0,6,7,9]) { r = r + (1 << a); }\n" |
| 2295 " var r = 0;\n" |
| 2296 " for (var a in [0,6,7,9]) { r = r + (1 << a); }\n" |
| 2297 " return r;\n" |
| 2298 "}", |
| 2299 0xf}, |
| 2300 {"function f() {\n" |
| 2301 " var r = 0;\n" |
| 2302 " for (var a in 'foobar') { r = r + (1 << a); }\n" |
| 2303 " return r;\n" |
| 2304 "}", |
| 2305 0x3f}, |
| 2306 {"function f() {\n" |
| 2307 " var r = 0;\n" |
| 2308 " for (var a in {1:0, 10:1, 100:2, 1000:3}) {\n" |
| 2309 " r = r + Number(a);\n" |
| 2310 " }\n" |
| 2311 " return r;\n" |
| 2312 "}", |
| 2313 1111}, |
| 2314 {"function f() {\n" |
| 2315 " var r = 0;\n" |
| 2316 " var input = 'foobar';\n" |
| 2317 " for (var a in input) {\n" |
| 2318 " if (input[a] == 'b') break;\n" |
| 2319 " r = r + (1 << a);\n" |
| 2320 " }\n" |
| 2321 " return r;\n" |
| 2322 "}", |
| 2323 0x7}, |
| 2324 {"function f() {\n" |
| 2325 "var r = 0;\n" |
| 2326 "var input = 'foobar';\n" |
| 2327 "for (var a in input) {\n" |
| 2328 " if (input[a] == 'b') continue;\n" |
| 2329 " r = r + (1 << a);\n" |
| 2330 "}\n" |
| 2331 "return r;\n" |
| 2332 "}", |
| 2333 0x37}, |
| 2334 {"function f() {\n" |
| 2335 " var r = 0;\n" |
| 2336 " var data = {1:0, 10:1, 100:2, 1000:3};\n" |
| 2337 " for (var a in data) {\n" |
| 2338 " if (a == 10) {\n" |
| 2339 " data[10000] = 4;\n" |
| 2340 " }\n" |
| 2341 " r = r + Number(a);\n" |
| 2342 " }\n" |
| 2343 " return r;\n" |
| 2344 "}", |
| 2345 1111}, |
| 2346 {"function f() {\n" |
| 2347 " var r = [ 3 ];\n" |
| 2348 " var data = {1:0, 10:1, 100:2, 1000:3};\n" |
| 2349 " for (r[10] in data) {\n" |
| 2350 " }\n" |
| 2351 " return Number(r[10]);\n" |
| 2352 "}", |
| 2353 1000}, |
| 2354 {"function f() {\n" |
| 2355 " var r = [ 3 ];\n" |
| 2356 " var data = {1:0, 10:1, 100:2, 1000:3};\n" |
| 2357 " for (r['100'] in data) {\n" |
| 2358 " }\n" |
| 2359 " return Number(r['100']);\n" |
| 2360 "}", |
| 2361 1000}, |
| 2362 }; |
| 2363 |
| 2364 for (size_t i = 0; i < arraysize(for_in_samples); i++) { |
| 2365 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first); |
| 2366 auto callable = tester.GetCallable<>(); |
| 2367 Handle<Object> return_val = callable().ToHandleChecked(); |
| 2368 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second); |
| 2369 } |
| 2370 } |
OLD | NEW |