128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
2c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Redistribution and use in source and binary forms, with or without
3c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// modification, are permitted provided that the following conditions are
4c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// met:
5c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//
6c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//     * Redistributions of source code must retain the above copyright
7c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//       notice, this list of conditions and the following disclaimer.
8c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//     * Redistributions in binary form must reproduce the above
9c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//       copyright notice, this list of conditions and the following
10c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//       disclaimer in the documentation and/or other materials provided
11c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//       with the distribution.
12c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//     * Neither the name of Google Inc. nor the names of its
13c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//       contributors may be used to endorse or promote products derived
14c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//       from this software without specific prior written permission.
15c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org//
16c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
28c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include <stdlib.h>
29c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
30c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "v8.h"
31c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
32c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "api.h"
33c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "cctest.h"
34c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "frames-inl.h"
35c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "string-stream.h"
36c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
37c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::ObjectTemplate;
38c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::Value;
39c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::Context;
40c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::Local;
41c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::String;
42c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::Script;
43c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::Function;
44c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::Extension;
45c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void handle_property(Local<String> name,
471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                            const v8::PropertyCallbackInfo<v8::Value>& info) {
48c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(v8_num(900));
50c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
51c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
523d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstatic void handle_property_2(Local<String> name,
533d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                              const v8::PropertyCallbackInfo<v8::Value>& info) {
543d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  ApiTestFuzzer::Fuzz();
553d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  info.GetReturnValue().Set(v8_num(902));
563d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org}
573d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org
58c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic void handle_property(const v8::FunctionCallbackInfo<v8::Value>& info) {
601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  ApiTestFuzzer::Fuzz();
611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  CHECK_EQ(0, info.Length());
621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  info.GetReturnValue().Set(v8_num(907));
631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
66c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(PropertyHandler) {
672bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext env;
682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(env->GetIsolate());
69c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
70c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  fun_templ->InstanceTemplate()->SetAccessor(v8_str("foo"), handle_property);
711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  Local<v8::FunctionTemplate> getter_templ =
721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org      v8::FunctionTemplate::New(handle_property);
731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  getter_templ->SetLength(0);
741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  fun_templ->
751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org      InstanceTemplate()->SetAccessorProperty(v8_str("bar"), getter_templ);
763d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  fun_templ->InstanceTemplate()->
773d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org      SetNativeDataProperty(v8_str("instance_foo"), handle_property);
783d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  fun_templ->SetNativeDataProperty(v8_str("object_foo"), handle_property_2);
79c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  Local<Function> fun = fun_templ->GetFunction();
80c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  env->Global()->Set(v8_str("Fun"), fun);
813d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  Local<Script> getter;
823d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  Local<Script> setter;
833d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  // check function instance accessors
843d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  getter = v8_compile("var obj = new Fun(); obj.instance_foo;");
85c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(900, getter->Run()->Int32Value());
863d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  setter = v8_compile("obj.instance_foo = 901;");
87c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(901, setter->Run()->Int32Value());
881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  getter = v8_compile("obj.bar;");
891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  CHECK_EQ(907, getter->Run()->Int32Value());
901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  setter = v8_compile("obj.bar = 908;");
911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  CHECK_EQ(908, setter->Run()->Int32Value());
923d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  // check function static accessors
933d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  getter = v8_compile("Fun.object_foo;");
943d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  CHECK_EQ(902, getter->Run()->Int32Value());
953d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  setter = v8_compile("Fun.object_foo = 903;");
963d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  CHECK_EQ(903, setter->Run()->Int32Value());
97c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
98c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
99c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void GetIntValue(Local<String> property,
1011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        const v8::PropertyCallbackInfo<v8::Value>& info) {
102c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
103c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  int* value =
104c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      static_cast<int*>(v8::Handle<v8::External>::Cast(info.Data())->Value());
1051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(v8_num(*value));
106c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
107c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
108c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
109c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgstatic void SetIntValue(Local<String> property,
110c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                        Local<Value> value,
1111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        const v8::PropertyCallbackInfo<void>& info) {
112c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  int* field =
113c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      static_cast<int*>(v8::Handle<v8::External>::Cast(info.Data())->Value());
114c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  *field = value->Int32Value();
115c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
116c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
117c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgint foo, bar, baz;
118c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
119c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(GlobalVariableAccess) {
120c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  foo = 0;
121c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  bar = -4;
122c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  baz = 10;
123528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
124c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New();
1250cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  templ->InstanceTemplate()->SetAccessor(
1260cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      v8_str("foo"), GetIntValue, SetIntValue,
1270cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      v8::External::New(CcTest::isolate(), &foo));
1280cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  templ->InstanceTemplate()->SetAccessor(
1290cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      v8_str("bar"), GetIntValue, SetIntValue,
1300cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      v8::External::New(CcTest::isolate(), &bar));
1310cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  templ->InstanceTemplate()->SetAccessor(
1320cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      v8_str("baz"), GetIntValue, SetIntValue,
1330cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      v8::External::New(CcTest::isolate(), &baz));
134c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  LocalContext env(0, templ->InstanceTemplate());
135c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8_compile("foo = (++bar) + baz")->Run();
136c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(bar, -3);
137c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(foo, 7);
138c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
139c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
140c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic int x_register[2] = {0, 0};
142c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgstatic v8::Handle<v8::Object> x_receiver;
143c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgstatic v8::Handle<v8::Object> x_holder;
144c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgtemplate<class Info>
1461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic void XGetter(const Info& info, int offset) {
147c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
148528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
14928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  CHECK_EQ(isolate, info.GetIsolate());
150c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(x_receiver, info.This());
1511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  info.GetReturnValue().Set(v8_num(x_register[offset]));
1521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
1531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic void XGetter(Local<String> name,
1561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                    const v8::PropertyCallbackInfo<v8::Value>& info) {
157c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(x_holder, info.Holder());
1581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  XGetter(info, 0);
159c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
160c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
161c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic void XGetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
1632c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(x_receiver, info.Holder());
1641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  XGetter(info, 1);
1651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
1661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgtemplate<class Info>
1691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic void XSetter(Local<Value> value, const Info& info, int offset) {
170528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
17128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  CHECK_EQ(isolate, info.GetIsolate());
172c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(x_holder, info.This());
1732c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(x_holder, info.Holder());
1741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  x_register[offset] = value->Int32Value();
1751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
1761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic void XSetter(Local<String> name,
1791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                    Local<Value> value,
1801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                    const v8::PropertyCallbackInfo<void>& info) {
1811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  XSetter(value, info, 0);
1821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
1831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgstatic void XSetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
1861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  CHECK_EQ(1, info.Length());
1871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  XSetter(info[0], info, 1);
188c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
189c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
190c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
191c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(AccessorIC) {
1922bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext context;
1932bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(context->GetIsolate());
194c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
1951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  obj->SetAccessor(v8_str("x0"), XGetter, XSetter);
1961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  obj->SetAccessorProperty(v8_str("x1"),
1971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                           v8::FunctionTemplate::New(XGetter),
1981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                           v8::FunctionTemplate::New(XSetter));
199c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  x_holder = obj->NewInstance();
200c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  context->Global()->Set(v8_str("holder"), x_holder);
201c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  x_receiver = v8::Object::New();
202c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  context->Global()->Set(v8_str("obj"), x_receiver);
203c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(CompileRun(
204c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    "obj.__proto__ = holder;"
205c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    "var result = [];"
2062c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    "var key_0 = 'x0';"
2072c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    "var key_1 = 'x1';"
208c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    "for (var i = 0; i < 10; i++) {"
2091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    "  holder.x0 = i;"
2101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    "  result.push(obj.x0);"
2112c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    "  holder.x1 = i;"
2121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    "  result.push(obj.x1);"
2132c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    "  holder[key_0] = i;"
2142c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    "  result.push(obj[key_0]);"
2152c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    "  holder[key_1] = i;"
2162c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    "  result.push(obj[key_1]);"
217c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    "}"
218c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    "result"));
2192c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(40, array->Length());
2202c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  for (int i = 0; i < 40; i++) {
221c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    v8::Handle<Value> entry = array->Get(v8::Integer::New(i));
2222c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    CHECK_EQ(v8::Integer::New(i/4), entry);
223c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
224c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
225c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
226c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
2271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void AccessorProhibitsOverwritingGetter(
228c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    Local<String> name,
2291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::PropertyCallbackInfo<v8::Value>& info) {
230c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
2311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(true);
232c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
233c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
234c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
235c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(AccessorProhibitsOverwriting) {
236c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  LocalContext context;
2372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(context->GetIsolate());
238c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  Local<ObjectTemplate> templ = ObjectTemplate::New();
239c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  templ->SetAccessor(v8_str("x"),
240c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                     AccessorProhibitsOverwritingGetter,
241c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                     0,
242c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                     v8::Handle<Value>(),
243c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                     v8::PROHIBITS_OVERWRITING,
244c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                     v8::ReadOnly);
245c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  Local<v8::Object> instance = templ->NewInstance();
246c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  context->Global()->Set(v8_str("obj"), instance);
247c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  Local<Value> value = CompileRun(
248c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj.__defineGetter__('x', function() { return false; });"
249c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj.x");
250c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK(value->BooleanValue());
251c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  value = CompileRun(
252c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "var setter_called = false;"
253c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj.__defineSetter__('x', function() { setter_called = true; });"
254c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj.x = 42;"
255c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "setter_called");
256c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK(!value->BooleanValue());
257c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  value = CompileRun(
258c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj2 = {};"
259c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj2.__proto__ = obj;"
260c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj2.__defineGetter__('x', function() { return false; });"
261c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj2.x");
262c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK(value->BooleanValue());
263c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  value = CompileRun(
264c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "var setter_called = false;"
265c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj2 = {};"
266c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj2.__proto__ = obj;"
267c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj2.__defineSetter__('x', function() { setter_called = true; });"
268c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "obj2.x = 42;"
269c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "setter_called");
270c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK(!value->BooleanValue());
271c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
272c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
273c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
274c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgtemplate <int C>
2751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void HandleAllocatingGetter(
2761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    Local<String> name,
2771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::PropertyCallbackInfo<v8::Value>& info) {
278c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
279c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  for (int i = 0; i < C; i++)
280f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    v8::String::NewFromUtf8(info.GetIsolate(), "foo");
281f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "foo"));
282c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
283c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
284c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
285c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(HandleScopePop) {
2862bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext context;
2872bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(context->GetIsolate());
288c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
289c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  obj->SetAccessor(v8_str("one"), HandleAllocatingGetter<1>);
290c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  obj->SetAccessor(v8_str("many"), HandleAllocatingGetter<1024>);
291c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::Object> inst = obj->NewInstance();
292f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  context->Global()->Set(v8::String::NewFromUtf8(context->GetIsolate(), "obj"),
293f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                         inst);
294528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  i::Isolate* isolate = CcTest::i_isolate();
29509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  int count_before = i::HandleScope::NumberOfHandles(isolate);
296c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  {
2972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    v8::HandleScope scope(context->GetIsolate());
298c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    CompileRun(
299c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org        "for (var i = 0; i < 1000; i++) {"
300c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org        "  obj.one;"
301c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org        "  obj.many;"
302c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org        "}");
303c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
30409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  int count_after = i::HandleScope::NumberOfHandles(isolate);
305c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(count_before, count_after);
306c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
307c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
3081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void CheckAccessorArgsCorrect(
3091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    Local<String> name,
3101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::PropertyCallbackInfo<v8::Value>& info) {
311528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(info.GetIsolate() == CcTest::isolate());
312c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK(info.This() == info.Holder());
313f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  CHECK(
314f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      info.Data()->Equals(v8::String::NewFromUtf8(CcTest::isolate(), "data")));
315c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
316528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(info.GetIsolate() == CcTest::isolate());
317c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK(info.This() == info.Holder());
318f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  CHECK(
319f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      info.Data()->Equals(v8::String::NewFromUtf8(CcTest::isolate(), "data")));
320528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
321528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(info.GetIsolate() == CcTest::isolate());
322c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK(info.This() == info.Holder());
323f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  CHECK(
324f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      info.Data()->Equals(v8::String::NewFromUtf8(CcTest::isolate(), "data")));
3251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(17);
326c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
327c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
328e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
329c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(DirectCall) {
3302bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext context;
3312bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(context->GetIsolate());
332c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
333c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  obj->SetAccessor(v8_str("xxx"),
334c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                   CheckAccessorArgsCorrect,
335c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                   NULL,
336f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                   v8::String::NewFromUtf8(context->GetIsolate(), "data"));
337c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::Object> inst = obj->NewInstance();
338f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  context->Global()->Set(v8::String::NewFromUtf8(context->GetIsolate(), "obj"),
339f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                         inst);
340f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  Local<Script> scr = v8::Script::Compile(
341f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      v8::String::NewFromUtf8(context->GetIsolate(), "obj.xxx"));
342c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  for (int i = 0; i < 10; i++) {
343c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    Local<Value> result = scr->Run();
344c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    CHECK(!result.IsEmpty());
345c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    CHECK_EQ(17, result->Int32Value());
346c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
347c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
348c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
3491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void EmptyGetter(Local<String> name,
3501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        const v8::PropertyCallbackInfo<v8::Value>& info) {
351c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CheckAccessorArgsCorrect(name, info);
352c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
353c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CheckAccessorArgsCorrect(name, info);
3541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(v8::Handle<v8::Value>());
355c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
356c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
357e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
358c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(EmptyResult) {
3592bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext context;
360cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  v8::Isolate* isolate = context->GetIsolate();
361cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  v8::HandleScope scope(isolate);
362c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
363f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  obj->SetAccessor(v8_str("xxx"), EmptyGetter, NULL,
364f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                   v8::String::NewFromUtf8(isolate, "data"));
365c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::Object> inst = obj->NewInstance();
366f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  context->Global()->Set(v8::String::NewFromUtf8(isolate, "obj"), inst);
367f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  Local<Script> scr =
368f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      v8::Script::Compile(v8::String::NewFromUtf8(isolate, "obj.xxx"));
369c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  for (int i = 0; i < 10; i++) {
370c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    Local<Value> result = scr->Run();
371cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    CHECK(result == v8::Undefined(isolate));
372c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
373c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
374c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
375c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
376c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(NoReuseRegress) {
377c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // Check that the IC generated for the one test doesn't get reused
378c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // for the other.
379cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
380cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  v8::HandleScope scope(isolate);
381c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  {
382c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
383f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    obj->SetAccessor(v8_str("xxx"), EmptyGetter, NULL,
384f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                     v8::String::NewFromUtf8(isolate, "data"));
385c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    LocalContext context;
386c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    v8::Handle<v8::Object> inst = obj->NewInstance();
387f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    context->Global()->Set(v8::String::NewFromUtf8(isolate, "obj"), inst);
388f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    Local<Script> scr =
389f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org        v8::Script::Compile(v8::String::NewFromUtf8(isolate, "obj.xxx"));
390c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    for (int i = 0; i < 2; i++) {
391c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      Local<Value> result = scr->Run();
392cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org      CHECK(result == v8::Undefined(isolate));
393c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    }
394c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
395c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  {
396c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
397c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    obj->SetAccessor(v8_str("xxx"),
398c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                     CheckAccessorArgsCorrect,
399c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                     NULL,
400f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                     v8::String::NewFromUtf8(isolate, "data"));
401c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    LocalContext context;
402c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    v8::Handle<v8::Object> inst = obj->NewInstance();
403f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    context->Global()->Set(v8::String::NewFromUtf8(isolate, "obj"), inst);
404f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    Local<Script> scr =
405f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org        v8::Script::Compile(v8::String::NewFromUtf8(isolate, "obj.xxx"));
406c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    for (int i = 0; i < 10; i++) {
407c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      Local<Value> result = scr->Run();
408c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      CHECK(!result.IsEmpty());
409c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      CHECK_EQ(17, result->Int32Value());
410c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    }
411c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
412c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
413c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
4141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void ThrowingGetAccessor(
4151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    Local<String> name,
4161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::PropertyCallbackInfo<v8::Value>& info) {
417c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
418cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  info.GetIsolate()->ThrowException(v8_str("g"));
419c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
420c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
421c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
422c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgstatic void ThrowingSetAccessor(Local<String> name,
423c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                                Local<Value> value,
4241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                const v8::PropertyCallbackInfo<void>& info) {
425cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  info.GetIsolate()->ThrowException(value);
426c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
427c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
428c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
429c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(Regress1054726) {
4302bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext env;
4312bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(env->GetIsolate());
432c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
433c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  obj->SetAccessor(v8_str("x"),
434c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                   ThrowingGetAccessor,
435c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                   ThrowingSetAccessor,
436c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org                   Local<Value>());
437c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
438c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  env->Global()->Set(v8_str("obj"), obj->NewInstance());
439c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
440c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // Use the throwing property setter/getter in a loop to force
441c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // the accessor ICs to be initialized.
442c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<Value> result;
443c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  result = Script::Compile(v8_str(
444c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "var result = '';"
445c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "for (var i = 0; i < 5; i++) {"
446c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "  try { obj.x; } catch (e) { result += e; }"
447c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "}; result"))->Run();
448c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(v8_str("ggggg"), result);
449c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
450f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  result = Script::Compile(String::NewFromUtf8(
451f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      env->GetIsolate(),
452c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "var result = '';"
453c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "for (var i = 0; i < 5; i++) {"
454c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "  try { obj.x = i; } catch (e) { result += e; }"
455c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "}; result"))->Run();
456c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(v8_str("01234"), result);
457c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
458c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
459c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
4601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void AllocGetter(Local<String> name,
4611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        const v8::PropertyCallbackInfo<v8::Value>& info) {
462c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ApiTestFuzzer::Fuzz();
4639f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  info.GetReturnValue().Set(v8::Array::New(info.GetIsolate(), 1000));
464c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
465c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
466c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
467c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(Gc) {
4682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext env;
4692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(env->GetIsolate());
470c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
471c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  obj->SetAccessor(v8_str("xxx"), AllocGetter);
472c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  env->Global()->Set(v8_str("obj"), obj->NewInstance());
473f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  Script::Compile(String::NewFromUtf8(
474f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      env->GetIsolate(),
475c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "var last = [];"
476c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "for (var i = 0; i < 2048; i++) {"
477c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "  var result = obj.xxx;"
478c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "  result[0] = last;"
479c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "  last = result;"
480c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "}"))->Run();
481c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
482c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
483c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
4841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void StackCheck(Local<String> name,
4851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                       const v8::PropertyCallbackInfo<v8::Value>& info) {
486c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  i::StackFrameIterator iter(reinterpret_cast<i::Isolate*>(info.GetIsolate()));
487c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  for (int i = 0; !iter.done(); i++) {
488c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    i::StackFrame* frame = iter.frame();
489c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    CHECK(i != 0 || (frame->type() == i::StackFrame::EXIT));
49074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org    i::Code* code = frame->LookupCode();
491ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    CHECK(code->IsCode());
492c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    i::Address pc = frame->pc();
493c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    CHECK(code->contains(pc));
494c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    iter.Advance();
495c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
496c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
497c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
498c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
499c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(StackIteration) {
5002bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext env;
5012bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(env->GetIsolate());
502c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
5033d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate());
5043d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  i::StringStream::ClearMentionedObjectCache(isolate);
505c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  obj->SetAccessor(v8_str("xxx"), StackCheck);
506c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  env->Global()->Set(v8_str("obj"), obj->NewInstance());
507f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  Script::Compile(String::NewFromUtf8(
508f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      env->GetIsolate(),
509c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "function foo() {"
510c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "  return obj.xxx;"
511c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "}"
512c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "for (var i = 0; i < 100; i++) {"
513c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "  foo();"
514c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "}"))->Run();
515c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
516c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
517c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
5181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void AllocateHandles(Local<String> name,
5191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                            const v8::PropertyCallbackInfo<v8::Value>& info) {
520c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  for (int i = 0; i < i::kHandleBlockSize + 1; i++) {
521cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    v8::Local<v8::Value>::New(info.GetIsolate(), name);
522c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
5231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(v8::Integer::New(100));
524c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
525c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
526c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
527c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTHREADED_TEST(HandleScopeSegment) {
528c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // Check that we can return values past popping of handle scope
529c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // segments.
5302bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  LocalContext env;
5312bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(env->GetIsolate());
532c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
533c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  obj->SetAccessor(v8_str("xxx"), AllocateHandles);
534c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  env->Global()->Set(v8_str("obj"), obj->NewInstance());
535f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::Handle<v8::Value> result = Script::Compile(String::NewFromUtf8(
536f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      env->GetIsolate(),
537c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "var result;"
538c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "for (var i = 0; i < 4; i++)"
539c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "  result = obj.xxx;"
540c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      "result;"))->Run();
541c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(100, result->Int32Value());
542c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
5438e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
5448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
5451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid JSONStringifyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
5469f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  v8::Handle<v8::Array> array = v8::Array::New(info.GetIsolate(), 1);
5478e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  array->Set(0, v8_str("regress"));
5481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(array);
5498e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
5508e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
5518e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
5521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid JSONStringifyGetter(Local<String> name,
5531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                         const v8::PropertyCallbackInfo<v8::Value>& info) {
5541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  info.GetReturnValue().Set(v8_str("crbug-161028"));
5558e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
5568e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
5578e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
5588e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgTHREADED_TEST(JSONStringifyNamedInterceptorObject) {
5598e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  LocalContext env;
5602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(env->GetIsolate());
5618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
5628e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
5638e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  obj->SetNamedPropertyHandler(
5648e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      JSONStringifyGetter, NULL, NULL, NULL, JSONStringifyEnumerator);
5658e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  env->Global()->Set(v8_str("obj"), obj->NewInstance());
5668e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  v8::Handle<v8::String> expected = v8_str("{\"regress\":\"crbug-161028\"}");
5678e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  CHECK(CompileRun("JSON.stringify(obj)")->Equals(expected));
5688e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
569350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org
570350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org
571528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgTHREADED_TEST(AccessorPropertyCrossContext) {
572350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  LocalContext env;
573350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  v8::Isolate* isolate = env->GetIsolate();
574350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  v8::HandleScope scope(isolate);
575350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  v8::Handle<v8::Function> fun = v8::Function::New(isolate, handle_property);
576350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  LocalContext switch_context;
577350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  switch_context->Global()->Set(v8_str("fun"), fun);
578350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  v8::TryCatch try_catch;
579350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  CompileRun(
580350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org      "var o = Object.create(null, { n: { get:fun } });"
581350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org      "for (var i = 0; i < 10; i++) o.n;");
582350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org  CHECK(!try_catch.HasCaught());
583350e5553d44186be95896c4a5ec77bc9ca3dfb52mstarzinger@chromium.org}
584