19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2007-2008 the V8 project authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met:
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions of source code must retain the above copyright
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       notice, this list of conditions and the following disclaimer.
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions in binary form must reproduce the above
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       copyright notice, this list of conditions and the following
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       disclaimer in the documentation and/or other materials provided
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       with the distribution.
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Neither the name of Google Inc. nor the names of its
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       contributors may be used to endorse or promote products derived
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       from this software without specific prior written permission.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <stdlib.h>
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "v8.h"
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "heap.h"
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cctest.h"
349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8;
369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comenum Expectations {
399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  EXPECT_RESULT,
4046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  EXPECT_EXCEPTION,
4146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  EXPECT_ERROR
429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A DeclarationContext holds a reference to a v8::Context and keeps
469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// track of various declaration related counters to make it easier to
479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// track if global declarations in the presence of interceptors behave
489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// the right way.
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass DeclarationContext {
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public:
519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  DeclarationContext();
529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  virtual ~DeclarationContext() {
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    if (is_initialized_) {
55c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org      Isolate* isolate = Isolate::GetCurrent();
56c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org      HandleScope scope(isolate);
57c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org      Local<Context> context = Local<Context>::New(isolate, context_);
58c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org      context->Exit();
59c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org      context_.Dispose(isolate);
609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  void Check(const char* source,
649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com             int get, int set, int has,
659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com             Expectations expectations,
669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com             v8::Handle<Value> value = Local<Value>());
679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int get_count() const { return get_count_; }
699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int set_count() const { return set_count_; }
701af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  int query_count() const { return query_count_; }
719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com protected:
739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  virtual v8::Handle<Value> Get(Local<String> key);
749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  virtual v8::Handle<Value> Set(Local<String> key, Local<Value> value);
751af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  virtual v8::Handle<Integer> Query(Local<String> key);
769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  void InitializeIfNeeded();
789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
79de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Perform optional initialization steps on the context after it has
80de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // been created. Defaults to none but may be overwritten.
81de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  virtual void PostInitializeContext(Handle<Context> context) {}
82de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Get the holder for the interceptor. Default to the instance template
849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // but may be overwritten.
859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  virtual Local<ObjectTemplate> GetHolder(Local<FunctionTemplate> function) {
869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    return function->InstanceTemplate();
879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // The handlers are called as static functions that forward
909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // to the instance specific virtual methods.
911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void HandleGet(Local<String> key,
921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        const v8::PropertyCallbackInfo<v8::Value>& info);
931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void HandleSet(Local<String> key,
941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        Local<Value> value,
951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        const v8::PropertyCallbackInfo<v8::Value>& info);
961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void HandleQuery(Local<String> key,
971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                          const v8::PropertyCallbackInfo<v8::Integer>& info);
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com private:
1009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool is_initialized_;
1019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Persistent<Context> context_;
1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int get_count_;
1049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int set_count_;
1051af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  int query_count_;
1069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static DeclarationContext* GetInstance(Local<Value> data);
1089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
1099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comDeclarationContext::DeclarationContext()
1121af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org    : is_initialized_(false), get_count_(0), set_count_(0), query_count_(0) {
1139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Do nothing.
1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid DeclarationContext::InitializeIfNeeded() {
1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (is_initialized_) return;
11957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Isolate* isolate = Isolate::GetCurrent();
12057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  HandleScope scope(isolate);
1219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Local<FunctionTemplate> function = FunctionTemplate::New();
122911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  Local<Value> data = External::New(this);
1239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  GetHolder(function)->SetNamedPropertyHandler(&HandleGet,
1249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                               &HandleSet,
1251af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org                                               &HandleQuery,
1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                               0, 0,
1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                               data);
128c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Local<Context> context = Context::New(isolate,
129c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org                                        0,
130c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org                                        function->InstanceTemplate(),
131c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org                                        Local<Value>());
132c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  context_.Reset(isolate, context);
133c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  context->Enter();
1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  is_initialized_ = true;
135c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  PostInitializeContext(context);
1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid DeclarationContext::Check(const char* source,
1401af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org                               int get, int set, int query,
1419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                               Expectations expectations,
1429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                               v8::Handle<Value> value) {
1439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  InitializeIfNeeded();
1449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // A retry after a GC may pollute the counts, so perform gc now
1459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // to avoid that.
146ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  HEAP->CollectGarbage(v8::internal::NEW_SPACE);
1472bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
1489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  TryCatch catcher;
1499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  catcher.SetVerbose(true);
15046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Local<Script> script = Script::Compile(String::New(source));
15146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  if (expectations == EXPECT_ERROR) {
15246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    CHECK(script.IsEmpty());
15346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    return;
15446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
15546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK(!script.IsEmpty());
15646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Local<Value> result = script->Run();
1579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(get, get_count());
1589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(set, set_count());
1591af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  CHECK_EQ(query, query_count());
1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (expectations == EXPECT_RESULT) {
1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK(!catcher.HasCaught());
1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    if (!value.IsEmpty()) {
1639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      CHECK_EQ(value, result);
1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  } else {
1669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK(expectations == EXPECT_EXCEPTION);
1679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK(catcher.HasCaught());
1689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    if (!value.IsEmpty()) {
1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      CHECK_EQ(value, catcher.Exception());
1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
17246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  HEAP->CollectAllAvailableGarbage();  // Clean slate for the next test.
1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid DeclarationContext::HandleGet(
1771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    Local<String> key,
1781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::PropertyCallbackInfo<v8::Value>& info) {
1791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  DeclarationContext* context = GetInstance(info.Data());
1809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  context->get_count_++;
1811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(context->Get(key));
1829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid DeclarationContext::HandleSet(
1861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    Local<String> key,
1871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    Local<Value> value,
1881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::PropertyCallbackInfo<v8::Value>& info) {
1891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  DeclarationContext* context = GetInstance(info.Data());
1909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  context->set_count_++;
1911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(context->Set(key, value));
1929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid DeclarationContext::HandleQuery(
1961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    Local<String> key,
1971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::PropertyCallbackInfo<v8::Integer>& info) {
1981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  DeclarationContext* context = GetInstance(info.Data());
1991af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  context->query_count_++;
2001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(context->Query(key));
2019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgDeclarationContext* DeclarationContext::GetInstance(Local<Value> data) {
2051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void* value = Local<External>::Cast(data)->Value();
206eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return static_cast<DeclarationContext*>(value);
2079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comv8::Handle<Value> DeclarationContext::Get(Local<String> key) {
2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return v8::Handle<Value>();
2129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comv8::Handle<Value> DeclarationContext::Set(Local<String> key,
2169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                          Local<Value> value) {
2179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return v8::Handle<Value>();
2189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2211af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgv8::Handle<Integer> DeclarationContext::Query(Local<String> key) {
2221af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  return v8::Handle<Integer>();
2239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test global declaration of a property the interceptor doesn't know
2279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// about and doesn't handle.
2289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Unknown) {
2292bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
2309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { DeclarationContext context;
2329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x; x",
2339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
2349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // declaration
2359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
2369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());
2379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
2389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { DeclarationContext context;
2409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x = 0; x",
2419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
2429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
2439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
2449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Number::New(0));
2459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
2469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { DeclarationContext context;
2489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("function x() { }; x",
2499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
2503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                  0,
2519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
2529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT);
2539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
2549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { DeclarationContext context;
2569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x; x",
2579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
2589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
259c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // declaration
2609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());
2619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
2629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { DeclarationContext context;
2649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x = 0; x",
2659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
2669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
267c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // declaration
2689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());  // SB 0 - BUG 1213579
2699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
2709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass PresentPropertyContext: public DeclarationContext {
2759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com protected:
2761af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  virtual v8::Handle<Integer> Query(Local<String> key) {
2771af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org    return Integer::New(v8::None);
2789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
2799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
2809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Present) {
2842bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
2859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { PresentPropertyContext context;
2879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x; x",
2889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
2899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
2909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
2919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_EXCEPTION);  // x is not defined!
2929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
2939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { PresentPropertyContext context;
2959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x = 0; x",
2969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
2979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // initialization
2989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
2999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Number::New(0));
3009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { PresentPropertyContext context;
3039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("function x() { }; x",
3049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
3053a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                  0,
3069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
3079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT);
3089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { PresentPropertyContext context;
3119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x; x",
312c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // access
313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // initialization
3149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // (re-)declaration
315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  EXPECT_RESULT, Undefined());
3169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { PresentPropertyContext context;
3199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x = 0; x",
320c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // access
321c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // initialization
3229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // (re-)declaration
323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  EXPECT_RESULT, Number::New(0));
3249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass AbsentPropertyContext: public DeclarationContext {
3309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com protected:
3311af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  virtual v8::Handle<Integer> Query(Local<String> key) {
3321af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org    return v8::Handle<Integer>();
3339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
3359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Absent) {
3382bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
3399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AbsentPropertyContext context;
3419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x; x",
3429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
3431af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org                  1,  // declaration
3449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
3459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());
3469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AbsentPropertyContext context;
3499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x = 0; x",
3509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
3519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
3529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
3539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Number::New(0));
3549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AbsentPropertyContext context;
3579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("function x() { }; x",
3589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
3593a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                  0,
3609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
3619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT);
3629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AbsentPropertyContext context;
3659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x; x",
3669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
3679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
368c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // declaration
3699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());
3709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AbsentPropertyContext context;
3739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x = 0; x",
3749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
3759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
376c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // declaration
3779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());  // SB 0 - BUG 1213579
3789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AbsentPropertyContext context;
3819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("if (false) { var x = 0 }; x",
3829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
3839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // declaration
3849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // declaration + initialization
3859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());
3869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass AppearingPropertyContext: public DeclarationContext {
3929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public:
3939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  enum State {
3949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    DECLARE,
3959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    INITIALIZE_IF_ASSIGN,
3969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    UNKNOWN
3979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  };
3989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  AppearingPropertyContext() : state_(DECLARE) { }
4009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com protected:
4021af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  virtual v8::Handle<Integer> Query(Local<String> key) {
4039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    switch (state_) {
4049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      case DECLARE:
4059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // Force declaration by returning that the
4069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // property is absent.
4079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        state_ = INITIALIZE_IF_ASSIGN;
4081af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org        return Handle<Integer>();
4099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      case INITIALIZE_IF_ASSIGN:
4109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // Return that the property is present so we only get the
4119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // setter called when initializing with a value.
4129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        state_ = UNKNOWN;
4131af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org        return Integer::New(v8::None);
4149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      default:
4153a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org        CHECK(state_ == UNKNOWN);
4169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        break;
4179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
4189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    // Do the lookup in the object.
4191af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org    return v8::Handle<Integer>();
4209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
4219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com private:
4239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  State state_;
4249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
4259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Appearing) {
4282bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
4299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AppearingPropertyContext context;
4319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x; x",
4329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
4339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // declaration
4349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
4359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());
4369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
4379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AppearingPropertyContext context;
4399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x = 0; x",
4409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
4419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
4429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
4439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Number::New(0));
4449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
4459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AppearingPropertyContext context;
4479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("function x() { }; x",
4489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  1,  // access
4493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                  0,
4509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
4519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT);
4529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
4539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AppearingPropertyContext context;
4559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x; x",
456c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // access
4579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
458c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // declaration
459c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  EXPECT_RESULT, Undefined());
4609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
4619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AppearingPropertyContext context;
4639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x = 0; x",
464c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // access
4659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  2,  // declaration + initialization
466c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  1,  // declaration
467c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  EXPECT_RESULT, Undefined());
468c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  // Result is undefined because declaration succeeded but
469c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  // initialization to 0 failed (due to context behavior).
4709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
4719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
4729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass ReappearingPropertyContext: public DeclarationContext {
4769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public:
4779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  enum State {
4789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    DECLARE,
4799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    DONT_DECLARE,
4809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    INITIALIZE,
4819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    UNKNOWN
4829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  };
4839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  ReappearingPropertyContext() : state_(DECLARE) { }
4859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com protected:
4871af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  virtual v8::Handle<Integer> Query(Local<String> key) {
4889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    switch (state_) {
4899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      case DECLARE:
4909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // Force the first declaration by returning that
4919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // the property is absent.
4929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        state_ = DONT_DECLARE;
4931af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org        return Handle<Integer>();
4949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      case DONT_DECLARE:
4959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // Ignore the second declaration by returning
4969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // that the property is already there.
4979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        state_ = INITIALIZE;
4981af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org        return Integer::New(v8::None);
4999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      case INITIALIZE:
5009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // Force an initialization by returning that
5019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // the property is absent. This will make sure
5029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // that the setter is called and it will not
5039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // lead to redeclaration conflicts (yet).
5049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        state_ = UNKNOWN;
5051af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org        return Handle<Integer>();
5069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      default:
5073a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org        CHECK(state_ == UNKNOWN);
5089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        break;
5099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
5109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    // Do the lookup in the object.
5111af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org    return Handle<Integer>();
5129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com private:
5159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  State state_;
5169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
5179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Reappearing) {
5202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
5219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { ReappearingPropertyContext context;
5239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x; var x = 0",
5249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
525c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  3,  // const declaration+initialization, var initialization
526c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  3,  // 2 x declaration + var initialization
527c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                  EXPECT_RESULT, Undefined());
5289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
5309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass ExistsInPrototypeContext: public DeclarationContext {
5349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com protected:
5351af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  virtual v8::Handle<Integer> Query(Local<String> key) {
5369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    // Let it seem that the property exists in the prototype object.
5371af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org    return Integer::New(v8::None);
5389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Use the prototype as the holder for the interceptors.
5419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  virtual Local<ObjectTemplate> GetHolder(Local<FunctionTemplate> function) {
5429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    return function->PrototypeTemplate();
5439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
5459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ExistsInPrototype) {
54888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  i::FLAG_es52_globals = true;
5492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
5509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Sanity check to make sure that the holder of the interceptor
5529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // really is the prototype object.
5539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { ExistsInPrototypeContext context;
5549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("this.x = 87; this.x",
5559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
5569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
5579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
5589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Number::New(87));
5599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { ExistsInPrototypeContext context;
5629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x; x",
5639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
564de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
565de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
566ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com                  EXPECT_RESULT, Undefined());
5679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { ExistsInPrototypeContext context;
5709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("var x = 0; x",
5719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
5729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
573de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
5749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Number::New(0));
5759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { ExistsInPrototypeContext context;
5789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x; x",
5799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
5809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
581de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
5829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());
5839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { ExistsInPrototypeContext context;
5869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("const x = 0; x",
5879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
5889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
589de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
5909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Number::New(0));
5919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
5939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass AbsentInPrototypeContext: public DeclarationContext {
5979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com protected:
5981af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  virtual v8::Handle<Integer> Query(Local<String> key) {
5999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    // Let it seem that the property is absent in the prototype object.
6001af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org    return Handle<Integer>();
6019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
6029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Use the prototype as the holder for the interceptors.
6049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  virtual Local<ObjectTemplate> GetHolder(Local<FunctionTemplate> function) {
6059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    return function->PrototypeTemplate();
6069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
6079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
6089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(AbsentInPrototype) {
61188d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  i::FLAG_es52_globals = true;
6122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
6139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  { AbsentInPrototypeContext context;
6159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    context.Check("if (false) { var x = 0; }; x",
6169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
6179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  0,
618de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
6199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  EXPECT_RESULT, Undefined());
6209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
6219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
622de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
623de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
624de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
625de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.orgclass ExistsInHiddenPrototypeContext: public DeclarationContext {
626de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org public:
627de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  ExistsInHiddenPrototypeContext() {
628de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    hidden_proto_ = FunctionTemplate::New();
629de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    hidden_proto_->SetHiddenPrototype(true);
630de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
631de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
632de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org protected:
633de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  virtual v8::Handle<Integer> Query(Local<String> key) {
634de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    // Let it seem that the property exists in the hidden prototype object.
635de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    return Integer::New(v8::None);
636de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
637de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
638de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Install the hidden prototype after the global object has been created.
639de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  virtual void PostInitializeContext(Handle<Context> context) {
640de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    Local<Object> global_object = context->Global();
641de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    Local<Object> hidden_proto = hidden_proto_->GetFunction()->NewInstance();
642de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    context->DetachGlobal();
643de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    context->Global()->SetPrototype(hidden_proto);
644de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    context->ReattachGlobal(global_object);
645de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
646de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
647de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Use the hidden prototype as the holder for the interceptors.
648de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  virtual Local<ObjectTemplate> GetHolder(Local<FunctionTemplate> function) {
649de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    return hidden_proto_->InstanceTemplate();
650de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
651de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
652de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org private:
653de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  Local<FunctionTemplate> hidden_proto_;
654de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org};
655de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
656de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
657de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.orgTEST(ExistsInHiddenPrototype) {
658de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  i::FLAG_es52_globals = true;
6592bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
660de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
661de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  { ExistsInHiddenPrototypeContext context;
662de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    context.Check("var x; x",
663de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  1,  // access
664de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
665de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  2,  // declaration + initialization
666de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  EXPECT_EXCEPTION);  // x is not defined!
667de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
668de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
669de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  { ExistsInHiddenPrototypeContext context;
670de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    context.Check("var x = 0; x",
671de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  1,  // access
672de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  1,  // initialization
673de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  2,  // declaration + initialization
674de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  EXPECT_RESULT, Number::New(0));
675de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
676de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
677de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  { ExistsInHiddenPrototypeContext context;
678de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    context.Check("function x() { }; x",
679de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
680de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
681de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
682de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  EXPECT_RESULT);
683de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
684de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
685de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // TODO(mstarzinger): The semantics of global const is vague.
686de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  { ExistsInHiddenPrototypeContext context;
687de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    context.Check("const x; x",
688de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
689de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
690de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  1,  // (re-)declaration
691de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  EXPECT_RESULT, Undefined());
692de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
693de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
694de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // TODO(mstarzinger): The semantics of global const is vague.
695de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  { ExistsInHiddenPrototypeContext context;
696de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    context.Check("const x = 0; x",
697de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
698de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  0,
699de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  1,  // (re-)declaration
700de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org                  EXPECT_RESULT, Number::New(0));
701de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
702de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org}
70346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
70446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
70546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
70646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgclass SimpleContext {
70746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org public:
70857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  SimpleContext()
70957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      : handle_scope_(Isolate::GetCurrent()),
71057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org        context_(Context::New(Isolate::GetCurrent())) {
71146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context_->Enter();
71246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
71346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
71457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  ~SimpleContext() {
71546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context_->Exit();
71646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
71746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
71846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  void Check(const char* source,
71946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org             Expectations expectations,
72046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org             v8::Handle<Value> value = Local<Value>()) {
7212bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    HandleScope scope(context_->GetIsolate());
72246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    TryCatch catcher;
72346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    catcher.SetVerbose(true);
72446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    Local<Script> script = Script::Compile(String::New(source));
72546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    if (expectations == EXPECT_ERROR) {
72646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      CHECK(script.IsEmpty());
72746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      return;
72846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    }
72946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    CHECK(!script.IsEmpty());
73046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    Local<Value> result = script->Run();
73146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    if (expectations == EXPECT_RESULT) {
73246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      CHECK(!catcher.HasCaught());
73346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      if (!value.IsEmpty()) {
73446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        CHECK_EQ(value, result);
73546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      }
73646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    } else {
73746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      CHECK(expectations == EXPECT_EXCEPTION);
73846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      CHECK(catcher.HasCaught());
73946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      if (!value.IsEmpty()) {
74046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        CHECK_EQ(value, catcher.Exception());
74146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      }
74246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    }
74346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
74446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
74546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org private:
74657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  HandleScope handle_scope_;
74757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Local<Context> context_;
74846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org};
74946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
75046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
7518e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgTEST(CrossScriptReferences) {
7522bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
75346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
75446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  { SimpleContext context;
75546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("var x = 1; x",
75646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(1));
75746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("var x = 2; x",
75846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(2));
75946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("const x = 3; x",
76046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(3));
76146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("const x = 4; x",
76246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(4));
76346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("x = 5; x",
76446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(5));
76546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("var x = 6; x",
76646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(6));
76746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("this.x",
76846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(6));
76946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("function x() { return 7 }; x()",
77046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(7));
77146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
77246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
77346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  { SimpleContext context;
77446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("const x = 1; x",
77546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(1));
77646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("var x = 2; x",  // assignment ignored
77746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(1));
77846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("const x = 3; x",
77946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(1));
78046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("x = 4; x",  // assignment ignored
78146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(1));
78246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("var x = 5; x",  // assignment ignored
78346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(1));
78446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("this.x",
78546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_RESULT, Number::New(1));
78646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context.Check("function x() { return 7 }; x",
78746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                  EXPECT_EXCEPTION);
78846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
7898e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
7908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
79146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
7928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgTEST(CrossScriptReferencesHarmony) {
79346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  i::FLAG_use_strict = true;
79446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  i::FLAG_harmony_scoping = true;
7958e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  i::FLAG_harmony_modules = true;
79646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
7972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
798355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
7998e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  const char* decs[] = {
8008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "var x = 1; x", "x", "this.x",
8018e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "function x() { return 1 }; x()", "x()", "this.x()",
8028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "let x = 1; x", "x", "this.x",
8038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "const x = 1; x", "x", "this.x",
8048e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "module x { export let a = 1 }; x.a", "x.a", "this.x.a",
8058e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    NULL
8068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  };
80746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
8088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  for (int i = 0; decs[i] != NULL; i += 3) {
8098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    SimpleContext context;
8108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    context.Check(decs[i], EXPECT_RESULT, Number::New(1));
8118e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    context.Check(decs[i+1], EXPECT_RESULT, Number::New(1));
812355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    // TODO(rossberg): The current ES6 draft spec does not reflect lexical
813355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    // bindings on the global object. However, this will probably change, in
814355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    // which case we reactivate the following test.
8158e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    if (i/3 < 2) context.Check(decs[i+2], EXPECT_RESULT, Number::New(1));
81646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
8178e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
81846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
81946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
8208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgTEST(CrossScriptConflicts) {
8218e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  i::FLAG_use_strict = true;
8228e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  i::FLAG_harmony_scoping = true;
8238e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  i::FLAG_harmony_modules = true;
82446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
8252bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(Isolate::GetCurrent());
82646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
8278e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  const char* firsts[] = {
8288e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "var x = 1; x",
8298e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "function x() { return 1 }; x()",
8308e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "let x = 1; x",
8318e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "const x = 1; x",
8328e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "module x { export let a = 1 }; x.a",
8338e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    NULL
8348e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  };
8358e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  const char* seconds[] = {
8368e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "var x = 2; x",
8378e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "function x() { return 2 }; x()",
8388e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "let x = 2; x",
8398e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "const x = 2; x",
8408e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    "module x { export let a = 2 }; x.a",
8418e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    NULL
8428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  };
84346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
8448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  for (int i = 0; firsts[i] != NULL; ++i) {
8458e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    for (int j = 0; seconds[j] != NULL; ++j) {
8468e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      SimpleContext context;
8478e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      context.Check(firsts[i], EXPECT_RESULT, Number::New(1));
8488e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      // TODO(rossberg): All tests should actually be errors in Harmony,
8498e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      // but we currently do not detect the cases where the first declaration
8508e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      // is not lexical.
8518e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      context.Check(seconds[j],
8528e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org                    i < 2 ? EXPECT_RESULT : EXPECT_ERROR, Number::New(2));
8538e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    }
85446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
85546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
856