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