| Index: test/cctest/test-decls.cc | 
| diff --git a/test/cctest/test-decls.cc b/test/cctest/test-decls.cc | 
| index f2ccdab6c0162f9b70924759dbfa80f576c80590..0c13a6844fbcf8c9eff18a95312136577a3d4ab9 100644 | 
| --- a/test/cctest/test-decls.cc | 
| +++ b/test/cctest/test-decls.cc | 
| @@ -644,6 +644,44 @@ TEST(CrossScriptReferences) { | 
| } | 
|  | 
|  | 
| +TEST(CrossScriptReferences_Simple) { | 
| +  i::FLAG_harmony_scoping = true; | 
| +  i::FLAG_use_strict = true; | 
| + | 
| +  v8::Isolate* isolate = CcTest::isolate(); | 
| +  HandleScope scope(isolate); | 
| + | 
| +  { | 
| +    SimpleContext context; | 
| +    context.Check("let x = 1; x", EXPECT_RESULT, Number::New(isolate, 1)); | 
| +    context.Check("let x = 5; x", EXPECT_EXCEPTION); | 
| +  } | 
| +} | 
| + | 
| + | 
| +TEST(CrossScriptReferences_Simple2) { | 
| +  i::FLAG_harmony_scoping = true; | 
| +  i::FLAG_use_strict = true; | 
| + | 
| +  v8::Isolate* isolate = CcTest::isolate(); | 
| +  HandleScope scope(isolate); | 
| + | 
| +  for (int k = 0; k < 100; k++) { | 
| +    SimpleContext context; | 
| +    bool cond = (k % 2) == 0; | 
| +    if (cond) { | 
| +      context.Check("let x = 1; x", EXPECT_RESULT, Number::New(isolate, 1)); | 
| +      context.Check("let z = 4; z", EXPECT_RESULT, Number::New(isolate, 4)); | 
| +    } else { | 
| +      context.Check("let z = 1; z", EXPECT_RESULT, Number::New(isolate, 1)); | 
| +      context.Check("let x = 4; x", EXPECT_RESULT, Number::New(isolate, 4)); | 
| +    } | 
| +    context.Check("let y = 2; x", EXPECT_RESULT, | 
| +                  Number::New(isolate, cond ? 1 : 4)); | 
| +  } | 
| +} | 
| + | 
| + | 
| TEST(CrossScriptReferencesHarmony) { | 
| i::FLAG_use_strict = true; | 
| i::FLAG_harmony_scoping = true; | 
| @@ -704,12 +742,12 @@ TEST(CrossScriptConflicts) { | 
| SimpleContext context; | 
| context.Check(firsts[i], EXPECT_RESULT, | 
| Number::New(CcTest::isolate(), 1)); | 
| -      // TODO(rossberg): All tests should actually be errors in Harmony, | 
| -      // but we currently do not detect the cases where the first declaration | 
| -      // is not lexical. | 
| -      context.Check(seconds[j], | 
| -                    i < 2 ? EXPECT_RESULT : EXPECT_ERROR, | 
| -                    Number::New(CcTest::isolate(), 2)); | 
| +      bool success_case = i < 2 && j < 2; | 
| +      Local<Value> success_result; | 
| +      if (success_case) success_result = Number::New(CcTest::isolate(), 2); | 
| + | 
| +      context.Check(seconds[j], success_case ? EXPECT_RESULT : EXPECT_EXCEPTION, | 
| +                    success_result); | 
| } | 
| } | 
| } | 
| @@ -740,9 +778,86 @@ TEST(CrossScriptDynamicLookup) { | 
| EXPECT_RESULT, Number::New(CcTest::isolate(), 1)); | 
| context.Check( | 
| "'use strict';" | 
| -        "g({});" | 
| +        "g({});0", | 
| +        EXPECT_RESULT, Number::New(CcTest::isolate(), 0)); | 
| +    context.Check("f({})", EXPECT_RESULT, Number::New(CcTest::isolate(), 15)); | 
| +    context.Check("h({})", EXPECT_RESULT, number_string); | 
| +  } | 
| +} | 
| + | 
| + | 
| +TEST(CrossScriptGlobal) { | 
| +  i::FLAG_harmony_scoping = true; | 
| + | 
| +  HandleScope handle_scope(CcTest::isolate()); | 
| +  { | 
| +    SimpleContext context; | 
| + | 
| +    context.Check( | 
| +        "var global = this;" | 
| +        "global.x = 255;" | 
| "x", | 
| +        EXPECT_RESULT, Number::New(CcTest::isolate(), 255)); | 
| +    context.Check( | 
| +        "'use strict';" | 
| +        "let x = 1;" | 
| +        "global.x", | 
| +        EXPECT_RESULT, Number::New(CcTest::isolate(), 255)); | 
| +    context.Check("global.x = 15; x", EXPECT_RESULT, | 
| +                  Number::New(CcTest::isolate(), 1)); | 
| +    context.Check("x = 221; global.x", EXPECT_RESULT, | 
| +                  Number::New(CcTest::isolate(), 15)); | 
| +    context.Check( | 
| +        "z = 15;" | 
| +        "function f() { return z; };" | 
| +        "for (var k = 0; k < 3; k++) { f(); }" | 
| +        "f()", | 
| EXPECT_RESULT, Number::New(CcTest::isolate(), 15)); | 
| +    context.Check( | 
| +        "'use strict';" | 
| +        "let z = 5; f()", | 
| +        EXPECT_RESULT, Number::New(CcTest::isolate(), 5)); | 
| +    context.Check( | 
| +        "function f() { konst = 10; return konst; };" | 
| +        "f()", | 
| +        EXPECT_RESULT, Number::New(CcTest::isolate(), 10)); | 
| +    context.Check( | 
| +        "'use strict';" | 
| +        "const konst = 255;" | 
| +        "f()", | 
| +        EXPECT_EXCEPTION); | 
| +  } | 
| +} | 
| + | 
| + | 
| +TEST(CrossScriptStaticLookupUndeclared) { | 
| +  i::FLAG_harmony_scoping = true; | 
| + | 
| +  HandleScope handle_scope(CcTest::isolate()); | 
| + | 
| +  { | 
| +    SimpleContext context; | 
| +    Local<String> undefined_string = String::NewFromUtf8( | 
| +        CcTest::isolate(), "undefined", String::kInternalizedString); | 
| +    Local<String> number_string = String::NewFromUtf8( | 
| +        CcTest::isolate(), "number", String::kInternalizedString); | 
| + | 
| +    context.Check( | 
| +        "function f(o) { return x; }" | 
| +        "function g(o) { x = 15; }" | 
| +        "function h(o) { return typeof x; }", | 
| +        EXPECT_RESULT, Undefined(CcTest::isolate())); | 
| +    context.Check("h({})", EXPECT_RESULT, undefined_string); | 
| +    context.Check( | 
| +        "'use strict';" | 
| +        "let x = 1;" | 
| +        "f({})", | 
| +        EXPECT_RESULT, Number::New(CcTest::isolate(), 1)); | 
| +    context.Check( | 
| +        "'use strict';" | 
| +        "g({});x", | 
| +        EXPECT_RESULT, Number::New(CcTest::isolate(), 15)); | 
| +    context.Check("h({})", EXPECT_RESULT, number_string); | 
| context.Check("f({})", EXPECT_RESULT, Number::New(CcTest::isolate(), 15)); | 
| context.Check("h({})", EXPECT_RESULT, number_string); | 
| } | 
|  |