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 2383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2394 | 2394 |
2395 | 2395 |
2396 TEST(InterpreterDeleteSloppyUnqualifiedIdentifier) { | 2396 TEST(InterpreterDeleteSloppyUnqualifiedIdentifier) { |
2397 HandleAndZoneScope handles; | 2397 HandleAndZoneScope handles; |
2398 i::Isolate* isolate = handles.main_isolate(); | 2398 i::Isolate* isolate = handles.main_isolate(); |
2399 i::Factory* factory = isolate->factory(); | 2399 i::Factory* factory = isolate->factory(); |
2400 | 2400 |
2401 // These tests generate a syntax error for strict mode. We don't | 2401 // These tests generate a syntax error for strict mode. We don't |
2402 // test for it here. | 2402 // test for it here. |
2403 std::pair<const char*, Handle<Object>> test_delete[] = { | 2403 std::pair<const char*, Handle<Object>> test_delete[] = { |
2404 std::make_pair("var a = { x:10, y:'abc'};\n" | 2404 std::make_pair("var sloppy_a = { x:10, y:'abc'};\n" |
2405 "var b = delete a;\n" | 2405 "var sloppy_b = delete sloppy_a;\n" |
2406 "if (delete a) {\n" | 2406 "if (delete sloppy_a) {\n" |
2407 " return undefined;\n" | 2407 " return undefined;\n" |
2408 "} else {\n" | 2408 "} else {\n" |
2409 " return a.x;\n" | 2409 " return sloppy_a.x;\n" |
2410 "}\n", | 2410 "}\n", |
2411 Handle<Object>(Smi::FromInt(10), isolate)), | 2411 Handle<Object>(Smi::FromInt(10), isolate)), |
2412 // TODO(mythria) When try-catch is implemented change the tests to check | 2412 // TODO(mythria) When try-catch is implemented change the tests to check |
2413 // if delete actually deletes | 2413 // if delete actually deletes |
2414 std::make_pair("a = { x:10, y:'abc'};\n" | 2414 std::make_pair("sloppy_a = { x:10, y:'abc'};\n" |
2415 "var b = delete a;\n" | 2415 "var sloppy_b = delete sloppy_a;\n" |
2416 // "try{return a.x;} catch(e) {return b;}\n" | 2416 // "try{return a.x;} catch(e) {return b;}\n" |
2417 "return b;", | 2417 "return sloppy_b;", |
2418 factory->ToBoolean(true)), | 2418 factory->ToBoolean(true)), |
2419 std::make_pair("a = { x:10, y:'abc'};\n" | 2419 std::make_pair("sloppy_a = { x:10, y:'abc'};\n" |
2420 "var b = delete c;\n" | 2420 "var sloppy_b = delete sloppy_c;\n" |
2421 "return b;", | 2421 "return sloppy_b;", |
2422 factory->ToBoolean(true))}; | 2422 factory->ToBoolean(true))}; |
2423 | 2423 |
2424 | 2424 |
2425 for (size_t i = 0; i < arraysize(test_delete); i++) { | 2425 for (size_t i = 0; i < arraysize(test_delete); i++) { |
2426 std::string source(InterpreterTester::SourceForBody(test_delete[i].first)); | 2426 std::string source(InterpreterTester::SourceForBody(test_delete[i].first)); |
2427 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 2427 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
2428 auto callable = tester.GetCallable<>(); | 2428 auto callable = tester.GetCallable<>(); |
2429 | 2429 |
2430 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2430 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2431 CHECK(return_value->SameValue(*test_delete[i].second)); | 2431 CHECK(return_value->SameValue(*test_delete[i].second)); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2491 | 2491 |
2492 for (size_t i = 0; i < arraysize(test_global_delete); i++) { | 2492 for (size_t i = 0; i < arraysize(test_global_delete); i++) { |
2493 InterpreterTester tester(handles.main_isolate(), | 2493 InterpreterTester tester(handles.main_isolate(), |
2494 test_global_delete[i].first); | 2494 test_global_delete[i].first); |
2495 auto callable = tester.GetCallable<>(); | 2495 auto callable = tester.GetCallable<>(); |
2496 | 2496 |
2497 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2497 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2498 CHECK(return_value->SameValue(*test_global_delete[i].second)); | 2498 CHECK(return_value->SameValue(*test_global_delete[i].second)); |
2499 } | 2499 } |
2500 } | 2500 } |
| 2501 |
| 2502 |
| 2503 TEST(InterpreterLoops) { |
| 2504 HandleAndZoneScope handles; |
| 2505 i::Isolate* isolate = handles.main_isolate(); |
| 2506 i::Factory* factory = isolate->factory(); |
| 2507 |
| 2508 std::pair<const char*, Handle<Object>> test_loop[] = { |
| 2509 std::make_pair("var a = 10; var b = 1;\n" |
| 2510 "while (false) {\n" |
| 2511 " b = b * 2;\n" |
| 2512 " a = a - 1;\n" |
| 2513 "}\n" |
| 2514 "return b;\n", |
| 2515 Handle<Object>(Smi::FromInt(1), isolate)), |
| 2516 std::make_pair("var a = 10; var b = 1;\n" |
| 2517 "while (true) {\n" |
| 2518 " b = b * 2;\n" |
| 2519 " a = a - 1;\n" |
| 2520 " if (a == 0) break;" |
| 2521 " continue;" |
| 2522 "}\n" |
| 2523 "return b;\n", |
| 2524 factory->NewHeapNumber(1024)), |
| 2525 std::make_pair("var a = 10; var b = 1;\n" |
| 2526 "do {\n" |
| 2527 " b = b * 2;\n" |
| 2528 " a = a - 1;\n" |
| 2529 " if (a == 0) break;" |
| 2530 "} while(true);\n" |
| 2531 "return b;\n", |
| 2532 factory->NewHeapNumber(1024)), |
| 2533 std::make_pair("var a = 10; var b = 1;\n" |
| 2534 "do {\n" |
| 2535 " b = b * 2;\n" |
| 2536 " a = a - 1;\n" |
| 2537 " if (a == 0) break;" |
| 2538 "} while(false);\n" |
| 2539 "return b;\n", |
| 2540 Handle<Object>(Smi::FromInt(2), isolate)), |
| 2541 std::make_pair("var a = 10; var b = 1;\n" |
| 2542 "for ( a = 1, b = 30; false; ) {\n" |
| 2543 " b = b * 2;\n" |
| 2544 "}\n" |
| 2545 "return b;\n", |
| 2546 Handle<Object>(Smi::FromInt(30), isolate))}; |
| 2547 |
| 2548 for (size_t i = 0; i < arraysize(test_loop); i++) { |
| 2549 std::string source(InterpreterTester::SourceForBody(test_loop[i].first)); |
| 2550 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
| 2551 auto callable = tester.GetCallable<>(); |
| 2552 |
| 2553 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 2554 CHECK(return_value->SameValue(*test_loop[i].second)); |
| 2555 } |
| 2556 } |
OLD | NEW |