| Index: test/cctest/test-unscopables-hidden-prototype.cc
|
| diff --git a/test/cctest/test-unscopables-hidden-prototype.cc b/test/cctest/test-unscopables-hidden-prototype.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8d4efd6266370197629997ef63166b9b37db8a7f
|
| --- /dev/null
|
| +++ b/test/cctest/test-unscopables-hidden-prototype.cc
|
| @@ -0,0 +1,105 @@
|
| +// Copyright 2014 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <stdlib.h>
|
| +
|
| +#include "src/v8.h"
|
| +#include "test/cctest/cctest.h"
|
| +
|
| +namespace {
|
| +
|
| +
|
| +static void Cleanup() {
|
| + CompileRun(
|
| + "delete object.x;"
|
| + "delete hidden_prototype.x;"
|
| + "delete object[Symbol.unscopables];"
|
| + "delete hidden_prototype[Symbol.unscopables];");
|
| +}
|
| +
|
| +
|
| +TEST(Unscopables) {
|
| + i::FLAG_harmony_unscopables = true;
|
| +
|
| + LocalContext context;
|
| + v8::Isolate* isolate = context->GetIsolate();
|
| + v8::HandleScope handle_scope(isolate);
|
| +
|
| + v8::Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate);
|
| + v8::Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
|
| +
|
| + t1->SetHiddenPrototype(true);
|
| +
|
| + v8::Local<v8::Object> object = t0->GetFunction()->NewInstance();
|
| + v8::Local<v8::Object> hidden_prototype = t1->GetFunction()->NewInstance();
|
| +
|
| + object->SetPrototype(hidden_prototype);
|
| +
|
| + context->Global()->Set(v8_str("object"), object);
|
| + context->Global()->Set(v8_str("hidden_prototype"), hidden_prototype);
|
| +
|
| + CHECK_EQ(1, CompileRun(
|
| + "var result;"
|
| + "var x = 0;"
|
| + "object.x = 1;"
|
| + "with (object) {"
|
| + " result = x;"
|
| + "}"
|
| + "result")->Int32Value());
|
| +
|
| + Cleanup();
|
| + CHECK_EQ(2, CompileRun(
|
| + "var result;"
|
| + "var x = 0;"
|
| + "hidden_prototype.x = 2;"
|
| + "with (object) {"
|
| + " result = x;"
|
| + "}"
|
| + "result")->Int32Value());
|
| +
|
| + Cleanup();
|
| + CHECK_EQ(0, CompileRun(
|
| + "var result;"
|
| + "var x = 0;"
|
| + "object.x = 3;"
|
| + "object[Symbol.unscopables] = {x: true};"
|
| + "with (object) {"
|
| + " result = x;"
|
| + "}"
|
| + "result")->Int32Value());
|
| +
|
| + Cleanup();
|
| + CHECK_EQ(0, CompileRun(
|
| + "var result;"
|
| + "var x = 0;"
|
| + "hidden_prototype.x = 4;"
|
| + "hidden_prototype[Symbol.unscopables] = {x: true};"
|
| + "with (object) {"
|
| + " result = x;"
|
| + "}"
|
| + "result")->Int32Value());
|
| +
|
| + Cleanup();
|
| + CHECK_EQ(0, CompileRun(
|
| + "var result;"
|
| + "var x = 0;"
|
| + "object.x = 5;"
|
| + "hidden_prototype[Symbol.unscopables] = {x: true};"
|
| + "with (object) {"
|
| + " result = x;"
|
| + "}"
|
| + "result;")->Int32Value());
|
| +
|
| + Cleanup();
|
| + CHECK_EQ(0, CompileRun(
|
| + "var result;"
|
| + "var x = 0;"
|
| + "hidden_prototype.x = 6;"
|
| + "object[Symbol.unscopables] = {x: true};"
|
| + "with (object) {"
|
| + " result = x;"
|
| + "}"
|
| + "result")->Int32Value());
|
| +}
|
| +}
|
|
|