19d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 29d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 39d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// found in the LICENSE file. 49d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 59d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org#include <stdlib.h> 69d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 79d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org#include "src/v8.h" 89d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org#include "test/cctest/cctest.h" 99d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 109d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgnamespace { 119d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 129d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 139d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgstatic void Cleanup() { 149d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org CompileRun( 159d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "delete object.x;" 169d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "delete hidden_prototype.x;" 179d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "delete object[Symbol.unscopables];" 189d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "delete hidden_prototype[Symbol.unscopables];"); 199d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 209d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 219d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 229d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgTEST(Unscopables) { 239d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org LocalContext context; 249d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org v8::Isolate* isolate = context->GetIsolate(); 259d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org v8::HandleScope handle_scope(isolate); 269d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 279d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org v8::Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); 289d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org v8::Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); 299d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 309d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org t1->SetHiddenPrototype(true); 319d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 329d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org v8::Local<v8::Object> object = t0->GetFunction()->NewInstance(); 339d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org v8::Local<v8::Object> hidden_prototype = t1->GetFunction()->NewInstance(); 349d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 359d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org object->SetPrototype(hidden_prototype); 369d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 379d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org context->Global()->Set(v8_str("object"), object); 389d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org context->Global()->Set(v8_str("hidden_prototype"), hidden_prototype); 399d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 409d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org CHECK_EQ(1, CompileRun( 419d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var result;" 429d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var x = 0;" 439d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "object.x = 1;" 449d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "with (object) {" 459d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org " result = x;" 469d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "}" 479d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "result")->Int32Value()); 489d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 499d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Cleanup(); 509d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org CHECK_EQ(2, CompileRun( 519d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var result;" 529d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var x = 0;" 539d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "hidden_prototype.x = 2;" 549d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "with (object) {" 559d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org " result = x;" 569d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "}" 579d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "result")->Int32Value()); 589d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 599d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Cleanup(); 609d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org CHECK_EQ(0, CompileRun( 619d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var result;" 629d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var x = 0;" 639d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "object.x = 3;" 649d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "object[Symbol.unscopables] = {x: true};" 659d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "with (object) {" 669d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org " result = x;" 679d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "}" 689d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "result")->Int32Value()); 699d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 709d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Cleanup(); 719d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org CHECK_EQ(0, CompileRun( 729d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var result;" 739d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var x = 0;" 749d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "hidden_prototype.x = 4;" 759d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "hidden_prototype[Symbol.unscopables] = {x: true};" 769d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "with (object) {" 779d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org " result = x;" 789d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "}" 799d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "result")->Int32Value()); 809d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 819d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Cleanup(); 829d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org CHECK_EQ(0, CompileRun( 839d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var result;" 849d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var x = 0;" 859d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "object.x = 5;" 869d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "hidden_prototype[Symbol.unscopables] = {x: true};" 879d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "with (object) {" 889d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org " result = x;" 899d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "}" 909d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "result;")->Int32Value()); 919d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 929d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Cleanup(); 939d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org CHECK_EQ(0, CompileRun( 949d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var result;" 959d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var x = 0;" 969d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "hidden_prototype.x = 6;" 979d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "object[Symbol.unscopables] = {x: true};" 989d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "with (object) {" 999d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org " result = x;" 1009d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "}" 1019d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "result")->Int32Value()); 1029d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 1039d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 104