| Index: test/cctest/test-decls.cc | 
| diff --git a/test/cctest/test-decls.cc b/test/cctest/test-decls.cc | 
| index b55f417de867b2e760d294d2b517a1951f3fdf07..42e7e78d7f6c2015554f9c624621c2685312ac75 100644 | 
| --- a/test/cctest/test-decls.cc | 
| +++ b/test/cctest/test-decls.cc | 
| @@ -37,7 +37,8 @@ using namespace v8; | 
|  | 
| enum Expectations { | 
| EXPECT_RESULT, | 
| -  EXPECT_EXCEPTION | 
| +  EXPECT_EXCEPTION, | 
| +  EXPECT_ERROR | 
| }; | 
|  | 
|  | 
| @@ -95,7 +96,6 @@ class DeclarationContext { | 
| private: | 
| bool is_initialized_; | 
| Persistent<Context> context_; | 
| -  Local<String> property_; | 
|  | 
| int get_count_; | 
| int set_count_; | 
| @@ -139,7 +139,13 @@ void DeclarationContext::Check(const char* source, | 
| HandleScope scope; | 
| TryCatch catcher; | 
| catcher.SetVerbose(true); | 
| -  Local<Value> result = Script::Compile(String::New(source))->Run(); | 
| +  Local<Script> script = Script::Compile(String::New(source)); | 
| +  if (expectations == EXPECT_ERROR) { | 
| +    CHECK(script.IsEmpty()); | 
| +    return; | 
| +  } | 
| +  CHECK(!script.IsEmpty()); | 
| +  Local<Value> result = script->Run(); | 
| CHECK_EQ(get, get_count()); | 
| CHECK_EQ(set, set_count()); | 
| CHECK_EQ(query, query_count()); | 
| @@ -681,3 +687,214 @@ TEST(ExistsInHiddenPrototype) { | 
| EXPECT_RESULT, Number::New(0)); | 
| } | 
| } | 
| + | 
| + | 
| + | 
| +class SimpleContext { | 
| + public: | 
| +  SimpleContext() { | 
| +    context_ = Context::New(0); | 
| +    context_->Enter(); | 
| +  } | 
| + | 
| +  virtual ~SimpleContext() { | 
| +    context_->Exit(); | 
| +    context_.Dispose(); | 
| +  } | 
| + | 
| +  void Check(const char* source, | 
| +             Expectations expectations, | 
| +             v8::Handle<Value> value = Local<Value>()) { | 
| +    HandleScope scope; | 
| +    TryCatch catcher; | 
| +    catcher.SetVerbose(true); | 
| +    Local<Script> script = Script::Compile(String::New(source)); | 
| +    if (expectations == EXPECT_ERROR) { | 
| +      CHECK(script.IsEmpty()); | 
| +      return; | 
| +    } | 
| +    CHECK(!script.IsEmpty()); | 
| +    Local<Value> result = script->Run(); | 
| +    if (expectations == EXPECT_RESULT) { | 
| +      CHECK(!catcher.HasCaught()); | 
| +      if (!value.IsEmpty()) { | 
| +        CHECK_EQ(value, result); | 
| +      } | 
| +    } else { | 
| +      CHECK(expectations == EXPECT_EXCEPTION); | 
| +      CHECK(catcher.HasCaught()); | 
| +      if (!value.IsEmpty()) { | 
| +        CHECK_EQ(value, catcher.Exception()); | 
| +      } | 
| +    } | 
| +  } | 
| + | 
| + private: | 
| +  Persistent<Context> context_; | 
| +}; | 
| + | 
| + | 
| +TEST(MultiScriptConflicts) { | 
| +  HandleScope scope; | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("var x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("var x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +    context.Check("const x = 3; x", | 
| +                  EXPECT_RESULT, Number::New(3)); | 
| +    context.Check("const x = 4; x", | 
| +                  EXPECT_RESULT, Number::New(4)); | 
| +    context.Check("x = 5; x", | 
| +                  EXPECT_RESULT, Number::New(5)); | 
| +    context.Check("var x = 6; x", | 
| +                  EXPECT_RESULT, Number::New(6)); | 
| +    context.Check("this.x", | 
| +                  EXPECT_RESULT, Number::New(6)); | 
| +    context.Check("function x() { return 7 }; x()", | 
| +                  EXPECT_RESULT, Number::New(7)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("const x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("var x = 2; x",  // assignment ignored | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("const x = 3; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("x = 4; x",  // assignment ignored | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("var x = 5; x",  // assignment ignored | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("this.x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("function x() { return 7 }; x", | 
| +                  EXPECT_EXCEPTION); | 
| +  } | 
| + | 
| +  i::FLAG_use_strict = true; | 
| +  i::FLAG_harmony_scoping = true; | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("var x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("this.x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("let x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +    context.Check("x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +    context.Check("this.x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("const x = 3; x", | 
| +                  EXPECT_RESULT, Number::New(3)); | 
| +    context.Check("x", | 
| +                  EXPECT_RESULT, Number::New(3)); | 
| +    context.Check("this.x", | 
| +                  EXPECT_RESULT, Number::New(3)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("function x() { return 4 }; x()", | 
| +                  EXPECT_RESULT, Number::New(4)); | 
| +    context.Check("x()", | 
| +                  EXPECT_RESULT, Number::New(4)); | 
| +    context.Check("this.x()", | 
| +                  EXPECT_RESULT, Number::New(4)); | 
| +  } | 
| + | 
| +  // TODO(rossberg): All of the below should actually be errors in Harmony. | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("var x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("let x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("var x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("const x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("function x() { return 1 }; x()", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("let x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("function x() { return 1 }; x()", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("const x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("let x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("var x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("let x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("let x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("let x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("const x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("let x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("function x() { return 2 }; x()", | 
| +                  EXPECT_RESULT, Number::New(2)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("const x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("var x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("const x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("let x = 2; x", | 
| +                  EXPECT_EXCEPTION); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("const x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("const x = 2; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +  } | 
| + | 
| +  { SimpleContext context; | 
| +    context.Check("const x = 1; x", | 
| +                  EXPECT_RESULT, Number::New(1)); | 
| +    context.Check("function x() { return 2 }; x()", | 
| +                  EXPECT_EXCEPTION); | 
| +  } | 
| +} | 
|  |