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