Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: test/cctest/test-api.cc

Issue 124943004: Prepare removal of ObjectTemplate::New without Isolate parameter. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Do not remove ObjectTemplate::New() yet. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/test-accessors.cc ('k') | test/cctest/test-assembler-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 static void SimpleCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { 1096 static void SimpleCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
1097 ApiTestFuzzer::Fuzz(); 1097 ApiTestFuzzer::Fuzz();
1098 CheckReturnValue(info, FUNCTION_ADDR(SimpleCallback)); 1098 CheckReturnValue(info, FUNCTION_ADDR(SimpleCallback));
1099 info.GetReturnValue().Set(v8_num(51423 + info.Length())); 1099 info.GetReturnValue().Set(v8_num(51423 + info.Length()));
1100 } 1100 }
1101 1101
1102 1102
1103 template<typename Callback> 1103 template<typename Callback>
1104 static void TestSimpleCallback(Callback callback) { 1104 static void TestSimpleCallback(Callback callback) {
1105 LocalContext env; 1105 LocalContext env;
1106 v8::HandleScope scope(env->GetIsolate()); 1106 v8::Isolate* isolate = env->GetIsolate();
1107 v8::HandleScope scope(isolate);
1107 1108
1108 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); 1109 v8::Handle<v8::ObjectTemplate> object_template =
1109 object_template->Set(env->GetIsolate(), "callback", 1110 v8::ObjectTemplate::New(isolate);
1110 v8::FunctionTemplate::New(env->GetIsolate(), callback)); 1111 object_template->Set(isolate, "callback",
1112 v8::FunctionTemplate::New(isolate, callback));
1111 v8::Local<v8::Object> object = object_template->NewInstance(); 1113 v8::Local<v8::Object> object = object_template->NewInstance();
1112 (*env)->Global()->Set(v8_str("callback_object"), object); 1114 (*env)->Global()->Set(v8_str("callback_object"), object);
1113 v8::Handle<v8::Script> script; 1115 v8::Handle<v8::Script> script;
1114 script = v8_compile("callback_object.callback(17)"); 1116 script = v8_compile("callback_object.callback(17)");
1115 for (int i = 0; i < 30; i++) { 1117 for (int i = 0; i < 30; i++) {
1116 CHECK_EQ(51424, script->Run()->Int32Value()); 1118 CHECK_EQ(51424, script->Run()->Int32Value());
1117 } 1119 }
1118 script = v8_compile("callback_object.callback(17, 24)"); 1120 script = v8_compile("callback_object.callback(17, 24)");
1119 for (int i = 0; i < 30; i++) { 1121 for (int i = 0; i < 30; i++) {
1120 CHECK_EQ(51425, script->Run()->Int32Value()); 1122 CHECK_EQ(51425, script->Run()->Int32Value());
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 v8::Handle<v8::Object> object; 1203 v8::Handle<v8::Object> object;
1202 if (!fast_return_value_object_is_empty) { 1204 if (!fast_return_value_object_is_empty) {
1203 object = Object::New(info.GetIsolate()); 1205 object = Object::New(info.GetIsolate());
1204 } 1206 }
1205 info.GetReturnValue().Set(object); 1207 info.GetReturnValue().Set(object);
1206 } 1208 }
1207 1209
1208 template<typename T> 1210 template<typename T>
1209 Handle<Value> TestFastReturnValues() { 1211 Handle<Value> TestFastReturnValues() {
1210 LocalContext env; 1212 LocalContext env;
1211 v8::EscapableHandleScope scope(env->GetIsolate()); 1213 v8::Isolate* isolate = env->GetIsolate();
1212 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); 1214 v8::EscapableHandleScope scope(isolate);
1215 v8::Handle<v8::ObjectTemplate> object_template =
1216 v8::ObjectTemplate::New(isolate);
1213 v8::FunctionCallback callback = &FastReturnValueCallback<T>; 1217 v8::FunctionCallback callback = &FastReturnValueCallback<T>;
1214 object_template->Set(env->GetIsolate(), "callback", 1218 object_template->Set(isolate, "callback",
1215 v8::FunctionTemplate::New(env->GetIsolate(), callback)); 1219 v8::FunctionTemplate::New(isolate, callback));
1216 v8::Local<v8::Object> object = object_template->NewInstance(); 1220 v8::Local<v8::Object> object = object_template->NewInstance();
1217 (*env)->Global()->Set(v8_str("callback_object"), object); 1221 (*env)->Global()->Set(v8_str("callback_object"), object);
1218 return scope.Escape(CompileRun("callback_object.callback()")); 1222 return scope.Escape(CompileRun("callback_object.callback()"));
1219 } 1223 }
1220 1224
1221 1225
1222 THREADED_PROFILED_TEST(FastReturnValues) { 1226 THREADED_PROFILED_TEST(FastReturnValues) {
1223 LocalContext env; 1227 LocalContext env;
1224 v8::HandleScope scope(CcTest::isolate()); 1228 v8::HandleScope scope(CcTest::isolate());
1225 v8::Handle<v8::Value> value; 1229 v8::Handle<v8::Value> value;
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
1792 v8::Handle<Value> result(script->Run()); 1796 v8::Handle<Value> result(script->Run());
1793 CHECK_EQ(13.4, result->NumberValue()); 1797 CHECK_EQ(13.4, result->NumberValue());
1794 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value()); 1798 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value());
1795 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value()); 1799 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value());
1796 } 1800 }
1797 1801
1798 1802
1799 THREADED_TEST(ObjectTemplate) { 1803 THREADED_TEST(ObjectTemplate) {
1800 v8::Isolate* isolate = CcTest::isolate(); 1804 v8::Isolate* isolate = CcTest::isolate();
1801 v8::HandleScope scope(isolate); 1805 v8::HandleScope scope(isolate);
1802 Local<ObjectTemplate> templ1 = ObjectTemplate::New(); 1806 Local<ObjectTemplate> templ1 = ObjectTemplate::New(isolate);
1803 templ1->Set(isolate, "x", v8_num(10)); 1807 templ1->Set(isolate, "x", v8_num(10));
1804 templ1->Set(isolate, "y", v8_num(13)); 1808 templ1->Set(isolate, "y", v8_num(13));
1805 LocalContext env; 1809 LocalContext env;
1806 Local<v8::Object> instance1 = templ1->NewInstance(); 1810 Local<v8::Object> instance1 = templ1->NewInstance();
1807 env->Global()->Set(v8_str("p"), instance1); 1811 env->Global()->Set(v8_str("p"), instance1);
1808 CHECK(v8_compile("(p.x == 10)")->Run()->BooleanValue()); 1812 CHECK(v8_compile("(p.x == 10)")->Run()->BooleanValue());
1809 CHECK(v8_compile("(p.y == 13)")->Run()->BooleanValue()); 1813 CHECK(v8_compile("(p.y == 13)")->Run()->BooleanValue());
1810 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); 1814 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate);
1811 fun->PrototypeTemplate()->Set(isolate, "nirk", v8_num(123)); 1815 fun->PrototypeTemplate()->Set(isolate, "nirk", v8_num(123));
1812 Local<ObjectTemplate> templ2 = fun->InstanceTemplate(); 1816 Local<ObjectTemplate> templ2 = fun->InstanceTemplate();
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
2467 v8::Handle<Value> function = 2471 v8::Handle<Value> function =
2468 args.This()->Get(v8_str("callFunctionRecursively")); 2472 args.This()->Get(v8_str("callFunctionRecursively"));
2469 args.GetReturnValue().Set( 2473 args.GetReturnValue().Set(
2470 function.As<Function>()->Call(args.This(), 0, NULL)); 2474 function.As<Function>()->Call(args.This(), 0, NULL));
2471 } 2475 }
2472 2476
2473 2477
2474 THREADED_TEST(DeepCrossLanguageRecursion) { 2478 THREADED_TEST(DeepCrossLanguageRecursion) {
2475 v8::Isolate* isolate = CcTest::isolate(); 2479 v8::Isolate* isolate = CcTest::isolate();
2476 v8::HandleScope scope(isolate); 2480 v8::HandleScope scope(isolate);
2477 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); 2481 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate);
2478 global->Set(v8_str("callScriptRecursively"), 2482 global->Set(v8_str("callScriptRecursively"),
2479 v8::FunctionTemplate::New(isolate, CallScriptRecursivelyCall)); 2483 v8::FunctionTemplate::New(isolate, CallScriptRecursivelyCall));
2480 global->Set(v8_str("callFunctionRecursively"), 2484 global->Set(v8_str("callFunctionRecursively"),
2481 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall)); 2485 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall));
2482 LocalContext env(NULL, global); 2486 LocalContext env(NULL, global);
2483 2487
2484 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); 2488 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0));
2485 call_recursively_script = v8_compile("callScriptRecursively()"); 2489 call_recursively_script = v8_compile("callScriptRecursively()");
2486 call_recursively_script->Run(); 2490 call_recursively_script->Run();
2487 call_recursively_script = v8::Handle<Script>(); 2491 call_recursively_script = v8::Handle<Script>();
(...skipping 14 matching lines...) Expand all
2502 static void ThrowingPropertyHandlerSet( 2506 static void ThrowingPropertyHandlerSet(
2503 Local<String> key, 2507 Local<String> key,
2504 Local<Value>, 2508 Local<Value>,
2505 const v8::PropertyCallbackInfo<v8::Value>& info) { 2509 const v8::PropertyCallbackInfo<v8::Value>& info) {
2506 info.GetIsolate()->ThrowException(key); 2510 info.GetIsolate()->ThrowException(key);
2507 info.GetReturnValue().SetUndefined(); // not the same as empty handle 2511 info.GetReturnValue().SetUndefined(); // not the same as empty handle
2508 } 2512 }
2509 2513
2510 2514
2511 THREADED_TEST(CallbackExceptionRegression) { 2515 THREADED_TEST(CallbackExceptionRegression) {
2512 v8::HandleScope scope(CcTest::isolate()); 2516 v8::Isolate* isolate = CcTest::isolate();
2513 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 2517 v8::HandleScope scope(isolate);
2518 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
2514 obj->SetNamedPropertyHandler(ThrowingPropertyHandlerGet, 2519 obj->SetNamedPropertyHandler(ThrowingPropertyHandlerGet,
2515 ThrowingPropertyHandlerSet); 2520 ThrowingPropertyHandlerSet);
2516 LocalContext env; 2521 LocalContext env;
2517 env->Global()->Set(v8_str("obj"), obj->NewInstance()); 2522 env->Global()->Set(v8_str("obj"), obj->NewInstance());
2518 v8::Handle<Value> otto = Script::Compile(v8_str( 2523 v8::Handle<Value> otto = Script::Compile(v8_str(
2519 "try { with (obj) { otto; } } catch (e) { e; }"))->Run(); 2524 "try { with (obj) { otto; } } catch (e) { e; }"))->Run();
2520 CHECK_EQ(v8_str("otto"), otto); 2525 CHECK_EQ(v8_str("otto"), otto);
2521 v8::Handle<Value> netto = Script::Compile(v8_str( 2526 v8::Handle<Value> netto = Script::Compile(v8_str(
2522 "try { with (obj) { netto = 4; } } catch (e) { e; }"))->Run(); 2527 "try { with (obj) { netto = 4; } } catch (e) { e; }"))->Run();
2523 CHECK_EQ(v8_str("netto"), netto); 2528 CHECK_EQ(v8_str("netto"), netto);
(...skipping 22 matching lines...) Expand all
2546 instance_templ->SetInternalFieldCount(1); 2551 instance_templ->SetInternalFieldCount(1);
2547 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); 2552 Local<v8::Object> obj = templ->GetFunction()->NewInstance();
2548 CHECK_EQ(1, obj->InternalFieldCount()); 2553 CHECK_EQ(1, obj->InternalFieldCount());
2549 CHECK(obj->GetInternalField(0)->IsUndefined()); 2554 CHECK(obj->GetInternalField(0)->IsUndefined());
2550 obj->SetInternalField(0, v8_num(17)); 2555 obj->SetInternalField(0, v8_num(17));
2551 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value()); 2556 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value());
2552 } 2557 }
2553 2558
2554 2559
2555 THREADED_TEST(GlobalObjectInternalFields) { 2560 THREADED_TEST(GlobalObjectInternalFields) {
2556 v8::HandleScope scope(CcTest::isolate()); 2561 v8::Isolate* isolate = CcTest::isolate();
2557 Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 2562 v8::HandleScope scope(isolate);
2563 Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate);
2558 global_template->SetInternalFieldCount(1); 2564 global_template->SetInternalFieldCount(1);
2559 LocalContext env(NULL, global_template); 2565 LocalContext env(NULL, global_template);
2560 v8::Handle<v8::Object> global_proxy = env->Global(); 2566 v8::Handle<v8::Object> global_proxy = env->Global();
2561 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); 2567 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>();
2562 CHECK_EQ(1, global->InternalFieldCount()); 2568 CHECK_EQ(1, global->InternalFieldCount());
2563 CHECK(global->GetInternalField(0)->IsUndefined()); 2569 CHECK(global->GetInternalField(0)->IsUndefined());
2564 global->SetInternalField(0, v8_num(17)); 2570 global->SetInternalField(0, v8_num(17));
2565 CHECK_EQ(17, global->GetInternalField(0)->Int32Value()); 2571 CHECK_EQ(17, global->GetInternalField(0)->Int32Value());
2566 } 2572 }
2567 2573
(...skipping 1672 matching lines...) Expand 10 before | Expand all | Expand 10 after
4240 Local<v8::Array> result = v8::Array::New(args.GetIsolate(), args.Length()); 4246 Local<v8::Array> result = v8::Array::New(args.GetIsolate(), args.Length());
4241 for (int i = 0; i < args.Length(); i++) 4247 for (int i = 0; i < args.Length(); i++)
4242 result->Set(i, args[i]); 4248 result->Set(i, args[i]);
4243 args.GetReturnValue().Set(scope.Escape(result)); 4249 args.GetReturnValue().Set(scope.Escape(result));
4244 } 4250 }
4245 4251
4246 4252
4247 THREADED_TEST(Vector) { 4253 THREADED_TEST(Vector) {
4248 v8::Isolate* isolate = CcTest::isolate(); 4254 v8::Isolate* isolate = CcTest::isolate();
4249 v8::HandleScope scope(isolate); 4255 v8::HandleScope scope(isolate);
4250 Local<ObjectTemplate> global = ObjectTemplate::New(); 4256 Local<ObjectTemplate> global = ObjectTemplate::New(isolate);
4251 global->Set(v8_str("f"), v8::FunctionTemplate::New(isolate, HandleF)); 4257 global->Set(v8_str("f"), v8::FunctionTemplate::New(isolate, HandleF));
4252 LocalContext context(0, global); 4258 LocalContext context(0, global);
4253 4259
4254 const char* fun = "f()"; 4260 const char* fun = "f()";
4255 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>(); 4261 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>();
4256 CHECK_EQ(0, a0->Length()); 4262 CHECK_EQ(0, a0->Length());
4257 4263
4258 const char* fun2 = "f(11)"; 4264 const char* fun2 = "f(11)";
4259 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>(); 4265 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>();
4260 CHECK_EQ(1, a1->Length()); 4266 CHECK_EQ(1, a1->Length());
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
4420 4426
4421 4427
4422 TEST(OutOfMemoryNested) { 4428 TEST(OutOfMemoryNested) {
4423 // It's not possible to read a snapshot into a heap with different dimensions. 4429 // It's not possible to read a snapshot into a heap with different dimensions.
4424 if (i::Snapshot::IsEnabled()) return; 4430 if (i::Snapshot::IsEnabled()) return;
4425 // Set heap limits. 4431 // Set heap limits.
4426 static const int K = 1024; 4432 static const int K = 1024;
4427 v8::ResourceConstraints constraints; 4433 v8::ResourceConstraints constraints;
4428 constraints.set_max_young_space_size(256 * K); 4434 constraints.set_max_young_space_size(256 * K);
4429 constraints.set_max_old_space_size(5 * K * K); 4435 constraints.set_max_old_space_size(5 * K * K);
4430 v8::SetResourceConstraints(CcTest::isolate(), &constraints); 4436 v8::Isolate* isolate = CcTest::isolate();
4437 v8::SetResourceConstraints(isolate, &constraints);
4431 4438
4432 v8::HandleScope scope(CcTest::isolate()); 4439 v8::HandleScope scope(isolate);
4433 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4440 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4434 templ->Set(v8_str("ProvokeOutOfMemory"), 4441 templ->Set(v8_str("ProvokeOutOfMemory"),
4435 v8::FunctionTemplate::New(CcTest::isolate(), ProvokeOutOfMemory)); 4442 v8::FunctionTemplate::New(isolate, ProvokeOutOfMemory));
4436 LocalContext context(0, templ); 4443 LocalContext context(0, templ);
4437 v8::V8::IgnoreOutOfMemoryException(); 4444 v8::V8::IgnoreOutOfMemoryException();
4438 Local<Value> result = CompileRun( 4445 Local<Value> result = CompileRun(
4439 "var thrown = false;" 4446 "var thrown = false;"
4440 "try {" 4447 "try {"
4441 " ProvokeOutOfMemory();" 4448 " ProvokeOutOfMemory();"
4442 "} catch (e) {" 4449 "} catch (e) {"
4443 " thrown = true;" 4450 " thrown = true;"
4444 "}"); 4451 "}");
4445 // Check for out of memory state. 4452 // Check for out of memory state.
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
4706 } 4713 }
4707 v8::HandleScope scope(args.GetIsolate()); 4714 v8::HandleScope scope(args.GetIsolate());
4708 v8::TryCatch try_catch; 4715 v8::TryCatch try_catch;
4709 Local<Value> result = v8::Script::Compile(args[0]->ToString())->Run(); 4716 Local<Value> result = v8::Script::Compile(args[0]->ToString())->Run();
4710 CHECK(!try_catch.HasCaught() || result.IsEmpty()); 4717 CHECK(!try_catch.HasCaught() || result.IsEmpty());
4711 args.GetReturnValue().Set(try_catch.HasCaught()); 4718 args.GetReturnValue().Set(try_catch.HasCaught());
4712 } 4719 }
4713 4720
4714 4721
4715 THREADED_TEST(APICatch) { 4722 THREADED_TEST(APICatch) {
4716 v8::HandleScope scope(CcTest::isolate()); 4723 v8::Isolate* isolate = CcTest::isolate();
4717 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4724 v8::HandleScope scope(isolate);
4725 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4718 templ->Set(v8_str("ThrowFromC"), 4726 templ->Set(v8_str("ThrowFromC"),
4719 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); 4727 v8::FunctionTemplate::New(isolate, ThrowFromC));
4720 LocalContext context(0, templ); 4728 LocalContext context(0, templ);
4721 CompileRun( 4729 CompileRun(
4722 "var thrown = false;" 4730 "var thrown = false;"
4723 "try {" 4731 "try {"
4724 " ThrowFromC();" 4732 " ThrowFromC();"
4725 "} catch (e) {" 4733 "} catch (e) {"
4726 " thrown = true;" 4734 " thrown = true;"
4727 "}"); 4735 "}");
4728 Local<Value> thrown = context->Global()->Get(v8_str("thrown")); 4736 Local<Value> thrown = context->Global()->Get(v8_str("thrown"));
4729 CHECK(thrown->BooleanValue()); 4737 CHECK(thrown->BooleanValue());
4730 } 4738 }
4731 4739
4732 4740
4733 THREADED_TEST(APIThrowTryCatch) { 4741 THREADED_TEST(APIThrowTryCatch) {
4734 v8::HandleScope scope(CcTest::isolate()); 4742 v8::Isolate* isolate = CcTest::isolate();
4735 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4743 v8::HandleScope scope(isolate);
4744 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4736 templ->Set(v8_str("ThrowFromC"), 4745 templ->Set(v8_str("ThrowFromC"),
4737 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); 4746 v8::FunctionTemplate::New(isolate, ThrowFromC));
4738 LocalContext context(0, templ); 4747 LocalContext context(0, templ);
4739 v8::TryCatch try_catch; 4748 v8::TryCatch try_catch;
4740 CompileRun("ThrowFromC();"); 4749 CompileRun("ThrowFromC();");
4741 CHECK(try_catch.HasCaught()); 4750 CHECK(try_catch.HasCaught());
4742 } 4751 }
4743 4752
4744 4753
4745 // Test that a try-finally block doesn't shadow a try-catch block 4754 // Test that a try-finally block doesn't shadow a try-catch block
4746 // when setting up an external handler. 4755 // when setting up an external handler.
4747 // 4756 //
4748 // BUG(271): Some of the exception propagation does not work on the 4757 // BUG(271): Some of the exception propagation does not work on the
4749 // ARM simulator because the simulator separates the C++ stack and the 4758 // ARM simulator because the simulator separates the C++ stack and the
4750 // JS stack. This test therefore fails on the simulator. The test is 4759 // JS stack. This test therefore fails on the simulator. The test is
4751 // not threaded to allow the threading tests to run on the simulator. 4760 // not threaded to allow the threading tests to run on the simulator.
4752 TEST(TryCatchInTryFinally) { 4761 TEST(TryCatchInTryFinally) {
4753 v8::HandleScope scope(CcTest::isolate()); 4762 v8::Isolate* isolate = CcTest::isolate();
4754 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4763 v8::HandleScope scope(isolate);
4764 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4755 templ->Set(v8_str("CCatcher"), 4765 templ->Set(v8_str("CCatcher"),
4756 v8::FunctionTemplate::New(CcTest::isolate(), CCatcher)); 4766 v8::FunctionTemplate::New(isolate, CCatcher));
4757 LocalContext context(0, templ); 4767 LocalContext context(0, templ);
4758 Local<Value> result = CompileRun("try {" 4768 Local<Value> result = CompileRun("try {"
4759 " try {" 4769 " try {"
4760 " CCatcher('throw 7;');" 4770 " CCatcher('throw 7;');"
4761 " } finally {" 4771 " } finally {"
4762 " }" 4772 " }"
4763 "} catch (e) {" 4773 "} catch (e) {"
4764 "}"); 4774 "}");
4765 CHECK(result->IsTrue()); 4775 CHECK(result->IsTrue());
4766 } 4776 }
(...skipping 13 matching lines...) Expand all
4780 } 4790 }
4781 4791
4782 4792
4783 // Test that overwritten methods are not invoked on uncaught exception 4793 // Test that overwritten methods are not invoked on uncaught exception
4784 // formatting. However, they are invoked when performing normal error 4794 // formatting. However, they are invoked when performing normal error
4785 // string conversions. 4795 // string conversions.
4786 TEST(APIThrowMessageOverwrittenToString) { 4796 TEST(APIThrowMessageOverwrittenToString) {
4787 v8::Isolate* isolate = CcTest::isolate(); 4797 v8::Isolate* isolate = CcTest::isolate();
4788 v8::HandleScope scope(isolate); 4798 v8::HandleScope scope(isolate);
4789 v8::V8::AddMessageListener(check_reference_error_message); 4799 v8::V8::AddMessageListener(check_reference_error_message);
4790 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4800 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4791 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(isolate, Fail)); 4801 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(isolate, Fail));
4792 LocalContext context(NULL, templ); 4802 LocalContext context(NULL, templ);
4793 CompileRun("asdf;"); 4803 CompileRun("asdf;");
4794 CompileRun("var limit = {};" 4804 CompileRun("var limit = {};"
4795 "limit.valueOf = fail;" 4805 "limit.valueOf = fail;"
4796 "Error.stackTraceLimit = limit;"); 4806 "Error.stackTraceLimit = limit;");
4797 CompileRun("asdf"); 4807 CompileRun("asdf");
4798 CompileRun("Array.prototype.pop = fail;"); 4808 CompileRun("Array.prototype.pop = fail;");
4799 CompileRun("Object.prototype.hasOwnProperty = fail;"); 4809 CompileRun("Object.prototype.hasOwnProperty = fail;");
4800 CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }"); 4810 CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }");
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
4902 4912
4903 static void receive_message(v8::Handle<v8::Message> message, 4913 static void receive_message(v8::Handle<v8::Message> message,
4904 v8::Handle<v8::Value> data) { 4914 v8::Handle<v8::Value> data) {
4905 message->Get(); 4915 message->Get();
4906 message_received = true; 4916 message_received = true;
4907 } 4917 }
4908 4918
4909 4919
4910 TEST(APIThrowMessage) { 4920 TEST(APIThrowMessage) {
4911 message_received = false; 4921 message_received = false;
4912 v8::HandleScope scope(CcTest::isolate()); 4922 v8::Isolate* isolate = CcTest::isolate();
4923 v8::HandleScope scope(isolate);
4913 v8::V8::AddMessageListener(receive_message); 4924 v8::V8::AddMessageListener(receive_message);
4914 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4925 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4915 templ->Set(v8_str("ThrowFromC"), 4926 templ->Set(v8_str("ThrowFromC"),
4916 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); 4927 v8::FunctionTemplate::New(isolate, ThrowFromC));
4917 LocalContext context(0, templ); 4928 LocalContext context(0, templ);
4918 CompileRun("ThrowFromC();"); 4929 CompileRun("ThrowFromC();");
4919 CHECK(message_received); 4930 CHECK(message_received);
4920 v8::V8::RemoveMessageListeners(receive_message); 4931 v8::V8::RemoveMessageListeners(receive_message);
4921 } 4932 }
4922 4933
4923 4934
4924 TEST(APIThrowMessageAndVerboseTryCatch) { 4935 TEST(APIThrowMessageAndVerboseTryCatch) {
4925 message_received = false; 4936 message_received = false;
4926 v8::HandleScope scope(CcTest::isolate()); 4937 v8::Isolate* isolate = CcTest::isolate();
4938 v8::HandleScope scope(isolate);
4927 v8::V8::AddMessageListener(receive_message); 4939 v8::V8::AddMessageListener(receive_message);
4928 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4940 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4929 templ->Set(v8_str("ThrowFromC"), 4941 templ->Set(v8_str("ThrowFromC"),
4930 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); 4942 v8::FunctionTemplate::New(isolate, ThrowFromC));
4931 LocalContext context(0, templ); 4943 LocalContext context(0, templ);
4932 v8::TryCatch try_catch; 4944 v8::TryCatch try_catch;
4933 try_catch.SetVerbose(true); 4945 try_catch.SetVerbose(true);
4934 Local<Value> result = CompileRun("ThrowFromC();"); 4946 Local<Value> result = CompileRun("ThrowFromC();");
4935 CHECK(try_catch.HasCaught()); 4947 CHECK(try_catch.HasCaught());
4936 CHECK(result.IsEmpty()); 4948 CHECK(result.IsEmpty());
4937 CHECK(message_received); 4949 CHECK(message_received);
4938 v8::V8::RemoveMessageListeners(receive_message); 4950 v8::V8::RemoveMessageListeners(receive_message);
4939 } 4951 }
4940 4952
4941 4953
4942 TEST(APIStackOverflowAndVerboseTryCatch) { 4954 TEST(APIStackOverflowAndVerboseTryCatch) {
4943 message_received = false; 4955 message_received = false;
4944 LocalContext context; 4956 LocalContext context;
4945 v8::HandleScope scope(context->GetIsolate()); 4957 v8::HandleScope scope(context->GetIsolate());
4946 v8::V8::AddMessageListener(receive_message); 4958 v8::V8::AddMessageListener(receive_message);
4947 v8::TryCatch try_catch; 4959 v8::TryCatch try_catch;
4948 try_catch.SetVerbose(true); 4960 try_catch.SetVerbose(true);
4949 Local<Value> result = CompileRun("function foo() { foo(); } foo();"); 4961 Local<Value> result = CompileRun("function foo() { foo(); } foo();");
4950 CHECK(try_catch.HasCaught()); 4962 CHECK(try_catch.HasCaught());
4951 CHECK(result.IsEmpty()); 4963 CHECK(result.IsEmpty());
4952 CHECK(message_received); 4964 CHECK(message_received);
4953 v8::V8::RemoveMessageListeners(receive_message); 4965 v8::V8::RemoveMessageListeners(receive_message);
4954 } 4966 }
4955 4967
4956 4968
4957 THREADED_TEST(ExternalScriptException) { 4969 THREADED_TEST(ExternalScriptException) {
4958 v8::HandleScope scope(CcTest::isolate()); 4970 v8::Isolate* isolate = CcTest::isolate();
4959 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4971 v8::HandleScope scope(isolate);
4972 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4960 templ->Set(v8_str("ThrowFromC"), 4973 templ->Set(v8_str("ThrowFromC"),
4961 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); 4974 v8::FunctionTemplate::New(isolate, ThrowFromC));
4962 LocalContext context(0, templ); 4975 LocalContext context(0, templ);
4963 4976
4964 v8::TryCatch try_catch; 4977 v8::TryCatch try_catch;
4965 Local<Script> script 4978 Local<Script> script
4966 = Script::Compile(v8_str("ThrowFromC(); throw 'panama';")); 4979 = Script::Compile(v8_str("ThrowFromC(); throw 'panama';"));
4967 Local<Value> result = script->Run(); 4980 Local<Value> result = script->Run();
4968 CHECK(result.IsEmpty()); 4981 CHECK(result.IsEmpty());
4969 CHECK(try_catch.HasCaught()); 4982 CHECK(try_catch.HasCaught());
4970 String::Utf8Value exception_value(try_catch.Exception()); 4983 String::Utf8Value exception_value(try_catch.Exception());
4971 CHECK_EQ("konto", *exception_value); 4984 CHECK_EQ("konto", *exception_value);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
5055 // level. Stars identify activations with exception handlers, the @ identifies 5068 // level. Stars identify activations with exception handlers, the @ identifies
5056 // the exception handler that should catch the exception. 5069 // the exception handler that should catch the exception.
5057 // 5070 //
5058 // BUG(271): Some of the exception propagation does not work on the 5071 // BUG(271): Some of the exception propagation does not work on the
5059 // ARM simulator because the simulator separates the C++ stack and the 5072 // ARM simulator because the simulator separates the C++ stack and the
5060 // JS stack. This test therefore fails on the simulator. The test is 5073 // JS stack. This test therefore fails on the simulator. The test is
5061 // not threaded to allow the threading tests to run on the simulator. 5074 // not threaded to allow the threading tests to run on the simulator.
5062 TEST(ExceptionOrder) { 5075 TEST(ExceptionOrder) {
5063 v8::Isolate* isolate = CcTest::isolate(); 5076 v8::Isolate* isolate = CcTest::isolate();
5064 v8::HandleScope scope(isolate); 5077 v8::HandleScope scope(isolate);
5065 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5078 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5066 templ->Set(v8_str("check"), v8::FunctionTemplate::New(isolate, JSCheck)); 5079 templ->Set(v8_str("check"), v8::FunctionTemplate::New(isolate, JSCheck));
5067 templ->Set(v8_str("CThrowCountDown"), 5080 templ->Set(v8_str("CThrowCountDown"),
5068 v8::FunctionTemplate::New(isolate, CThrowCountDown)); 5081 v8::FunctionTemplate::New(isolate, CThrowCountDown));
5069 LocalContext context(0, templ); 5082 LocalContext context(0, templ);
5070 CompileRun( 5083 CompileRun(
5071 "function JSThrowCountDown(count, jsInterval, cInterval, expected) {" 5084 "function JSThrowCountDown(count, jsInterval, cInterval, expected) {"
5072 " if (count == 0) throw 'FromJS';" 5085 " if (count == 0) throw 'FromJS';"
5073 " if (count % jsInterval == 0) {" 5086 " if (count % jsInterval == 0) {"
5074 " try {" 5087 " try {"
5075 " var value = CThrowCountDown(count - 1," 5088 " var value = CThrowCountDown(count - 1,"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
5120 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) { 5133 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) {
5121 ApiTestFuzzer::Fuzz(); 5134 ApiTestFuzzer::Fuzz();
5122 CHECK_EQ(1, args.Length()); 5135 CHECK_EQ(1, args.Length());
5123 args.GetIsolate()->ThrowException(args[0]); 5136 args.GetIsolate()->ThrowException(args[0]);
5124 } 5137 }
5125 5138
5126 5139
5127 THREADED_TEST(ThrowValues) { 5140 THREADED_TEST(ThrowValues) {
5128 v8::Isolate* isolate = CcTest::isolate(); 5141 v8::Isolate* isolate = CcTest::isolate();
5129 v8::HandleScope scope(isolate); 5142 v8::HandleScope scope(isolate);
5130 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5143 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5131 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(isolate, ThrowValue)); 5144 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(isolate, ThrowValue));
5132 LocalContext context(0, templ); 5145 LocalContext context(0, templ);
5133 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( 5146 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun(
5134 "function Run(obj) {" 5147 "function Run(obj) {"
5135 " try {" 5148 " try {"
5136 " Throw(obj);" 5149 " Throw(obj);"
5137 " } catch (e) {" 5150 " } catch (e) {"
5138 " return e;" 5151 " return e;"
5139 " }" 5152 " }"
5140 " return 'no exception';" 5153 " return 'no exception';"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
5262 // This test ensures that an outer TryCatch in the following situation: 5275 // This test ensures that an outer TryCatch in the following situation:
5263 // C++/TryCatch -> JS -> C++/TryCatch -> JS w/ SyntaxError 5276 // C++/TryCatch -> JS -> C++/TryCatch -> JS w/ SyntaxError
5264 // does not clobber the Message object generated for the inner TryCatch. 5277 // does not clobber the Message object generated for the inner TryCatch.
5265 // This exercises the ability of TryCatch.ReThrow() to restore the 5278 // This exercises the ability of TryCatch.ReThrow() to restore the
5266 // inner pending Message before throwing the exception again. 5279 // inner pending Message before throwing the exception again.
5267 TEST(TryCatchMixedNesting) { 5280 TEST(TryCatchMixedNesting) {
5268 v8::Isolate* isolate = CcTest::isolate(); 5281 v8::Isolate* isolate = CcTest::isolate();
5269 v8::HandleScope scope(isolate); 5282 v8::HandleScope scope(isolate);
5270 v8::V8::Initialize(); 5283 v8::V8::Initialize();
5271 v8::TryCatch try_catch; 5284 v8::TryCatch try_catch;
5272 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5285 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5273 templ->Set(v8_str("TryCatchMixedNestingHelper"), 5286 templ->Set(v8_str("TryCatchMixedNestingHelper"),
5274 v8::FunctionTemplate::New(isolate, TryCatchMixedNestingHelper)); 5287 v8::FunctionTemplate::New(isolate, TryCatchMixedNestingHelper));
5275 LocalContext context(0, templ); 5288 LocalContext context(0, templ);
5276 CompileRunWithOrigin("TryCatchMixedNestingHelper();\n", "outer", 1, 1); 5289 CompileRunWithOrigin("TryCatchMixedNestingHelper();\n", "outer", 1, 1);
5277 TryCatchMixedNestingCheck(&try_catch); 5290 TryCatchMixedNestingCheck(&try_catch);
5278 } 5291 }
5279 5292
5280 5293
5281 THREADED_TEST(Equality) { 5294 THREADED_TEST(Equality) {
5282 LocalContext context; 5295 LocalContext context;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
5334 const v8::PropertyCallbackInfo<v8::Value>& info) { 5347 const v8::PropertyCallbackInfo<v8::Value>& info) {
5335 ApiTestFuzzer::Fuzz(); 5348 ApiTestFuzzer::Fuzz();
5336 CHECK_EQ(info.Data(), v8_str("donut")); 5349 CHECK_EQ(info.Data(), v8_str("donut"));
5337 CHECK_EQ(name, v8_str("x")); 5350 CHECK_EQ(name, v8_str("x"));
5338 info.GetReturnValue().Set(name); 5351 info.GetReturnValue().Set(name);
5339 } 5352 }
5340 5353
5341 5354
5342 THREADED_TEST(SimplePropertyRead) { 5355 THREADED_TEST(SimplePropertyRead) {
5343 LocalContext context; 5356 LocalContext context;
5344 v8::HandleScope scope(context->GetIsolate()); 5357 v8::Isolate* isolate = context->GetIsolate();
5345 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5358 v8::HandleScope scope(isolate);
5359 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5346 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); 5360 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"));
5347 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5361 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5348 Local<Script> script = Script::Compile(v8_str("obj.x")); 5362 Local<Script> script = Script::Compile(v8_str("obj.x"));
5349 for (int i = 0; i < 10; i++) { 5363 for (int i = 0; i < 10; i++) {
5350 Local<Value> result = script->Run(); 5364 Local<Value> result = script->Run();
5351 CHECK_EQ(result, v8_str("x")); 5365 CHECK_EQ(result, v8_str("x"));
5352 } 5366 }
5353 } 5367 }
5354 5368
5355 5369
5356 THREADED_TEST(DefinePropertyOnAPIAccessor) { 5370 THREADED_TEST(DefinePropertyOnAPIAccessor) {
5357 LocalContext context; 5371 LocalContext context;
5358 v8::HandleScope scope(context->GetIsolate()); 5372 v8::Isolate* isolate = context->GetIsolate();
5359 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5373 v8::HandleScope scope(isolate);
5374 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5360 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); 5375 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"));
5361 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5376 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5362 5377
5363 // Uses getOwnPropertyDescriptor to check the configurable status 5378 // Uses getOwnPropertyDescriptor to check the configurable status
5364 Local<Script> script_desc 5379 Local<Script> script_desc
5365 = Script::Compile(v8_str("var prop = Object.getOwnPropertyDescriptor( " 5380 = Script::Compile(v8_str("var prop = Object.getOwnPropertyDescriptor( "
5366 "obj, 'x');" 5381 "obj, 'x');"
5367 "prop.configurable;")); 5382 "prop.configurable;"));
5368 Local<Value> result = script_desc->Run(); 5383 Local<Value> result = script_desc->Run();
5369 CHECK_EQ(result->BooleanValue(), true); 5384 CHECK_EQ(result->BooleanValue(), true);
(...skipping 25 matching lines...) Expand all
5395 // Make sure that it is not possible to redefine again 5410 // Make sure that it is not possible to redefine again
5396 v8::TryCatch try_catch; 5411 v8::TryCatch try_catch;
5397 result = script_define->Run(); 5412 result = script_define->Run();
5398 CHECK(try_catch.HasCaught()); 5413 CHECK(try_catch.HasCaught());
5399 String::Utf8Value exception_value(try_catch.Exception()); 5414 String::Utf8Value exception_value(try_catch.Exception());
5400 CHECK_EQ(*exception_value, "TypeError: Cannot redefine property: x"); 5415 CHECK_EQ(*exception_value, "TypeError: Cannot redefine property: x");
5401 } 5416 }
5402 5417
5403 5418
5404 THREADED_TEST(DefinePropertyOnDefineGetterSetter) { 5419 THREADED_TEST(DefinePropertyOnDefineGetterSetter) {
5405 v8::HandleScope scope(CcTest::isolate()); 5420 v8::Isolate* isolate = CcTest::isolate();
5406 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5421 v8::HandleScope scope(isolate);
5422 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5407 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); 5423 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"));
5408 LocalContext context; 5424 LocalContext context;
5409 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5425 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5410 5426
5411 Local<Script> script_desc = Script::Compile(v8_str("var prop =" 5427 Local<Script> script_desc = Script::Compile(v8_str("var prop ="
5412 "Object.getOwnPropertyDescriptor( " 5428 "Object.getOwnPropertyDescriptor( "
5413 "obj, 'x');" 5429 "obj, 'x');"
5414 "prop.configurable;")); 5430 "prop.configurable;"));
5415 Local<Value> result = script_desc->Run(); 5431 Local<Value> result = script_desc->Run();
5416 CHECK_EQ(result->BooleanValue(), true); 5432 CHECK_EQ(result->BooleanValue(), true);
(...skipping 30 matching lines...) Expand all
5447 } 5463 }
5448 5464
5449 5465
5450 static v8::Handle<v8::Object> GetGlobalProperty(LocalContext* context, 5466 static v8::Handle<v8::Object> GetGlobalProperty(LocalContext* context,
5451 char const* name) { 5467 char const* name) {
5452 return v8::Handle<v8::Object>::Cast((*context)->Global()->Get(v8_str(name))); 5468 return v8::Handle<v8::Object>::Cast((*context)->Global()->Get(v8_str(name)));
5453 } 5469 }
5454 5470
5455 5471
5456 THREADED_TEST(DefineAPIAccessorOnObject) { 5472 THREADED_TEST(DefineAPIAccessorOnObject) {
5457 v8::HandleScope scope(CcTest::isolate()); 5473 v8::Isolate* isolate = CcTest::isolate();
5458 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5474 v8::HandleScope scope(isolate);
5475 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5459 LocalContext context; 5476 LocalContext context;
5460 5477
5461 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 5478 context->Global()->Set(v8_str("obj1"), templ->NewInstance());
5462 CompileRun("var obj2 = {};"); 5479 CompileRun("var obj2 = {};");
5463 5480
5464 CHECK(CompileRun("obj1.x")->IsUndefined()); 5481 CHECK(CompileRun("obj1.x")->IsUndefined());
5465 CHECK(CompileRun("obj2.x")->IsUndefined()); 5482 CHECK(CompileRun("obj2.x")->IsUndefined());
5466 5483
5467 CHECK(GetGlobalProperty(&context, "obj1")-> 5484 CHECK(GetGlobalProperty(&context, "obj1")->
5468 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 5485 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
5521 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 5538 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")));
5522 CHECK(!GetGlobalProperty(&context, "obj2")-> 5539 CHECK(!GetGlobalProperty(&context, "obj2")->
5523 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 5540 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")));
5524 5541
5525 ExpectString("obj1.x", "z"); 5542 ExpectString("obj1.x", "z");
5526 ExpectString("obj2.x", "z"); 5543 ExpectString("obj2.x", "z");
5527 } 5544 }
5528 5545
5529 5546
5530 THREADED_TEST(DontDeleteAPIAccessorsCannotBeOverriden) { 5547 THREADED_TEST(DontDeleteAPIAccessorsCannotBeOverriden) {
5531 v8::HandleScope scope(CcTest::isolate()); 5548 v8::Isolate* isolate = CcTest::isolate();
5532 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5549 v8::HandleScope scope(isolate);
5550 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5533 LocalContext context; 5551 LocalContext context;
5534 5552
5535 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 5553 context->Global()->Set(v8_str("obj1"), templ->NewInstance());
5536 CompileRun("var obj2 = {};"); 5554 CompileRun("var obj2 = {};");
5537 5555
5538 CHECK(GetGlobalProperty(&context, "obj1")->SetAccessor( 5556 CHECK(GetGlobalProperty(&context, "obj1")->SetAccessor(
5539 v8_str("x"), 5557 v8_str("x"),
5540 GetXValue, NULL, 5558 GetXValue, NULL,
5541 v8_str("donut"), v8::DEFAULT, v8::DontDelete)); 5559 v8_str("donut"), v8::DEFAULT, v8::DontDelete));
5542 CHECK(GetGlobalProperty(&context, "obj2")->SetAccessor( 5560 CHECK(GetGlobalProperty(&context, "obj2")->SetAccessor(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
5577 static void Get239Value(Local<String> name, 5595 static void Get239Value(Local<String> name,
5578 const v8::PropertyCallbackInfo<v8::Value>& info) { 5596 const v8::PropertyCallbackInfo<v8::Value>& info) {
5579 ApiTestFuzzer::Fuzz(); 5597 ApiTestFuzzer::Fuzz();
5580 CHECK_EQ(info.Data(), v8_str("donut")); 5598 CHECK_EQ(info.Data(), v8_str("donut"));
5581 CHECK_EQ(name, v8_str("239")); 5599 CHECK_EQ(name, v8_str("239"));
5582 info.GetReturnValue().Set(name); 5600 info.GetReturnValue().Set(name);
5583 } 5601 }
5584 5602
5585 5603
5586 THREADED_TEST(ElementAPIAccessor) { 5604 THREADED_TEST(ElementAPIAccessor) {
5587 v8::HandleScope scope(CcTest::isolate()); 5605 v8::Isolate* isolate = CcTest::isolate();
5588 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5606 v8::HandleScope scope(isolate);
5607 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5589 LocalContext context; 5608 LocalContext context;
5590 5609
5591 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 5610 context->Global()->Set(v8_str("obj1"), templ->NewInstance());
5592 CompileRun("var obj2 = {};"); 5611 CompileRun("var obj2 = {};");
5593 5612
5594 CHECK(GetGlobalProperty(&context, "obj1")->SetAccessor( 5613 CHECK(GetGlobalProperty(&context, "obj1")->SetAccessor(
5595 v8_str("239"), 5614 v8_str("239"),
5596 Get239Value, NULL, 5615 Get239Value, NULL,
5597 v8_str("donut"))); 5616 v8_str("donut")));
5598 CHECK(GetGlobalProperty(&context, "obj2")->SetAccessor( 5617 CHECK(GetGlobalProperty(&context, "obj2")->SetAccessor(
(...skipping 16 matching lines...) Expand all
5615 const v8::PropertyCallbackInfo<void>& info) { 5634 const v8::PropertyCallbackInfo<void>& info) {
5616 CHECK_EQ(value, v8_num(4)); 5635 CHECK_EQ(value, v8_num(4));
5617 CHECK_EQ(info.Data(), v8_str("donut")); 5636 CHECK_EQ(info.Data(), v8_str("donut"));
5618 CHECK_EQ(name, v8_str("x")); 5637 CHECK_EQ(name, v8_str("x"));
5619 CHECK(xValue.IsEmpty()); 5638 CHECK(xValue.IsEmpty());
5620 xValue.Reset(info.GetIsolate(), value); 5639 xValue.Reset(info.GetIsolate(), value);
5621 } 5640 }
5622 5641
5623 5642
5624 THREADED_TEST(SimplePropertyWrite) { 5643 THREADED_TEST(SimplePropertyWrite) {
5625 v8::HandleScope scope(CcTest::isolate()); 5644 v8::Isolate* isolate = CcTest::isolate();
5626 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5645 v8::HandleScope scope(isolate);
5646 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5627 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); 5647 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut"));
5628 LocalContext context; 5648 LocalContext context;
5629 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5649 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5630 Local<Script> script = Script::Compile(v8_str("obj.x = 4")); 5650 Local<Script> script = Script::Compile(v8_str("obj.x = 4"));
5631 for (int i = 0; i < 10; i++) { 5651 for (int i = 0; i < 10; i++) {
5632 CHECK(xValue.IsEmpty()); 5652 CHECK(xValue.IsEmpty());
5633 script->Run(); 5653 script->Run();
5634 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue)); 5654 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue));
5635 xValue.Reset(); 5655 xValue.Reset();
5636 } 5656 }
5637 } 5657 }
5638 5658
5639 5659
5640 THREADED_TEST(SetterOnly) { 5660 THREADED_TEST(SetterOnly) {
5641 v8::HandleScope scope(CcTest::isolate()); 5661 v8::Isolate* isolate = CcTest::isolate();
5642 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5662 v8::HandleScope scope(isolate);
5663 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5643 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); 5664 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut"));
5644 LocalContext context; 5665 LocalContext context;
5645 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5666 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5646 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); 5667 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x"));
5647 for (int i = 0; i < 10; i++) { 5668 for (int i = 0; i < 10; i++) {
5648 CHECK(xValue.IsEmpty()); 5669 CHECK(xValue.IsEmpty());
5649 script->Run(); 5670 script->Run();
5650 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue)); 5671 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue));
5651 xValue.Reset(); 5672 xValue.Reset();
5652 } 5673 }
5653 } 5674 }
5654 5675
5655 5676
5656 THREADED_TEST(NoAccessors) { 5677 THREADED_TEST(NoAccessors) {
5657 v8::HandleScope scope(CcTest::isolate()); 5678 v8::Isolate* isolate = CcTest::isolate();
5658 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5679 v8::HandleScope scope(isolate);
5680 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5659 templ->SetAccessor(v8_str("x"), 5681 templ->SetAccessor(v8_str("x"),
5660 static_cast<v8::AccessorGetterCallback>(NULL), 5682 static_cast<v8::AccessorGetterCallback>(NULL),
5661 NULL, 5683 NULL,
5662 v8_str("donut")); 5684 v8_str("donut"));
5663 LocalContext context; 5685 LocalContext context;
5664 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5686 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5665 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); 5687 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x"));
5666 for (int i = 0; i < 10; i++) { 5688 for (int i = 0; i < 10; i++) {
5667 script->Run(); 5689 script->Run();
5668 } 5690 }
5669 } 5691 }
5670 5692
5671 5693
5672 static void XPropertyGetter(Local<String> property, 5694 static void XPropertyGetter(Local<String> property,
5673 const v8::PropertyCallbackInfo<v8::Value>& info) { 5695 const v8::PropertyCallbackInfo<v8::Value>& info) {
5674 ApiTestFuzzer::Fuzz(); 5696 ApiTestFuzzer::Fuzz();
5675 CHECK(info.Data()->IsUndefined()); 5697 CHECK(info.Data()->IsUndefined());
5676 info.GetReturnValue().Set(property); 5698 info.GetReturnValue().Set(property);
5677 } 5699 }
5678 5700
5679 5701
5680 THREADED_TEST(NamedInterceptorPropertyRead) { 5702 THREADED_TEST(NamedInterceptorPropertyRead) {
5681 v8::HandleScope scope(CcTest::isolate()); 5703 v8::Isolate* isolate = CcTest::isolate();
5682 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5704 v8::HandleScope scope(isolate);
5705 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5683 templ->SetNamedPropertyHandler(XPropertyGetter); 5706 templ->SetNamedPropertyHandler(XPropertyGetter);
5684 LocalContext context; 5707 LocalContext context;
5685 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5708 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5686 Local<Script> script = Script::Compile(v8_str("obj.x")); 5709 Local<Script> script = Script::Compile(v8_str("obj.x"));
5687 for (int i = 0; i < 10; i++) { 5710 for (int i = 0; i < 10; i++) {
5688 Local<Value> result = script->Run(); 5711 Local<Value> result = script->Run();
5689 CHECK_EQ(result, v8_str("x")); 5712 CHECK_EQ(result, v8_str("x"));
5690 } 5713 }
5691 } 5714 }
5692 5715
5693 5716
5694 THREADED_TEST(NamedInterceptorDictionaryIC) { 5717 THREADED_TEST(NamedInterceptorDictionaryIC) {
5695 v8::HandleScope scope(CcTest::isolate()); 5718 v8::Isolate* isolate = CcTest::isolate();
5696 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5719 v8::HandleScope scope(isolate);
5720 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5697 templ->SetNamedPropertyHandler(XPropertyGetter); 5721 templ->SetNamedPropertyHandler(XPropertyGetter);
5698 LocalContext context; 5722 LocalContext context;
5699 // Create an object with a named interceptor. 5723 // Create an object with a named interceptor.
5700 context->Global()->Set(v8_str("interceptor_obj"), templ->NewInstance()); 5724 context->Global()->Set(v8_str("interceptor_obj"), templ->NewInstance());
5701 Local<Script> script = Script::Compile(v8_str("interceptor_obj.x")); 5725 Local<Script> script = Script::Compile(v8_str("interceptor_obj.x"));
5702 for (int i = 0; i < 10; i++) { 5726 for (int i = 0; i < 10; i++) {
5703 Local<Value> result = script->Run(); 5727 Local<Value> result = script->Run();
5704 CHECK_EQ(result, v8_str("x")); 5728 CHECK_EQ(result, v8_str("x"));
5705 } 5729 }
5706 // Create a slow case object and a function accessing a property in 5730 // Create a slow case object and a function accessing a property in
(...skipping 13 matching lines...) Expand all
5720 CHECK_EQ(result, v8_str("x")); 5744 CHECK_EQ(result, v8_str("x"));
5721 } 5745 }
5722 5746
5723 5747
5724 THREADED_TEST(NamedInterceptorDictionaryICMultipleContext) { 5748 THREADED_TEST(NamedInterceptorDictionaryICMultipleContext) {
5725 v8::Isolate* isolate = CcTest::isolate(); 5749 v8::Isolate* isolate = CcTest::isolate();
5726 v8::HandleScope scope(isolate); 5750 v8::HandleScope scope(isolate);
5727 v8::Local<Context> context1 = Context::New(isolate); 5751 v8::Local<Context> context1 = Context::New(isolate);
5728 5752
5729 context1->Enter(); 5753 context1->Enter();
5730 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5754 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5731 templ->SetNamedPropertyHandler(XPropertyGetter); 5755 templ->SetNamedPropertyHandler(XPropertyGetter);
5732 // Create an object with a named interceptor. 5756 // Create an object with a named interceptor.
5733 v8::Local<v8::Object> object = templ->NewInstance(); 5757 v8::Local<v8::Object> object = templ->NewInstance();
5734 context1->Global()->Set(v8_str("interceptor_obj"), object); 5758 context1->Global()->Set(v8_str("interceptor_obj"), object);
5735 5759
5736 // Force the object into the slow case. 5760 // Force the object into the slow case.
5737 CompileRun("interceptor_obj.y = 0;" 5761 CompileRun("interceptor_obj.y = 0;"
5738 "delete interceptor_obj.y;"); 5762 "delete interceptor_obj.y;");
5739 context1->Exit(); 5763 context1->Exit();
5740 5764
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
5807 Local<Value> value, 5831 Local<Value> value,
5808 const v8::PropertyCallbackInfo<v8::Value>& info) { 5832 const v8::PropertyCallbackInfo<v8::Value>& info) {
5809 ApiTestFuzzer::Fuzz(); 5833 ApiTestFuzzer::Fuzz();
5810 if (index == 39) { 5834 if (index == 39) {
5811 info.GetReturnValue().Set(value); 5835 info.GetReturnValue().Set(value);
5812 } 5836 }
5813 } 5837 }
5814 5838
5815 5839
5816 THREADED_TEST(IndexedInterceptorWithIndexedAccessor) { 5840 THREADED_TEST(IndexedInterceptorWithIndexedAccessor) {
5817 v8::HandleScope scope(CcTest::isolate()); 5841 v8::Isolate* isolate = CcTest::isolate();
5818 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5842 v8::HandleScope scope(isolate);
5843 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5819 templ->SetIndexedPropertyHandler(IndexedPropertyGetter, 5844 templ->SetIndexedPropertyHandler(IndexedPropertyGetter,
5820 IndexedPropertySetter); 5845 IndexedPropertySetter);
5821 LocalContext context; 5846 LocalContext context;
5822 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5847 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5823 Local<Script> getter_script = Script::Compile(v8_str( 5848 Local<Script> getter_script = Script::Compile(v8_str(
5824 "obj.__defineGetter__(\"3\", function(){return 5;});obj[3];")); 5849 "obj.__defineGetter__(\"3\", function(){return 5;});obj[3];"));
5825 Local<Script> setter_script = Script::Compile(v8_str( 5850 Local<Script> setter_script = Script::Compile(v8_str(
5826 "obj.__defineSetter__(\"17\", function(val){this.foo = val;});" 5851 "obj.__defineSetter__(\"17\", function(val){this.foo = val;});"
5827 "obj[17] = 23;" 5852 "obj[17] = 23;"
5828 "obj.foo;")); 5853 "obj.foo;"));
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
5872 "for(i = 0; i < 80000; i++) { keys[i] = i; };" 5897 "for(i = 0; i < 80000; i++) { keys[i] = i; };"
5873 "keys.length = 25; keys;")); 5898 "keys.length = 25; keys;"));
5874 Local<Value> result = indexed_property_names_script->Run(); 5899 Local<Value> result = indexed_property_names_script->Run();
5875 info.GetReturnValue().Set(Local<v8::Array>::Cast(result)); 5900 info.GetReturnValue().Set(Local<v8::Array>::Cast(result));
5876 } 5901 }
5877 5902
5878 5903
5879 // Make sure that the the interceptor code in the runtime properly handles 5904 // Make sure that the the interceptor code in the runtime properly handles
5880 // merging property name lists for double-array-backed arrays. 5905 // merging property name lists for double-array-backed arrays.
5881 THREADED_TEST(IndexedInterceptorUnboxedDoubleWithIndexedAccessor) { 5906 THREADED_TEST(IndexedInterceptorUnboxedDoubleWithIndexedAccessor) {
5882 v8::HandleScope scope(CcTest::isolate()); 5907 v8::Isolate* isolate = CcTest::isolate();
5883 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5908 v8::HandleScope scope(isolate);
5909 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5884 templ->SetIndexedPropertyHandler(UnboxedDoubleIndexedPropertyGetter, 5910 templ->SetIndexedPropertyHandler(UnboxedDoubleIndexedPropertyGetter,
5885 UnboxedDoubleIndexedPropertySetter, 5911 UnboxedDoubleIndexedPropertySetter,
5886 0, 5912 0,
5887 0, 5913 0,
5888 UnboxedDoubleIndexedPropertyEnumerator); 5914 UnboxedDoubleIndexedPropertyEnumerator);
5889 LocalContext context; 5915 LocalContext context;
5890 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5916 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5891 // When obj is created, force it to be Stored in a FastDoubleArray. 5917 // When obj is created, force it to be Stored in a FastDoubleArray.
5892 Local<Script> create_unboxed_double_script = Script::Compile(v8_str( 5918 Local<Script> create_unboxed_double_script = Script::Compile(v8_str(
5893 "obj[125000] = 1; for(i = 0; i < 80000; i+=2) { obj[i] = i; } " 5919 "obj[125000] = 1; for(i = 0; i < 80000; i+=2) { obj[i] = i; } "
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
5928 ApiTestFuzzer::Fuzz(); 5954 ApiTestFuzzer::Fuzz();
5929 if (index < 4) { 5955 if (index < 4) {
5930 info.GetReturnValue().Set(v8_num(index)); 5956 info.GetReturnValue().Set(v8_num(index));
5931 } 5957 }
5932 } 5958 }
5933 5959
5934 5960
5935 // Make sure that the the interceptor code in the runtime properly handles 5961 // Make sure that the the interceptor code in the runtime properly handles
5936 // merging property name lists for non-string arguments arrays. 5962 // merging property name lists for non-string arguments arrays.
5937 THREADED_TEST(IndexedInterceptorNonStrictArgsWithIndexedAccessor) { 5963 THREADED_TEST(IndexedInterceptorNonStrictArgsWithIndexedAccessor) {
5938 v8::HandleScope scope(CcTest::isolate()); 5964 v8::Isolate* isolate = CcTest::isolate();
5939 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5965 v8::HandleScope scope(isolate);
5966 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5940 templ->SetIndexedPropertyHandler(NonStrictIndexedPropertyGetter, 5967 templ->SetIndexedPropertyHandler(NonStrictIndexedPropertyGetter,
5941 0, 5968 0,
5942 0, 5969 0,
5943 0, 5970 0,
5944 NonStrictArgsIndexedPropertyEnumerator); 5971 NonStrictArgsIndexedPropertyEnumerator);
5945 LocalContext context; 5972 LocalContext context;
5946 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5973 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5947 Local<Script> create_args_script = 5974 Local<Script> create_args_script =
5948 Script::Compile(v8_str( 5975 Script::Compile(v8_str(
5949 "var key_count = 0;" 5976 "var key_count = 0;"
5950 "for (x in obj) {key_count++;} key_count;")); 5977 "for (x in obj) {key_count++;} key_count;"));
5951 Local<Value> result = create_args_script->Run(); 5978 Local<Value> result = create_args_script->Run();
5952 CHECK_EQ(v8_num(4), result); 5979 CHECK_EQ(v8_num(4), result);
5953 } 5980 }
5954 5981
5955 5982
5956 static void IdentityIndexedPropertyGetter( 5983 static void IdentityIndexedPropertyGetter(
5957 uint32_t index, 5984 uint32_t index,
5958 const v8::PropertyCallbackInfo<v8::Value>& info) { 5985 const v8::PropertyCallbackInfo<v8::Value>& info) {
5959 info.GetReturnValue().Set(index); 5986 info.GetReturnValue().Set(index);
5960 } 5987 }
5961 5988
5962 5989
5963 THREADED_TEST(IndexedInterceptorWithGetOwnPropertyDescriptor) { 5990 THREADED_TEST(IndexedInterceptorWithGetOwnPropertyDescriptor) {
5964 v8::HandleScope scope(CcTest::isolate()); 5991 v8::Isolate* isolate = CcTest::isolate();
5965 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5992 v8::HandleScope scope(isolate);
5993 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5966 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5994 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5967 5995
5968 LocalContext context; 5996 LocalContext context;
5969 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5997 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5970 5998
5971 // Check fast object case. 5999 // Check fast object case.
5972 const char* fast_case_code = 6000 const char* fast_case_code =
5973 "Object.getOwnPropertyDescriptor(obj, 0).value.toString()"; 6001 "Object.getOwnPropertyDescriptor(obj, 0).value.toString()";
5974 ExpectString(fast_case_code, "0"); 6002 ExpectString(fast_case_code, "0");
5975 6003
5976 // Check slow case. 6004 // Check slow case.
5977 const char* slow_case_code = 6005 const char* slow_case_code =
5978 "obj.x = 1; delete obj.x;" 6006 "obj.x = 1; delete obj.x;"
5979 "Object.getOwnPropertyDescriptor(obj, 1).value.toString()"; 6007 "Object.getOwnPropertyDescriptor(obj, 1).value.toString()";
5980 ExpectString(slow_case_code, "1"); 6008 ExpectString(slow_case_code, "1");
5981 } 6009 }
5982 6010
5983 6011
5984 THREADED_TEST(IndexedInterceptorWithNoSetter) { 6012 THREADED_TEST(IndexedInterceptorWithNoSetter) {
5985 v8::HandleScope scope(CcTest::isolate()); 6013 v8::Isolate* isolate = CcTest::isolate();
5986 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6014 v8::HandleScope scope(isolate);
6015 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5987 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6016 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5988 6017
5989 LocalContext context; 6018 LocalContext context;
5990 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 6019 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5991 6020
5992 const char* code = 6021 const char* code =
5993 "try {" 6022 "try {"
5994 " obj[0] = 239;" 6023 " obj[0] = 239;"
5995 " for (var i = 0; i < 100; i++) {" 6024 " for (var i = 0; i < 100; i++) {"
5996 " var v = obj[0];" 6025 " var v = obj[0];"
5997 " if (v != 0) throw 'Wrong value ' + v + ' at iteration ' + i;" 6026 " if (v != 0) throw 'Wrong value ' + v + ' at iteration ' + i;"
5998 " }" 6027 " }"
5999 " 'PASSED'" 6028 " 'PASSED'"
6000 "} catch(e) {" 6029 "} catch(e) {"
6001 " e" 6030 " e"
6002 "}"; 6031 "}";
6003 ExpectString(code, "PASSED"); 6032 ExpectString(code, "PASSED");
6004 } 6033 }
6005 6034
6006 6035
6007 THREADED_TEST(IndexedInterceptorWithAccessorCheck) { 6036 THREADED_TEST(IndexedInterceptorWithAccessorCheck) {
6008 v8::HandleScope scope(CcTest::isolate()); 6037 v8::Isolate* isolate = CcTest::isolate();
6009 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6038 v8::HandleScope scope(isolate);
6039 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6010 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6040 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
6011 6041
6012 LocalContext context; 6042 LocalContext context;
6013 Local<v8::Object> obj = templ->NewInstance(); 6043 Local<v8::Object> obj = templ->NewInstance();
6014 obj->TurnOnAccessCheck(); 6044 obj->TurnOnAccessCheck();
6015 context->Global()->Set(v8_str("obj"), obj); 6045 context->Global()->Set(v8_str("obj"), obj);
6016 6046
6017 const char* code = 6047 const char* code =
6018 "try {" 6048 "try {"
6019 " for (var i = 0; i < 100; i++) {" 6049 " for (var i = 0; i < 100; i++) {"
6020 " var v = obj[0];" 6050 " var v = obj[0];"
6021 " if (v != undefined) throw 'Wrong value ' + v + ' at iteration ' + i;" 6051 " if (v != undefined) throw 'Wrong value ' + v + ' at iteration ' + i;"
6022 " }" 6052 " }"
6023 " 'PASSED'" 6053 " 'PASSED'"
6024 "} catch(e) {" 6054 "} catch(e) {"
6025 " e" 6055 " e"
6026 "}"; 6056 "}";
6027 ExpectString(code, "PASSED"); 6057 ExpectString(code, "PASSED");
6028 } 6058 }
6029 6059
6030 6060
6031 THREADED_TEST(IndexedInterceptorWithAccessorCheckSwitchedOn) { 6061 THREADED_TEST(IndexedInterceptorWithAccessorCheckSwitchedOn) {
6032 i::FLAG_allow_natives_syntax = true; 6062 i::FLAG_allow_natives_syntax = true;
6033 v8::HandleScope scope(CcTest::isolate()); 6063 v8::Isolate* isolate = CcTest::isolate();
6034 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6064 v8::HandleScope scope(isolate);
6065 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6035 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6066 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
6036 6067
6037 LocalContext context; 6068 LocalContext context;
6038 Local<v8::Object> obj = templ->NewInstance(); 6069 Local<v8::Object> obj = templ->NewInstance();
6039 context->Global()->Set(v8_str("obj"), obj); 6070 context->Global()->Set(v8_str("obj"), obj);
6040 6071
6041 const char* code = 6072 const char* code =
6042 "try {" 6073 "try {"
6043 " for (var i = 0; i < 100; i++) {" 6074 " for (var i = 0; i < 100; i++) {"
6044 " var expected = i;" 6075 " var expected = i;"
6045 " if (i == 5) {" 6076 " if (i == 5) {"
6046 " %EnableAccessChecks(obj);" 6077 " %EnableAccessChecks(obj);"
6047 " expected = undefined;" 6078 " expected = undefined;"
6048 " }" 6079 " }"
6049 " var v = obj[i];" 6080 " var v = obj[i];"
6050 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" 6081 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
6051 " if (i == 5) %DisableAccessChecks(obj);" 6082 " if (i == 5) %DisableAccessChecks(obj);"
6052 " }" 6083 " }"
6053 " 'PASSED'" 6084 " 'PASSED'"
6054 "} catch(e) {" 6085 "} catch(e) {"
6055 " e" 6086 " e"
6056 "}"; 6087 "}";
6057 ExpectString(code, "PASSED"); 6088 ExpectString(code, "PASSED");
6058 } 6089 }
6059 6090
6060 6091
6061 THREADED_TEST(IndexedInterceptorWithDifferentIndices) { 6092 THREADED_TEST(IndexedInterceptorWithDifferentIndices) {
6062 v8::HandleScope scope(CcTest::isolate()); 6093 v8::Isolate* isolate = CcTest::isolate();
6063 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6094 v8::HandleScope scope(isolate);
6095 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6064 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6096 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
6065 6097
6066 LocalContext context; 6098 LocalContext context;
6067 Local<v8::Object> obj = templ->NewInstance(); 6099 Local<v8::Object> obj = templ->NewInstance();
6068 context->Global()->Set(v8_str("obj"), obj); 6100 context->Global()->Set(v8_str("obj"), obj);
6069 6101
6070 const char* code = 6102 const char* code =
6071 "try {" 6103 "try {"
6072 " for (var i = 0; i < 100; i++) {" 6104 " for (var i = 0; i < 100; i++) {"
6073 " var v = obj[i];" 6105 " var v = obj[i];"
6074 " if (v != i) throw 'Wrong value ' + v + ' at iteration ' + i;" 6106 " if (v != i) throw 'Wrong value ' + v + ' at iteration ' + i;"
6075 " }" 6107 " }"
6076 " 'PASSED'" 6108 " 'PASSED'"
6077 "} catch(e) {" 6109 "} catch(e) {"
6078 " e" 6110 " e"
6079 "}"; 6111 "}";
6080 ExpectString(code, "PASSED"); 6112 ExpectString(code, "PASSED");
6081 } 6113 }
6082 6114
6083 6115
6084 THREADED_TEST(IndexedInterceptorWithNegativeIndices) { 6116 THREADED_TEST(IndexedInterceptorWithNegativeIndices) {
6085 v8::HandleScope scope(CcTest::isolate()); 6117 v8::Isolate* isolate = CcTest::isolate();
6086 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6118 v8::HandleScope scope(isolate);
6119 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6087 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6120 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
6088 6121
6089 LocalContext context; 6122 LocalContext context;
6090 Local<v8::Object> obj = templ->NewInstance(); 6123 Local<v8::Object> obj = templ->NewInstance();
6091 context->Global()->Set(v8_str("obj"), obj); 6124 context->Global()->Set(v8_str("obj"), obj);
6092 6125
6093 const char* code = 6126 const char* code =
6094 "try {" 6127 "try {"
6095 " for (var i = 0; i < 100; i++) {" 6128 " for (var i = 0; i < 100; i++) {"
6096 " var expected = i;" 6129 " var expected = i;"
(...skipping 17 matching lines...) Expand all
6114 " }" 6147 " }"
6115 " 'PASSED'" 6148 " 'PASSED'"
6116 "} catch(e) {" 6149 "} catch(e) {"
6117 " e" 6150 " e"
6118 "}"; 6151 "}";
6119 ExpectString(code, "PASSED"); 6152 ExpectString(code, "PASSED");
6120 } 6153 }
6121 6154
6122 6155
6123 THREADED_TEST(IndexedInterceptorWithNotSmiLookup) { 6156 THREADED_TEST(IndexedInterceptorWithNotSmiLookup) {
6124 v8::HandleScope scope(CcTest::isolate()); 6157 v8::Isolate* isolate = CcTest::isolate();
6125 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6158 v8::HandleScope scope(isolate);
6159 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6126 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6160 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
6127 6161
6128 LocalContext context; 6162 LocalContext context;
6129 Local<v8::Object> obj = templ->NewInstance(); 6163 Local<v8::Object> obj = templ->NewInstance();
6130 context->Global()->Set(v8_str("obj"), obj); 6164 context->Global()->Set(v8_str("obj"), obj);
6131 6165
6132 const char* code = 6166 const char* code =
6133 "try {" 6167 "try {"
6134 " for (var i = 0; i < 100; i++) {" 6168 " for (var i = 0; i < 100; i++) {"
6135 " var expected = i;" 6169 " var expected = i;"
6136 " var key = i;" 6170 " var key = i;"
6137 " if (i == 50) {" 6171 " if (i == 50) {"
6138 " key = 'foobar';" 6172 " key = 'foobar';"
6139 " expected = undefined;" 6173 " expected = undefined;"
6140 " }" 6174 " }"
6141 " var v = obj[key];" 6175 " var v = obj[key];"
6142 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" 6176 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
6143 " }" 6177 " }"
6144 " 'PASSED'" 6178 " 'PASSED'"
6145 "} catch(e) {" 6179 "} catch(e) {"
6146 " e" 6180 " e"
6147 "}"; 6181 "}";
6148 ExpectString(code, "PASSED"); 6182 ExpectString(code, "PASSED");
6149 } 6183 }
6150 6184
6151 6185
6152 THREADED_TEST(IndexedInterceptorGoingMegamorphic) { 6186 THREADED_TEST(IndexedInterceptorGoingMegamorphic) {
6153 v8::HandleScope scope(CcTest::isolate()); 6187 v8::Isolate* isolate = CcTest::isolate();
6154 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6188 v8::HandleScope scope(isolate);
6189 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6155 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6190 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
6156 6191
6157 LocalContext context; 6192 LocalContext context;
6158 Local<v8::Object> obj = templ->NewInstance(); 6193 Local<v8::Object> obj = templ->NewInstance();
6159 context->Global()->Set(v8_str("obj"), obj); 6194 context->Global()->Set(v8_str("obj"), obj);
6160 6195
6161 const char* code = 6196 const char* code =
6162 "var original = obj;" 6197 "var original = obj;"
6163 "try {" 6198 "try {"
6164 " for (var i = 0; i < 100; i++) {" 6199 " for (var i = 0; i < 100; i++) {"
6165 " var expected = i;" 6200 " var expected = i;"
6166 " if (i == 50) {" 6201 " if (i == 50) {"
6167 " obj = {50: 'foobar'};" 6202 " obj = {50: 'foobar'};"
6168 " expected = 'foobar';" 6203 " expected = 'foobar';"
6169 " }" 6204 " }"
6170 " var v = obj[i];" 6205 " var v = obj[i];"
6171 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" 6206 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
6172 " if (i == 50) obj = original;" 6207 " if (i == 50) obj = original;"
6173 " }" 6208 " }"
6174 " 'PASSED'" 6209 " 'PASSED'"
6175 "} catch(e) {" 6210 "} catch(e) {"
6176 " e" 6211 " e"
6177 "}"; 6212 "}";
6178 ExpectString(code, "PASSED"); 6213 ExpectString(code, "PASSED");
6179 } 6214 }
6180 6215
6181 6216
6182 THREADED_TEST(IndexedInterceptorReceiverTurningSmi) { 6217 THREADED_TEST(IndexedInterceptorReceiverTurningSmi) {
6183 v8::HandleScope scope(CcTest::isolate()); 6218 v8::Isolate* isolate = CcTest::isolate();
6184 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6219 v8::HandleScope scope(isolate);
6220 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6185 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6221 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
6186 6222
6187 LocalContext context; 6223 LocalContext context;
6188 Local<v8::Object> obj = templ->NewInstance(); 6224 Local<v8::Object> obj = templ->NewInstance();
6189 context->Global()->Set(v8_str("obj"), obj); 6225 context->Global()->Set(v8_str("obj"), obj);
6190 6226
6191 const char* code = 6227 const char* code =
6192 "var original = obj;" 6228 "var original = obj;"
6193 "try {" 6229 "try {"
6194 " for (var i = 0; i < 100; i++) {" 6230 " for (var i = 0; i < 100; i++) {"
6195 " var expected = i;" 6231 " var expected = i;"
6196 " if (i == 5) {" 6232 " if (i == 5) {"
6197 " obj = 239;" 6233 " obj = 239;"
6198 " expected = undefined;" 6234 " expected = undefined;"
6199 " }" 6235 " }"
6200 " var v = obj[i];" 6236 " var v = obj[i];"
6201 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" 6237 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
6202 " if (i == 5) obj = original;" 6238 " if (i == 5) obj = original;"
6203 " }" 6239 " }"
6204 " 'PASSED'" 6240 " 'PASSED'"
6205 "} catch(e) {" 6241 "} catch(e) {"
6206 " e" 6242 " e"
6207 "}"; 6243 "}";
6208 ExpectString(code, "PASSED"); 6244 ExpectString(code, "PASSED");
6209 } 6245 }
6210 6246
6211 6247
6212 THREADED_TEST(IndexedInterceptorOnProto) { 6248 THREADED_TEST(IndexedInterceptorOnProto) {
6213 v8::HandleScope scope(CcTest::isolate()); 6249 v8::Isolate* isolate = CcTest::isolate();
6214 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6250 v8::HandleScope scope(isolate);
6251 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6215 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 6252 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
6216 6253
6217 LocalContext context; 6254 LocalContext context;
6218 Local<v8::Object> obj = templ->NewInstance(); 6255 Local<v8::Object> obj = templ->NewInstance();
6219 context->Global()->Set(v8_str("obj"), obj); 6256 context->Global()->Set(v8_str("obj"), obj);
6220 6257
6221 const char* code = 6258 const char* code =
6222 "var o = {__proto__: obj};" 6259 "var o = {__proto__: obj};"
6223 "try {" 6260 "try {"
6224 " for (var i = 0; i < 100; i++) {" 6261 " for (var i = 0; i < 100; i++) {"
6225 " var v = o[i];" 6262 " var v = o[i];"
6226 " if (v != i) throw 'Wrong value ' + v + ' at iteration ' + i;" 6263 " if (v != i) throw 'Wrong value ' + v + ' at iteration ' + i;"
6227 " }" 6264 " }"
6228 " 'PASSED'" 6265 " 'PASSED'"
6229 "} catch(e) {" 6266 "} catch(e) {"
6230 " e" 6267 " e"
6231 "}"; 6268 "}";
6232 ExpectString(code, "PASSED"); 6269 ExpectString(code, "PASSED");
6233 } 6270 }
6234 6271
6235 6272
6236 THREADED_TEST(MultiContexts) { 6273 THREADED_TEST(MultiContexts) {
6237 v8::Isolate* isolate = CcTest::isolate(); 6274 v8::Isolate* isolate = CcTest::isolate();
6238 v8::HandleScope scope(isolate); 6275 v8::HandleScope scope(isolate);
6239 v8::Handle<ObjectTemplate> templ = ObjectTemplate::New(); 6276 v8::Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6240 templ->Set(v8_str("dummy"), v8::FunctionTemplate::New(isolate, 6277 templ->Set(v8_str("dummy"), v8::FunctionTemplate::New(isolate,
6241 DummyCallHandler)); 6278 DummyCallHandler));
6242 6279
6243 Local<String> password = v8_str("Password"); 6280 Local<String> password = v8_str("Password");
6244 6281
6245 // Create an environment 6282 // Create an environment
6246 LocalContext context0(0, templ); 6283 LocalContext context0(0, templ);
6247 context0->SetSecurityToken(password); 6284 context0->SetSecurityToken(password);
6248 v8::Handle<v8::Object> global0 = context0->Global(); 6285 v8::Handle<v8::Object> global0 = context0->Global();
6249 global0->Set(v8_str("custom"), v8_num(1234)); 6286 global0->Set(v8_str("custom"), v8_num(1234));
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
6524 TEST(PersistentHandles) { 6561 TEST(PersistentHandles) {
6525 LocalContext env; 6562 LocalContext env;
6526 v8::Isolate* isolate = CcTest::isolate(); 6563 v8::Isolate* isolate = CcTest::isolate();
6527 v8::HandleScope scope(isolate); 6564 v8::HandleScope scope(isolate);
6528 Local<String> str = v8_str("foo"); 6565 Local<String> str = v8_str("foo");
6529 v8::Persistent<String> p_str(isolate, str); 6566 v8::Persistent<String> p_str(isolate, str);
6530 p_str.Reset(); 6567 p_str.Reset();
6531 Local<Script> scr = Script::Compile(v8_str("")); 6568 Local<Script> scr = Script::Compile(v8_str(""));
6532 v8::Persistent<Script> p_scr(isolate, scr); 6569 v8::Persistent<Script> p_scr(isolate, scr);
6533 p_scr.Reset(); 6570 p_scr.Reset();
6534 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6571 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
6535 v8::Persistent<ObjectTemplate> p_templ(isolate, templ); 6572 v8::Persistent<ObjectTemplate> p_templ(isolate, templ);
6536 p_templ.Reset(); 6573 p_templ.Reset();
6537 } 6574 }
6538 6575
6539 6576
6540 static void HandleLogDelegator( 6577 static void HandleLogDelegator(
6541 const v8::FunctionCallbackInfo<v8::Value>& args) { 6578 const v8::FunctionCallbackInfo<v8::Value>& args) {
6542 ApiTestFuzzer::Fuzz(); 6579 ApiTestFuzzer::Fuzz();
6543 } 6580 }
6544 6581
6545 6582
6546 THREADED_TEST(GlobalObjectTemplate) { 6583 THREADED_TEST(GlobalObjectTemplate) {
6547 v8::Isolate* isolate = CcTest::isolate(); 6584 v8::Isolate* isolate = CcTest::isolate();
6548 v8::HandleScope handle_scope(isolate); 6585 v8::HandleScope handle_scope(isolate);
6549 Local<ObjectTemplate> global_template = ObjectTemplate::New(); 6586 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate);
6550 global_template->Set(v8_str("JSNI_Log"), 6587 global_template->Set(v8_str("JSNI_Log"),
6551 v8::FunctionTemplate::New(isolate, HandleLogDelegator)); 6588 v8::FunctionTemplate::New(isolate, HandleLogDelegator));
6552 v8::Local<Context> context = Context::New(isolate, 0, global_template); 6589 v8::Local<Context> context = Context::New(isolate, 0, global_template);
6553 Context::Scope context_scope(context); 6590 Context::Scope context_scope(context);
6554 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); 6591 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run();
6555 } 6592 }
6556 6593
6557 6594
6558 static const char* kSimpleExtensionSource = 6595 static const char* kSimpleExtensionSource =
6559 "function Foo() {" 6596 "function Foo() {"
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
7077 prev.SetWeak<Value, Snorkel<Value> >(new Snorkel<Value>(&prev.As<Value>()), 7114 prev.SetWeak<Value, Snorkel<Value> >(new Snorkel<Value>(&prev.As<Value>()),
7078 &HandleWeakReference); 7115 &HandleWeakReference);
7079 } 7116 }
7080 whammy->objects_[whammy->cursor_].Reset(info.GetIsolate(), obj); 7117 whammy->objects_[whammy->cursor_].Reset(info.GetIsolate(), obj);
7081 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount; 7118 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount;
7082 info.GetReturnValue().Set(whammy->getScript()->Run()); 7119 info.GetReturnValue().Set(whammy->getScript()->Run());
7083 } 7120 }
7084 7121
7085 7122
7086 THREADED_TEST(WeakReference) { 7123 THREADED_TEST(WeakReference) {
7087 v8::HandleScope handle_scope(CcTest::isolate()); 7124 v8::Isolate* isolate = CcTest::isolate();
7088 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(); 7125 v8::HandleScope handle_scope(isolate);
7126 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(isolate);
7089 Whammy* whammy = new Whammy(CcTest::isolate()); 7127 Whammy* whammy = new Whammy(CcTest::isolate());
7090 templ->SetNamedPropertyHandler(WhammyPropertyGetter, 7128 templ->SetNamedPropertyHandler(WhammyPropertyGetter,
7091 0, 0, 0, 0, 7129 0, 0, 0, 0,
7092 v8::External::New(CcTest::isolate(), whammy)); 7130 v8::External::New(CcTest::isolate(), whammy));
7093 const char* extension_list[] = { "v8/gc" }; 7131 const char* extension_list[] = { "v8/gc" };
7094 v8::ExtensionConfiguration extensions(1, extension_list); 7132 v8::ExtensionConfiguration extensions(1, extension_list);
7095 v8::Handle<Context> context = 7133 v8::Handle<Context> context =
7096 Context::New(CcTest::isolate(), &extensions); 7134 Context::New(CcTest::isolate(), &extensions);
7097 Context::Scope context_scope(context); 7135 Context::Scope context_scope(context);
7098 7136
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
7265 CHECK_EQ(v8::Integer::New(isolate, 3), args[2]); 7303 CHECK_EQ(v8::Integer::New(isolate, 3), args[2]);
7266 CHECK_EQ(v8::Undefined(isolate), args[3]); 7304 CHECK_EQ(v8::Undefined(isolate), args[3]);
7267 v8::HandleScope scope(args.GetIsolate()); 7305 v8::HandleScope scope(args.GetIsolate());
7268 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 7306 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
7269 } 7307 }
7270 7308
7271 7309
7272 THREADED_TEST(Arguments) { 7310 THREADED_TEST(Arguments) {
7273 v8::Isolate* isolate = CcTest::isolate(); 7311 v8::Isolate* isolate = CcTest::isolate();
7274 v8::HandleScope scope(isolate); 7312 v8::HandleScope scope(isolate);
7275 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); 7313 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate);
7276 global->Set(v8_str("f"), 7314 global->Set(v8_str("f"),
7277 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback)); 7315 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback));
7278 LocalContext context(NULL, global); 7316 LocalContext context(NULL, global);
7279 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); 7317 args_fun = context->Global()->Get(v8_str("f")).As<Function>();
7280 v8_compile("f(1, 2, 3)")->Run(); 7318 v8_compile("f(1, 2, 3)")->Run();
7281 } 7319 }
7282 7320
7283 7321
7284 static void NoBlockGetterX(Local<String> name, 7322 static void NoBlockGetterX(Local<String> name,
7285 const v8::PropertyCallbackInfo<v8::Value>&) { 7323 const v8::PropertyCallbackInfo<v8::Value>&) {
(...skipping 19 matching lines...) Expand all
7305 const v8::PropertyCallbackInfo<v8::Boolean>& info) { 7343 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
7306 if (index != 2) { 7344 if (index != 2) {
7307 return; // not intercepted 7345 return; // not intercepted
7308 } 7346 }
7309 7347
7310 info.GetReturnValue().Set(false); // intercepted, don't delete the property 7348 info.GetReturnValue().Set(false); // intercepted, don't delete the property
7311 } 7349 }
7312 7350
7313 7351
7314 THREADED_TEST(Deleter) { 7352 THREADED_TEST(Deleter) {
7315 v8::HandleScope scope(CcTest::isolate()); 7353 v8::Isolate* isolate = CcTest::isolate();
7316 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 7354 v8::HandleScope scope(isolate);
7355 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
7317 obj->SetNamedPropertyHandler(NoBlockGetterX, NULL, NULL, PDeleter, NULL); 7356 obj->SetNamedPropertyHandler(NoBlockGetterX, NULL, NULL, PDeleter, NULL);
7318 obj->SetIndexedPropertyHandler(NoBlockGetterI, NULL, NULL, IDeleter, NULL); 7357 obj->SetIndexedPropertyHandler(NoBlockGetterI, NULL, NULL, IDeleter, NULL);
7319 LocalContext context; 7358 LocalContext context;
7320 context->Global()->Set(v8_str("k"), obj->NewInstance()); 7359 context->Global()->Set(v8_str("k"), obj->NewInstance());
7321 CompileRun( 7360 CompileRun(
7322 "k.foo = 'foo';" 7361 "k.foo = 'foo';"
7323 "k.bar = 'bar';" 7362 "k.bar = 'bar';"
7324 "k[2] = 2;" 7363 "k[2] = 2;"
7325 "k[4] = 4;"); 7364 "k[4] = 4;");
7326 CHECK(v8_compile("delete k.foo")->Run()->IsFalse()); 7365 CHECK(v8_compile("delete k.foo")->Run()->IsFalse());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
7370 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); 7409 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2);
7371 result->Set(v8::Integer::New(info.GetIsolate(), 0), v8_str("0")); 7410 result->Set(v8::Integer::New(info.GetIsolate(), 0), v8_str("0"));
7372 result->Set(v8::Integer::New(info.GetIsolate(), 1), v8_str("1")); 7411 result->Set(v8::Integer::New(info.GetIsolate(), 1), v8_str("1"));
7373 info.GetReturnValue().Set(result); 7412 info.GetReturnValue().Set(result);
7374 } 7413 }
7375 7414
7376 7415
7377 THREADED_TEST(Enumerators) { 7416 THREADED_TEST(Enumerators) {
7378 v8::Isolate* isolate = CcTest::isolate(); 7417 v8::Isolate* isolate = CcTest::isolate();
7379 v8::HandleScope scope(isolate); 7418 v8::HandleScope scope(isolate);
7380 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 7419 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
7381 obj->SetNamedPropertyHandler(GetK, NULL, NULL, NULL, NamedEnum); 7420 obj->SetNamedPropertyHandler(GetK, NULL, NULL, NULL, NamedEnum);
7382 obj->SetIndexedPropertyHandler(IndexedGetK, NULL, NULL, NULL, IndexedEnum); 7421 obj->SetIndexedPropertyHandler(IndexedGetK, NULL, NULL, NULL, IndexedEnum);
7383 LocalContext context; 7422 LocalContext context;
7384 context->Global()->Set(v8_str("k"), obj->NewInstance()); 7423 context->Global()->Set(v8_str("k"), obj->NewInstance());
7385 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( 7424 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun(
7386 "k[10] = 0;" 7425 "k[10] = 0;"
7387 "k.a = 0;" 7426 "k.a = 0;"
7388 "k[5] = 0;" 7427 "k[5] = 0;"
7389 "k.b = 0;" 7428 "k.b = 0;"
7390 "k[4294967295] = 0;" 7429 "k[4294967295] = 0;"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
7484 CHECK_EQ(info.This(), global->Get(v8_str("o2"))); 7523 CHECK_EQ(info.This(), global->Get(v8_str("o2")));
7485 } else if (name->Equals(v8_str("p3"))) { 7524 } else if (name->Equals(v8_str("p3"))) {
7486 CHECK_EQ(info.This(), global->Get(v8_str("o3"))); 7525 CHECK_EQ(info.This(), global->Get(v8_str("o3")));
7487 } else if (name->Equals(v8_str("p4"))) { 7526 } else if (name->Equals(v8_str("p4"))) {
7488 CHECK_EQ(info.This(), global->Get(v8_str("o4"))); 7527 CHECK_EQ(info.This(), global->Get(v8_str("o4")));
7489 } 7528 }
7490 } 7529 }
7491 7530
7492 7531
7493 THREADED_TEST(GetterHolders) { 7532 THREADED_TEST(GetterHolders) {
7494 v8::HandleScope scope(CcTest::isolate()); 7533 v8::Isolate* isolate = CcTest::isolate();
7495 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 7534 v8::HandleScope scope(isolate);
7535 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
7496 obj->SetAccessor(v8_str("p1"), PGetter); 7536 obj->SetAccessor(v8_str("p1"), PGetter);
7497 obj->SetAccessor(v8_str("p2"), PGetter); 7537 obj->SetAccessor(v8_str("p2"), PGetter);
7498 obj->SetAccessor(v8_str("p3"), PGetter); 7538 obj->SetAccessor(v8_str("p3"), PGetter);
7499 obj->SetAccessor(v8_str("p4"), PGetter); 7539 obj->SetAccessor(v8_str("p4"), PGetter);
7500 p_getter_count = 0; 7540 p_getter_count = 0;
7501 RunHolderTest(obj); 7541 RunHolderTest(obj);
7502 CHECK_EQ(40, p_getter_count); 7542 CHECK_EQ(40, p_getter_count);
7503 } 7543 }
7504 7544
7505 7545
7506 THREADED_TEST(PreInterceptorHolders) { 7546 THREADED_TEST(PreInterceptorHolders) {
7507 v8::HandleScope scope(CcTest::isolate()); 7547 v8::Isolate* isolate = CcTest::isolate();
7508 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 7548 v8::HandleScope scope(isolate);
7549 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
7509 obj->SetNamedPropertyHandler(PGetter2); 7550 obj->SetNamedPropertyHandler(PGetter2);
7510 p_getter_count2 = 0; 7551 p_getter_count2 = 0;
7511 RunHolderTest(obj); 7552 RunHolderTest(obj);
7512 CHECK_EQ(40, p_getter_count2); 7553 CHECK_EQ(40, p_getter_count2);
7513 } 7554 }
7514 7555
7515 7556
7516 THREADED_TEST(ObjectInstantiation) { 7557 THREADED_TEST(ObjectInstantiation) {
7517 v8::Isolate* isolate = CcTest::isolate(); 7558 v8::Isolate* isolate = CcTest::isolate();
7518 v8::HandleScope scope(isolate); 7559 v8::HandleScope scope(isolate);
7519 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 7560 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
7520 templ->SetAccessor(v8_str("t"), PGetter2); 7561 templ->SetAccessor(v8_str("t"), PGetter2);
7521 LocalContext context; 7562 LocalContext context;
7522 context->Global()->Set(v8_str("o"), templ->NewInstance()); 7563 context->Global()->Set(v8_str("o"), templ->NewInstance());
7523 for (int i = 0; i < 100; i++) { 7564 for (int i = 0; i < 100; i++) {
7524 v8::HandleScope inner_scope(CcTest::isolate()); 7565 v8::HandleScope inner_scope(CcTest::isolate());
7525 v8::Handle<v8::Object> obj = templ->NewInstance(); 7566 v8::Handle<v8::Object> obj = templ->NewInstance();
7526 CHECK_NE(obj, context->Global()->Get(v8_str("o"))); 7567 CHECK_NE(obj, context->Global()->Get(v8_str("o")));
7527 context->Global()->Set(v8_str("o2"), obj); 7568 context->Global()->Set(v8_str("o2"), obj);
7528 v8::Handle<Value> value = 7569 v8::Handle<Value> value =
7529 Script::Compile(v8_str("o.__proto__ === o2.__proto__"))->Run(); 7570 Script::Compile(v8_str("o.__proto__ === o2.__proto__"))->Run();
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
8112 Local<Value> value, 8153 Local<Value> value,
8113 const v8::PropertyCallbackInfo<void>& info) { 8154 const v8::PropertyCallbackInfo<void>& info) {
8114 if (info.This()->Has(name)) { 8155 if (info.This()->Has(name)) {
8115 info.This()->Delete(name); 8156 info.This()->Delete(name);
8116 } 8157 }
8117 info.This()->Set(name, value); 8158 info.This()->Set(name, value);
8118 } 8159 }
8119 8160
8120 8161
8121 THREADED_TEST(DeleteAccessor) { 8162 THREADED_TEST(DeleteAccessor) {
8122 v8::HandleScope scope(CcTest::isolate()); 8163 v8::Isolate* isolate = CcTest::isolate();
8123 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 8164 v8::HandleScope scope(isolate);
8165 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
8124 obj->SetAccessor(v8_str("y"), YGetter, YSetter); 8166 obj->SetAccessor(v8_str("y"), YGetter, YSetter);
8125 LocalContext context; 8167 LocalContext context;
8126 v8::Handle<v8::Object> holder = obj->NewInstance(); 8168 v8::Handle<v8::Object> holder = obj->NewInstance();
8127 context->Global()->Set(v8_str("holder"), holder); 8169 context->Global()->Set(v8_str("holder"), holder);
8128 v8::Handle<Value> result = CompileRun( 8170 v8::Handle<Value> result = CompileRun(
8129 "holder.y = 11; holder.y = 12; holder.y"); 8171 "holder.y = 11; holder.y = 12; holder.y");
8130 CHECK_EQ(12, result->Uint32Value()); 8172 CHECK_EQ(12, result->Uint32Value());
8131 } 8173 }
8132 8174
8133 8175
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
8304 CHECK(!try_catch.HasCaught()); 8346 CHECK(!try_catch.HasCaught());
8305 Script::Compile(v8_str("(function()" 8347 Script::Compile(v8_str("(function()"
8306 " { try { throw ''; } finally { throw 0; }" 8348 " { try { throw ''; } finally { throw 0; }"
8307 "})()"))->Run(); 8349 "})()"))->Run();
8308 CHECK(try_catch.HasCaught()); 8350 CHECK(try_catch.HasCaught());
8309 } 8351 }
8310 8352
8311 8353
8312 // SecurityHandler can't be run twice 8354 // SecurityHandler can't be run twice
8313 TEST(SecurityHandler) { 8355 TEST(SecurityHandler) {
8314 v8::HandleScope scope0(CcTest::isolate()); 8356 v8::Isolate* isolate = CcTest::isolate();
8315 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 8357 v8::HandleScope scope0(isolate);
8358 v8::Handle<v8::ObjectTemplate> global_template =
8359 v8::ObjectTemplate::New(isolate);
8316 global_template->SetAccessCheckCallbacks(NamedSecurityTestCallback, 8360 global_template->SetAccessCheckCallbacks(NamedSecurityTestCallback,
8317 IndexedSecurityTestCallback); 8361 IndexedSecurityTestCallback);
8318 // Create an environment 8362 // Create an environment
8319 v8::Handle<Context> context0 = 8363 v8::Handle<Context> context0 = Context::New(isolate, NULL, global_template);
8320 Context::New(CcTest::isolate(), NULL, global_template);
8321 context0->Enter(); 8364 context0->Enter();
8322 8365
8323 v8::Handle<v8::Object> global0 = context0->Global(); 8366 v8::Handle<v8::Object> global0 = context0->Global();
8324 v8::Handle<Script> script0 = v8_compile("foo = 111"); 8367 v8::Handle<Script> script0 = v8_compile("foo = 111");
8325 script0->Run(); 8368 script0->Run();
8326 global0->Set(v8_str("0"), v8_num(999)); 8369 global0->Set(v8_str("0"), v8_num(999));
8327 v8::Handle<Value> foo0 = global0->Get(v8_str("foo")); 8370 v8::Handle<Value> foo0 = global0->Get(v8_str("foo"));
8328 CHECK_EQ(111, foo0->Int32Value()); 8371 CHECK_EQ(111, foo0->Int32Value());
8329 v8::Handle<Value> z0 = global0->Get(v8_str("0")); 8372 v8::Handle<Value> z0 = global0->Get(v8_str("0"));
8330 CHECK_EQ(999, z0->Int32Value()); 8373 CHECK_EQ(999, z0->Int32Value());
8331 8374
8332 // Create another environment, should fail security checks. 8375 // Create another environment, should fail security checks.
8333 v8::HandleScope scope1(CcTest::isolate()); 8376 v8::HandleScope scope1(isolate);
8334 8377
8335 v8::Handle<Context> context1 = 8378 v8::Handle<Context> context1 =
8336 Context::New(CcTest::isolate(), NULL, global_template); 8379 Context::New(isolate, NULL, global_template);
8337 context1->Enter(); 8380 context1->Enter();
8338 8381
8339 v8::Handle<v8::Object> global1 = context1->Global(); 8382 v8::Handle<v8::Object> global1 = context1->Global();
8340 global1->Set(v8_str("othercontext"), global0); 8383 global1->Set(v8_str("othercontext"), global0);
8341 // This set will fail the security check. 8384 // This set will fail the security check.
8342 v8::Handle<Script> script1 = 8385 v8::Handle<Script> script1 =
8343 v8_compile("othercontext.foo = 222; othercontext[0] = 888;"); 8386 v8_compile("othercontext.foo = 222; othercontext[0] = 888;");
8344 script1->Run(); 8387 script1->Run();
8345 // This read will pass the security check. 8388 // This read will pass the security check.
8346 v8::Handle<Value> foo1 = global0->Get(v8_str("foo")); 8389 v8::Handle<Value> foo1 = global0->Get(v8_str("foo"));
8347 CHECK_EQ(111, foo1->Int32Value()); 8390 CHECK_EQ(111, foo1->Int32Value());
8348 // This read will pass the security check. 8391 // This read will pass the security check.
8349 v8::Handle<Value> z1 = global0->Get(v8_str("0")); 8392 v8::Handle<Value> z1 = global0->Get(v8_str("0"));
8350 CHECK_EQ(999, z1->Int32Value()); 8393 CHECK_EQ(999, z1->Int32Value());
8351 8394
8352 // Create another environment, should pass security checks. 8395 // Create another environment, should pass security checks.
8353 { g_security_callback_result = true; // allow security handler to pass. 8396 { g_security_callback_result = true; // allow security handler to pass.
8354 v8::HandleScope scope2(CcTest::isolate()); 8397 v8::HandleScope scope2(isolate);
8355 LocalContext context2; 8398 LocalContext context2;
8356 v8::Handle<v8::Object> global2 = context2->Global(); 8399 v8::Handle<v8::Object> global2 = context2->Global();
8357 global2->Set(v8_str("othercontext"), global0); 8400 global2->Set(v8_str("othercontext"), global0);
8358 v8::Handle<Script> script2 = 8401 v8::Handle<Script> script2 =
8359 v8_compile("othercontext.foo = 333; othercontext[0] = 888;"); 8402 v8_compile("othercontext.foo = 333; othercontext[0] = 888;");
8360 script2->Run(); 8403 script2->Run();
8361 v8::Handle<Value> foo2 = global0->Get(v8_str("foo")); 8404 v8::Handle<Value> foo2 = global0->Get(v8_str("foo"));
8362 CHECK_EQ(333, foo2->Int32Value()); 8405 CHECK_EQ(333, foo2->Int32Value());
8363 v8::Handle<Value> z2 = global0->Get(v8_str("0")); 8406 v8::Handle<Value> z2 = global0->Get(v8_str("0"));
8364 CHECK_EQ(888, z2->Int32Value()); 8407 CHECK_EQ(888, z2->Int32Value());
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
8892 8935
8893 static void UnreachableFunction( 8936 static void UnreachableFunction(
8894 const v8::FunctionCallbackInfo<v8::Value>& info) { 8937 const v8::FunctionCallbackInfo<v8::Value>& info) {
8895 CHECK(false); // This function should not be called.. 8938 CHECK(false); // This function should not be called..
8896 } 8939 }
8897 8940
8898 8941
8899 TEST(AccessControl) { 8942 TEST(AccessControl) {
8900 v8::Isolate* isolate = CcTest::isolate(); 8943 v8::Isolate* isolate = CcTest::isolate();
8901 v8::HandleScope handle_scope(isolate); 8944 v8::HandleScope handle_scope(isolate);
8902 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 8945 v8::Handle<v8::ObjectTemplate> global_template =
8946 v8::ObjectTemplate::New(isolate);
8903 8947
8904 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, 8948 global_template->SetAccessCheckCallbacks(NamedAccessBlocker,
8905 IndexedAccessBlocker); 8949 IndexedAccessBlocker);
8906 8950
8907 // Add an accessor accessible by cross-domain JS code. 8951 // Add an accessor accessible by cross-domain JS code.
8908 global_template->SetAccessor( 8952 global_template->SetAccessor(
8909 v8_str("accessible_prop"), 8953 v8_str("accessible_prop"),
8910 EchoGetter, EchoSetter, 8954 EchoGetter, EchoSetter,
8911 v8::Handle<Value>(), 8955 v8::Handle<Value>(),
8912 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); 8956 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
9171 CHECK(value->IsTrue()); 9215 CHECK(value->IsTrue());
9172 9216
9173 context1->Exit(); 9217 context1->Exit();
9174 context0->Exit(); 9218 context0->Exit();
9175 } 9219 }
9176 9220
9177 9221
9178 TEST(AccessControlES5) { 9222 TEST(AccessControlES5) {
9179 v8::Isolate* isolate = CcTest::isolate(); 9223 v8::Isolate* isolate = CcTest::isolate();
9180 v8::HandleScope handle_scope(isolate); 9224 v8::HandleScope handle_scope(isolate);
9181 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 9225 v8::Handle<v8::ObjectTemplate> global_template =
9226 v8::ObjectTemplate::New(isolate);
9182 9227
9183 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, 9228 global_template->SetAccessCheckCallbacks(NamedAccessBlocker,
9184 IndexedAccessBlocker); 9229 IndexedAccessBlocker);
9185 9230
9186 // Add accessible accessor. 9231 // Add accessible accessor.
9187 global_template->SetAccessor( 9232 global_template->SetAccessor(
9188 v8_str("accessible_prop"), 9233 v8_str("accessible_prop"),
9189 EchoGetter, EchoSetter, 9234 EchoGetter, EchoSetter,
9190 v8::Handle<Value>(), 9235 v8::Handle<Value>(),
9191 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); 9236 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
9258 uint32_t key, 9303 uint32_t key,
9259 v8::AccessType type, 9304 v8::AccessType type,
9260 Local<Value> data) { 9305 Local<Value> data) {
9261 return false; 9306 return false;
9262 } 9307 }
9263 9308
9264 9309
9265 THREADED_TEST(AccessControlGetOwnPropertyNames) { 9310 THREADED_TEST(AccessControlGetOwnPropertyNames) {
9266 v8::Isolate* isolate = CcTest::isolate(); 9311 v8::Isolate* isolate = CcTest::isolate();
9267 v8::HandleScope handle_scope(isolate); 9312 v8::HandleScope handle_scope(isolate);
9268 v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(); 9313 v8::Handle<v8::ObjectTemplate> obj_template =
9314 v8::ObjectTemplate::New(isolate);
9269 9315
9270 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 9316 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
9271 obj_template->SetAccessCheckCallbacks(GetOwnPropertyNamesNamedBlocker, 9317 obj_template->SetAccessCheckCallbacks(GetOwnPropertyNamesNamedBlocker,
9272 GetOwnPropertyNamesIndexedBlocker); 9318 GetOwnPropertyNamesIndexedBlocker);
9273 9319
9274 // Create an environment 9320 // Create an environment
9275 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 9321 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
9276 context0->Enter(); 9322 context0->Enter();
9277 9323
9278 v8::Handle<v8::Object> global0 = context0->Global(); 9324 v8::Handle<v8::Object> global0 = context0->Global();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
9316 static void NamedPropertyEnumerator( 9362 static void NamedPropertyEnumerator(
9317 const v8::PropertyCallbackInfo<v8::Array>& info) { 9363 const v8::PropertyCallbackInfo<v8::Array>& info) {
9318 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); 9364 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2);
9319 result->Set(0, v8_str("x")); 9365 result->Set(0, v8_str("x"));
9320 result->Set(1, v8::Object::New(info.GetIsolate())); 9366 result->Set(1, v8::Object::New(info.GetIsolate()));
9321 info.GetReturnValue().Set(result); 9367 info.GetReturnValue().Set(result);
9322 } 9368 }
9323 9369
9324 9370
9325 THREADED_TEST(GetOwnPropertyNamesWithInterceptor) { 9371 THREADED_TEST(GetOwnPropertyNamesWithInterceptor) {
9326 v8::HandleScope handle_scope(CcTest::isolate()); 9372 v8::Isolate* isolate = CcTest::isolate();
9327 v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(); 9373 v8::HandleScope handle_scope(isolate);
9374 v8::Handle<v8::ObjectTemplate> obj_template =
9375 v8::ObjectTemplate::New(isolate);
9328 9376
9329 obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7)); 9377 obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7));
9330 obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42)); 9378 obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42));
9331 obj_template->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL, 9379 obj_template->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL,
9332 IndexedPropertyEnumerator); 9380 IndexedPropertyEnumerator);
9333 obj_template->SetNamedPropertyHandler(NULL, NULL, NULL, NULL, 9381 obj_template->SetNamedPropertyHandler(NULL, NULL, NULL, NULL,
9334 NamedPropertyEnumerator); 9382 NamedPropertyEnumerator);
9335 9383
9336 LocalContext context; 9384 LocalContext context;
9337 v8::Handle<v8::Object> global = context->Global(); 9385 v8::Handle<v8::Object> global = context->Global();
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
9438 9486
9439 v8::Isolate* isolate = CcTest::isolate(); 9487 v8::Isolate* isolate = CcTest::isolate();
9440 v8::HandleScope handle_scope(isolate); 9488 v8::HandleScope handle_scope(isolate);
9441 9489
9442 // Create an environment. 9490 // Create an environment.
9443 v8::Local<Context> context0 = Context::New(isolate); 9491 v8::Local<Context> context0 = Context::New(isolate);
9444 context0->Enter(); 9492 context0->Enter();
9445 9493
9446 // Create an object that requires access-check functions to be 9494 // Create an object that requires access-check functions to be
9447 // called for cross-domain access. 9495 // called for cross-domain access.
9448 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); 9496 v8::Handle<v8::ObjectTemplate> object_template =
9497 v8::ObjectTemplate::New(isolate);
9449 object_template->SetAccessCheckCallbacks(NamedAccessCounter, 9498 object_template->SetAccessCheckCallbacks(NamedAccessCounter,
9450 IndexedAccessCounter); 9499 IndexedAccessCounter);
9451 Local<v8::Object> object = object_template->NewInstance(); 9500 Local<v8::Object> object = object_template->NewInstance();
9452 9501
9453 v8::HandleScope scope1(isolate); 9502 v8::HandleScope scope1(isolate);
9454 9503
9455 // Create another environment. 9504 // Create another environment.
9456 v8::Local<Context> context1 = Context::New(isolate); 9505 v8::Local<Context> context1 = Context::New(isolate);
9457 context1->Enter(); 9506 context1->Enter();
9458 9507
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
9586 9635
9587 v8::Isolate* isolate = CcTest::isolate(); 9636 v8::Isolate* isolate = CcTest::isolate();
9588 v8::HandleScope handle_scope(isolate); 9637 v8::HandleScope handle_scope(isolate);
9589 9638
9590 // Create an environment. 9639 // Create an environment.
9591 v8::Local<Context> context0 = Context::New(isolate); 9640 v8::Local<Context> context0 = Context::New(isolate);
9592 context0->Enter(); 9641 context0->Enter();
9593 9642
9594 // Create an object that requires access-check functions to be 9643 // Create an object that requires access-check functions to be
9595 // called for cross-domain access. 9644 // called for cross-domain access.
9596 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); 9645 v8::Handle<v8::ObjectTemplate> object_template =
9646 v8::ObjectTemplate::New(isolate);
9597 object_template->SetAccessCheckCallbacks(NamedAccessFlatten, 9647 object_template->SetAccessCheckCallbacks(NamedAccessFlatten,
9598 IndexedAccessFlatten); 9648 IndexedAccessFlatten);
9599 Local<v8::Object> object = object_template->NewInstance(); 9649 Local<v8::Object> object = object_template->NewInstance();
9600 9650
9601 v8::HandleScope scope1(isolate); 9651 v8::HandleScope scope1(isolate);
9602 9652
9603 // Create another environment. 9653 // Create another environment.
9604 v8::Local<Context> context1 = Context::New(isolate); 9654 v8::Local<Context> context1 = Context::New(isolate);
9605 context1->Enter(); 9655 context1->Enter();
9606 9656
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
9655 v8::Isolate* isolate = CcTest::isolate(); 9705 v8::Isolate* isolate = CcTest::isolate();
9656 v8::HandleScope handle_scope(isolate); 9706 v8::HandleScope handle_scope(isolate);
9657 9707
9658 // Create an environment. 9708 // Create an environment.
9659 v8::Local<Context> context0 = Context::New(isolate); 9709 v8::Local<Context> context0 = Context::New(isolate);
9660 context0->Enter(); 9710 context0->Enter();
9661 9711
9662 // Create an object that requires access-check functions to be 9712 // Create an object that requires access-check functions to be
9663 // called for cross-domain access. The object also has interceptors 9713 // called for cross-domain access. The object also has interceptors
9664 // interceptor. 9714 // interceptor.
9665 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); 9715 v8::Handle<v8::ObjectTemplate> object_template =
9716 v8::ObjectTemplate::New(isolate);
9666 object_template->SetAccessCheckCallbacks(NamedAccessCounter, 9717 object_template->SetAccessCheckCallbacks(NamedAccessCounter,
9667 IndexedAccessCounter); 9718 IndexedAccessCounter);
9668 object_template->SetNamedPropertyHandler(AccessControlNamedGetter, 9719 object_template->SetNamedPropertyHandler(AccessControlNamedGetter,
9669 AccessControlNamedSetter); 9720 AccessControlNamedSetter);
9670 object_template->SetIndexedPropertyHandler(AccessControlIndexedGetter, 9721 object_template->SetIndexedPropertyHandler(AccessControlIndexedGetter,
9671 AccessControlIndexedSetter); 9722 AccessControlIndexedSetter);
9672 Local<v8::Object> object = object_template->NewInstance(); 9723 Local<v8::Object> object = object_template->NewInstance();
9673 9724
9674 v8::HandleScope scope1(isolate); 9725 v8::HandleScope scope1(isolate);
9675 9726
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
9891 static void ShadowNamedGet(Local<String> key, 9942 static void ShadowNamedGet(Local<String> key,
9892 const v8::PropertyCallbackInfo<v8::Value>&) { 9943 const v8::PropertyCallbackInfo<v8::Value>&) {
9893 } 9944 }
9894 9945
9895 9946
9896 THREADED_TEST(ShadowObject) { 9947 THREADED_TEST(ShadowObject) {
9897 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0; 9948 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0;
9898 v8::Isolate* isolate = CcTest::isolate(); 9949 v8::Isolate* isolate = CcTest::isolate();
9899 v8::HandleScope handle_scope(isolate); 9950 v8::HandleScope handle_scope(isolate);
9900 9951
9901 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(); 9952 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate);
9902 LocalContext context(NULL, global_template); 9953 LocalContext context(NULL, global_template);
9903 9954
9904 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); 9955 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
9905 t->InstanceTemplate()->SetNamedPropertyHandler(ShadowNamedGet); 9956 t->InstanceTemplate()->SetNamedPropertyHandler(ShadowNamedGet);
9906 t->InstanceTemplate()->SetIndexedPropertyHandler(ShadowIndexedGet); 9957 t->InstanceTemplate()->SetIndexedPropertyHandler(ShadowIndexedGet);
9907 Local<ObjectTemplate> proto = t->PrototypeTemplate(); 9958 Local<ObjectTemplate> proto = t->PrototypeTemplate();
9908 Local<ObjectTemplate> instance = t->InstanceTemplate(); 9959 Local<ObjectTemplate> instance = t->InstanceTemplate();
9909 9960
9910 proto->Set(v8_str("f"), 9961 proto->Set(v8_str("f"),
9911 v8::FunctionTemplate::New(isolate, 9962 v8::FunctionTemplate::New(isolate,
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
10352 ApiTestFuzzer::Fuzz(); 10403 ApiTestFuzzer::Fuzz();
10353 args.GetReturnValue().Set(args[0]); 10404 args.GetReturnValue().Set(args[0]);
10354 } 10405 }
10355 10406
10356 10407
10357 THREADED_TEST(ConstructorForObject) { 10408 THREADED_TEST(ConstructorForObject) {
10358 LocalContext context; 10409 LocalContext context;
10359 v8::Isolate* isolate = context->GetIsolate(); 10410 v8::Isolate* isolate = context->GetIsolate();
10360 v8::HandleScope handle_scope(isolate); 10411 v8::HandleScope handle_scope(isolate);
10361 10412
10362 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); 10413 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
10363 instance_template->SetCallAsFunctionHandler(ConstructorCallback); 10414 instance_template->SetCallAsFunctionHandler(ConstructorCallback);
10364 Local<Object> instance = instance_template->NewInstance(); 10415 Local<Object> instance = instance_template->NewInstance();
10365 context->Global()->Set(v8_str("obj"), instance); 10416 context->Global()->Set(v8_str("obj"), instance);
10366 v8::TryCatch try_catch; 10417 v8::TryCatch try_catch;
10367 Local<Value> value; 10418 Local<Value> value;
10368 CHECK(!try_catch.HasCaught()); 10419 CHECK(!try_catch.HasCaught());
10369 10420
10370 // Call the Object's constructor with a 32-bit signed integer. 10421 // Call the Object's constructor with a 32-bit signed integer.
10371 value = CompileRun("(function() { var o = new obj(28); return o.a; })()"); 10422 value = CompileRun("(function() { var o = new obj(28); return o.a; })()");
10372 CHECK(!try_catch.HasCaught()); 10423 CHECK(!try_catch.HasCaught());
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
10428 Handle<Value> args5[] = { v8::Null(isolate) }; 10479 Handle<Value> args5[] = { v8::Null(isolate) };
10429 Local<Value> value_obj5 = instance->CallAsConstructor(1, args5); 10480 Local<Value> value_obj5 = instance->CallAsConstructor(1, args5);
10430 CHECK(value_obj5->IsObject()); 10481 CHECK(value_obj5->IsObject());
10431 Local<Object> object5 = Local<Object>::Cast(value_obj5); 10482 Local<Object> object5 = Local<Object>::Cast(value_obj5);
10432 value = object5->Get(v8_str("a")); 10483 value = object5->Get(v8_str("a"));
10433 CHECK(!try_catch.HasCaught()); 10484 CHECK(!try_catch.HasCaught());
10434 CHECK(value->IsNull()); 10485 CHECK(value->IsNull());
10435 } 10486 }
10436 10487
10437 // Check exception handling when there is no constructor set for the Object. 10488 // Check exception handling when there is no constructor set for the Object.
10438 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); 10489 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
10439 Local<Object> instance = instance_template->NewInstance(); 10490 Local<Object> instance = instance_template->NewInstance();
10440 context->Global()->Set(v8_str("obj2"), instance); 10491 context->Global()->Set(v8_str("obj2"), instance);
10441 v8::TryCatch try_catch; 10492 v8::TryCatch try_catch;
10442 Local<Value> value; 10493 Local<Value> value;
10443 CHECK(!try_catch.HasCaught()); 10494 CHECK(!try_catch.HasCaught());
10444 10495
10445 value = CompileRun("new obj2(28)"); 10496 value = CompileRun("new obj2(28)");
10446 CHECK(try_catch.HasCaught()); 10497 CHECK(try_catch.HasCaught());
10447 String::Utf8Value exception_value1(try_catch.Exception()); 10498 String::Utf8Value exception_value1(try_catch.Exception());
10448 CHECK_EQ("TypeError: object is not a function", *exception_value1); 10499 CHECK_EQ("TypeError: object is not a function", *exception_value1);
10449 try_catch.Reset(); 10500 try_catch.Reset();
10450 10501
10451 Local<Value> args[] = { v8_num(29) }; 10502 Local<Value> args[] = { v8_num(29) };
10452 value = instance->CallAsConstructor(1, args); 10503 value = instance->CallAsConstructor(1, args);
10453 CHECK(try_catch.HasCaught()); 10504 CHECK(try_catch.HasCaught());
10454 String::Utf8Value exception_value2(try_catch.Exception()); 10505 String::Utf8Value exception_value2(try_catch.Exception());
10455 CHECK_EQ("TypeError: #<Object> is not a function", *exception_value2); 10506 CHECK_EQ("TypeError: #<Object> is not a function", *exception_value2);
10456 try_catch.Reset(); 10507 try_catch.Reset();
10457 } 10508 }
10458 10509
10459 // Check the case when constructor throws exception. 10510 // Check the case when constructor throws exception.
10460 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); 10511 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
10461 instance_template->SetCallAsFunctionHandler(ThrowValue); 10512 instance_template->SetCallAsFunctionHandler(ThrowValue);
10462 Local<Object> instance = instance_template->NewInstance(); 10513 Local<Object> instance = instance_template->NewInstance();
10463 context->Global()->Set(v8_str("obj3"), instance); 10514 context->Global()->Set(v8_str("obj3"), instance);
10464 v8::TryCatch try_catch; 10515 v8::TryCatch try_catch;
10465 Local<Value> value; 10516 Local<Value> value;
10466 CHECK(!try_catch.HasCaught()); 10517 CHECK(!try_catch.HasCaught());
10467 10518
10468 value = CompileRun("new obj3(22)"); 10519 value = CompileRun("new obj3(22)");
10469 CHECK(try_catch.HasCaught()); 10520 CHECK(try_catch.HasCaught());
10470 String::Utf8Value exception_value1(try_catch.Exception()); 10521 String::Utf8Value exception_value1(try_catch.Exception());
(...skipping 23 matching lines...) Expand all
10494 10545
10495 value = CompileRun("new obj4(28)"); 10546 value = CompileRun("new obj4(28)");
10496 CHECK(!try_catch.HasCaught()); 10547 CHECK(!try_catch.HasCaught());
10497 CHECK(value->IsObject()); 10548 CHECK(value->IsObject());
10498 10549
10499 Local<Value> args1[] = { v8_num(28) }; 10550 Local<Value> args1[] = { v8_num(28) };
10500 value = instance1->CallAsConstructor(1, args1); 10551 value = instance1->CallAsConstructor(1, args1);
10501 CHECK(!try_catch.HasCaught()); 10552 CHECK(!try_catch.HasCaught());
10502 CHECK(value->IsObject()); 10553 CHECK(value->IsObject());
10503 10554
10504 Local<ObjectTemplate> instance_template = ObjectTemplate::New(); 10555 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
10505 instance_template->SetCallAsFunctionHandler(FakeConstructorCallback); 10556 instance_template->SetCallAsFunctionHandler(FakeConstructorCallback);
10506 Local<Object> instance2 = instance_template->NewInstance(); 10557 Local<Object> instance2 = instance_template->NewInstance();
10507 context->Global()->Set(v8_str("obj5"), instance2); 10558 context->Global()->Set(v8_str("obj5"), instance2);
10508 CHECK(!try_catch.HasCaught()); 10559 CHECK(!try_catch.HasCaught());
10509 10560
10510 CHECK(instance2->IsObject()); 10561 CHECK(instance2->IsObject());
10511 CHECK(!instance2->IsFunction()); 10562 CHECK(!instance2->IsFunction());
10512 10563
10513 value = CompileRun("new obj5(28)"); 10564 value = CompileRun("new obj5(28)");
10514 CHECK(!try_catch.HasCaught()); 10565 CHECK(!try_catch.HasCaught());
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
10926 } 10977 }
10927 } 10978 }
10928 10979
10929 10980
10930 // Check whether a non-function object is callable. 10981 // Check whether a non-function object is callable.
10931 THREADED_TEST(CallableObject) { 10982 THREADED_TEST(CallableObject) {
10932 LocalContext context; 10983 LocalContext context;
10933 v8::Isolate* isolate = context->GetIsolate(); 10984 v8::Isolate* isolate = context->GetIsolate();
10934 v8::HandleScope scope(isolate); 10985 v8::HandleScope scope(isolate);
10935 10986
10936 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); 10987 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
10937 instance_template->SetCallAsFunctionHandler(call_as_function); 10988 instance_template->SetCallAsFunctionHandler(call_as_function);
10938 Local<Object> instance = instance_template->NewInstance(); 10989 Local<Object> instance = instance_template->NewInstance();
10939 v8::TryCatch try_catch; 10990 v8::TryCatch try_catch;
10940 10991
10941 CHECK(instance->IsCallable()); 10992 CHECK(instance->IsCallable());
10942 CHECK(!try_catch.HasCaught()); 10993 CHECK(!try_catch.HasCaught());
10943 } 10994 }
10944 10995
10945 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); 10996 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
10946 Local<Object> instance = instance_template->NewInstance(); 10997 Local<Object> instance = instance_template->NewInstance();
10947 v8::TryCatch try_catch; 10998 v8::TryCatch try_catch;
10948 10999
10949 CHECK(!instance->IsCallable()); 11000 CHECK(!instance->IsCallable());
10950 CHECK(!try_catch.HasCaught()); 11001 CHECK(!try_catch.HasCaught());
10951 } 11002 }
10952 11003
10953 { Local<FunctionTemplate> function_template = 11004 { Local<FunctionTemplate> function_template =
10954 FunctionTemplate::New(isolate, call_as_function); 11005 FunctionTemplate::New(isolate, call_as_function);
10955 Local<Function> function = function_template->GetFunction(); 11006 Local<Function> function = function_template->GetFunction();
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
11083 11134
11084 11135
11085 typedef void (*NamedPropertyGetter)( 11136 typedef void (*NamedPropertyGetter)(
11086 Local<String> property, 11137 Local<String> property,
11087 const v8::PropertyCallbackInfo<v8::Value>& info); 11138 const v8::PropertyCallbackInfo<v8::Value>& info);
11088 11139
11089 11140
11090 static void CheckInterceptorLoadIC(NamedPropertyGetter getter, 11141 static void CheckInterceptorLoadIC(NamedPropertyGetter getter,
11091 const char* source, 11142 const char* source,
11092 int expected) { 11143 int expected) {
11093 v8::HandleScope scope(CcTest::isolate()); 11144 v8::Isolate* isolate = CcTest::isolate();
11094 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11145 v8::HandleScope scope(isolate);
11146 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11095 templ->SetNamedPropertyHandler(getter, 0, 0, 0, 0, v8_str("data")); 11147 templ->SetNamedPropertyHandler(getter, 0, 0, 0, 0, v8_str("data"));
11096 LocalContext context; 11148 LocalContext context;
11097 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11149 context->Global()->Set(v8_str("o"), templ->NewInstance());
11098 v8::Handle<Value> value = CompileRun(source); 11150 v8::Handle<Value> value = CompileRun(source);
11099 CHECK_EQ(expected, value->Int32Value()); 11151 CHECK_EQ(expected, value->Int32Value());
11100 } 11152 }
11101 11153
11102 11154
11103 static void InterceptorLoadICGetter( 11155 static void InterceptorLoadICGetter(
11104 Local<String> name, 11156 Local<String> name,
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
11296 11348
11297 11349
11298 static void SetOnThis(Local<String> name, 11350 static void SetOnThis(Local<String> name,
11299 Local<Value> value, 11351 Local<Value> value,
11300 const v8::PropertyCallbackInfo<void>& info) { 11352 const v8::PropertyCallbackInfo<void>& info) {
11301 info.This()->ForceSet(name, value); 11353 info.This()->ForceSet(name, value);
11302 } 11354 }
11303 11355
11304 11356
11305 THREADED_TEST(InterceptorLoadICWithCallbackOnHolder) { 11357 THREADED_TEST(InterceptorLoadICWithCallbackOnHolder) {
11306 v8::HandleScope scope(CcTest::isolate()); 11358 v8::Isolate* isolate = CcTest::isolate();
11307 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11359 v8::HandleScope scope(isolate);
11360 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11308 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter); 11361 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter);
11309 templ->SetAccessor(v8_str("y"), Return239Callback); 11362 templ->SetAccessor(v8_str("y"), Return239Callback);
11310 LocalContext context; 11363 LocalContext context;
11311 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11364 context->Global()->Set(v8_str("o"), templ->NewInstance());
11312 11365
11313 // Check the case when receiver and interceptor's holder 11366 // Check the case when receiver and interceptor's holder
11314 // are the same objects. 11367 // are the same objects.
11315 v8::Handle<Value> value = CompileRun( 11368 v8::Handle<Value> value = CompileRun(
11316 "var result = 0;" 11369 "var result = 0;"
11317 "for (var i = 0; i < 7; i++) {" 11370 "for (var i = 0; i < 7; i++) {"
11318 " result = o.y;" 11371 " result = o.y;"
11319 "}"); 11372 "}");
11320 CHECK_EQ(239, value->Int32Value()); 11373 CHECK_EQ(239, value->Int32Value());
11321 11374
11322 // Check the case when interceptor's holder is in proto chain 11375 // Check the case when interceptor's holder is in proto chain
11323 // of receiver. 11376 // of receiver.
11324 value = CompileRun( 11377 value = CompileRun(
11325 "r = { __proto__: o };" 11378 "r = { __proto__: o };"
11326 "var result = 0;" 11379 "var result = 0;"
11327 "for (var i = 0; i < 7; i++) {" 11380 "for (var i = 0; i < 7; i++) {"
11328 " result = r.y;" 11381 " result = r.y;"
11329 "}"); 11382 "}");
11330 CHECK_EQ(239, value->Int32Value()); 11383 CHECK_EQ(239, value->Int32Value());
11331 } 11384 }
11332 11385
11333 11386
11334 THREADED_TEST(InterceptorLoadICWithCallbackOnProto) { 11387 THREADED_TEST(InterceptorLoadICWithCallbackOnProto) {
11335 v8::HandleScope scope(CcTest::isolate()); 11388 v8::Isolate* isolate = CcTest::isolate();
11336 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11389 v8::HandleScope scope(isolate);
11390 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(isolate);
11337 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter); 11391 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter);
11338 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(); 11392 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(isolate);
11339 templ_p->SetAccessor(v8_str("y"), Return239Callback); 11393 templ_p->SetAccessor(v8_str("y"), Return239Callback);
11340 11394
11341 LocalContext context; 11395 LocalContext context;
11342 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 11396 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
11343 context->Global()->Set(v8_str("p"), templ_p->NewInstance()); 11397 context->Global()->Set(v8_str("p"), templ_p->NewInstance());
11344 11398
11345 // Check the case when receiver and interceptor's holder 11399 // Check the case when receiver and interceptor's holder
11346 // are the same objects. 11400 // are the same objects.
11347 v8::Handle<Value> value = CompileRun( 11401 v8::Handle<Value> value = CompileRun(
11348 "o.__proto__ = p;" 11402 "o.__proto__ = p;"
11349 "var result = 0;" 11403 "var result = 0;"
11350 "for (var i = 0; i < 7; i++) {" 11404 "for (var i = 0; i < 7; i++) {"
11351 " result = o.x + o.y;" 11405 " result = o.x + o.y;"
11352 "}"); 11406 "}");
11353 CHECK_EQ(239 + 42, value->Int32Value()); 11407 CHECK_EQ(239 + 42, value->Int32Value());
11354 11408
11355 // Check the case when interceptor's holder is in proto chain 11409 // Check the case when interceptor's holder is in proto chain
11356 // of receiver. 11410 // of receiver.
11357 value = CompileRun( 11411 value = CompileRun(
11358 "r = { __proto__: o };" 11412 "r = { __proto__: o };"
11359 "var result = 0;" 11413 "var result = 0;"
11360 "for (var i = 0; i < 7; i++) {" 11414 "for (var i = 0; i < 7; i++) {"
11361 " result = r.x + r.y;" 11415 " result = r.x + r.y;"
11362 "}"); 11416 "}");
11363 CHECK_EQ(239 + 42, value->Int32Value()); 11417 CHECK_EQ(239 + 42, value->Int32Value());
11364 } 11418 }
11365 11419
11366 11420
11367 THREADED_TEST(InterceptorLoadICForCallbackWithOverride) { 11421 THREADED_TEST(InterceptorLoadICForCallbackWithOverride) {
11368 v8::HandleScope scope(CcTest::isolate()); 11422 v8::Isolate* isolate = CcTest::isolate();
11369 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11423 v8::HandleScope scope(isolate);
11424 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11370 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter); 11425 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter);
11371 templ->SetAccessor(v8_str("y"), Return239Callback); 11426 templ->SetAccessor(v8_str("y"), Return239Callback);
11372 11427
11373 LocalContext context; 11428 LocalContext context;
11374 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11429 context->Global()->Set(v8_str("o"), templ->NewInstance());
11375 11430
11376 v8::Handle<Value> value = CompileRun( 11431 v8::Handle<Value> value = CompileRun(
11377 "fst = new Object(); fst.__proto__ = o;" 11432 "fst = new Object(); fst.__proto__ = o;"
11378 "snd = new Object(); snd.__proto__ = fst;" 11433 "snd = new Object(); snd.__proto__ = fst;"
11379 "var result1 = 0;" 11434 "var result1 = 0;"
11380 "for (var i = 0; i < 7; i++) {" 11435 "for (var i = 0; i < 7; i++) {"
11381 " result1 = snd.x;" 11436 " result1 = snd.x;"
11382 "}" 11437 "}"
11383 "fst.x = 239;" 11438 "fst.x = 239;"
11384 "var result = 0;" 11439 "var result = 0;"
11385 "for (var i = 0; i < 7; i++) {" 11440 "for (var i = 0; i < 7; i++) {"
11386 " result = snd.x;" 11441 " result = snd.x;"
11387 "}" 11442 "}"
11388 "result + result1"); 11443 "result + result1");
11389 CHECK_EQ(239 + 42, value->Int32Value()); 11444 CHECK_EQ(239 + 42, value->Int32Value());
11390 } 11445 }
11391 11446
11392 11447
11393 // Test the case when we stored callback into 11448 // Test the case when we stored callback into
11394 // a stub, but interceptor produced value on its own. 11449 // a stub, but interceptor produced value on its own.
11395 THREADED_TEST(InterceptorLoadICCallbackNotNeeded) { 11450 THREADED_TEST(InterceptorLoadICCallbackNotNeeded) {
11396 v8::HandleScope scope(CcTest::isolate()); 11451 v8::Isolate* isolate = CcTest::isolate();
11397 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11452 v8::HandleScope scope(isolate);
11453 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(isolate);
11398 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter); 11454 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter);
11399 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(); 11455 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(isolate);
11400 templ_p->SetAccessor(v8_str("y"), Return239Callback); 11456 templ_p->SetAccessor(v8_str("y"), Return239Callback);
11401 11457
11402 LocalContext context; 11458 LocalContext context;
11403 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 11459 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
11404 context->Global()->Set(v8_str("p"), templ_p->NewInstance()); 11460 context->Global()->Set(v8_str("p"), templ_p->NewInstance());
11405 11461
11406 v8::Handle<Value> value = CompileRun( 11462 v8::Handle<Value> value = CompileRun(
11407 "o.__proto__ = p;" 11463 "o.__proto__ = p;"
11408 "for (var i = 0; i < 7; i++) {" 11464 "for (var i = 0; i < 7; i++) {"
11409 " o.x;" 11465 " o.x;"
11410 // Now it should be ICed and keep a reference to x defined on p 11466 // Now it should be ICed and keep a reference to x defined on p
11411 "}" 11467 "}"
11412 "var result = 0;" 11468 "var result = 0;"
11413 "for (var i = 0; i < 7; i++) {" 11469 "for (var i = 0; i < 7; i++) {"
11414 " result += o.x;" 11470 " result += o.x;"
11415 "}" 11471 "}"
11416 "result"); 11472 "result");
11417 CHECK_EQ(42 * 7, value->Int32Value()); 11473 CHECK_EQ(42 * 7, value->Int32Value());
11418 } 11474 }
11419 11475
11420 11476
11421 // Test the case when we stored callback into 11477 // Test the case when we stored callback into
11422 // a stub, but it got invalidated later on. 11478 // a stub, but it got invalidated later on.
11423 THREADED_TEST(InterceptorLoadICInvalidatedCallback) { 11479 THREADED_TEST(InterceptorLoadICInvalidatedCallback) {
11424 v8::HandleScope scope(CcTest::isolate()); 11480 v8::Isolate* isolate = CcTest::isolate();
11425 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11481 v8::HandleScope scope(isolate);
11482 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(isolate);
11426 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter); 11483 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter);
11427 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(); 11484 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(isolate);
11428 templ_p->SetAccessor(v8_str("y"), Return239Callback, SetOnThis); 11485 templ_p->SetAccessor(v8_str("y"), Return239Callback, SetOnThis);
11429 11486
11430 LocalContext context; 11487 LocalContext context;
11431 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 11488 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
11432 context->Global()->Set(v8_str("p"), templ_p->NewInstance()); 11489 context->Global()->Set(v8_str("p"), templ_p->NewInstance());
11433 11490
11434 v8::Handle<Value> value = CompileRun( 11491 v8::Handle<Value> value = CompileRun(
11435 "inbetween = new Object();" 11492 "inbetween = new Object();"
11436 "o.__proto__ = inbetween;" 11493 "o.__proto__ = inbetween;"
11437 "inbetween.__proto__ = p;" 11494 "inbetween.__proto__ = p;"
11438 "for (var i = 0; i < 10; i++) {" 11495 "for (var i = 0; i < 10; i++) {"
11439 " o.y;" 11496 " o.y;"
11440 // Now it should be ICed and keep a reference to y defined on p 11497 // Now it should be ICed and keep a reference to y defined on p
11441 "}" 11498 "}"
11442 "inbetween.y = 42;" 11499 "inbetween.y = 42;"
11443 "var result = 0;" 11500 "var result = 0;"
11444 "for (var i = 0; i < 10; i++) {" 11501 "for (var i = 0; i < 10; i++) {"
11445 " result += o.y;" 11502 " result += o.y;"
11446 "}" 11503 "}"
11447 "result"); 11504 "result");
11448 CHECK_EQ(42 * 10, value->Int32Value()); 11505 CHECK_EQ(42 * 10, value->Int32Value());
11449 } 11506 }
11450 11507
11451 11508
11452 // Test the case when we stored callback into 11509 // Test the case when we stored callback into
11453 // a stub, but it got invalidated later on due to override on 11510 // a stub, but it got invalidated later on due to override on
11454 // global object which is between interceptor and callbacks' holders. 11511 // global object which is between interceptor and callbacks' holders.
11455 THREADED_TEST(InterceptorLoadICInvalidatedCallbackViaGlobal) { 11512 THREADED_TEST(InterceptorLoadICInvalidatedCallbackViaGlobal) {
11456 v8::HandleScope scope(CcTest::isolate()); 11513 v8::Isolate* isolate = CcTest::isolate();
11457 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11514 v8::HandleScope scope(isolate);
11515 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(isolate);
11458 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter); 11516 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter);
11459 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(); 11517 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(isolate);
11460 templ_p->SetAccessor(v8_str("y"), Return239Callback, SetOnThis); 11518 templ_p->SetAccessor(v8_str("y"), Return239Callback, SetOnThis);
11461 11519
11462 LocalContext context; 11520 LocalContext context;
11463 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 11521 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
11464 context->Global()->Set(v8_str("p"), templ_p->NewInstance()); 11522 context->Global()->Set(v8_str("p"), templ_p->NewInstance());
11465 11523
11466 v8::Handle<Value> value = CompileRun( 11524 v8::Handle<Value> value = CompileRun(
11467 "o.__proto__ = this;" 11525 "o.__proto__ = this;"
11468 "this.__proto__ = p;" 11526 "this.__proto__ = p;"
11469 "for (var i = 0; i < 10; i++) {" 11527 "for (var i = 0; i < 10; i++) {"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
11501 Local<Value> value, 11559 Local<Value> value,
11502 const v8::PropertyCallbackInfo<v8::Value>& info) { 11560 const v8::PropertyCallbackInfo<v8::Value>& info) {
11503 CHECK(v8_str("x")->Equals(key)); 11561 CHECK(v8_str("x")->Equals(key));
11504 CHECK_EQ(42, value->Int32Value()); 11562 CHECK_EQ(42, value->Int32Value());
11505 info.GetReturnValue().Set(value); 11563 info.GetReturnValue().Set(value);
11506 } 11564 }
11507 11565
11508 11566
11509 // This test should hit the store IC for the interceptor case. 11567 // This test should hit the store IC for the interceptor case.
11510 THREADED_TEST(InterceptorStoreIC) { 11568 THREADED_TEST(InterceptorStoreIC) {
11511 v8::HandleScope scope(CcTest::isolate()); 11569 v8::Isolate* isolate = CcTest::isolate();
11512 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11570 v8::HandleScope scope(isolate);
11571 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11513 templ->SetNamedPropertyHandler(InterceptorLoadICGetter, 11572 templ->SetNamedPropertyHandler(InterceptorLoadICGetter,
11514 InterceptorStoreICSetter, 11573 InterceptorStoreICSetter,
11515 0, 0, 0, v8_str("data")); 11574 0, 0, 0, v8_str("data"));
11516 LocalContext context; 11575 LocalContext context;
11517 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11576 context->Global()->Set(v8_str("o"), templ->NewInstance());
11518 CompileRun( 11577 CompileRun(
11519 "for (var i = 0; i < 1000; i++) {" 11578 "for (var i = 0; i < 1000; i++) {"
11520 " o.x = 42;" 11579 " o.x = 42;"
11521 "}"); 11580 "}");
11522 } 11581 }
11523 11582
11524 11583
11525 THREADED_TEST(InterceptorStoreICWithNoSetter) { 11584 THREADED_TEST(InterceptorStoreICWithNoSetter) {
11526 v8::HandleScope scope(CcTest::isolate()); 11585 v8::Isolate* isolate = CcTest::isolate();
11527 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11586 v8::HandleScope scope(isolate);
11587 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11528 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter); 11588 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter);
11529 LocalContext context; 11589 LocalContext context;
11530 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11590 context->Global()->Set(v8_str("o"), templ->NewInstance());
11531 v8::Handle<Value> value = CompileRun( 11591 v8::Handle<Value> value = CompileRun(
11532 "for (var i = 0; i < 1000; i++) {" 11592 "for (var i = 0; i < 1000; i++) {"
11533 " o.y = 239;" 11593 " o.y = 239;"
11534 "}" 11594 "}"
11535 "42 + o.y"); 11595 "42 + o.y");
11536 CHECK_EQ(239 + 42, value->Int32Value()); 11596 CHECK_EQ(239 + 42, value->Int32Value());
11537 } 11597 }
11538 11598
11539 11599
11540 11600
11541 11601
11542 v8::Handle<Value> call_ic_function; 11602 v8::Handle<Value> call_ic_function;
11543 v8::Handle<Value> call_ic_function2; 11603 v8::Handle<Value> call_ic_function2;
11544 v8::Handle<Value> call_ic_function3; 11604 v8::Handle<Value> call_ic_function3;
11545 11605
11546 static void InterceptorCallICGetter( 11606 static void InterceptorCallICGetter(
11547 Local<String> name, 11607 Local<String> name,
11548 const v8::PropertyCallbackInfo<v8::Value>& info) { 11608 const v8::PropertyCallbackInfo<v8::Value>& info) {
11549 ApiTestFuzzer::Fuzz(); 11609 ApiTestFuzzer::Fuzz();
11550 CHECK(v8_str("x")->Equals(name)); 11610 CHECK(v8_str("x")->Equals(name));
11551 info.GetReturnValue().Set(call_ic_function); 11611 info.GetReturnValue().Set(call_ic_function);
11552 } 11612 }
11553 11613
11554 11614
11555 // This test should hit the call IC for the interceptor case. 11615 // This test should hit the call IC for the interceptor case.
11556 THREADED_TEST(InterceptorCallIC) { 11616 THREADED_TEST(InterceptorCallIC) {
11557 v8::HandleScope scope(CcTest::isolate()); 11617 v8::Isolate* isolate = CcTest::isolate();
11558 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11618 v8::HandleScope scope(isolate);
11619 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11559 templ->SetNamedPropertyHandler(InterceptorCallICGetter); 11620 templ->SetNamedPropertyHandler(InterceptorCallICGetter);
11560 LocalContext context; 11621 LocalContext context;
11561 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11622 context->Global()->Set(v8_str("o"), templ->NewInstance());
11562 call_ic_function = 11623 call_ic_function =
11563 v8_compile("function f(x) { return x + 1; }; f")->Run(); 11624 v8_compile("function f(x) { return x + 1; }; f")->Run();
11564 v8::Handle<Value> value = CompileRun( 11625 v8::Handle<Value> value = CompileRun(
11565 "var result = 0;" 11626 "var result = 0;"
11566 "for (var i = 0; i < 1000; i++) {" 11627 "for (var i = 0; i < 1000; i++) {"
11567 " result = o.x(41);" 11628 " result = o.x(41);"
11568 "}"); 11629 "}");
11569 CHECK_EQ(42, value->Int32Value()); 11630 CHECK_EQ(42, value->Int32Value());
11570 } 11631 }
11571 11632
11572 11633
11573 // This test checks that if interceptor doesn't provide 11634 // This test checks that if interceptor doesn't provide
11574 // a value, we can fetch regular value. 11635 // a value, we can fetch regular value.
11575 THREADED_TEST(InterceptorCallICSeesOthers) { 11636 THREADED_TEST(InterceptorCallICSeesOthers) {
11576 v8::HandleScope scope(CcTest::isolate()); 11637 v8::Isolate* isolate = CcTest::isolate();
11577 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11638 v8::HandleScope scope(isolate);
11639 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11578 templ->SetNamedPropertyHandler(NoBlockGetterX); 11640 templ->SetNamedPropertyHandler(NoBlockGetterX);
11579 LocalContext context; 11641 LocalContext context;
11580 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11642 context->Global()->Set(v8_str("o"), templ->NewInstance());
11581 v8::Handle<Value> value = CompileRun( 11643 v8::Handle<Value> value = CompileRun(
11582 "o.x = function f(x) { return x + 1; };" 11644 "o.x = function f(x) { return x + 1; };"
11583 "var result = 0;" 11645 "var result = 0;"
11584 "for (var i = 0; i < 7; i++) {" 11646 "for (var i = 0; i < 7; i++) {"
11585 " result = o.x(41);" 11647 " result = o.x(41);"
11586 "}"); 11648 "}");
11587 CHECK_EQ(42, value->Int32Value()); 11649 CHECK_EQ(42, value->Int32Value());
11588 } 11650 }
11589 11651
11590 11652
11591 static v8::Handle<Value> call_ic_function4; 11653 static v8::Handle<Value> call_ic_function4;
11592 static void InterceptorCallICGetter4( 11654 static void InterceptorCallICGetter4(
11593 Local<String> name, 11655 Local<String> name,
11594 const v8::PropertyCallbackInfo<v8::Value>& info) { 11656 const v8::PropertyCallbackInfo<v8::Value>& info) {
11595 ApiTestFuzzer::Fuzz(); 11657 ApiTestFuzzer::Fuzz();
11596 CHECK(v8_str("x")->Equals(name)); 11658 CHECK(v8_str("x")->Equals(name));
11597 info.GetReturnValue().Set(call_ic_function4); 11659 info.GetReturnValue().Set(call_ic_function4);
11598 } 11660 }
11599 11661
11600 11662
11601 // This test checks that if interceptor provides a function, 11663 // This test checks that if interceptor provides a function,
11602 // even if we cached shadowed variant, interceptor's function 11664 // even if we cached shadowed variant, interceptor's function
11603 // is invoked 11665 // is invoked
11604 THREADED_TEST(InterceptorCallICCacheableNotNeeded) { 11666 THREADED_TEST(InterceptorCallICCacheableNotNeeded) {
11605 v8::HandleScope scope(CcTest::isolate()); 11667 v8::Isolate* isolate = CcTest::isolate();
11606 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11668 v8::HandleScope scope(isolate);
11669 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11607 templ->SetNamedPropertyHandler(InterceptorCallICGetter4); 11670 templ->SetNamedPropertyHandler(InterceptorCallICGetter4);
11608 LocalContext context; 11671 LocalContext context;
11609 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11672 context->Global()->Set(v8_str("o"), templ->NewInstance());
11610 call_ic_function4 = 11673 call_ic_function4 =
11611 v8_compile("function f(x) { return x - 1; }; f")->Run(); 11674 v8_compile("function f(x) { return x - 1; }; f")->Run();
11612 v8::Handle<Value> value = CompileRun( 11675 v8::Handle<Value> value = CompileRun(
11613 "Object.getPrototypeOf(o).x = function(x) { return x + 1; };" 11676 "Object.getPrototypeOf(o).x = function(x) { return x + 1; };"
11614 "var result = 0;" 11677 "var result = 0;"
11615 "for (var i = 0; i < 1000; i++) {" 11678 "for (var i = 0; i < 1000; i++) {"
11616 " result = o.x(42);" 11679 " result = o.x(42);"
11617 "}"); 11680 "}");
11618 CHECK_EQ(41, value->Int32Value()); 11681 CHECK_EQ(41, value->Int32Value());
11619 } 11682 }
11620 11683
11621 11684
11622 // Test the case when we stored cacheable lookup into 11685 // Test the case when we stored cacheable lookup into
11623 // a stub, but it got invalidated later on 11686 // a stub, but it got invalidated later on
11624 THREADED_TEST(InterceptorCallICInvalidatedCacheable) { 11687 THREADED_TEST(InterceptorCallICInvalidatedCacheable) {
11625 v8::HandleScope scope(CcTest::isolate()); 11688 v8::Isolate* isolate = CcTest::isolate();
11626 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11689 v8::HandleScope scope(isolate);
11690 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11627 templ->SetNamedPropertyHandler(NoBlockGetterX); 11691 templ->SetNamedPropertyHandler(NoBlockGetterX);
11628 LocalContext context; 11692 LocalContext context;
11629 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11693 context->Global()->Set(v8_str("o"), templ->NewInstance());
11630 v8::Handle<Value> value = CompileRun( 11694 v8::Handle<Value> value = CompileRun(
11631 "proto1 = new Object();" 11695 "proto1 = new Object();"
11632 "proto2 = new Object();" 11696 "proto2 = new Object();"
11633 "o.__proto__ = proto1;" 11697 "o.__proto__ = proto1;"
11634 "proto1.__proto__ = proto2;" 11698 "proto1.__proto__ = proto2;"
11635 "proto2.y = function(x) { return x + 1; };" 11699 "proto2.y = function(x) { return x + 1; };"
11636 // Invoke it many times to compile a stub 11700 // Invoke it many times to compile a stub
11637 "for (var i = 0; i < 7; i++) {" 11701 "for (var i = 0; i < 7; i++) {"
11638 " o.y(42);" 11702 " o.y(42);"
11639 "}" 11703 "}"
11640 "proto1.y = function(x) { return x - 1; };" 11704 "proto1.y = function(x) { return x - 1; };"
11641 "var result = 0;" 11705 "var result = 0;"
11642 "for (var i = 0; i < 7; i++) {" 11706 "for (var i = 0; i < 7; i++) {"
11643 " result += o.y(42);" 11707 " result += o.y(42);"
11644 "}"); 11708 "}");
11645 CHECK_EQ(41 * 7, value->Int32Value()); 11709 CHECK_EQ(41 * 7, value->Int32Value());
11646 } 11710 }
11647 11711
11648 11712
11649 // This test checks that if interceptor doesn't provide a function, 11713 // This test checks that if interceptor doesn't provide a function,
11650 // cached constant function is used 11714 // cached constant function is used
11651 THREADED_TEST(InterceptorCallICConstantFunctionUsed) { 11715 THREADED_TEST(InterceptorCallICConstantFunctionUsed) {
11652 v8::HandleScope scope(CcTest::isolate()); 11716 v8::Isolate* isolate = CcTest::isolate();
11653 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11717 v8::HandleScope scope(isolate);
11718 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11654 templ->SetNamedPropertyHandler(NoBlockGetterX); 11719 templ->SetNamedPropertyHandler(NoBlockGetterX);
11655 LocalContext context; 11720 LocalContext context;
11656 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11721 context->Global()->Set(v8_str("o"), templ->NewInstance());
11657 v8::Handle<Value> value = CompileRun( 11722 v8::Handle<Value> value = CompileRun(
11658 "function inc(x) { return x + 1; };" 11723 "function inc(x) { return x + 1; };"
11659 "inc(1);" 11724 "inc(1);"
11660 "o.x = inc;" 11725 "o.x = inc;"
11661 "var result = 0;" 11726 "var result = 0;"
11662 "for (var i = 0; i < 1000; i++) {" 11727 "for (var i = 0; i < 1000; i++) {"
11663 " result = o.x(42);" 11728 " result = o.x(42);"
11664 "}"); 11729 "}");
11665 CHECK_EQ(43, value->Int32Value()); 11730 CHECK_EQ(43, value->Int32Value());
11666 } 11731 }
11667 11732
11668 11733
11669 static v8::Handle<Value> call_ic_function5; 11734 static v8::Handle<Value> call_ic_function5;
11670 static void InterceptorCallICGetter5( 11735 static void InterceptorCallICGetter5(
11671 Local<String> name, 11736 Local<String> name,
11672 const v8::PropertyCallbackInfo<v8::Value>& info) { 11737 const v8::PropertyCallbackInfo<v8::Value>& info) {
11673 ApiTestFuzzer::Fuzz(); 11738 ApiTestFuzzer::Fuzz();
11674 if (v8_str("x")->Equals(name)) 11739 if (v8_str("x")->Equals(name))
11675 info.GetReturnValue().Set(call_ic_function5); 11740 info.GetReturnValue().Set(call_ic_function5);
11676 } 11741 }
11677 11742
11678 11743
11679 // This test checks that if interceptor provides a function, 11744 // This test checks that if interceptor provides a function,
11680 // even if we cached constant function, interceptor's function 11745 // even if we cached constant function, interceptor's function
11681 // is invoked 11746 // is invoked
11682 THREADED_TEST(InterceptorCallICConstantFunctionNotNeeded) { 11747 THREADED_TEST(InterceptorCallICConstantFunctionNotNeeded) {
11683 v8::HandleScope scope(CcTest::isolate()); 11748 v8::Isolate* isolate = CcTest::isolate();
11684 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11749 v8::HandleScope scope(isolate);
11750 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11685 templ->SetNamedPropertyHandler(InterceptorCallICGetter5); 11751 templ->SetNamedPropertyHandler(InterceptorCallICGetter5);
11686 LocalContext context; 11752 LocalContext context;
11687 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11753 context->Global()->Set(v8_str("o"), templ->NewInstance());
11688 call_ic_function5 = 11754 call_ic_function5 =
11689 v8_compile("function f(x) { return x - 1; }; f")->Run(); 11755 v8_compile("function f(x) { return x - 1; }; f")->Run();
11690 v8::Handle<Value> value = CompileRun( 11756 v8::Handle<Value> value = CompileRun(
11691 "function inc(x) { return x + 1; };" 11757 "function inc(x) { return x + 1; };"
11692 "inc(1);" 11758 "inc(1);"
11693 "o.x = inc;" 11759 "o.x = inc;"
11694 "var result = 0;" 11760 "var result = 0;"
(...skipping 11 matching lines...) Expand all
11706 ApiTestFuzzer::Fuzz(); 11772 ApiTestFuzzer::Fuzz();
11707 if (v8_str("x")->Equals(name)) 11773 if (v8_str("x")->Equals(name))
11708 info.GetReturnValue().Set(call_ic_function6); 11774 info.GetReturnValue().Set(call_ic_function6);
11709 } 11775 }
11710 11776
11711 11777
11712 // Same test as above, except the code is wrapped in a function 11778 // Same test as above, except the code is wrapped in a function
11713 // to test the optimized compiler. 11779 // to test the optimized compiler.
11714 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) { 11780 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) {
11715 i::FLAG_allow_natives_syntax = true; 11781 i::FLAG_allow_natives_syntax = true;
11716 v8::HandleScope scope(CcTest::isolate()); 11782 v8::Isolate* isolate = CcTest::isolate();
11717 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11783 v8::HandleScope scope(isolate);
11784 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11718 templ->SetNamedPropertyHandler(InterceptorCallICGetter6); 11785 templ->SetNamedPropertyHandler(InterceptorCallICGetter6);
11719 LocalContext context; 11786 LocalContext context;
11720 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11787 context->Global()->Set(v8_str("o"), templ->NewInstance());
11721 call_ic_function6 = 11788 call_ic_function6 =
11722 v8_compile("function f(x) { return x - 1; }; f")->Run(); 11789 v8_compile("function f(x) { return x - 1; }; f")->Run();
11723 v8::Handle<Value> value = CompileRun( 11790 v8::Handle<Value> value = CompileRun(
11724 "function inc(x) { return x + 1; };" 11791 "function inc(x) { return x + 1; };"
11725 "inc(1);" 11792 "inc(1);"
11726 "o.x = inc;" 11793 "o.x = inc;"
11727 "function test() {" 11794 "function test() {"
11728 " var result = 0;" 11795 " var result = 0;"
11729 " for (var i = 0; i < 1000; i++) {" 11796 " for (var i = 0; i < 1000; i++) {"
11730 " result = o.x(42);" 11797 " result = o.x(42);"
11731 " }" 11798 " }"
11732 " return result;" 11799 " return result;"
11733 "};" 11800 "};"
11734 "test();" 11801 "test();"
11735 "test();" 11802 "test();"
11736 "test();" 11803 "test();"
11737 "%OptimizeFunctionOnNextCall(test);" 11804 "%OptimizeFunctionOnNextCall(test);"
11738 "test()"); 11805 "test()");
11739 CHECK_EQ(41, value->Int32Value()); 11806 CHECK_EQ(41, value->Int32Value());
11740 } 11807 }
11741 11808
11742 11809
11743 // Test the case when we stored constant function into 11810 // Test the case when we stored constant function into
11744 // a stub, but it got invalidated later on 11811 // a stub, but it got invalidated later on
11745 THREADED_TEST(InterceptorCallICInvalidatedConstantFunction) { 11812 THREADED_TEST(InterceptorCallICInvalidatedConstantFunction) {
11746 v8::HandleScope scope(CcTest::isolate()); 11813 v8::Isolate* isolate = CcTest::isolate();
11747 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11814 v8::HandleScope scope(isolate);
11815 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11748 templ->SetNamedPropertyHandler(NoBlockGetterX); 11816 templ->SetNamedPropertyHandler(NoBlockGetterX);
11749 LocalContext context; 11817 LocalContext context;
11750 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11818 context->Global()->Set(v8_str("o"), templ->NewInstance());
11751 v8::Handle<Value> value = CompileRun( 11819 v8::Handle<Value> value = CompileRun(
11752 "function inc(x) { return x + 1; };" 11820 "function inc(x) { return x + 1; };"
11753 "inc(1);" 11821 "inc(1);"
11754 "proto1 = new Object();" 11822 "proto1 = new Object();"
11755 "proto2 = new Object();" 11823 "proto2 = new Object();"
11756 "o.__proto__ = proto1;" 11824 "o.__proto__ = proto1;"
11757 "proto1.__proto__ = proto2;" 11825 "proto1.__proto__ = proto2;"
11758 "proto2.y = inc;" 11826 "proto2.y = inc;"
11759 // Invoke it many times to compile a stub 11827 // Invoke it many times to compile a stub
11760 "for (var i = 0; i < 7; i++) {" 11828 "for (var i = 0; i < 7; i++) {"
11761 " o.y(42);" 11829 " o.y(42);"
11762 "}" 11830 "}"
11763 "proto1.y = function(x) { return x - 1; };" 11831 "proto1.y = function(x) { return x - 1; };"
11764 "var result = 0;" 11832 "var result = 0;"
11765 "for (var i = 0; i < 7; i++) {" 11833 "for (var i = 0; i < 7; i++) {"
11766 " result += o.y(42);" 11834 " result += o.y(42);"
11767 "}"); 11835 "}");
11768 CHECK_EQ(41 * 7, value->Int32Value()); 11836 CHECK_EQ(41 * 7, value->Int32Value());
11769 } 11837 }
11770 11838
11771 11839
11772 // Test the case when we stored constant function into 11840 // Test the case when we stored constant function into
11773 // a stub, but it got invalidated later on due to override on 11841 // a stub, but it got invalidated later on due to override on
11774 // global object which is between interceptor and constant function' holders. 11842 // global object which is between interceptor and constant function' holders.
11775 THREADED_TEST(InterceptorCallICInvalidatedConstantFunctionViaGlobal) { 11843 THREADED_TEST(InterceptorCallICInvalidatedConstantFunctionViaGlobal) {
11776 v8::HandleScope scope(CcTest::isolate()); 11844 v8::Isolate* isolate = CcTest::isolate();
11777 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11845 v8::HandleScope scope(isolate);
11846 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11778 templ->SetNamedPropertyHandler(NoBlockGetterX); 11847 templ->SetNamedPropertyHandler(NoBlockGetterX);
11779 LocalContext context; 11848 LocalContext context;
11780 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11849 context->Global()->Set(v8_str("o"), templ->NewInstance());
11781 v8::Handle<Value> value = CompileRun( 11850 v8::Handle<Value> value = CompileRun(
11782 "function inc(x) { return x + 1; };" 11851 "function inc(x) { return x + 1; };"
11783 "inc(1);" 11852 "inc(1);"
11784 "o.__proto__ = this;" 11853 "o.__proto__ = this;"
11785 "this.__proto__.y = inc;" 11854 "this.__proto__.y = inc;"
11786 // Invoke it many times to compile a stub 11855 // Invoke it many times to compile a stub
11787 "for (var i = 0; i < 7; i++) {" 11856 "for (var i = 0; i < 7; i++) {"
11788 " if (o.y(42) != 43) throw 'oops: ' + o.y(42);" 11857 " if (o.y(42) != 43) throw 'oops: ' + o.y(42);"
11789 "}" 11858 "}"
11790 "this.y = function(x) { return x - 1; };" 11859 "this.y = function(x) { return x - 1; };"
11791 "var result = 0;" 11860 "var result = 0;"
11792 "for (var i = 0; i < 7; i++) {" 11861 "for (var i = 0; i < 7; i++) {"
11793 " result += o.y(42);" 11862 " result += o.y(42);"
11794 "}"); 11863 "}");
11795 CHECK_EQ(41 * 7, value->Int32Value()); 11864 CHECK_EQ(41 * 7, value->Int32Value());
11796 } 11865 }
11797 11866
11798 11867
11799 // Test the case when actual function to call sits on global object. 11868 // Test the case when actual function to call sits on global object.
11800 THREADED_TEST(InterceptorCallICCachedFromGlobal) { 11869 THREADED_TEST(InterceptorCallICCachedFromGlobal) {
11801 v8::HandleScope scope(CcTest::isolate()); 11870 v8::Isolate* isolate = CcTest::isolate();
11802 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11871 v8::HandleScope scope(isolate);
11872 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(isolate);
11803 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 11873 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
11804 11874
11805 LocalContext context; 11875 LocalContext context;
11806 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 11876 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
11807 11877
11808 v8::Handle<Value> value = CompileRun( 11878 v8::Handle<Value> value = CompileRun(
11809 "try {" 11879 "try {"
11810 " o.__proto__ = this;" 11880 " o.__proto__ = this;"
11811 " for (var i = 0; i < 10; i++) {" 11881 " for (var i = 0; i < 10; i++) {"
11812 " var v = o.parseFloat('239');" 11882 " var v = o.parseFloat('239');"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
11881 // This should move the stub 11951 // This should move the stub
11882 GenerateSomeGarbage(); // This should ensure the old stub memory is flushed 11952 GenerateSomeGarbage(); // This should ensure the old stub memory is flushed
11883 } 11953 }
11884 } 11954 }
11885 11955
11886 11956
11887 THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) { 11957 THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) {
11888 LocalContext context; 11958 LocalContext context;
11889 v8::Isolate* isolate = context->GetIsolate(); 11959 v8::Isolate* isolate = context->GetIsolate();
11890 v8::HandleScope scope(isolate); 11960 v8::HandleScope scope(isolate);
11891 v8::Handle<v8::ObjectTemplate> nativeobject_templ = v8::ObjectTemplate::New(); 11961 v8::Handle<v8::ObjectTemplate> nativeobject_templ =
11962 v8::ObjectTemplate::New(isolate);
11892 nativeobject_templ->Set(isolate, "callback", 11963 nativeobject_templ->Set(isolate, "callback",
11893 v8::FunctionTemplate::New(isolate, 11964 v8::FunctionTemplate::New(isolate,
11894 DirectApiCallback)); 11965 DirectApiCallback));
11895 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); 11966 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance();
11896 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); 11967 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj);
11897 // call the api function multiple times to ensure direct call stub creation. 11968 // call the api function multiple times to ensure direct call stub creation.
11898 CompileRun( 11969 CompileRun(
11899 "function f() {" 11970 "function f() {"
11900 " for (var i = 1; i <= 30; i++) {" 11971 " for (var i = 1; i <= 30; i++) {"
11901 " nativeobject.callback();" 11972 " nativeobject.callback();"
11902 " }" 11973 " }"
11903 "}" 11974 "}"
11904 "f();"); 11975 "f();");
11905 } 11976 }
11906 11977
11907 11978
11908 void ThrowingDirectApiCallback( 11979 void ThrowingDirectApiCallback(
11909 const v8::FunctionCallbackInfo<v8::Value>& args) { 11980 const v8::FunctionCallbackInfo<v8::Value>& args) {
11910 args.GetIsolate()->ThrowException(v8_str("g")); 11981 args.GetIsolate()->ThrowException(v8_str("g"));
11911 } 11982 }
11912 11983
11913 11984
11914 THREADED_TEST(CallICFastApi_DirectCall_Throw) { 11985 THREADED_TEST(CallICFastApi_DirectCall_Throw) {
11915 LocalContext context; 11986 LocalContext context;
11916 v8::Isolate* isolate = context->GetIsolate(); 11987 v8::Isolate* isolate = context->GetIsolate();
11917 v8::HandleScope scope(isolate); 11988 v8::HandleScope scope(isolate);
11918 v8::Handle<v8::ObjectTemplate> nativeobject_templ = 11989 v8::Handle<v8::ObjectTemplate> nativeobject_templ =
11919 v8::ObjectTemplate::New(); 11990 v8::ObjectTemplate::New(isolate);
11920 nativeobject_templ->Set(isolate, "callback", 11991 nativeobject_templ->Set(isolate, "callback",
11921 v8::FunctionTemplate::New(isolate, 11992 v8::FunctionTemplate::New(isolate,
11922 ThrowingDirectApiCallback)); 11993 ThrowingDirectApiCallback));
11923 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); 11994 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance();
11924 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); 11995 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj);
11925 // call the api function multiple times to ensure direct call stub creation. 11996 // call the api function multiple times to ensure direct call stub creation.
11926 v8::Handle<Value> result = CompileRun( 11997 v8::Handle<Value> result = CompileRun(
11927 "var result = '';" 11998 "var result = '';"
11928 "function f() {" 11999 "function f() {"
11929 " for (var i = 1; i <= 5; i++) {" 12000 " for (var i = 1; i <= 5; i++) {"
(...skipping 17 matching lines...) Expand all
11947 Local<String> name, 12018 Local<String> name,
11948 const v8::PropertyCallbackInfo<v8::Value>& info) { 12019 const v8::PropertyCallbackInfo<v8::Value>& info) {
11949 CheckReturnValue(info, FUNCTION_ADDR(DirectGetterCallback)); 12020 CheckReturnValue(info, FUNCTION_ADDR(DirectGetterCallback));
11950 info.GetReturnValue().Set(DoDirectGetter()); 12021 info.GetReturnValue().Set(DoDirectGetter());
11951 } 12022 }
11952 12023
11953 12024
11954 template<typename Accessor> 12025 template<typename Accessor>
11955 static void LoadICFastApi_DirectCall_GCMoveStub(Accessor accessor) { 12026 static void LoadICFastApi_DirectCall_GCMoveStub(Accessor accessor) {
11956 LocalContext context; 12027 LocalContext context;
11957 v8::HandleScope scope(context->GetIsolate()); 12028 v8::Isolate* isolate = context->GetIsolate();
11958 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(); 12029 v8::HandleScope scope(isolate);
12030 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate);
11959 obj->SetAccessor(v8_str("p1"), accessor); 12031 obj->SetAccessor(v8_str("p1"), accessor);
11960 context->Global()->Set(v8_str("o1"), obj->NewInstance()); 12032 context->Global()->Set(v8_str("o1"), obj->NewInstance());
11961 p_getter_count = 0; 12033 p_getter_count = 0;
11962 v8::Handle<v8::Value> result = CompileRun( 12034 v8::Handle<v8::Value> result = CompileRun(
11963 "function f() {" 12035 "function f() {"
11964 " for (var i = 0; i < 30; i++) o1.p1;" 12036 " for (var i = 0; i < 30; i++) o1.p1;"
11965 " return o1.p1" 12037 " return o1.p1"
11966 "}" 12038 "}"
11967 "f();"); 12039 "f();");
11968 CHECK_EQ(v8_str("Direct Getter Result"), result); 12040 CHECK_EQ(v8_str("Direct Getter Result"), result);
11969 CHECK_EQ(31, p_getter_count); 12041 CHECK_EQ(31, p_getter_count);
11970 } 12042 }
11971 12043
11972 12044
11973 THREADED_PROFILED_TEST(LoadICFastApi_DirectCall_GCMoveStub) { 12045 THREADED_PROFILED_TEST(LoadICFastApi_DirectCall_GCMoveStub) {
11974 LoadICFastApi_DirectCall_GCMoveStub(DirectGetterCallback); 12046 LoadICFastApi_DirectCall_GCMoveStub(DirectGetterCallback);
11975 } 12047 }
11976 12048
11977 12049
11978 void ThrowingDirectGetterCallback( 12050 void ThrowingDirectGetterCallback(
11979 Local<String> name, 12051 Local<String> name,
11980 const v8::PropertyCallbackInfo<v8::Value>& info) { 12052 const v8::PropertyCallbackInfo<v8::Value>& info) {
11981 info.GetIsolate()->ThrowException(v8_str("g")); 12053 info.GetIsolate()->ThrowException(v8_str("g"));
11982 } 12054 }
11983 12055
11984 12056
11985 THREADED_TEST(LoadICFastApi_DirectCall_Throw) { 12057 THREADED_TEST(LoadICFastApi_DirectCall_Throw) {
11986 LocalContext context; 12058 LocalContext context;
11987 v8::HandleScope scope(context->GetIsolate()); 12059 v8::Isolate* isolate = context->GetIsolate();
11988 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(); 12060 v8::HandleScope scope(isolate);
12061 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate);
11989 obj->SetAccessor(v8_str("p1"), ThrowingDirectGetterCallback); 12062 obj->SetAccessor(v8_str("p1"), ThrowingDirectGetterCallback);
11990 context->Global()->Set(v8_str("o1"), obj->NewInstance()); 12063 context->Global()->Set(v8_str("o1"), obj->NewInstance());
11991 v8::Handle<Value> result = CompileRun( 12064 v8::Handle<Value> result = CompileRun(
11992 "var result = '';" 12065 "var result = '';"
11993 "for (var i = 0; i < 5; i++) {" 12066 "for (var i = 0; i < 5; i++) {"
11994 " try { o1.p1; } catch (e) { result += e; }" 12067 " try { o1.p1; } catch (e) { result += e; }"
11995 "}" 12068 "}"
11996 "result;"); 12069 "result;");
11997 CHECK_EQ(v8_str("ggggg"), result); 12070 CHECK_EQ(v8_str("ggggg"), result);
11998 } 12071 }
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
12401 ApiTestFuzzer::Fuzz(); 12474 ApiTestFuzzer::Fuzz();
12402 if (v8_str("x")->Equals(name)) { 12475 if (v8_str("x")->Equals(name)) {
12403 info.GetReturnValue().Set(keyed_call_ic_function); 12476 info.GetReturnValue().Set(keyed_call_ic_function);
12404 } 12477 }
12405 } 12478 }
12406 12479
12407 12480
12408 // Test the case when we stored cacheable lookup into 12481 // Test the case when we stored cacheable lookup into
12409 // a stub, but the function name changed (to another cacheable function). 12482 // a stub, but the function name changed (to another cacheable function).
12410 THREADED_TEST(InterceptorKeyedCallICKeyChange1) { 12483 THREADED_TEST(InterceptorKeyedCallICKeyChange1) {
12411 v8::HandleScope scope(CcTest::isolate()); 12484 v8::Isolate* isolate = CcTest::isolate();
12412 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12485 v8::HandleScope scope(isolate);
12486 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12413 templ->SetNamedPropertyHandler(NoBlockGetterX); 12487 templ->SetNamedPropertyHandler(NoBlockGetterX);
12414 LocalContext context; 12488 LocalContext context;
12415 context->Global()->Set(v8_str("o"), templ->NewInstance()); 12489 context->Global()->Set(v8_str("o"), templ->NewInstance());
12416 CompileRun( 12490 CompileRun(
12417 "proto = new Object();" 12491 "proto = new Object();"
12418 "proto.y = function(x) { return x + 1; };" 12492 "proto.y = function(x) { return x + 1; };"
12419 "proto.z = function(x) { return x - 1; };" 12493 "proto.z = function(x) { return x - 1; };"
12420 "o.__proto__ = proto;" 12494 "o.__proto__ = proto;"
12421 "var result = 0;" 12495 "var result = 0;"
12422 "var method = 'y';" 12496 "var method = 'y';"
12423 "for (var i = 0; i < 10; i++) {" 12497 "for (var i = 0; i < 10; i++) {"
12424 " if (i == 5) { method = 'z'; };" 12498 " if (i == 5) { method = 'z'; };"
12425 " result += o[method](41);" 12499 " result += o[method](41);"
12426 "}"); 12500 "}");
12427 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 12501 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
12428 } 12502 }
12429 12503
12430 12504
12431 // Test the case when we stored cacheable lookup into 12505 // Test the case when we stored cacheable lookup into
12432 // a stub, but the function name changed (and the new function is present 12506 // a stub, but the function name changed (and the new function is present
12433 // both before and after the interceptor in the prototype chain). 12507 // both before and after the interceptor in the prototype chain).
12434 THREADED_TEST(InterceptorKeyedCallICKeyChange2) { 12508 THREADED_TEST(InterceptorKeyedCallICKeyChange2) {
12435 v8::HandleScope scope(CcTest::isolate()); 12509 v8::Isolate* isolate = CcTest::isolate();
12436 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12510 v8::HandleScope scope(isolate);
12511 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12437 templ->SetNamedPropertyHandler(InterceptorKeyedCallICGetter); 12512 templ->SetNamedPropertyHandler(InterceptorKeyedCallICGetter);
12438 LocalContext context; 12513 LocalContext context;
12439 context->Global()->Set(v8_str("proto1"), templ->NewInstance()); 12514 context->Global()->Set(v8_str("proto1"), templ->NewInstance());
12440 keyed_call_ic_function = 12515 keyed_call_ic_function =
12441 v8_compile("function f(x) { return x - 1; }; f")->Run(); 12516 v8_compile("function f(x) { return x - 1; }; f")->Run();
12442 CompileRun( 12517 CompileRun(
12443 "o = new Object();" 12518 "o = new Object();"
12444 "proto2 = new Object();" 12519 "proto2 = new Object();"
12445 "o.y = function(x) { return x + 1; };" 12520 "o.y = function(x) { return x + 1; };"
12446 "proto2.y = function(x) { return x + 2; };" 12521 "proto2.y = function(x) { return x + 2; };"
12447 "o.__proto__ = proto1;" 12522 "o.__proto__ = proto1;"
12448 "proto1.__proto__ = proto2;" 12523 "proto1.__proto__ = proto2;"
12449 "var result = 0;" 12524 "var result = 0;"
12450 "var method = 'x';" 12525 "var method = 'x';"
12451 "for (var i = 0; i < 10; i++) {" 12526 "for (var i = 0; i < 10; i++) {"
12452 " if (i == 5) { method = 'y'; };" 12527 " if (i == 5) { method = 'y'; };"
12453 " result += o[method](41);" 12528 " result += o[method](41);"
12454 "}"); 12529 "}");
12455 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 12530 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
12456 } 12531 }
12457 12532
12458 12533
12459 // Same as InterceptorKeyedCallICKeyChange1 only the cacheable function sit 12534 // Same as InterceptorKeyedCallICKeyChange1 only the cacheable function sit
12460 // on the global object. 12535 // on the global object.
12461 THREADED_TEST(InterceptorKeyedCallICKeyChangeOnGlobal) { 12536 THREADED_TEST(InterceptorKeyedCallICKeyChangeOnGlobal) {
12462 v8::HandleScope scope(CcTest::isolate()); 12537 v8::Isolate* isolate = CcTest::isolate();
12463 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12538 v8::HandleScope scope(isolate);
12539 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12464 templ->SetNamedPropertyHandler(NoBlockGetterX); 12540 templ->SetNamedPropertyHandler(NoBlockGetterX);
12465 LocalContext context; 12541 LocalContext context;
12466 context->Global()->Set(v8_str("o"), templ->NewInstance()); 12542 context->Global()->Set(v8_str("o"), templ->NewInstance());
12467 CompileRun( 12543 CompileRun(
12468 "function inc(x) { return x + 1; };" 12544 "function inc(x) { return x + 1; };"
12469 "inc(1);" 12545 "inc(1);"
12470 "function dec(x) { return x - 1; };" 12546 "function dec(x) { return x - 1; };"
12471 "dec(1);" 12547 "dec(1);"
12472 "o.__proto__ = this;" 12548 "o.__proto__ = this;"
12473 "this.__proto__.x = inc;" 12549 "this.__proto__.x = inc;"
12474 "this.__proto__.y = dec;" 12550 "this.__proto__.y = dec;"
12475 "var result = 0;" 12551 "var result = 0;"
12476 "var method = 'x';" 12552 "var method = 'x';"
12477 "for (var i = 0; i < 10; i++) {" 12553 "for (var i = 0; i < 10; i++) {"
12478 " if (i == 5) { method = 'y'; };" 12554 " if (i == 5) { method = 'y'; };"
12479 " result += o[method](41);" 12555 " result += o[method](41);"
12480 "}"); 12556 "}");
12481 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 12557 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
12482 } 12558 }
12483 12559
12484 12560
12485 // Test the case when actual function to call sits on global object. 12561 // Test the case when actual function to call sits on global object.
12486 THREADED_TEST(InterceptorKeyedCallICFromGlobal) { 12562 THREADED_TEST(InterceptorKeyedCallICFromGlobal) {
12487 v8::HandleScope scope(CcTest::isolate()); 12563 v8::Isolate* isolate = CcTest::isolate();
12488 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 12564 v8::HandleScope scope(isolate);
12565 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(isolate);
12489 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 12566 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
12490 LocalContext context; 12567 LocalContext context;
12491 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 12568 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
12492 12569
12493 CompileRun( 12570 CompileRun(
12494 "function len(x) { return x.length; };" 12571 "function len(x) { return x.length; };"
12495 "o.__proto__ = this;" 12572 "o.__proto__ = this;"
12496 "var m = 'parseFloat';" 12573 "var m = 'parseFloat';"
12497 "var result = 0;" 12574 "var result = 0;"
12498 "for (var i = 0; i < 10; i++) {" 12575 "for (var i = 0; i < 10; i++) {"
12499 " if (i == 5) {" 12576 " if (i == 5) {"
12500 " m = 'len';" 12577 " m = 'len';"
12501 " saved_result = result;" 12578 " saved_result = result;"
12502 " };" 12579 " };"
12503 " result = o[m]('239');" 12580 " result = o[m]('239');"
12504 "}"); 12581 "}");
12505 CHECK_EQ(3, context->Global()->Get(v8_str("result"))->Int32Value()); 12582 CHECK_EQ(3, context->Global()->Get(v8_str("result"))->Int32Value());
12506 CHECK_EQ(239, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12583 CHECK_EQ(239, context->Global()->Get(v8_str("saved_result"))->Int32Value());
12507 } 12584 }
12508 12585
12509 12586
12510 // Test the map transition before the interceptor. 12587 // Test the map transition before the interceptor.
12511 THREADED_TEST(InterceptorKeyedCallICMapChangeBefore) { 12588 THREADED_TEST(InterceptorKeyedCallICMapChangeBefore) {
12512 v8::HandleScope scope(CcTest::isolate()); 12589 v8::Isolate* isolate = CcTest::isolate();
12513 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 12590 v8::HandleScope scope(isolate);
12591 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(isolate);
12514 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 12592 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
12515 LocalContext context; 12593 LocalContext context;
12516 context->Global()->Set(v8_str("proto"), templ_o->NewInstance()); 12594 context->Global()->Set(v8_str("proto"), templ_o->NewInstance());
12517 12595
12518 CompileRun( 12596 CompileRun(
12519 "var o = new Object();" 12597 "var o = new Object();"
12520 "o.__proto__ = proto;" 12598 "o.__proto__ = proto;"
12521 "o.method = function(x) { return x + 1; };" 12599 "o.method = function(x) { return x + 1; };"
12522 "var m = 'method';" 12600 "var m = 'method';"
12523 "var result = 0;" 12601 "var result = 0;"
12524 "for (var i = 0; i < 10; i++) {" 12602 "for (var i = 0; i < 10; i++) {"
12525 " if (i == 5) { o.method = function(x) { return x - 1; }; };" 12603 " if (i == 5) { o.method = function(x) { return x - 1; }; };"
12526 " result += o[m](41);" 12604 " result += o[m](41);"
12527 "}"); 12605 "}");
12528 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 12606 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
12529 } 12607 }
12530 12608
12531 12609
12532 // Test the map transition after the interceptor. 12610 // Test the map transition after the interceptor.
12533 THREADED_TEST(InterceptorKeyedCallICMapChangeAfter) { 12611 THREADED_TEST(InterceptorKeyedCallICMapChangeAfter) {
12534 v8::HandleScope scope(CcTest::isolate()); 12612 v8::Isolate* isolate = CcTest::isolate();
12535 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 12613 v8::HandleScope scope(isolate);
12614 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(isolate);
12536 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 12615 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
12537 LocalContext context; 12616 LocalContext context;
12538 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 12617 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
12539 12618
12540 CompileRun( 12619 CompileRun(
12541 "var proto = new Object();" 12620 "var proto = new Object();"
12542 "o.__proto__ = proto;" 12621 "o.__proto__ = proto;"
12543 "proto.method = function(x) { return x + 1; };" 12622 "proto.method = function(x) { return x + 1; };"
12544 "var m = 'method';" 12623 "var m = 'method';"
12545 "var result = 0;" 12624 "var result = 0;"
(...skipping 14 matching lines...) Expand all
12560 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) { 12639 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) {
12561 info.GetReturnValue().Set(call_ic_function2); 12640 info.GetReturnValue().Set(call_ic_function2);
12562 } 12641 }
12563 } 12642 }
12564 12643
12565 12644
12566 // This test should hit load and call ICs for the interceptor case. 12645 // This test should hit load and call ICs for the interceptor case.
12567 // Once in a while, the interceptor will reply that a property was not 12646 // Once in a while, the interceptor will reply that a property was not
12568 // found in which case we should get a reference error. 12647 // found in which case we should get a reference error.
12569 THREADED_TEST(InterceptorICReferenceErrors) { 12648 THREADED_TEST(InterceptorICReferenceErrors) {
12570 v8::HandleScope scope(CcTest::isolate()); 12649 v8::Isolate* isolate = CcTest::isolate();
12571 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12650 v8::HandleScope scope(isolate);
12651 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12572 templ->SetNamedPropertyHandler(InterceptorICRefErrorGetter); 12652 templ->SetNamedPropertyHandler(InterceptorICRefErrorGetter);
12573 LocalContext context(0, templ, v8::Handle<Value>()); 12653 LocalContext context(0, templ, v8::Handle<Value>());
12574 call_ic_function2 = v8_compile("function h(x) { return x; }; h")->Run(); 12654 call_ic_function2 = v8_compile("function h(x) { return x; }; h")->Run();
12575 v8::Handle<Value> value = CompileRun( 12655 v8::Handle<Value> value = CompileRun(
12576 "function f() {" 12656 "function f() {"
12577 " for (var i = 0; i < 1000; i++) {" 12657 " for (var i = 0; i < 1000; i++) {"
12578 " try { x; } catch(e) { return true; }" 12658 " try { x; } catch(e) { return true; }"
12579 " }" 12659 " }"
12580 " return false;" 12660 " return false;"
12581 "};" 12661 "};"
(...skipping 25 matching lines...) Expand all
12607 info.GetIsolate()->ThrowException(v8_num(42)); 12687 info.GetIsolate()->ThrowException(v8_num(42));
12608 return; 12688 return;
12609 } 12689 }
12610 } 12690 }
12611 12691
12612 12692
12613 // Test interceptor load/call IC where the interceptor throws an 12693 // Test interceptor load/call IC where the interceptor throws an
12614 // exception once in a while. 12694 // exception once in a while.
12615 THREADED_TEST(InterceptorICGetterExceptions) { 12695 THREADED_TEST(InterceptorICGetterExceptions) {
12616 interceptor_ic_exception_get_count = 0; 12696 interceptor_ic_exception_get_count = 0;
12617 v8::HandleScope scope(CcTest::isolate()); 12697 v8::Isolate* isolate = CcTest::isolate();
12618 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12698 v8::HandleScope scope(isolate);
12699 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12619 templ->SetNamedPropertyHandler(InterceptorICExceptionGetter); 12700 templ->SetNamedPropertyHandler(InterceptorICExceptionGetter);
12620 LocalContext context(0, templ, v8::Handle<Value>()); 12701 LocalContext context(0, templ, v8::Handle<Value>());
12621 call_ic_function3 = v8_compile("function h(x) { return x; }; h")->Run(); 12702 call_ic_function3 = v8_compile("function h(x) { return x; }; h")->Run();
12622 v8::Handle<Value> value = CompileRun( 12703 v8::Handle<Value> value = CompileRun(
12623 "function f() {" 12704 "function f() {"
12624 " for (var i = 0; i < 100; i++) {" 12705 " for (var i = 0; i < 100; i++) {"
12625 " try { x; } catch(e) { return true; }" 12706 " try { x; } catch(e) { return true; }"
12626 " }" 12707 " }"
12627 " return false;" 12708 " return false;"
12628 "};" 12709 "};"
(...skipping 22 matching lines...) Expand all
12651 if (++interceptor_ic_exception_set_count > 20) { 12732 if (++interceptor_ic_exception_set_count > 20) {
12652 info.GetIsolate()->ThrowException(v8_num(42)); 12733 info.GetIsolate()->ThrowException(v8_num(42));
12653 } 12734 }
12654 } 12735 }
12655 12736
12656 12737
12657 // Test interceptor store IC where the interceptor throws an exception 12738 // Test interceptor store IC where the interceptor throws an exception
12658 // once in a while. 12739 // once in a while.
12659 THREADED_TEST(InterceptorICSetterExceptions) { 12740 THREADED_TEST(InterceptorICSetterExceptions) {
12660 interceptor_ic_exception_set_count = 0; 12741 interceptor_ic_exception_set_count = 0;
12661 v8::HandleScope scope(CcTest::isolate()); 12742 v8::Isolate* isolate = CcTest::isolate();
12662 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12743 v8::HandleScope scope(isolate);
12744 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12663 templ->SetNamedPropertyHandler(0, InterceptorICExceptionSetter); 12745 templ->SetNamedPropertyHandler(0, InterceptorICExceptionSetter);
12664 LocalContext context(0, templ, v8::Handle<Value>()); 12746 LocalContext context(0, templ, v8::Handle<Value>());
12665 v8::Handle<Value> value = CompileRun( 12747 v8::Handle<Value> value = CompileRun(
12666 "function f() {" 12748 "function f() {"
12667 " for (var i = 0; i < 100; i++) {" 12749 " for (var i = 0; i < 100; i++) {"
12668 " try { x = 42; } catch(e) { return true; }" 12750 " try { x = 42; } catch(e) { return true; }"
12669 " }" 12751 " }"
12670 " return false;" 12752 " return false;"
12671 "};" 12753 "};"
12672 "f();"); 12754 "f();");
12673 CHECK_EQ(true, value->BooleanValue()); 12755 CHECK_EQ(true, value->BooleanValue());
12674 } 12756 }
12675 12757
12676 12758
12677 // Test that we ignore null interceptors. 12759 // Test that we ignore null interceptors.
12678 THREADED_TEST(NullNamedInterceptor) { 12760 THREADED_TEST(NullNamedInterceptor) {
12679 v8::HandleScope scope(CcTest::isolate()); 12761 v8::Isolate* isolate = CcTest::isolate();
12680 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12762 v8::HandleScope scope(isolate);
12763 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12681 templ->SetNamedPropertyHandler( 12764 templ->SetNamedPropertyHandler(
12682 static_cast<v8::NamedPropertyGetterCallback>(0)); 12765 static_cast<v8::NamedPropertyGetterCallback>(0));
12683 LocalContext context; 12766 LocalContext context;
12684 templ->Set(CcTest::isolate(), "x", v8_num(42)); 12767 templ->Set(CcTest::isolate(), "x", v8_num(42));
12685 v8::Handle<v8::Object> obj = templ->NewInstance(); 12768 v8::Handle<v8::Object> obj = templ->NewInstance();
12686 context->Global()->Set(v8_str("obj"), obj); 12769 context->Global()->Set(v8_str("obj"), obj);
12687 v8::Handle<Value> value = CompileRun("obj.x"); 12770 v8::Handle<Value> value = CompileRun("obj.x");
12688 CHECK(value->IsInt32()); 12771 CHECK(value->IsInt32());
12689 CHECK_EQ(42, value->Int32Value()); 12772 CHECK_EQ(42, value->Int32Value());
12690 } 12773 }
12691 12774
12692 12775
12693 // Test that we ignore null interceptors. 12776 // Test that we ignore null interceptors.
12694 THREADED_TEST(NullIndexedInterceptor) { 12777 THREADED_TEST(NullIndexedInterceptor) {
12695 v8::HandleScope scope(CcTest::isolate()); 12778 v8::Isolate* isolate = CcTest::isolate();
12696 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12779 v8::HandleScope scope(isolate);
12780 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12697 templ->SetIndexedPropertyHandler( 12781 templ->SetIndexedPropertyHandler(
12698 static_cast<v8::IndexedPropertyGetterCallback>(0)); 12782 static_cast<v8::IndexedPropertyGetterCallback>(0));
12699 LocalContext context; 12783 LocalContext context;
12700 templ->Set(CcTest::isolate(), "42", v8_num(42)); 12784 templ->Set(CcTest::isolate(), "42", v8_num(42));
12701 v8::Handle<v8::Object> obj = templ->NewInstance(); 12785 v8::Handle<v8::Object> obj = templ->NewInstance();
12702 context->Global()->Set(v8_str("obj"), obj); 12786 context->Global()->Set(v8_str("obj"), obj);
12703 v8::Handle<Value> value = CompileRun("obj[42]"); 12787 v8::Handle<Value> value = CompileRun("obj[42]");
12704 CHECK(value->IsInt32()); 12788 CHECK(value->IsInt32());
12705 CHECK_EQ(42, value->Int32Value()); 12789 CHECK_EQ(42, value->Int32Value());
12706 } 12790 }
(...skipping 1083 matching lines...) Expand 10 before | Expand all | Expand 10 after
13790 13874
13791 return invocations; 13875 return invocations;
13792 } 13876 }
13793 13877
13794 13878
13795 void SetFunctionEntryHookTest::RunLoopInNewEnv(v8::Isolate* isolate) { 13879 void SetFunctionEntryHookTest::RunLoopInNewEnv(v8::Isolate* isolate) {
13796 v8::HandleScope outer(isolate); 13880 v8::HandleScope outer(isolate);
13797 v8::Local<Context> env = Context::New(isolate); 13881 v8::Local<Context> env = Context::New(isolate);
13798 env->Enter(); 13882 env->Enter();
13799 13883
13800 Local<ObjectTemplate> t = ObjectTemplate::New(); 13884 Local<ObjectTemplate> t = ObjectTemplate::New(isolate);
13801 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(isolate, RuntimeCallback)); 13885 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(isolate, RuntimeCallback));
13802 env->Global()->Set(v8_str("obj"), t->NewInstance()); 13886 env->Global()->Set(v8_str("obj"), t->NewInstance());
13803 13887
13804 const char* script = 13888 const char* script =
13805 "function bar() {\n" 13889 "function bar() {\n"
13806 " var sum = 0;\n" 13890 " var sum = 0;\n"
13807 " for (i = 0; i < 100; ++i)\n" 13891 " for (i = 0; i < 100; ++i)\n"
13808 " sum = foo(i);\n" 13892 " sum = foo(i);\n"
13809 " return sum;\n" 13893 " return sum;\n"
13810 "}\n" 13894 "}\n"
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
14160 // Regression test for issue 54, object templates with internal fields 14244 // Regression test for issue 54, object templates with internal fields
14161 // but no accessors or interceptors did not get their internal field 14245 // but no accessors or interceptors did not get their internal field
14162 // count set on instances. 14246 // count set on instances.
14163 THREADED_TEST(Regress54) { 14247 THREADED_TEST(Regress54) {
14164 LocalContext context; 14248 LocalContext context;
14165 v8::Isolate* isolate = context->GetIsolate(); 14249 v8::Isolate* isolate = context->GetIsolate();
14166 v8::HandleScope outer(isolate); 14250 v8::HandleScope outer(isolate);
14167 static v8::Persistent<v8::ObjectTemplate> templ; 14251 static v8::Persistent<v8::ObjectTemplate> templ;
14168 if (templ.IsEmpty()) { 14252 if (templ.IsEmpty()) {
14169 v8::EscapableHandleScope inner(isolate); 14253 v8::EscapableHandleScope inner(isolate);
14170 v8::Local<v8::ObjectTemplate> local = v8::ObjectTemplate::New(); 14254 v8::Local<v8::ObjectTemplate> local = v8::ObjectTemplate::New(isolate);
14171 local->SetInternalFieldCount(1); 14255 local->SetInternalFieldCount(1);
14172 templ.Reset(isolate, inner.Escape(local)); 14256 templ.Reset(isolate, inner.Escape(local));
14173 } 14257 }
14174 v8::Handle<v8::Object> result = 14258 v8::Handle<v8::Object> result =
14175 v8::Local<v8::ObjectTemplate>::New(isolate, templ)->NewInstance(); 14259 v8::Local<v8::ObjectTemplate>::New(isolate, templ)->NewInstance();
14176 CHECK_EQ(1, result->InternalFieldCount()); 14260 CHECK_EQ(1, result->InternalFieldCount());
14177 } 14261 }
14178 14262
14179 14263
14180 // If part of the threaded tests, this test makes ThreadingTest fail 14264 // If part of the threaded tests, this test makes ThreadingTest fail
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
14281 const v8::FunctionCallbackInfo<v8::Value>& args) { 14365 const v8::FunctionCallbackInfo<v8::Value>& args) {
14282 ApiTestFuzzer::Fuzz(); 14366 ApiTestFuzzer::Fuzz();
14283 args.GetReturnValue().Set(v8_num(42)); 14367 args.GetReturnValue().Set(v8_num(42));
14284 } 14368 }
14285 14369
14286 14370
14287 THREADED_TEST(CallbackFunctionName) { 14371 THREADED_TEST(CallbackFunctionName) {
14288 LocalContext context; 14372 LocalContext context;
14289 v8::Isolate* isolate = context->GetIsolate(); 14373 v8::Isolate* isolate = context->GetIsolate();
14290 v8::HandleScope scope(isolate); 14374 v8::HandleScope scope(isolate);
14291 Local<ObjectTemplate> t = ObjectTemplate::New(); 14375 Local<ObjectTemplate> t = ObjectTemplate::New(isolate);
14292 t->Set(v8_str("asdf"), 14376 t->Set(v8_str("asdf"),
14293 v8::FunctionTemplate::New(isolate, FunctionNameCallback)); 14377 v8::FunctionTemplate::New(isolate, FunctionNameCallback));
14294 context->Global()->Set(v8_str("obj"), t->NewInstance()); 14378 context->Global()->Set(v8_str("obj"), t->NewInstance());
14295 v8::Handle<v8::Value> value = CompileRun("obj.asdf.name"); 14379 v8::Handle<v8::Value> value = CompileRun("obj.asdf.name");
14296 CHECK(value->IsString()); 14380 CHECK(value->IsString());
14297 v8::String::Utf8Value name(value); 14381 v8::String::Utf8Value name(value);
14298 CHECK_EQ("asdf", *name); 14382 CHECK_EQ("asdf", *name);
14299 } 14383 }
14300 14384
14301 14385
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
14424 v8::AccessType type, 14508 v8::AccessType type,
14425 Local<Value> data) { 14509 Local<Value> data) {
14426 return type != v8::ACCESS_SET; 14510 return type != v8::ACCESS_SET;
14427 } 14511 }
14428 14512
14429 14513
14430 THREADED_TEST(DisableAccessChecksWhileConfiguring) { 14514 THREADED_TEST(DisableAccessChecksWhileConfiguring) {
14431 LocalContext context; 14515 LocalContext context;
14432 v8::Isolate* isolate = context->GetIsolate(); 14516 v8::Isolate* isolate = context->GetIsolate();
14433 v8::HandleScope scope(isolate); 14517 v8::HandleScope scope(isolate);
14434 Local<ObjectTemplate> templ = ObjectTemplate::New(); 14518 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
14435 templ->SetAccessCheckCallbacks(NamedSetAccessBlocker, 14519 templ->SetAccessCheckCallbacks(NamedSetAccessBlocker,
14436 IndexedSetAccessBlocker); 14520 IndexedSetAccessBlocker);
14437 templ->Set(v8_str("x"), v8::True(isolate)); 14521 templ->Set(v8_str("x"), v8::True(isolate));
14438 Local<v8::Object> instance = templ->NewInstance(); 14522 Local<v8::Object> instance = templ->NewInstance();
14439 context->Global()->Set(v8_str("obj"), instance); 14523 context->Global()->Set(v8_str("obj"), instance);
14440 Local<Value> value = CompileRun("obj.x"); 14524 Local<Value> value = CompileRun("obj.x");
14441 CHECK(value->BooleanValue()); 14525 CHECK(value->BooleanValue());
14442 } 14526 }
14443 14527
14444 14528
14445 static bool NamedGetAccessBlocker(Local<v8::Object> obj, 14529 static bool NamedGetAccessBlocker(Local<v8::Object> obj,
14446 Local<Value> name, 14530 Local<Value> name,
14447 v8::AccessType type, 14531 v8::AccessType type,
14448 Local<Value> data) { 14532 Local<Value> data) {
14449 return false; 14533 return false;
14450 } 14534 }
14451 14535
14452 14536
14453 static bool IndexedGetAccessBlocker(Local<v8::Object> obj, 14537 static bool IndexedGetAccessBlocker(Local<v8::Object> obj,
14454 uint32_t key, 14538 uint32_t key,
14455 v8::AccessType type, 14539 v8::AccessType type,
14456 Local<Value> data) { 14540 Local<Value> data) {
14457 return false; 14541 return false;
14458 } 14542 }
14459 14543
14460 14544
14461 14545
14462 THREADED_TEST(AccessChecksReenabledCorrectly) { 14546 THREADED_TEST(AccessChecksReenabledCorrectly) {
14463 LocalContext context; 14547 LocalContext context;
14464 v8::HandleScope scope(context->GetIsolate()); 14548 v8::Isolate* isolate = context->GetIsolate();
14465 Local<ObjectTemplate> templ = ObjectTemplate::New(); 14549 v8::HandleScope scope(isolate);
14550 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
14466 templ->SetAccessCheckCallbacks(NamedGetAccessBlocker, 14551 templ->SetAccessCheckCallbacks(NamedGetAccessBlocker,
14467 IndexedGetAccessBlocker); 14552 IndexedGetAccessBlocker);
14468 templ->Set(v8_str("a"), v8_str("a")); 14553 templ->Set(v8_str("a"), v8_str("a"));
14469 // Add more than 8 (see kMaxFastProperties) properties 14554 // Add more than 8 (see kMaxFastProperties) properties
14470 // so that the constructor will force copying map. 14555 // so that the constructor will force copying map.
14471 // Cannot sprintf, gcc complains unsafety. 14556 // Cannot sprintf, gcc complains unsafety.
14472 char buf[4]; 14557 char buf[4];
14473 for (char i = '0'; i <= '9' ; i++) { 14558 for (char i = '0'; i <= '9' ; i++) {
14474 buf[0] = i; 14559 buf[0] = i;
14475 for (char j = '0'; j <= '9'; j++) { 14560 for (char j = '0'; j <= '9'; j++) {
14476 buf[1] = j; 14561 buf[1] = j;
14477 for (char k = '0'; k <= '9'; k++) { 14562 for (char k = '0'; k <= '9'; k++) {
14478 buf[2] = k; 14563 buf[2] = k;
14479 buf[3] = 0; 14564 buf[3] = 0;
14480 templ->Set(v8_str(buf), v8::Number::New(context->GetIsolate(), k)); 14565 templ->Set(v8_str(buf), v8::Number::New(isolate, k));
14481 } 14566 }
14482 } 14567 }
14483 } 14568 }
14484 14569
14485 Local<v8::Object> instance_1 = templ->NewInstance(); 14570 Local<v8::Object> instance_1 = templ->NewInstance();
14486 context->Global()->Set(v8_str("obj_1"), instance_1); 14571 context->Global()->Set(v8_str("obj_1"), instance_1);
14487 14572
14488 Local<Value> value_1 = CompileRun("obj_1.a"); 14573 Local<Value> value_1 = CompileRun("obj_1.a");
14489 CHECK(value_1->IsUndefined()); 14574 CHECK(value_1->IsUndefined());
14490 14575
14491 Local<v8::Object> instance_2 = templ->NewInstance(); 14576 Local<v8::Object> instance_2 = templ->NewInstance();
14492 context->Global()->Set(v8_str("obj_2"), instance_2); 14577 context->Global()->Set(v8_str("obj_2"), instance_2);
14493 14578
14494 Local<Value> value_2 = CompileRun("obj_2.a"); 14579 Local<Value> value_2 = CompileRun("obj_2.a");
14495 CHECK(value_2->IsUndefined()); 14580 CHECK(value_2->IsUndefined());
14496 } 14581 }
14497 14582
14498 14583
14499 // This tests that access check information remains on the global 14584 // This tests that access check information remains on the global
14500 // object template when creating contexts. 14585 // object template when creating contexts.
14501 THREADED_TEST(AccessControlRepeatedContextCreation) { 14586 THREADED_TEST(AccessControlRepeatedContextCreation) {
14502 v8::Isolate* isolate = CcTest::isolate(); 14587 v8::Isolate* isolate = CcTest::isolate();
14503 v8::HandleScope handle_scope(isolate); 14588 v8::HandleScope handle_scope(isolate);
14504 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 14589 v8::Handle<v8::ObjectTemplate> global_template =
14590 v8::ObjectTemplate::New(isolate);
14505 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker, 14591 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker,
14506 IndexedSetAccessBlocker); 14592 IndexedSetAccessBlocker);
14507 i::Handle<i::ObjectTemplateInfo> internal_template = 14593 i::Handle<i::ObjectTemplateInfo> internal_template =
14508 v8::Utils::OpenHandle(*global_template); 14594 v8::Utils::OpenHandle(*global_template);
14509 CHECK(!internal_template->constructor()->IsUndefined()); 14595 CHECK(!internal_template->constructor()->IsUndefined());
14510 i::Handle<i::FunctionTemplateInfo> constructor( 14596 i::Handle<i::FunctionTemplateInfo> constructor(
14511 i::FunctionTemplateInfo::cast(internal_template->constructor())); 14597 i::FunctionTemplateInfo::cast(internal_template->constructor()));
14512 CHECK(!constructor->access_check_info()->IsUndefined()); 14598 CHECK(!constructor->access_check_info()->IsUndefined());
14513 v8::Local<Context> context0(Context::New(isolate, NULL, global_template)); 14599 v8::Local<Context> context0(Context::New(isolate, NULL, global_template));
14514 CHECK(!context0.IsEmpty()); 14600 CHECK(!context0.IsEmpty());
14515 CHECK(!constructor->access_check_info()->IsUndefined()); 14601 CHECK(!constructor->access_check_info()->IsUndefined());
14516 } 14602 }
14517 14603
14518 14604
14519 THREADED_TEST(TurnOnAccessCheck) { 14605 THREADED_TEST(TurnOnAccessCheck) {
14520 v8::Isolate* isolate = CcTest::isolate(); 14606 v8::Isolate* isolate = CcTest::isolate();
14521 v8::HandleScope handle_scope(isolate); 14607 v8::HandleScope handle_scope(isolate);
14522 14608
14523 // Create an environment with access check to the global object disabled by 14609 // Create an environment with access check to the global object disabled by
14524 // default. 14610 // default.
14525 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 14611 v8::Handle<v8::ObjectTemplate> global_template =
14612 v8::ObjectTemplate::New(isolate);
14526 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, 14613 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker,
14527 IndexedGetAccessBlocker, 14614 IndexedGetAccessBlocker,
14528 v8::Handle<v8::Value>(), 14615 v8::Handle<v8::Value>(),
14529 false); 14616 false);
14530 v8::Local<Context> context = Context::New(isolate, NULL, global_template); 14617 v8::Local<Context> context = Context::New(isolate, NULL, global_template);
14531 Context::Scope context_scope(context); 14618 Context::Scope context_scope(context);
14532 14619
14533 // Set up a property and a number of functions. 14620 // Set up a property and a number of functions.
14534 context->Global()->Set(v8_str("a"), v8_num(1)); 14621 context->Global()->Set(v8_str("a"), v8_num(1));
14535 CompileRun("function f1() {return a;}" 14622 CompileRun("function f1() {return a;}"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
14599 } 14686 }
14600 14687
14601 14688
14602 THREADED_TEST(TurnOnAccessCheckAndRecompile) { 14689 THREADED_TEST(TurnOnAccessCheckAndRecompile) {
14603 v8::Isolate* isolate = CcTest::isolate(); 14690 v8::Isolate* isolate = CcTest::isolate();
14604 v8::HandleScope handle_scope(isolate); 14691 v8::HandleScope handle_scope(isolate);
14605 14692
14606 // Create an environment with access check to the global object disabled by 14693 // Create an environment with access check to the global object disabled by
14607 // default. When the registered access checker will block access to properties 14694 // default. When the registered access checker will block access to properties
14608 // a and h. 14695 // a and h.
14609 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 14696 v8::Handle<v8::ObjectTemplate> global_template =
14697 v8::ObjectTemplate::New(isolate);
14610 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH, 14698 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH,
14611 IndexedGetAccessBlocker, 14699 IndexedGetAccessBlocker,
14612 v8::Handle<v8::Value>(), 14700 v8::Handle<v8::Value>(),
14613 false); 14701 false);
14614 v8::Local<Context> context = Context::New(isolate, NULL, global_template); 14702 v8::Local<Context> context = Context::New(isolate, NULL, global_template);
14615 Context::Scope context_scope(context); 14703 Context::Scope context_scope(context);
14616 14704
14617 // Set up a property and a number of functions. 14705 // Set up a property and a number of functions.
14618 context->Global()->Set(v8_str("a"), v8_num(1)); 14706 context->Global()->Set(v8_str("a"), v8_num(1));
14619 static const char* source = "function f1() {return a;}" 14707 static const char* source = "function f1() {return a;}"
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
15159 15247
15160 #endif // V8_INTERPRETED_REGEXP 15248 #endif // V8_INTERPRETED_REGEXP
15161 15249
15162 15250
15163 // Test that we cannot set a property on the global object if there 15251 // Test that we cannot set a property on the global object if there
15164 // is a read-only property in the prototype chain. 15252 // is a read-only property in the prototype chain.
15165 TEST(ReadOnlyPropertyInGlobalProto) { 15253 TEST(ReadOnlyPropertyInGlobalProto) {
15166 i::FLAG_es5_readonly = true; 15254 i::FLAG_es5_readonly = true;
15167 v8::Isolate* isolate = CcTest::isolate(); 15255 v8::Isolate* isolate = CcTest::isolate();
15168 v8::HandleScope scope(isolate); 15256 v8::HandleScope scope(isolate);
15169 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 15257 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
15170 LocalContext context(0, templ); 15258 LocalContext context(0, templ);
15171 v8::Handle<v8::Object> global = context->Global(); 15259 v8::Handle<v8::Object> global = context->Global();
15172 v8::Handle<v8::Object> global_proto = 15260 v8::Handle<v8::Object> global_proto =
15173 v8::Handle<v8::Object>::Cast(global->Get(v8_str("__proto__"))); 15261 v8::Handle<v8::Object>::Cast(global->Get(v8_str("__proto__")));
15174 global_proto->Set(v8_str("x"), v8::Integer::New(isolate, 0), v8::ReadOnly); 15262 global_proto->Set(v8_str("x"), v8::Integer::New(isolate, 0), v8::ReadOnly);
15175 global_proto->Set(v8_str("y"), v8::Integer::New(isolate, 0), v8::ReadOnly); 15263 global_proto->Set(v8_str("y"), v8::Integer::New(isolate, 0), v8::ReadOnly);
15176 // Check without 'eval' or 'with'. 15264 // Check without 'eval' or 'with'.
15177 v8::Handle<v8::Value> res = 15265 v8::Handle<v8::Value> res =
15178 CompileRun("function f() { x = 42; return x; }; f()"); 15266 CompileRun("function f() { x = 42; return x; }; f()");
15179 CHECK_EQ(v8::Integer::New(isolate, 0), res); 15267 CHECK_EQ(v8::Integer::New(isolate, 0), res);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
15213 } 15301 }
15214 15302
15215 15303
15216 TEST(ForceSet) { 15304 TEST(ForceSet) {
15217 force_set_get_count = 0; 15305 force_set_get_count = 0;
15218 force_set_set_count = 0; 15306 force_set_set_count = 0;
15219 pass_on_get = false; 15307 pass_on_get = false;
15220 15308
15221 v8::Isolate* isolate = CcTest::isolate(); 15309 v8::Isolate* isolate = CcTest::isolate();
15222 v8::HandleScope scope(isolate); 15310 v8::HandleScope scope(isolate);
15223 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 15311 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
15224 v8::Handle<v8::String> access_property = 15312 v8::Handle<v8::String> access_property =
15225 v8::String::NewFromUtf8(isolate, "a"); 15313 v8::String::NewFromUtf8(isolate, "a");
15226 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter); 15314 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter);
15227 LocalContext context(NULL, templ); 15315 LocalContext context(NULL, templ);
15228 v8::Handle<v8::Object> global = context->Global(); 15316 v8::Handle<v8::Object> global = context->Global();
15229 15317
15230 // Ordinary properties 15318 // Ordinary properties
15231 v8::Handle<v8::String> simple_property = 15319 v8::Handle<v8::String> simple_property =
15232 v8::String::NewFromUtf8(isolate, "p"); 15320 v8::String::NewFromUtf8(isolate, "p");
15233 global->Set(simple_property, v8::Int32::New(isolate, 4), v8::ReadOnly); 15321 global->Set(simple_property, v8::Int32::New(isolate, 4), v8::ReadOnly);
(...skipping 24 matching lines...) Expand all
15258 } 15346 }
15259 15347
15260 15348
15261 TEST(ForceSetWithInterceptor) { 15349 TEST(ForceSetWithInterceptor) {
15262 force_set_get_count = 0; 15350 force_set_get_count = 0;
15263 force_set_set_count = 0; 15351 force_set_set_count = 0;
15264 pass_on_get = false; 15352 pass_on_get = false;
15265 15353
15266 v8::Isolate* isolate = CcTest::isolate(); 15354 v8::Isolate* isolate = CcTest::isolate();
15267 v8::HandleScope scope(isolate); 15355 v8::HandleScope scope(isolate);
15268 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 15356 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
15269 templ->SetNamedPropertyHandler(ForceSetGetter, ForceSetInterceptSetter); 15357 templ->SetNamedPropertyHandler(ForceSetGetter, ForceSetInterceptSetter);
15270 LocalContext context(NULL, templ); 15358 LocalContext context(NULL, templ);
15271 v8::Handle<v8::Object> global = context->Global(); 15359 v8::Handle<v8::Object> global = context->Global();
15272 15360
15273 v8::Handle<v8::String> some_property = 15361 v8::Handle<v8::String> some_property =
15274 v8::String::NewFromUtf8(isolate, "a"); 15362 v8::String::NewFromUtf8(isolate, "a");
15275 CHECK_EQ(0, force_set_set_count); 15363 CHECK_EQ(0, force_set_set_count);
15276 CHECK_EQ(0, force_set_get_count); 15364 CHECK_EQ(0, force_set_get_count);
15277 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 15365 CHECK_EQ(3, global->Get(some_property)->Int32Value());
15278 // Setting the property shouldn't override it, just call the setter 15366 // Setting the property shouldn't override it, just call the setter
(...skipping 25 matching lines...) Expand all
15304 CHECK_EQ(3, global->Get(v8::String::NewFromUtf8(isolate, "b")) 15392 CHECK_EQ(3, global->Get(v8::String::NewFromUtf8(isolate, "b"))
15305 ->Int32Value()); 15393 ->Int32Value());
15306 CHECK_EQ(1, force_set_set_count); 15394 CHECK_EQ(1, force_set_set_count);
15307 CHECK_EQ(6, force_set_get_count); 15395 CHECK_EQ(6, force_set_get_count);
15308 } 15396 }
15309 15397
15310 15398
15311 THREADED_TEST(ForceDelete) { 15399 THREADED_TEST(ForceDelete) {
15312 v8::Isolate* isolate = CcTest::isolate(); 15400 v8::Isolate* isolate = CcTest::isolate();
15313 v8::HandleScope scope(isolate); 15401 v8::HandleScope scope(isolate);
15314 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 15402 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
15315 LocalContext context(NULL, templ); 15403 LocalContext context(NULL, templ);
15316 v8::Handle<v8::Object> global = context->Global(); 15404 v8::Handle<v8::Object> global = context->Global();
15317 15405
15318 // Ordinary properties 15406 // Ordinary properties
15319 v8::Handle<v8::String> simple_property = 15407 v8::Handle<v8::String> simple_property =
15320 v8::String::NewFromUtf8(isolate, "p"); 15408 v8::String::NewFromUtf8(isolate, "p");
15321 global->Set(simple_property, v8::Int32::New(isolate, 4), v8::DontDelete); 15409 global->Set(simple_property, v8::Int32::New(isolate, 4), v8::DontDelete);
15322 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 15410 CHECK_EQ(4, global->Get(simple_property)->Int32Value());
15323 // This should fail because the property is dont-delete. 15411 // This should fail because the property is dont-delete.
15324 CHECK(!global->Delete(simple_property)); 15412 CHECK(!global->Delete(simple_property));
(...skipping 16 matching lines...) Expand all
15341 info.GetReturnValue().Set(true); 15429 info.GetReturnValue().Set(true);
15342 } 15430 }
15343 15431
15344 15432
15345 THREADED_TEST(ForceDeleteWithInterceptor) { 15433 THREADED_TEST(ForceDeleteWithInterceptor) {
15346 force_delete_interceptor_count = 0; 15434 force_delete_interceptor_count = 0;
15347 pass_on_delete = false; 15435 pass_on_delete = false;
15348 15436
15349 v8::Isolate* isolate = CcTest::isolate(); 15437 v8::Isolate* isolate = CcTest::isolate();
15350 v8::HandleScope scope(isolate); 15438 v8::HandleScope scope(isolate);
15351 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 15439 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
15352 templ->SetNamedPropertyHandler(0, 0, 0, ForceDeleteDeleter); 15440 templ->SetNamedPropertyHandler(0, 0, 0, ForceDeleteDeleter);
15353 LocalContext context(NULL, templ); 15441 LocalContext context(NULL, templ);
15354 v8::Handle<v8::Object> global = context->Global(); 15442 v8::Handle<v8::Object> global = context->Global();
15355 15443
15356 v8::Handle<v8::String> some_property = 15444 v8::Handle<v8::String> some_property =
15357 v8::String::NewFromUtf8(isolate, "a"); 15445 v8::String::NewFromUtf8(isolate, "a");
15358 global->Set(some_property, v8::Integer::New(isolate, 42), v8::DontDelete); 15446 global->Set(some_property, v8::Integer::New(isolate, 42), v8::DontDelete);
15359 15447
15360 // Deleting a property should get intercepted and nothing should 15448 // Deleting a property should get intercepted and nothing should
15361 // happen. 15449 // happen.
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after
15970 uint32_t index, 16058 uint32_t index,
15971 Local<Value> value, 16059 Local<Value> value,
15972 const v8::PropertyCallbackInfo<v8::Value>& info) { 16060 const v8::PropertyCallbackInfo<v8::Value>& info) {
15973 ApiTestFuzzer::Fuzz(); 16061 ApiTestFuzzer::Fuzz();
15974 } 16062 }
15975 16063
15976 16064
15977 THREADED_TEST(PixelArrayWithInterceptor) { 16065 THREADED_TEST(PixelArrayWithInterceptor) {
15978 LocalContext context; 16066 LocalContext context;
15979 i::Factory* factory = CcTest::i_isolate()->factory(); 16067 i::Factory* factory = CcTest::i_isolate()->factory();
15980 v8::HandleScope scope(context->GetIsolate()); 16068 v8::Isolate* isolate = context->GetIsolate();
16069 v8::HandleScope scope(isolate);
15981 const int kElementCount = 260; 16070 const int kElementCount = 260;
15982 uint8_t* pixel_data = reinterpret_cast<uint8_t*>(malloc(kElementCount)); 16071 uint8_t* pixel_data = reinterpret_cast<uint8_t*>(malloc(kElementCount));
15983 i::Handle<i::ExternalPixelArray> pixels = 16072 i::Handle<i::ExternalPixelArray> pixels =
15984 i::Handle<i::ExternalPixelArray>::cast( 16073 i::Handle<i::ExternalPixelArray>::cast(
15985 factory->NewExternalArray(kElementCount, 16074 factory->NewExternalArray(kElementCount,
15986 v8::kExternalPixelArray, 16075 v8::kExternalPixelArray,
15987 pixel_data)); 16076 pixel_data));
15988 for (int i = 0; i < kElementCount; i++) { 16077 for (int i = 0; i < kElementCount; i++) {
15989 pixels->set(i, i % 256); 16078 pixels->set(i, i % 256);
15990 } 16079 }
15991 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 16080 v8::Handle<v8::ObjectTemplate> templ =
16081 v8::ObjectTemplate::New(context->GetIsolate());
15992 templ->SetIndexedPropertyHandler(NotHandledIndexedPropertyGetter, 16082 templ->SetIndexedPropertyHandler(NotHandledIndexedPropertyGetter,
15993 NotHandledIndexedPropertySetter); 16083 NotHandledIndexedPropertySetter);
15994 v8::Handle<v8::Object> obj = templ->NewInstance(); 16084 v8::Handle<v8::Object> obj = templ->NewInstance();
15995 obj->SetIndexedPropertiesToPixelData(pixel_data, kElementCount); 16085 obj->SetIndexedPropertiesToPixelData(pixel_data, kElementCount);
15996 context->Global()->Set(v8_str("pixels"), obj); 16086 context->Global()->Set(v8_str("pixels"), obj);
15997 v8::Handle<v8::Value> result = CompileRun("pixels[1]"); 16087 v8::Handle<v8::Value> result = CompileRun("pixels[1]");
15998 CHECK_EQ(1, result->Int32Value()); 16088 CHECK_EQ(1, result->Int32Value());
15999 result = CompileRun("var sum = 0;" 16089 result = CompileRun("var sum = 0;"
16000 "for (var i = 0; i < 8; i++) {" 16090 "for (var i = 0; i < 8; i++) {"
16001 " sum += pixels[i] = pixels[i] = -i;" 16091 " sum += pixels[i] = pixels[i] = -i;"
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after
16956 17046
16957 17047
16958 // Tests the C++ StackTrace API. 17048 // Tests the C++ StackTrace API.
16959 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. 17049 // TODO(3074796): Reenable this as a THREADED_TEST once it passes.
16960 // THREADED_TEST(CaptureStackTrace) { 17050 // THREADED_TEST(CaptureStackTrace) {
16961 TEST(CaptureStackTrace) { 17051 TEST(CaptureStackTrace) {
16962 v8::Isolate* isolate = CcTest::isolate(); 17052 v8::Isolate* isolate = CcTest::isolate();
16963 v8::HandleScope scope(isolate); 17053 v8::HandleScope scope(isolate);
16964 v8::Handle<v8::String> origin = 17054 v8::Handle<v8::String> origin =
16965 v8::String::NewFromUtf8(isolate, "capture-stack-trace-test"); 17055 v8::String::NewFromUtf8(isolate, "capture-stack-trace-test");
16966 Local<ObjectTemplate> templ = ObjectTemplate::New(); 17056 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
16967 templ->Set(v8_str("AnalyzeStackInNativeCode"), 17057 templ->Set(v8_str("AnalyzeStackInNativeCode"),
16968 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode)); 17058 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode));
16969 LocalContext context(0, templ); 17059 LocalContext context(0, templ);
16970 17060
16971 // Test getting OVERVIEW information. Should ignore information that is not 17061 // Test getting OVERVIEW information. Should ignore information that is not
16972 // script name, function name, line number, and column offset. 17062 // script name, function name, line number, and column offset.
16973 const char *overview_source = 17063 const char *overview_source =
16974 "function bar() {\n" 17064 "function bar() {\n"
16975 " var y; AnalyzeStackInNativeCode(1);\n" 17065 " var y; AnalyzeStackInNativeCode(1);\n"
16976 "}\n" 17066 "}\n"
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
17207 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 17297 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
17208 CHECK(!name.IsEmpty()); 17298 CHECK(!name.IsEmpty());
17209 CHECK_EQ(url, name); 17299 CHECK_EQ(url, name);
17210 } 17300 }
17211 } 17301 }
17212 17302
17213 17303
17214 TEST(SourceURLInStackTrace) { 17304 TEST(SourceURLInStackTrace) {
17215 v8::Isolate* isolate = CcTest::isolate(); 17305 v8::Isolate* isolate = CcTest::isolate();
17216 v8::HandleScope scope(isolate); 17306 v8::HandleScope scope(isolate);
17217 Local<ObjectTemplate> templ = ObjectTemplate::New(); 17307 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17218 templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"), 17308 templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"),
17219 v8::FunctionTemplate::New(isolate, 17309 v8::FunctionTemplate::New(isolate,
17220 AnalyzeStackOfEvalWithSourceURL)); 17310 AnalyzeStackOfEvalWithSourceURL));
17221 LocalContext context(0, templ); 17311 LocalContext context(0, templ);
17222 17312
17223 const char *source = 17313 const char *source =
17224 "function outer() {\n" 17314 "function outer() {\n"
17225 "function bar() {\n" 17315 "function bar() {\n"
17226 " AnalyzeStackOfEvalWithSourceURL();\n" 17316 " AnalyzeStackOfEvalWithSourceURL();\n"
17227 "}\n" 17317 "}\n"
(...skipping 23 matching lines...) Expand all
17251 CHECK_EQ(2, stackTrace->GetFrameCount()); 17341 CHECK_EQ(2, stackTrace->GetFrameCount());
17252 for (int i = 0; i < 2; i++) { 17342 for (int i = 0; i < 2; i++) {
17253 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId(); 17343 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId();
17254 } 17344 }
17255 } 17345 }
17256 17346
17257 17347
17258 TEST(ScriptIdInStackTrace) { 17348 TEST(ScriptIdInStackTrace) {
17259 v8::Isolate* isolate = CcTest::isolate(); 17349 v8::Isolate* isolate = CcTest::isolate();
17260 v8::HandleScope scope(isolate); 17350 v8::HandleScope scope(isolate);
17261 Local<ObjectTemplate> templ = ObjectTemplate::New(); 17351 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17262 templ->Set(v8_str("AnalyzeScriptIdInStack"), 17352 templ->Set(v8_str("AnalyzeScriptIdInStack"),
17263 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack)); 17353 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack));
17264 LocalContext context(0, templ); 17354 LocalContext context(0, templ);
17265 17355
17266 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( 17356 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8(
17267 isolate, 17357 isolate,
17268 "function foo() {\n" 17358 "function foo() {\n"
17269 " AnalyzeScriptIdInStack();" 17359 " AnalyzeScriptIdInStack();"
17270 "}\n" 17360 "}\n"
17271 "foo();\n"); 17361 "foo();\n");
(...skipping 18 matching lines...) Expand all
17290 for (int i = 0; i < 3; i++) { 17380 for (int i = 0; i < 3; i++) {
17291 v8::Handle<v8::String> name = 17381 v8::Handle<v8::String> name =
17292 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 17382 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
17293 CHECK(!name.IsEmpty()); 17383 CHECK(!name.IsEmpty());
17294 CHECK_EQ(url, name); 17384 CHECK_EQ(url, name);
17295 } 17385 }
17296 } 17386 }
17297 17387
17298 17388
17299 TEST(InlineScriptWithSourceURLInStackTrace) { 17389 TEST(InlineScriptWithSourceURLInStackTrace) {
17300 v8::HandleScope scope(CcTest::isolate()); 17390 v8::Isolate* isolate = CcTest::isolate();
17301 Local<ObjectTemplate> templ = ObjectTemplate::New(); 17391 v8::HandleScope scope(isolate);
17392 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17302 templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"), 17393 templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"),
17303 v8::FunctionTemplate::New( 17394 v8::FunctionTemplate::New(
17304 CcTest::isolate(), AnalyzeStackOfInlineScriptWithSourceURL)); 17395 CcTest::isolate(), AnalyzeStackOfInlineScriptWithSourceURL));
17305 LocalContext context(0, templ); 17396 LocalContext context(0, templ);
17306 17397
17307 const char *source = 17398 const char *source =
17308 "function outer() {\n" 17399 "function outer() {\n"
17309 "function bar() {\n" 17400 "function bar() {\n"
17310 " AnalyzeStackOfInlineScriptWithSourceURL();\n" 17401 " AnalyzeStackOfInlineScriptWithSourceURL();\n"
17311 "}\n" 17402 "}\n"
(...skipping 23 matching lines...) Expand all
17335 for (int i = 0; i < 3; i++) { 17426 for (int i = 0; i < 3; i++) {
17336 v8::Handle<v8::String> name = 17427 v8::Handle<v8::String> name =
17337 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 17428 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
17338 CHECK(!name.IsEmpty()); 17429 CHECK(!name.IsEmpty());
17339 CHECK_EQ(url, name); 17430 CHECK_EQ(url, name);
17340 } 17431 }
17341 } 17432 }
17342 17433
17343 17434
17344 TEST(DynamicWithSourceURLInStackTrace) { 17435 TEST(DynamicWithSourceURLInStackTrace) {
17345 v8::HandleScope scope(CcTest::isolate()); 17436 v8::Isolate* isolate = CcTest::isolate();
17346 Local<ObjectTemplate> templ = ObjectTemplate::New(); 17437 v8::HandleScope scope(isolate);
17438 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17347 templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"), 17439 templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"),
17348 v8::FunctionTemplate::New( 17440 v8::FunctionTemplate::New(
17349 CcTest::isolate(), AnalyzeStackOfDynamicScriptWithSourceURL)); 17441 CcTest::isolate(), AnalyzeStackOfDynamicScriptWithSourceURL));
17350 LocalContext context(0, templ); 17442 LocalContext context(0, templ);
17351 17443
17352 const char *source = 17444 const char *source =
17353 "function outer() {\n" 17445 "function outer() {\n"
17354 "function bar() {\n" 17446 "function bar() {\n"
17355 " AnalyzeStackOfDynamicScriptWithSourceURL();\n" 17447 " AnalyzeStackOfDynamicScriptWithSourceURL();\n"
17356 "}\n" 17448 "}\n"
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after
18201 const v8::PropertyCallbackInfo<v8::Value>& info) { 18293 const v8::PropertyCallbackInfo<v8::Value>& info) {
18202 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 18294 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
18203 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 18295 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
18204 if (!name->Equals(v8_str("foo"))) return; 18296 if (!name->Equals(v8_str("foo"))) return;
18205 info.This()->Set(v8_str("y"), v8_num(23)); 18297 info.This()->Set(v8_str("y"), v8_num(23));
18206 info.GetReturnValue().Set(v8_num(23)); 18298 info.GetReturnValue().Set(v8_num(23));
18207 } 18299 }
18208 18300
18209 18301
18210 TEST(SetterOnConstructorPrototype) { 18302 TEST(SetterOnConstructorPrototype) {
18211 v8::HandleScope scope(CcTest::isolate()); 18303 v8::Isolate* isolate = CcTest::isolate();
18212 Local<ObjectTemplate> templ = ObjectTemplate::New(); 18304 v8::HandleScope scope(isolate);
18305 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
18213 templ->SetAccessor(v8_str("x"), 18306 templ->SetAccessor(v8_str("x"),
18214 GetterWhichReturns42, 18307 GetterWhichReturns42,
18215 SetterWhichSetsYOnThisTo23); 18308 SetterWhichSetsYOnThisTo23);
18216 LocalContext context; 18309 LocalContext context;
18217 context->Global()->Set(v8_str("P"), templ->NewInstance()); 18310 context->Global()->Set(v8_str("P"), templ->NewInstance());
18218 CompileRun("function C1() {" 18311 CompileRun("function C1() {"
18219 " this.x = 23;" 18312 " this.x = 23;"
18220 "};" 18313 "};"
18221 "C1.prototype = P;" 18314 "C1.prototype = P;"
18222 "function C2() {" 18315 "function C2() {"
(...skipping 30 matching lines...) Expand all
18253 Local<String> name, 18346 Local<String> name,
18254 Local<Value> value, 18347 Local<Value> value,
18255 const v8::PropertyCallbackInfo<v8::Value>& info) { 18348 const v8::PropertyCallbackInfo<v8::Value>& info) {
18256 if (name->Equals(v8_str("x"))) { 18349 if (name->Equals(v8_str("x"))) {
18257 info.This()->Set(v8_str("y"), v8_num(23)); 18350 info.This()->Set(v8_str("y"), v8_num(23));
18258 } 18351 }
18259 } 18352 }
18260 18353
18261 18354
18262 THREADED_TEST(InterceptorOnConstructorPrototype) { 18355 THREADED_TEST(InterceptorOnConstructorPrototype) {
18263 v8::HandleScope scope(CcTest::isolate()); 18356 v8::Isolate* isolate = CcTest::isolate();
18264 Local<ObjectTemplate> templ = ObjectTemplate::New(); 18357 v8::HandleScope scope(isolate);
18358 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
18265 templ->SetNamedPropertyHandler(NamedPropertyGetterWhichReturns42, 18359 templ->SetNamedPropertyHandler(NamedPropertyGetterWhichReturns42,
18266 NamedPropertySetterWhichSetsYOnThisTo23); 18360 NamedPropertySetterWhichSetsYOnThisTo23);
18267 LocalContext context; 18361 LocalContext context;
18268 context->Global()->Set(v8_str("P"), templ->NewInstance()); 18362 context->Global()->Set(v8_str("P"), templ->NewInstance());
18269 CompileRun("function C1() {" 18363 CompileRun("function C1() {"
18270 " this.x = 23;" 18364 " this.x = 23;"
18271 "};" 18365 "};"
18272 "C1.prototype = P;" 18366 "C1.prototype = P;"
18273 "function C2() {" 18367 "function C2() {"
18274 " this.x = 23" 18368 " this.x = 23"
(...skipping 18 matching lines...) Expand all
18293 } 18387 }
18294 18388
18295 18389
18296 TEST(Regress618) { 18390 TEST(Regress618) {
18297 const char* source = "function C1() {" 18391 const char* source = "function C1() {"
18298 " this.x = 23;" 18392 " this.x = 23;"
18299 "};" 18393 "};"
18300 "C1.prototype = P;"; 18394 "C1.prototype = P;";
18301 18395
18302 LocalContext context; 18396 LocalContext context;
18303 v8::HandleScope scope(context->GetIsolate()); 18397 v8::Isolate* isolate = context->GetIsolate();
18398 v8::HandleScope scope(isolate);
18304 v8::Local<v8::Script> script; 18399 v8::Local<v8::Script> script;
18305 18400
18306 // Use a simple object as prototype. 18401 // Use a simple object as prototype.
18307 v8::Local<v8::Object> prototype = v8::Object::New(context->GetIsolate()); 18402 v8::Local<v8::Object> prototype = v8::Object::New(isolate);
18308 prototype->Set(v8_str("y"), v8_num(42)); 18403 prototype->Set(v8_str("y"), v8_num(42));
18309 context->Global()->Set(v8_str("P"), prototype); 18404 context->Global()->Set(v8_str("P"), prototype);
18310 18405
18311 // This compile will add the code to the compilation cache. 18406 // This compile will add the code to the compilation cache.
18312 CompileRun(source); 18407 CompileRun(source);
18313 18408
18314 script = v8::Script::Compile(v8_str("new C1();")); 18409 script = v8::Script::Compile(v8_str("new C1();"));
18315 // Allow enough iterations for the inobject slack tracking logic 18410 // Allow enough iterations for the inobject slack tracking logic
18316 // to finalize instance size and install the fast construct stub. 18411 // to finalize instance size and install the fast construct stub.
18317 for (int i = 0; i < 256; i++) { 18412 for (int i = 0; i < 256; i++) {
18318 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); 18413 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run());
18319 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); 18414 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value());
18320 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); 18415 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value());
18321 } 18416 }
18322 18417
18323 // Use an API object with accessors as prototype. 18418 // Use an API object with accessors as prototype.
18324 Local<ObjectTemplate> templ = ObjectTemplate::New(); 18419 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
18325 templ->SetAccessor(v8_str("x"), 18420 templ->SetAccessor(v8_str("x"),
18326 GetterWhichReturns42, 18421 GetterWhichReturns42,
18327 SetterWhichSetsYOnThisTo23); 18422 SetterWhichSetsYOnThisTo23);
18328 context->Global()->Set(v8_str("P"), templ->NewInstance()); 18423 context->Global()->Set(v8_str("P"), templ->NewInstance());
18329 18424
18330 // This compile will get the code from the compilation cache. 18425 // This compile will get the code from the compilation cache.
18331 CompileRun(source); 18426 CompileRun(source);
18332 18427
18333 script = v8::Script::Compile(v8_str("new C1();")); 18428 script = v8::Script::Compile(v8_str("new C1();"));
18334 for (int i = 0; i < 10; i++) { 18429 for (int i = 0; i < 10; i++) {
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
18751 } 18846 }
18752 18847
18753 18848
18754 TEST(GCInFailedAccessCheckCallback) { 18849 TEST(GCInFailedAccessCheckCallback) {
18755 // Install a failed access check callback that performs a GC on each 18850 // Install a failed access check callback that performs a GC on each
18756 // invocation. Then force the callback to be called from va 18851 // invocation. Then force the callback to be called from va
18757 18852
18758 v8::V8::Initialize(); 18853 v8::V8::Initialize();
18759 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); 18854 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC);
18760 18855
18761 v8::HandleScope scope(CcTest::isolate()); 18856 v8::Isolate* isolate = CcTest::isolate();
18857 v8::HandleScope scope(isolate);
18762 18858
18763 // Create an ObjectTemplate for global objects and install access 18859 // Create an ObjectTemplate for global objects and install access
18764 // check callbacks that will block access. 18860 // check callbacks that will block access.
18765 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 18861 v8::Handle<v8::ObjectTemplate> global_template =
18862 v8::ObjectTemplate::New(isolate);
18766 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, 18863 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker,
18767 IndexedGetAccessBlocker, 18864 IndexedGetAccessBlocker,
18768 v8::Handle<v8::Value>(), 18865 v8::Handle<v8::Value>(),
18769 false); 18866 false);
18770 18867
18771 // Create a context and set an x property on it's global object. 18868 // Create a context and set an x property on it's global object.
18772 LocalContext context0(NULL, global_template); 18869 LocalContext context0(NULL, global_template);
18773 context0->Global()->Set(v8_str("x"), v8_num(42)); 18870 context0->Global()->Set(v8_str("x"), v8_num(42));
18774 v8::Handle<v8::Object> global0 = context0->Global(); 18871 v8::Handle<v8::Object> global0 = context0->Global();
18775 18872
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after
19515 19612
19516 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { 19613 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
19517 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate()); 19614 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate());
19518 result->Set(0, v8_str("universalAnswer")); 19615 result->Set(0, v8_str("universalAnswer"));
19519 info.GetReturnValue().Set(result); 19616 info.GetReturnValue().Set(result);
19520 } 19617 }
19521 19618
19522 19619
19523 TEST(NamedEnumeratorAndForIn) { 19620 TEST(NamedEnumeratorAndForIn) {
19524 LocalContext context; 19621 LocalContext context;
19525 v8::HandleScope handle_scope(context->GetIsolate()); 19622 v8::Isolate* isolate = context->GetIsolate();
19623 v8::HandleScope handle_scope(isolate);
19526 v8::Context::Scope context_scope(context.local()); 19624 v8::Context::Scope context_scope(context.local());
19527 19625
19528 v8::Handle<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(); 19626 v8::Handle<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(isolate);
19529 tmpl->SetNamedPropertyHandler(Getter, NULL, NULL, NULL, Enumerator); 19627 tmpl->SetNamedPropertyHandler(Getter, NULL, NULL, NULL, Enumerator);
19530 context->Global()->Set(v8_str("o"), tmpl->NewInstance()); 19628 context->Global()->Set(v8_str("o"), tmpl->NewInstance());
19531 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( 19629 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun(
19532 "var result = []; for (var k in o) result.push(k); result")); 19630 "var result = []; for (var k in o) result.push(k); result"));
19533 CHECK_EQ(1, result->Length()); 19631 CHECK_EQ(1, result->Length());
19534 CHECK_EQ(v8_str("universalAnswer"), result->Get(0)); 19632 CHECK_EQ(v8_str("universalAnswer"), result->Get(0));
19535 } 19633 }
19536 19634
19537 19635
19538 TEST(DefinePropertyPostDetach) { 19636 TEST(DefinePropertyPostDetach) {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
19699 19797
19700 void HasOwnPropertyAccessorGetter( 19798 void HasOwnPropertyAccessorGetter(
19701 Local<String> property, 19799 Local<String> property,
19702 const v8::PropertyCallbackInfo<v8::Value>& info) { 19800 const v8::PropertyCallbackInfo<v8::Value>& info) {
19703 info.GetReturnValue().Set(v8_str("yes")); 19801 info.GetReturnValue().Set(v8_str("yes"));
19704 } 19802 }
19705 19803
19706 19804
19707 TEST(HasOwnProperty) { 19805 TEST(HasOwnProperty) {
19708 LocalContext env; 19806 LocalContext env;
19709 v8::HandleScope scope(env->GetIsolate()); 19807 v8::Isolate* isolate = env->GetIsolate();
19808 v8::HandleScope scope(isolate);
19710 { // Check normal properties and defined getters. 19809 { // Check normal properties and defined getters.
19711 Handle<Value> value = CompileRun( 19810 Handle<Value> value = CompileRun(
19712 "function Foo() {" 19811 "function Foo() {"
19713 " this.foo = 11;" 19812 " this.foo = 11;"
19714 " this.__defineGetter__('baz', function() { return 1; });" 19813 " this.__defineGetter__('baz', function() { return 1; });"
19715 "};" 19814 "};"
19716 "function Bar() { " 19815 "function Bar() { "
19717 " this.bar = 13;" 19816 " this.bar = 13;"
19718 " this.__defineGetter__('bla', function() { return 2; });" 19817 " this.__defineGetter__('bla', function() { return 2; });"
19719 "};" 19818 "};"
19720 "Bar.prototype = new Foo();" 19819 "Bar.prototype = new Foo();"
19721 "new Bar();"); 19820 "new Bar();");
19722 CHECK(value->IsObject()); 19821 CHECK(value->IsObject());
19723 Handle<Object> object = value->ToObject(); 19822 Handle<Object> object = value->ToObject();
19724 CHECK(object->Has(v8_str("foo"))); 19823 CHECK(object->Has(v8_str("foo")));
19725 CHECK(!object->HasOwnProperty(v8_str("foo"))); 19824 CHECK(!object->HasOwnProperty(v8_str("foo")));
19726 CHECK(object->HasOwnProperty(v8_str("bar"))); 19825 CHECK(object->HasOwnProperty(v8_str("bar")));
19727 CHECK(object->Has(v8_str("baz"))); 19826 CHECK(object->Has(v8_str("baz")));
19728 CHECK(!object->HasOwnProperty(v8_str("baz"))); 19827 CHECK(!object->HasOwnProperty(v8_str("baz")));
19729 CHECK(object->HasOwnProperty(v8_str("bla"))); 19828 CHECK(object->HasOwnProperty(v8_str("bla")));
19730 } 19829 }
19731 { // Check named getter interceptors. 19830 { // Check named getter interceptors.
19732 Handle<ObjectTemplate> templ = ObjectTemplate::New(); 19831 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19733 templ->SetNamedPropertyHandler(HasOwnPropertyNamedPropertyGetter); 19832 templ->SetNamedPropertyHandler(HasOwnPropertyNamedPropertyGetter);
19734 Handle<Object> instance = templ->NewInstance(); 19833 Handle<Object> instance = templ->NewInstance();
19735 CHECK(!instance->HasOwnProperty(v8_str("42"))); 19834 CHECK(!instance->HasOwnProperty(v8_str("42")));
19736 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19835 CHECK(instance->HasOwnProperty(v8_str("foo")));
19737 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19836 CHECK(!instance->HasOwnProperty(v8_str("bar")));
19738 } 19837 }
19739 { // Check indexed getter interceptors. 19838 { // Check indexed getter interceptors.
19740 Handle<ObjectTemplate> templ = ObjectTemplate::New(); 19839 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19741 templ->SetIndexedPropertyHandler(HasOwnPropertyIndexedPropertyGetter); 19840 templ->SetIndexedPropertyHandler(HasOwnPropertyIndexedPropertyGetter);
19742 Handle<Object> instance = templ->NewInstance(); 19841 Handle<Object> instance = templ->NewInstance();
19743 CHECK(instance->HasOwnProperty(v8_str("42"))); 19842 CHECK(instance->HasOwnProperty(v8_str("42")));
19744 CHECK(!instance->HasOwnProperty(v8_str("43"))); 19843 CHECK(!instance->HasOwnProperty(v8_str("43")));
19745 CHECK(!instance->HasOwnProperty(v8_str("foo"))); 19844 CHECK(!instance->HasOwnProperty(v8_str("foo")));
19746 } 19845 }
19747 { // Check named query interceptors. 19846 { // Check named query interceptors.
19748 Handle<ObjectTemplate> templ = ObjectTemplate::New(); 19847 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19749 templ->SetNamedPropertyHandler(0, 0, HasOwnPropertyNamedPropertyQuery); 19848 templ->SetNamedPropertyHandler(0, 0, HasOwnPropertyNamedPropertyQuery);
19750 Handle<Object> instance = templ->NewInstance(); 19849 Handle<Object> instance = templ->NewInstance();
19751 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19850 CHECK(instance->HasOwnProperty(v8_str("foo")));
19752 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19851 CHECK(!instance->HasOwnProperty(v8_str("bar")));
19753 } 19852 }
19754 { // Check indexed query interceptors. 19853 { // Check indexed query interceptors.
19755 Handle<ObjectTemplate> templ = ObjectTemplate::New(); 19854 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19756 templ->SetIndexedPropertyHandler(0, 0, HasOwnPropertyIndexedPropertyQuery); 19855 templ->SetIndexedPropertyHandler(0, 0, HasOwnPropertyIndexedPropertyQuery);
19757 Handle<Object> instance = templ->NewInstance(); 19856 Handle<Object> instance = templ->NewInstance();
19758 CHECK(instance->HasOwnProperty(v8_str("42"))); 19857 CHECK(instance->HasOwnProperty(v8_str("42")));
19759 CHECK(!instance->HasOwnProperty(v8_str("41"))); 19858 CHECK(!instance->HasOwnProperty(v8_str("41")));
19760 } 19859 }
19761 { // Check callbacks. 19860 { // Check callbacks.
19762 Handle<ObjectTemplate> templ = ObjectTemplate::New(); 19861 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19763 templ->SetAccessor(v8_str("foo"), HasOwnPropertyAccessorGetter); 19862 templ->SetAccessor(v8_str("foo"), HasOwnPropertyAccessorGetter);
19764 Handle<Object> instance = templ->NewInstance(); 19863 Handle<Object> instance = templ->NewInstance();
19765 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19864 CHECK(instance->HasOwnProperty(v8_str("foo")));
19766 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19865 CHECK(!instance->HasOwnProperty(v8_str("bar")));
19767 } 19866 }
19768 { // Check that query wins on disagreement. 19867 { // Check that query wins on disagreement.
19769 Handle<ObjectTemplate> templ = ObjectTemplate::New(); 19868 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19770 templ->SetNamedPropertyHandler(HasOwnPropertyNamedPropertyGetter, 19869 templ->SetNamedPropertyHandler(HasOwnPropertyNamedPropertyGetter,
19771 0, 19870 0,
19772 HasOwnPropertyNamedPropertyQuery2); 19871 HasOwnPropertyNamedPropertyQuery2);
19773 Handle<Object> instance = templ->NewInstance(); 19872 Handle<Object> instance = templ->NewInstance();
19774 CHECK(!instance->HasOwnProperty(v8_str("foo"))); 19873 CHECK(!instance->HasOwnProperty(v8_str("foo")));
19775 CHECK(instance->HasOwnProperty(v8_str("bar"))); 19874 CHECK(instance->HasOwnProperty(v8_str("bar")));
19776 } 19875 }
19777 } 19876 }
19778 19877
19779 19878
19780 TEST(IndexedInterceptorWithStringProto) { 19879 TEST(IndexedInterceptorWithStringProto) {
19781 v8::HandleScope scope(CcTest::isolate()); 19880 v8::Isolate* isolate = CcTest::isolate();
19782 Handle<ObjectTemplate> templ = ObjectTemplate::New(); 19881 v8::HandleScope scope(isolate);
19882 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19783 templ->SetIndexedPropertyHandler(NULL, 19883 templ->SetIndexedPropertyHandler(NULL,
19784 NULL, 19884 NULL,
19785 HasOwnPropertyIndexedPropertyQuery); 19885 HasOwnPropertyIndexedPropertyQuery);
19786 LocalContext context; 19886 LocalContext context;
19787 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 19887 context->Global()->Set(v8_str("obj"), templ->NewInstance());
19788 CompileRun("var s = new String('foobar'); obj.__proto__ = s;"); 19888 CompileRun("var s = new String('foobar'); obj.__proto__ = s;");
19789 // These should be intercepted. 19889 // These should be intercepted.
19790 CHECK(CompileRun("42 in obj")->BooleanValue()); 19890 CHECK(CompileRun("42 in obj")->BooleanValue());
19791 CHECK(CompileRun("'42' in obj")->BooleanValue()); 19891 CHECK(CompileRun("'42' in obj")->BooleanValue());
19792 // These should fall through to the String prototype. 19892 // These should fall through to the String prototype.
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
19899 v8::FunctionTemplate::New(isolate, NonObjectThis); 19999 v8::FunctionTemplate::New(isolate, NonObjectThis);
19900 Handle<Function> function = templ->GetFunction(); 20000 Handle<Function> function = templ->GetFunction();
19901 context->Global()->Set(v8_str("f"), function); 20001 context->Global()->Set(v8_str("f"), function);
19902 TryCatch try_catch; 20002 TryCatch try_catch;
19903 CompileRun("f.call(2)"); 20003 CompileRun("f.call(2)");
19904 } 20004 }
19905 20005
19906 20006
19907 // Regression test for issue 1470. 20007 // Regression test for issue 1470.
19908 THREADED_TEST(ReadOnlyIndexedProperties) { 20008 THREADED_TEST(ReadOnlyIndexedProperties) {
19909 v8::HandleScope scope(CcTest::isolate()); 20009 v8::Isolate* isolate = CcTest::isolate();
19910 Local<ObjectTemplate> templ = ObjectTemplate::New(); 20010 v8::HandleScope scope(isolate);
20011 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19911 20012
19912 LocalContext context; 20013 LocalContext context;
19913 Local<v8::Object> obj = templ->NewInstance(); 20014 Local<v8::Object> obj = templ->NewInstance();
19914 context->Global()->Set(v8_str("obj"), obj); 20015 context->Global()->Set(v8_str("obj"), obj);
19915 obj->Set(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly); 20016 obj->Set(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly);
19916 obj->Set(v8_str("1"), v8_str("foobar")); 20017 obj->Set(v8_str("1"), v8_str("foobar"));
19917 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("1"))); 20018 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("1")));
19918 obj->Set(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly); 20019 obj->Set(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly);
19919 obj->Set(v8_num(2), v8_str("foobar")); 20020 obj->Set(v8_num(2), v8_str("foobar"));
19920 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_num(2))); 20021 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_num(2)));
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
19968 20069
19969 return true; 20070 return true;
19970 } 20071 }
19971 20072
19972 20073
19973 THREADED_TEST(Regress93759) { 20074 THREADED_TEST(Regress93759) {
19974 v8::Isolate* isolate = CcTest::isolate(); 20075 v8::Isolate* isolate = CcTest::isolate();
19975 HandleScope scope(isolate); 20076 HandleScope scope(isolate);
19976 20077
19977 // Template for object with security check. 20078 // Template for object with security check.
19978 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(); 20079 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(isolate);
19979 // We don't do indexing, so any callback can be used for that. 20080 // We don't do indexing, so any callback can be used for that.
19980 no_proto_template->SetAccessCheckCallbacks( 20081 no_proto_template->SetAccessCheckCallbacks(
19981 BlockProtoNamedSecurityTestCallback, 20082 BlockProtoNamedSecurityTestCallback,
19982 IndexedSecurityTestCallback); 20083 IndexedSecurityTestCallback);
19983 20084
19984 // Templates for objects with hidden prototypes and possibly security check. 20085 // Templates for objects with hidden prototypes and possibly security check.
19985 Local<FunctionTemplate> hidden_proto_template = 20086 Local<FunctionTemplate> hidden_proto_template =
19986 v8::FunctionTemplate::New(isolate); 20087 v8::FunctionTemplate::New(isolate);
19987 hidden_proto_template->SetHiddenPrototype(true); 20088 hidden_proto_template->SetHiddenPrototype(true);
19988 20089
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
20023 Local<Object> protected_hidden_prototype = 20124 Local<Object> protected_hidden_prototype =
20024 protected_hidden_proto_template->GetFunction()->NewInstance(); 20125 protected_hidden_proto_template->GetFunction()->NewInstance();
20025 Local<Object> object_with_protected_hidden = 20126 Local<Object> object_with_protected_hidden =
20026 Object::New(isolate); 20127 Object::New(isolate);
20027 object_with_protected_hidden->SetPrototype(protected_hidden_prototype); 20128 object_with_protected_hidden->SetPrototype(protected_hidden_prototype);
20028 20129
20029 context->Exit(); 20130 context->Exit();
20030 20131
20031 // Template for object for second context. Values to test are put on it as 20132 // Template for object for second context. Values to test are put on it as
20032 // properties. 20133 // properties.
20033 Local<ObjectTemplate> global_template = ObjectTemplate::New(); 20134 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate);
20034 global_template->Set(v8_str("simple"), simple_object); 20135 global_template->Set(v8_str("simple"), simple_object);
20035 global_template->Set(v8_str("protected"), protected_object); 20136 global_template->Set(v8_str("protected"), protected_object);
20036 global_template->Set(v8_str("global"), global_object); 20137 global_template->Set(v8_str("global"), global_object);
20037 global_template->Set(v8_str("proxy"), proxy_object); 20138 global_template->Set(v8_str("proxy"), proxy_object);
20038 global_template->Set(v8_str("hidden"), object_with_hidden); 20139 global_template->Set(v8_str("hidden"), object_with_hidden);
20039 global_template->Set(v8_str("phidden"), object_with_protected_hidden); 20140 global_template->Set(v8_str("phidden"), object_with_protected_hidden);
20040 20141
20041 LocalContext context2(NULL, global_template); 20142 LocalContext context2(NULL, global_template);
20042 20143
20043 Local<Value> result1 = CompileRun("Object.getPrototypeOf(simple)"); 20144 Local<Value> result1 = CompileRun("Object.getPrototypeOf(simple)");
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
20649 CHECK_EQ(6, message->GetLineNumber()); 20750 CHECK_EQ(6, message->GetLineNumber());
20650 } 20751 }
20651 } 20752 }
20652 20753
20653 20754
20654 static void Helper137002(bool do_store, 20755 static void Helper137002(bool do_store,
20655 bool polymorphic, 20756 bool polymorphic,
20656 bool remove_accessor, 20757 bool remove_accessor,
20657 bool interceptor) { 20758 bool interceptor) {
20658 LocalContext context; 20759 LocalContext context;
20659 Local<ObjectTemplate> templ = ObjectTemplate::New(); 20760 Local<ObjectTemplate> templ = ObjectTemplate::New(context->GetIsolate());
20660 if (interceptor) { 20761 if (interceptor) {
20661 templ->SetNamedPropertyHandler(FooGetInterceptor, FooSetInterceptor); 20762 templ->SetNamedPropertyHandler(FooGetInterceptor, FooSetInterceptor);
20662 } else { 20763 } else {
20663 templ->SetAccessor(v8_str("foo"), 20764 templ->SetAccessor(v8_str("foo"),
20664 GetterWhichReturns42, 20765 GetterWhichReturns42,
20665 SetterWhichSetsYOnThisTo23); 20766 SetterWhichSetsYOnThisTo23);
20666 } 20767 }
20667 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 20768 context->Global()->Set(v8_str("obj"), templ->NewInstance());
20668 20769
20669 // Turn monomorphic on slow object with native accessor, then turn 20770 // Turn monomorphic on slow object with native accessor, then turn
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
20704 v8::HandleScope scope(CcTest::isolate()); 20805 v8::HandleScope scope(CcTest::isolate());
20705 for (int i = 0; i < 16; i++) { 20806 for (int i = 0; i < 16; i++) {
20706 Helper137002(i & 8, i & 4, i & 2, i & 1); 20807 Helper137002(i & 8, i & 4, i & 2, i & 1);
20707 } 20808 }
20708 } 20809 }
20709 20810
20710 20811
20711 THREADED_TEST(Regress137002b) { 20812 THREADED_TEST(Regress137002b) {
20712 i::FLAG_allow_natives_syntax = true; 20813 i::FLAG_allow_natives_syntax = true;
20713 LocalContext context; 20814 LocalContext context;
20714 v8::HandleScope scope(context->GetIsolate()); 20815 v8::Isolate* isolate = context->GetIsolate();
20715 Local<ObjectTemplate> templ = ObjectTemplate::New(); 20816 v8::HandleScope scope(isolate);
20817 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
20716 templ->SetAccessor(v8_str("foo"), 20818 templ->SetAccessor(v8_str("foo"),
20717 GetterWhichReturns42, 20819 GetterWhichReturns42,
20718 SetterWhichSetsYOnThisTo23); 20820 SetterWhichSetsYOnThisTo23);
20719 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 20821 context->Global()->Set(v8_str("obj"), templ->NewInstance());
20720 20822
20721 // Turn monomorphic on slow object with native accessor, then just 20823 // Turn monomorphic on slow object with native accessor, then just
20722 // delete the property and fail. 20824 // delete the property and fail.
20723 CompileRun("function load(x) { return x.foo; }" 20825 CompileRun("function load(x) { return x.foo; }"
20724 "function store(x) { x.foo = void 0; }" 20826 "function store(x) { x.foo = void 0; }"
20725 "function keyed_load(x, key) { return x[key]; }" 20827 "function keyed_load(x, key) { return x[key]; }"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
20772 CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined()); 20874 CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined());
20773 CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined()); 20875 CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined());
20774 CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined()); 20876 CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined());
20775 CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined()); 20877 CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined());
20776 } 20878 }
20777 20879
20778 20880
20779 THREADED_TEST(Regress142088) { 20881 THREADED_TEST(Regress142088) {
20780 i::FLAG_allow_natives_syntax = true; 20882 i::FLAG_allow_natives_syntax = true;
20781 LocalContext context; 20883 LocalContext context;
20782 v8::HandleScope scope(context->GetIsolate()); 20884 v8::Isolate* isolate = context->GetIsolate();
20783 Local<ObjectTemplate> templ = ObjectTemplate::New(); 20885 v8::HandleScope scope(isolate);
20886 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
20784 templ->SetAccessor(v8_str("foo"), 20887 templ->SetAccessor(v8_str("foo"),
20785 GetterWhichReturns42, 20888 GetterWhichReturns42,
20786 SetterWhichSetsYOnThisTo23); 20889 SetterWhichSetsYOnThisTo23);
20787 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 20890 context->Global()->Set(v8_str("obj"), templ->NewInstance());
20788 20891
20789 CompileRun("function load(x) { return x.foo; }" 20892 CompileRun("function load(x) { return x.foo; }"
20790 "var o = Object.create(obj);" 20893 "var o = Object.create(obj);"
20791 "%OptimizeObjectForAddingMultipleProperties(obj, 1);" 20894 "%OptimizeObjectForAddingMultipleProperties(obj, 1);"
20792 "load(o); load(o); load(o); load(o);"); 20895 "load(o); load(o); load(o); load(o);");
20793 } 20896 }
(...skipping 18 matching lines...) Expand all
20812 v8::HandleScope scope(context->GetIsolate()); 20915 v8::HandleScope scope(context->GetIsolate());
20813 Handle<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); 20916 Handle<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate());
20814 AddInterceptor(templ, EmptyInterceptorGetter, EmptyInterceptorSetter); 20917 AddInterceptor(templ, EmptyInterceptorGetter, EmptyInterceptorSetter);
20815 context->Global()->Set(v8_str("Bug"), templ->GetFunction()); 20918 context->Global()->Set(v8_str("Bug"), templ->GetFunction());
20816 CompileRun("Number.prototype.__proto__ = new Bug; var x = 0; x.foo();"); 20919 CompileRun("Number.prototype.__proto__ = new Bug; var x = 0; x.foo();");
20817 } 20920 }
20818 20921
20819 20922
20820 THREADED_TEST(Regress157124) { 20923 THREADED_TEST(Regress157124) {
20821 LocalContext context; 20924 LocalContext context;
20822 v8::HandleScope scope(context->GetIsolate()); 20925 v8::Isolate* isolate = context->GetIsolate();
20823 Local<ObjectTemplate> templ = ObjectTemplate::New(); 20926 v8::HandleScope scope(isolate);
20927 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
20824 Local<Object> obj = templ->NewInstance(); 20928 Local<Object> obj = templ->NewInstance();
20825 obj->GetIdentityHash(); 20929 obj->GetIdentityHash();
20826 obj->DeleteHiddenValue(v8_str("Bug")); 20930 obj->DeleteHiddenValue(v8_str("Bug"));
20827 } 20931 }
20828 20932
20829 20933
20830 THREADED_TEST(Regress2535) { 20934 THREADED_TEST(Regress2535) {
20831 i::FLAG_harmony_collections = true; 20935 i::FLAG_harmony_collections = true;
20832 LocalContext context; 20936 LocalContext context;
20833 v8::HandleScope scope(context->GetIsolate()); 20937 v8::HandleScope scope(context->GetIsolate());
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
20968 } 21072 }
20969 21073
20970 21074
20971 void UnreachableCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 21075 void UnreachableCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
20972 CHECK(false); 21076 CHECK(false);
20973 } 21077 }
20974 21078
20975 21079
20976 TEST(JSONStringifyAccessCheck) { 21080 TEST(JSONStringifyAccessCheck) {
20977 v8::V8::Initialize(); 21081 v8::V8::Initialize();
20978 v8::HandleScope scope(CcTest::isolate()); 21082 v8::Isolate* isolate = CcTest::isolate();
21083 v8::HandleScope scope(isolate);
20979 21084
20980 // Create an ObjectTemplate for global objects and install access 21085 // Create an ObjectTemplate for global objects and install access
20981 // check callbacks that will block access. 21086 // check callbacks that will block access.
20982 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 21087 v8::Handle<v8::ObjectTemplate> global_template =
21088 v8::ObjectTemplate::New(isolate);
20983 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked, 21089 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked,
20984 IndexAccessAlwaysBlocked); 21090 IndexAccessAlwaysBlocked);
20985 21091
20986 // Create a context and set an x property on it's global object. 21092 // Create a context and set an x property on it's global object.
20987 LocalContext context0(NULL, global_template); 21093 LocalContext context0(NULL, global_template);
20988 v8::Handle<v8::Object> global0 = context0->Global(); 21094 v8::Handle<v8::Object> global0 = context0->Global();
20989 global0->Set(v8_str("x"), v8_num(42)); 21095 global0->Set(v8_str("x"), v8_num(42));
20990 ExpectString("JSON.stringify(this)", "{\"x\":42}"); 21096 ExpectString("JSON.stringify(this)", "{\"x\":42}");
20991 21097
20992 for (int i = 0; i < 2; i++) { 21098 for (int i = 0; i < 2; i++) {
20993 if (i == 1) { 21099 if (i == 1) {
20994 // Install a toJSON function on the second run. 21100 // Install a toJSON function on the second run.
20995 v8::Handle<v8::FunctionTemplate> toJSON = 21101 v8::Handle<v8::FunctionTemplate> toJSON =
20996 v8::FunctionTemplate::New(CcTest::isolate(), UnreachableCallback); 21102 v8::FunctionTemplate::New(isolate, UnreachableCallback);
20997 21103
20998 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); 21104 global0->Set(v8_str("toJSON"), toJSON->GetFunction());
20999 } 21105 }
21000 // Create a context with a different security token so that the 21106 // Create a context with a different security token so that the
21001 // failed access check callback will be called on each access. 21107 // failed access check callback will be called on each access.
21002 LocalContext context1(NULL, global_template); 21108 LocalContext context1(NULL, global_template);
21003 context1->Global()->Set(v8_str("other"), global0); 21109 context1->Global()->Set(v8_str("other"), global0);
21004 21110
21005 ExpectString("JSON.stringify(other)", "{}"); 21111 ExpectString("JSON.stringify(other)", "{}");
21006 ExpectString("JSON.stringify({ 'a' : other, 'b' : ['c'] })", 21112 ExpectString("JSON.stringify({ 'a' : other, 'b' : ['c'] })",
21007 "{\"a\":{},\"b\":[\"c\"]}"); 21113 "{\"a\":{},\"b\":[\"c\"]}");
21008 ExpectString("JSON.stringify([other, 'b', 'c'])", 21114 ExpectString("JSON.stringify([other, 'b', 'c'])",
21009 "[{},\"b\",\"c\"]"); 21115 "[{},\"b\",\"c\"]");
21010 21116
21011 v8::Handle<v8::Array> array = v8::Array::New(CcTest::isolate(), 2); 21117 v8::Handle<v8::Array> array = v8::Array::New(isolate, 2);
21012 array->Set(0, v8_str("a")); 21118 array->Set(0, v8_str("a"));
21013 array->Set(1, v8_str("b")); 21119 array->Set(1, v8_str("b"));
21014 context1->Global()->Set(v8_str("array"), array); 21120 context1->Global()->Set(v8_str("array"), array);
21015 ExpectString("JSON.stringify(array)", "[\"a\",\"b\"]"); 21121 ExpectString("JSON.stringify(array)", "[\"a\",\"b\"]");
21016 array->TurnOnAccessCheck(); 21122 array->TurnOnAccessCheck();
21017 ExpectString("JSON.stringify(array)", "[]"); 21123 ExpectString("JSON.stringify(array)", "[]");
21018 ExpectString("JSON.stringify([array])", "[[]]"); 21124 ExpectString("JSON.stringify([array])", "[[]]");
21019 ExpectString("JSON.stringify({'a' : array})", "{\"a\":[]}"); 21125 ExpectString("JSON.stringify({'a' : array})", "{\"a\":[]}");
21020 } 21126 }
21021 } 21127 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
21066 CompileRun("try { [1, 2, 3].sort(); } catch (e) { catcher(e) };"); 21172 CompileRun("try { [1, 2, 3].sort(); } catch (e) { catcher(e) };");
21067 CHECK(!access_check_fail_thrown); 21173 CHECK(!access_check_fail_thrown);
21068 CHECK(!catch_callback_called); 21174 CHECK(!catch_callback_called);
21069 } 21175 }
21070 21176
21071 21177
21072 TEST(AccessCheckThrows) { 21178 TEST(AccessCheckThrows) {
21073 i::FLAG_allow_natives_syntax = true; 21179 i::FLAG_allow_natives_syntax = true;
21074 v8::V8::Initialize(); 21180 v8::V8::Initialize();
21075 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows); 21181 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows);
21076 v8::HandleScope scope(CcTest::isolate()); 21182 v8::Isolate* isolate = CcTest::isolate();
21183 v8::HandleScope scope(isolate);
21077 21184
21078 // Create an ObjectTemplate for global objects and install access 21185 // Create an ObjectTemplate for global objects and install access
21079 // check callbacks that will block access. 21186 // check callbacks that will block access.
21080 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 21187 v8::Handle<v8::ObjectTemplate> global_template =
21188 v8::ObjectTemplate::New(isolate);
21081 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked, 21189 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked,
21082 IndexAccessAlwaysBlocked); 21190 IndexAccessAlwaysBlocked);
21083 21191
21084 // Create a context and set an x property on it's global object. 21192 // Create a context and set an x property on it's global object.
21085 LocalContext context0(NULL, global_template); 21193 LocalContext context0(NULL, global_template);
21086 context0->Global()->Set(v8_str("x"), v8_num(42)); 21194 context0->Global()->Set(v8_str("x"), v8_num(42));
21087 v8::Handle<v8::Object> global0 = context0->Global(); 21195 v8::Handle<v8::Object> global0 = context0->Global();
21088 21196
21089 // Create a context with a different security token so that the 21197 // Create a context with a different security token so that the
21090 // failed access check callback will be called on each access. 21198 // failed access check callback will be called on each access.
21091 LocalContext context1(NULL, global_template); 21199 LocalContext context1(NULL, global_template);
21092 context1->Global()->Set(v8_str("other"), global0); 21200 context1->Global()->Set(v8_str("other"), global0);
21093 21201
21094 v8::Handle<v8::FunctionTemplate> catcher_fun = 21202 v8::Handle<v8::FunctionTemplate> catcher_fun =
21095 v8::FunctionTemplate::New(CcTest::isolate(), CatcherCallback); 21203 v8::FunctionTemplate::New(isolate, CatcherCallback);
21096 context1->Global()->Set(v8_str("catcher"), catcher_fun->GetFunction()); 21204 context1->Global()->Set(v8_str("catcher"), catcher_fun->GetFunction());
21097 21205
21098 v8::Handle<v8::FunctionTemplate> has_own_property_fun = 21206 v8::Handle<v8::FunctionTemplate> has_own_property_fun =
21099 v8::FunctionTemplate::New(CcTest::isolate(), HasOwnPropertyCallback); 21207 v8::FunctionTemplate::New(isolate, HasOwnPropertyCallback);
21100 context1->Global()->Set(v8_str("has_own_property"), 21208 context1->Global()->Set(v8_str("has_own_property"),
21101 has_own_property_fun->GetFunction()); 21209 has_own_property_fun->GetFunction());
21102 21210
21103 { v8::TryCatch try_catch; 21211 { v8::TryCatch try_catch;
21104 access_check_fail_thrown = false; 21212 access_check_fail_thrown = false;
21105 CompileRun("other.x;"); 21213 CompileRun("other.x;");
21106 CHECK(access_check_fail_thrown); 21214 CHECK(access_check_fail_thrown);
21107 CHECK(try_catch.HasCaught()); 21215 CHECK(try_catch.HasCaught());
21108 } 21216 }
21109 21217
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
21541 } 21649 }
21542 for (int i = 0; i < runs; i++) { 21650 for (int i = 0; i < runs; i++) {
21543 Local<String> expected; 21651 Local<String> expected;
21544 if (i != 0) { 21652 if (i != 0) {
21545 CHECK_EQ(v8_str("escape value"), values[i]); 21653 CHECK_EQ(v8_str("escape value"), values[i]);
21546 } else { 21654 } else {
21547 CHECK(values[i].IsEmpty()); 21655 CHECK(values[i].IsEmpty());
21548 } 21656 }
21549 } 21657 }
21550 } 21658 }
OLDNEW
« no previous file with comments | « test/cctest/test-accessors.cc ('k') | test/cctest/test-assembler-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698