| 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++) {
|
|
|