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