| Index: test/cctest/interpreter/test-interpreter.cc
|
| diff --git a/test/cctest/interpreter/test-interpreter.cc b/test/cctest/interpreter/test-interpreter.cc
|
| index 164959019ac298b8fe76fd02b127a48fc2ae1c7a..32ec35249cfdc493a6c322cfb7fef7bf4607c4cc 100644
|
| --- a/test/cctest/interpreter/test-interpreter.cc
|
| +++ b/test/cctest/interpreter/test-interpreter.cc
|
| @@ -2401,24 +2401,24 @@ TEST(InterpreterDeleteSloppyUnqualifiedIdentifier) {
|
| // These tests generate a syntax error for strict mode. We don't
|
| // test for it here.
|
| std::pair<const char*, Handle<Object>> test_delete[] = {
|
| - std::make_pair("var a = { x:10, y:'abc'};\n"
|
| - "var b = delete a;\n"
|
| - "if (delete a) {\n"
|
| + std::make_pair("var sloppy_a = { x:10, y:'abc'};\n"
|
| + "var sloppy_b = delete sloppy_a;\n"
|
| + "if (delete sloppy_a) {\n"
|
| " return undefined;\n"
|
| "} else {\n"
|
| - " return a.x;\n"
|
| + " return sloppy_a.x;\n"
|
| "}\n",
|
| Handle<Object>(Smi::FromInt(10), isolate)),
|
| // TODO(mythria) When try-catch is implemented change the tests to check
|
| // if delete actually deletes
|
| - std::make_pair("a = { x:10, y:'abc'};\n"
|
| - "var b = delete a;\n"
|
| + std::make_pair("sloppy_a = { x:10, y:'abc'};\n"
|
| + "var sloppy_b = delete sloppy_a;\n"
|
| // "try{return a.x;} catch(e) {return b;}\n"
|
| - "return b;",
|
| + "return sloppy_b;",
|
| factory->ToBoolean(true)),
|
| - std::make_pair("a = { x:10, y:'abc'};\n"
|
| - "var b = delete c;\n"
|
| - "return b;",
|
| + std::make_pair("sloppy_a = { x:10, y:'abc'};\n"
|
| + "var sloppy_b = delete sloppy_c;\n"
|
| + "return sloppy_b;",
|
| factory->ToBoolean(true))};
|
|
|
|
|
| @@ -2498,3 +2498,59 @@ TEST(InterpreterGlobalDelete) {
|
| CHECK(return_value->SameValue(*test_global_delete[i].second));
|
| }
|
| }
|
| +
|
| +
|
| +TEST(InterpreterLoops) {
|
| + HandleAndZoneScope handles;
|
| + i::Isolate* isolate = handles.main_isolate();
|
| + i::Factory* factory = isolate->factory();
|
| +
|
| + std::pair<const char*, Handle<Object>> test_loop[] = {
|
| + std::make_pair("var a = 10; var b = 1;\n"
|
| + "while (false) {\n"
|
| + " b = b * 2;\n"
|
| + " a = a - 1;\n"
|
| + "}\n"
|
| + "return b;\n",
|
| + Handle<Object>(Smi::FromInt(1), isolate)),
|
| + std::make_pair("var a = 10; var b = 1;\n"
|
| + "while (true) {\n"
|
| + " b = b * 2;\n"
|
| + " a = a - 1;\n"
|
| + " if (a == 0) break;"
|
| + " continue;"
|
| + "}\n"
|
| + "return b;\n",
|
| + factory->NewHeapNumber(1024)),
|
| + std::make_pair("var a = 10; var b = 1;\n"
|
| + "do {\n"
|
| + " b = b * 2;\n"
|
| + " a = a - 1;\n"
|
| + " if (a == 0) break;"
|
| + "} while(true);\n"
|
| + "return b;\n",
|
| + factory->NewHeapNumber(1024)),
|
| + std::make_pair("var a = 10; var b = 1;\n"
|
| + "do {\n"
|
| + " b = b * 2;\n"
|
| + " a = a - 1;\n"
|
| + " if (a == 0) break;"
|
| + "} while(false);\n"
|
| + "return b;\n",
|
| + Handle<Object>(Smi::FromInt(2), isolate)),
|
| + std::make_pair("var a = 10; var b = 1;\n"
|
| + "for ( a = 1, b = 30; false; ) {\n"
|
| + " b = b * 2;\n"
|
| + "}\n"
|
| + "return b;\n",
|
| + Handle<Object>(Smi::FromInt(30), isolate))};
|
| +
|
| + for (size_t i = 0; i < arraysize(test_loop); i++) {
|
| + std::string source(InterpreterTester::SourceForBody(test_loop[i].first));
|
| + InterpreterTester tester(handles.main_isolate(), source.c_str());
|
| + auto callable = tester.GetCallable<>();
|
| +
|
| + Handle<i::Object> return_value = callable().ToHandleChecked();
|
| + CHECK(return_value->SameValue(*test_loop[i].second));
|
| + }
|
| +}
|
|
|