Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Unified Diff: test/cctest/interpreter/test-interpreter.cc

Issue 1524803003: [Interpreter] Add support for Load / Store to Lookup slots. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@init_eval_impl
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: test/cctest/interpreter/test-interpreter.cc
diff --git a/test/cctest/interpreter/test-interpreter.cc b/test/cctest/interpreter/test-interpreter.cc
index 76d694bc9c41bfa5ba92a257be0f3d9746d94384..e3e4d482f2ae24f5c8bd8dea2ce0eaa654f4313c 100644
--- a/test/cctest/interpreter/test-interpreter.cc
+++ b/test/cctest/interpreter/test-interpreter.cc
@@ -3051,7 +3051,7 @@ TEST(InterpreterAssignmentInExpressions) {
}
-TEST(InterpreterEval) {
+TEST(InterpreterEvalLocal) {
HandleAndZoneScope handles;
i::Isolate* isolate = handles.main_isolate();
@@ -3059,9 +3059,150 @@ TEST(InterpreterEval) {
std::make_pair("return eval('1;');", handle(Smi::FromInt(1), isolate)),
std::make_pair("return eval('100 * 20;');",
handle(Smi::FromInt(2000), isolate)),
- // TODO(mythria): Add more tests here where eval uses / modifies variables
- // and parameters from the function's scope when we have support for
- // lookup variables.
+ std::make_pair("var x = 10; return eval('x + 20;');",
+ handle(Smi::FromInt(30), isolate)),
+ std::make_pair("var x = 10; eval('x = 33;'); return x;",
+ handle(Smi::FromInt(33), isolate)),
+ std::make_pair("'use strict'; var x = 20; var z = 0; eval('var x = 33; z "
+ "= x;'); return x + z;",
+ handle(Smi::FromInt(53), isolate)),
+ std::make_pair(
+ "eval('var x = 33;'); eval('var y = x + 20'); return x + y;",
+ handle(Smi::FromInt(86), isolate)),
+ };
+
+ for (size_t i = 0; i < arraysize(eval); i++) {
+ std::string source(InterpreterTester::SourceForBody(eval[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(*eval[i].second));
+ }
+}
+
+
+TEST(InterpreterEvalParams) {
+ HandleAndZoneScope handles;
+ i::Isolate* isolate = handles.main_isolate();
+
+ std::pair<const char*, Handle<Object>> eval_params[] = {
+ std::make_pair("var x = 10; return eval('x + p1;');",
+ handle(Smi::FromInt(30), isolate)),
+ std::make_pair("var x = 10; eval('p1 = x;'); return p1;",
+ handle(Smi::FromInt(10), isolate)),
+ std::make_pair("var a = 10;"
+ "function inner() { return eval('a + p1;');}"
+ "return inner();",
+ handle(Smi::FromInt(30), isolate)),
+ };
+
+ for (size_t i = 0; i < arraysize(eval_params); i++) {
+ std::string source = "function " + InterpreterTester::function_name() +
+ "(p1) {" + eval_params[i].first + "}";
+ InterpreterTester tester(handles.main_isolate(), source.c_str());
+ auto callable = tester.GetCallable<Handle<Object>>();
+
+ Handle<i::Object> return_value =
+ callable(handle(Smi::FromInt(20), isolate)).ToHandleChecked();
+ CHECK(return_value->SameValue(*eval_params[i].second));
+ }
+}
+
+
+TEST(InterpreterEvalGlobal) {
+ HandleAndZoneScope handles;
+ i::Isolate* isolate = handles.main_isolate();
+
+ std::pair<const char*, Handle<Object>> eval_global[] = {
+ std::make_pair("function add_global() { eval('x = 33;'); }; "
+ "function f() { add_global(); return x; }"
+ "f();",
+ handle(Smi::FromInt(33), isolate)),
+ std::make_pair(
+ "function add_global() { 'use strict'; eval('x = 33;'); }; "
+ "function f() { add_global(); return x; }"
+ "f();",
+ handle(Smi::FromInt(33), isolate)),
+ };
+
+ for (size_t i = 0; i < arraysize(eval_global); i++) {
+ InterpreterTester tester(handles.main_isolate(), eval_global[i].first, "*");
+ auto callable = tester.GetCallable<>();
+
+ Handle<i::Object> return_value = callable().ToHandleChecked();
+ CHECK(return_value->SameValue(*eval_global[i].second));
+ }
+}
+
+
+TEST(InterpreterEval) {
+ HandleAndZoneScope handles;
+ i::Isolate* isolate = handles.main_isolate();
+ i::Factory* factory = isolate->factory();
+
+ const char* func =
+ "var x = 42;"
+ "function f(str, p1) {"
+ " if(p1) { eval(str) }"
+ " x = x + 10;"
+ " return x;"
+ "}"
+ "f('var x = 10', 1);";
+
+ Handle<Object> params[][3] = {
+ {factory->NewNumberFromInt(30),
+ factory->NewStringFromStaticChars("var x = 20;"), factory->true_value()},
+ {factory->NewNumberFromInt(52),
+ factory->NewStringFromStaticChars("var x = 20;"),
+ factory->false_value()},
+ {factory->NewNumberFromInt(52),
+ factory->NewStringFromStaticChars("'use strict'; var x = 20;"),
+ factory->true_value()},
+ {factory->NewNumberFromInt(52),
+ factory->NewStringFromStaticChars("'use strict'; var x = 20;"),
+ factory->false_value()},
+ {factory->NewNumberFromInt(62),
+ factory->NewStringFromStaticChars("for(i = 0; i < 10; i++) x = x + 1;"),
+ factory->true_value()},
+ };
+
+ for (size_t i = 0; i < arraysize(params); i++) {
+ InterpreterTester tester(handles.main_isolate(), func);
+ auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>();
+ Handle<i::Object> return_value =
+ callable(params[i][1], params[i][2]).ToHandleChecked();
+ CHECK(return_value->SameValue(*params[i][0]));
+ }
+}
+
+
+TEST(InterpreterEvalInsideTypeOf) {
+ HandleAndZoneScope handles;
+ i::Isolate* isolate = handles.main_isolate();
+ i::Factory* factory = isolate->factory();
+
+ std::pair<const char*, Handle<Object>> eval[] = {
+ std::make_pair("var x = 10; eval('x + 20;'); return typeof x;",
+ factory->NewStringFromStaticChars("number")),
+ std::make_pair("eval('var y = 10;');"
+ "return typeof x;",
+ factory->NewStringFromStaticChars("undefined")),
+ std::make_pair("'use strict';"
+ "eval('var y = 10;');"
+ "return typeof x;",
+ factory->NewStringFromStaticChars("undefined")),
+ std::make_pair("eval('var x = 10;'); return typeof x;",
+ factory->NewStringFromStaticChars("number")),
+ std::make_pair("var x = {};"
+ "eval('var x = 10;');"
+ "return typeof x;",
+ factory->NewStringFromStaticChars("number")),
+ std::make_pair("'use strict';"
+ "var x = {};"
+ "eval('var x = 10;');"
+ "return typeof x;",
+ factory->NewStringFromStaticChars("object")),
};
for (size_t i = 0; i < arraysize(eval); i++) {

Powered by Google App Engine
This is Rietveld 408576698