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)); |
+ } |
+} |