| Index: test/cctest/test-api.cc
|
| ===================================================================
|
| --- test/cctest/test-api.cc (revision 768)
|
| +++ test/cctest/test-api.cc (working copy)
|
| @@ -4018,6 +4018,22 @@
|
| }
|
|
|
|
|
| +THREADED_TEST(Eval) {
|
| + v8::HandleScope scope;
|
| + LocalContext current;
|
| +
|
| + // Test that un-aliased eval uses local context.
|
| + Local<Script> script =
|
| + Script::Compile(v8_str("foo = 0;"
|
| + "(function() {"
|
| + " var foo = 2;"
|
| + " return eval('foo');"
|
| + "})();"));
|
| + Local<Value> foo = script->Run();
|
| + CHECK_EQ(2, foo->Int32Value());
|
| +}
|
| +
|
| +
|
| THREADED_TEST(CrossEval) {
|
| v8::HandleScope scope;
|
| LocalContext other;
|
| @@ -4039,49 +4055,58 @@
|
| CHECK(!current->Global()->Has(v8_str("foo")));
|
|
|
| // Check that writing to non-existing properties introduces them in
|
| - // the current context.
|
| + // the other context.
|
| script =
|
| Script::Compile(v8_str("other.eval('na = 1234')"));
|
| script->Run();
|
| - CHECK_EQ(1234, current->Global()->Get(v8_str("na"))->Int32Value());
|
| - CHECK(!other->Global()->Has(v8_str("na")));
|
| + CHECK_EQ(1234, other->Global()->Get(v8_str("na"))->Int32Value());
|
| + CHECK(!current->Global()->Has(v8_str("na")));
|
|
|
| - // Check that variables in current context are visible in other
|
| - // context. This must include local variables.
|
| + // Check that global variables in current context are not visible in other
|
| + // context.
|
| + v8::TryCatch try_catch;
|
| script =
|
| - Script::Compile(v8_str("var bar = 42;"
|
| - "(function() { "
|
| - " var baz = 87;"
|
| - " return other.eval('bar + baz');"
|
| - "})();"));
|
| + Script::Compile(v8_str("var bar = 42; other.eval('bar');"));
|
| Local<Value> result = script->Run();
|
| - CHECK_EQ(42 + 87, result->Int32Value());
|
| + CHECK(try_catch.HasCaught());
|
| + try_catch.Reset();
|
|
|
| + // Check that local variables in current context are not visible in other
|
| + // context.
|
| + script =
|
| + Script::Compile(v8_str("(function() { "
|
| + " var baz = 87;"
|
| + " return other.eval('baz');"
|
| + "})();"));
|
| + result = script->Run();
|
| + CHECK(try_catch.HasCaught());
|
| + try_catch.Reset();
|
| +
|
| // Check that global variables in the other environment are visible
|
| // when evaluting code.
|
| other->Global()->Set(v8_str("bis"), v8_num(1234));
|
| script = Script::Compile(v8_str("other.eval('bis')"));
|
| CHECK_EQ(1234, script->Run()->Int32Value());
|
| + CHECK(!try_catch.HasCaught());
|
|
|
| - // Check that the 'this' pointer isn't touched as a result of
|
| - // calling eval across environments.
|
| - script =
|
| - Script::Compile(v8_str("var t = this; other.eval('this == t')"));
|
| + // Check that the 'this' pointer points to the global object evaluating
|
| + // code.
|
| + other->Global()->Set(v8_str("t"), other->Global());
|
| + script = Script::Compile(v8_str("other.eval('this == t')"));
|
| result = script->Run();
|
| - CHECK(result->IsBoolean());
|
| - CHECK(result->BooleanValue());
|
| + CHECK(result->IsTrue());
|
| + CHECK(!try_catch.HasCaught());
|
|
|
| - // Check that doing a cross eval works from within a global
|
| - // with-statement.
|
| + // Check that variables introduced in with-statement are not visible in
|
| + // other context.
|
| script =
|
| - Script::Compile(v8_str("other.y = 1;"
|
| - "with({x:2}){other.eval('x+y')}"));
|
| + Script::Compile(v8_str("with({x:2}){other.eval('x')}"));
|
| result = script->Run();
|
| - CHECK_EQ(3, result->Int32Value());
|
| + CHECK(try_catch.HasCaught());
|
| + try_catch.Reset();
|
|
|
| // Check that you cannot use 'eval.call' with another object than the
|
| // current global object.
|
| - v8::TryCatch try_catch;
|
| script =
|
| Script::Compile(v8_str("other.y = 1; eval.call(other, 'y')"));
|
| result = script->Run();
|
|
|