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

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

Issue 11563: Fixing the detection of aliased eval so that it is exact.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 12 years, 1 month 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
« no previous file with comments | « src/v8natives.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/test-api.cc
===================================================================
--- test/cctest/test-api.cc (revision 805)
+++ test/cctest/test-api.cc (working copy)
@@ -4022,7 +4022,7 @@
v8::HandleScope scope;
LocalContext current;
- // Test that un-aliased eval uses local context.
+ // Test that un-aliased eval reads from local context.
Local<Script> script =
Script::Compile(v8_str("foo = 0;"
"(function() {"
@@ -4032,6 +4032,19 @@
Local<Value> result = script->Run();
CHECK_EQ(2, result->Int32Value());
+ // Test that un-aliased eval writes to local context.
+ script =
+ Script::Compile(v8_str("foo = 0;"
+ "(function() {"
+ " var foo = 1;"
+ " eval('foo = 2;');"
+ " return foo;"
+ "})();"));
+ result = script->Run();
+ CHECK_EQ(0, current->Global()->Get(v8_str("foo"))->Int32Value());
+ CHECK(result->IsInt32());
+ CHECK_EQ(2, result->Int32Value());
+
// Test that un-aliased eval has right this.
script =
Script::Compile(v8_str("function MyObject() { this.self = eval('this'); }"
@@ -4039,9 +4052,123 @@
"o === o.self"));
result = script->Run();
CHECK(result->IsTrue());
+
+ // Test that aliased eval reads from global context.
+ script =
+ Script::Compile(v8_str("var e = eval;"
+ "foo = 0;"
+ "(function() {"
+ " var foo = 2;"
+ " return e('foo');"
+ "})();"));
+ result = script->Run();
+ CHECK_EQ(0, result->Int32Value());
+
+ // Test that aliased eval writes to global context.
+ script =
+ Script::Compile(v8_str("var e = eval;"
+ "foo = 0;"
+ "(function() {"
+ " e('var foo = 2;');"
+ "})();"
+ "foo"));
+ result = script->Run();
+ CHECK_EQ(2, result->Int32Value());
+
+ // Test that aliased eval has right this.
+ script =
+ Script::Compile(v8_str("var e = eval;"
+ "function MyObject() { this.self = e('this'); }"
+ "var o = new MyObject();"
+ "this === o.self"));
+ result = script->Run();
+ CHECK(result->IsTrue());
+
+ // Try to cheat the 'aliased eval' detection.
+ script =
+ Script::Compile(v8_str("var x = this;"
+ "foo = 0;"
+ "(function() {"
+ " var foo = 2;"
+ " return x.eval('foo');"
+ "})();"));
+ result = script->Run();
+ CHECK_EQ(0, result->Int32Value());
+
+ script =
+ Script::Compile(v8_str("var e = eval;"
+ "foo = 0;"
+ "(function() {"
+ " var eval = function(x) { return x; };"
+ " var foo = eval(2);"
+ " return e('foo');"
+ "})();"));
+ result = script->Run();
+ CHECK_EQ(0, result->Int32Value());
+
+ script =
+ Script::Compile(v8_str("(function() {"
+ " var eval = function(x) { return 2 * x; };"
+ " return (function() { return eval(2); })();"
+ "})();"));
+ result = script->Run();
+ CHECK_EQ(4, result->Int32Value());
+
+ script =
+ Script::Compile(v8_str("eval = function(x) { return 2 * x; };"
+ "(function() {"
+ " return (function() { return eval(2); })();"
+ "})();"));
+ result = script->Run();
+ CHECK_EQ(4, result->Int32Value());
}
+THREADED_TEST(EvalAliasedDynamic) {
+ v8::HandleScope scope;
+ LocalContext current;
+
+ // This sets 'global' to the real global object (as opposed to the
+ // proxy). It is highly implementation dependent, so take care.
+ current->Global()->Set(v8_str("global"), current->Global()->GetPrototype());
+
+ // Tests where aliased eval can only be resolved dynamically.
+ Local<Script> script =
+ Script::Compile(v8_str("function f(x) { "
+ " var foo = 2;"
+ " with (x) { return eval('foo'); }"
+ "}"
+ "foo = 0;"
+ "var result = f(new Object()) == 2;"
+ "result = result && (f(global) == 0);"
+ "var x = new Object();"
+ "x.eval = function(x) { return 1; };"
+ "result = result && (f(x) == 1);"
+ "result"));
+ Local<Value> result = script->Run();
+ CHECK(result->IsTrue());
+
+ v8::TryCatch try_catch;
+ script =
+ Script::Compile(v8_str("function f(x) { "
+ " var bar = 2;"
+ " with (x) { return eval('bar'); }"
+ "}"
+ "f(global)"));
+ result = script->Run();
+ CHECK(try_catch.HasCaught());
+ try_catch.Reset();
+
+ script =
+ Script::Compile(v8_str("this.eval = function (x) { return x + x; };"
+ "foo = 2;"
+ "eval('foo')"));
+ result = script->Run();
+ CHECK(result->IsString());
+ CHECK_EQ(v8_str("foofoo"), result);
+}
+
+
THREADED_TEST(CrossEval) {
v8::HandleScope scope;
LocalContext other;
« no previous file with comments | « src/v8natives.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698