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

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

Issue 24265002: bulk replace v8::Isolate::GetCurrent in tests (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 3 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-alloc.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 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 for (int i = 0; i < 3; ++i) CHECK(v8::V8::Dispose()); 186 for (int i = 0; i < 3; ++i) CHECK(v8::V8::Dispose());
187 for (int i = 0; i < 3; ++i) CHECK(v8::V8::Initialize()); 187 for (int i = 0; i < 3; ++i) CHECK(v8::V8::Initialize());
188 for (int i = 0; i < 3; ++i) CHECK(v8::V8::Dispose()); 188 for (int i = 0; i < 3; ++i) CHECK(v8::V8::Dispose());
189 // TODO(mstarzinger): This should fail gracefully instead of asserting. 189 // TODO(mstarzinger): This should fail gracefully instead of asserting.
190 // for (int i = 0; i < 3; ++i) CHECK(v8::V8::Initialize()); 190 // for (int i = 0; i < 3; ++i) CHECK(v8::V8::Initialize());
191 for (int i = 0; i < 3; ++i) CHECK(v8::V8::Dispose()); 191 for (int i = 0; i < 3; ++i) CHECK(v8::V8::Dispose());
192 } 192 }
193 193
194 194
195 THREADED_TEST(Handles) { 195 THREADED_TEST(Handles) {
196 v8::HandleScope scope(v8::Isolate::GetCurrent()); 196 v8::HandleScope scope(CcTest::isolate());
197 Local<Context> local_env; 197 Local<Context> local_env;
198 { 198 {
199 LocalContext env; 199 LocalContext env;
200 local_env = env.local(); 200 local_env = env.local();
201 } 201 }
202 202
203 // Local context should still be live. 203 // Local context should still be live.
204 CHECK(!local_env.IsEmpty()); 204 CHECK(!local_env.IsEmpty());
205 local_env->Enter(); 205 local_env->Enter();
206 206
207 v8::Handle<v8::Primitive> undef = v8::Undefined(); 207 v8::Handle<v8::Primitive> undef = v8::Undefined();
208 CHECK(!undef.IsEmpty()); 208 CHECK(!undef.IsEmpty());
209 CHECK(undef->IsUndefined()); 209 CHECK(undef->IsUndefined());
210 210
211 const char* c_source = "1 + 2 + 3"; 211 const char* c_source = "1 + 2 + 3";
212 Local<String> source = String::New(c_source); 212 Local<String> source = String::New(c_source);
213 Local<Script> script = Script::Compile(source); 213 Local<Script> script = Script::Compile(source);
214 CHECK_EQ(6, script->Run()->Int32Value()); 214 CHECK_EQ(6, script->Run()->Int32Value());
215 215
216 local_env->Exit(); 216 local_env->Exit();
217 } 217 }
218 218
219 219
220 THREADED_TEST(IsolateOfContext) { 220 THREADED_TEST(IsolateOfContext) {
221 v8::HandleScope scope(v8::Isolate::GetCurrent()); 221 v8::HandleScope scope(CcTest::isolate());
222 v8::Handle<Context> env = Context::New(v8::Isolate::GetCurrent()); 222 v8::Handle<Context> env = Context::New(CcTest::isolate());
223 223
224 CHECK(!env->InContext()); 224 CHECK(!env->InContext());
225 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 225 CHECK(env->GetIsolate() == CcTest::isolate());
226 env->Enter(); 226 env->Enter();
227 CHECK(env->InContext()); 227 CHECK(env->InContext());
228 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 228 CHECK(env->GetIsolate() == CcTest::isolate());
229 env->Exit(); 229 env->Exit();
230 CHECK(!env->InContext()); 230 CHECK(!env->InContext());
231 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 231 CHECK(env->GetIsolate() == CcTest::isolate());
232 } 232 }
233 233
234 234
235 static void TestSignature(const char* loop_js, Local<Value> receiver) { 235 static void TestSignature(const char* loop_js, Local<Value> receiver) {
236 i::ScopedVector<char> source(200); 236 i::ScopedVector<char> source(200);
237 i::OS::SNPrintF(source, 237 i::OS::SNPrintF(source,
238 "for (var i = 0; i < 10; i++) {" 238 "for (var i = 0; i < 10; i++) {"
239 " %s" 239 " %s"
240 "}", 240 "}",
241 loop_js); 241 loop_js);
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 732
733 // Trigger GCs and force evacuation. 733 // Trigger GCs and force evacuation.
734 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 734 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
735 HEAP->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask); 735 HEAP->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask);
736 } 736 }
737 737
738 738
739 THREADED_TEST(UsingExternalString) { 739 THREADED_TEST(UsingExternalString) {
740 i::Factory* factory = i::Isolate::Current()->factory(); 740 i::Factory* factory = i::Isolate::Current()->factory();
741 { 741 {
742 v8::HandleScope scope(v8::Isolate::GetCurrent()); 742 v8::HandleScope scope(CcTest::isolate());
743 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); 743 uint16_t* two_byte_string = AsciiToTwoByteString("test string");
744 Local<String> string = 744 Local<String> string =
745 String::NewExternal(new TestResource(two_byte_string)); 745 String::NewExternal(new TestResource(two_byte_string));
746 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); 746 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string);
747 // Trigger GCs so that the newly allocated string moves to old gen. 747 // Trigger GCs so that the newly allocated string moves to old gen.
748 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now 748 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now
749 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now 749 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now
750 i::Handle<i::String> isymbol = 750 i::Handle<i::String> isymbol =
751 factory->InternalizedStringFromString(istring); 751 factory->InternalizedStringFromString(istring);
752 CHECK(isymbol->IsInternalizedString()); 752 CHECK(isymbol->IsInternalizedString());
753 } 753 }
754 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 754 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
755 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 755 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
756 } 756 }
757 757
758 758
759 THREADED_TEST(UsingExternalAsciiString) { 759 THREADED_TEST(UsingExternalAsciiString) {
760 i::Factory* factory = i::Isolate::Current()->factory(); 760 i::Factory* factory = i::Isolate::Current()->factory();
761 { 761 {
762 v8::HandleScope scope(v8::Isolate::GetCurrent()); 762 v8::HandleScope scope(CcTest::isolate());
763 const char* one_byte_string = "test string"; 763 const char* one_byte_string = "test string";
764 Local<String> string = String::NewExternal( 764 Local<String> string = String::NewExternal(
765 new TestAsciiResource(i::StrDup(one_byte_string))); 765 new TestAsciiResource(i::StrDup(one_byte_string)));
766 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); 766 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string);
767 // Trigger GCs so that the newly allocated string moves to old gen. 767 // Trigger GCs so that the newly allocated string moves to old gen.
768 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now 768 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now
769 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now 769 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now
770 i::Handle<i::String> isymbol = 770 i::Handle<i::String> isymbol =
771 factory->InternalizedStringFromString(istring); 771 factory->InternalizedStringFromString(istring);
772 CHECK(isymbol->IsInternalizedString()); 772 CHECK(isymbol->IsInternalizedString());
773 } 773 }
774 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 774 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
775 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 775 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
776 } 776 }
777 777
778 778
779 THREADED_TEST(ScavengeExternalString) { 779 THREADED_TEST(ScavengeExternalString) {
780 i::FLAG_stress_compaction = false; 780 i::FLAG_stress_compaction = false;
781 i::FLAG_gc_global = false; 781 i::FLAG_gc_global = false;
782 int dispose_count = 0; 782 int dispose_count = 0;
783 bool in_new_space = false; 783 bool in_new_space = false;
784 { 784 {
785 v8::HandleScope scope(v8::Isolate::GetCurrent()); 785 v8::HandleScope scope(CcTest::isolate());
786 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); 786 uint16_t* two_byte_string = AsciiToTwoByteString("test string");
787 Local<String> string = 787 Local<String> string =
788 String::NewExternal(new TestResource(two_byte_string, 788 String::NewExternal(new TestResource(two_byte_string,
789 &dispose_count)); 789 &dispose_count));
790 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); 790 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string);
791 HEAP->CollectGarbage(i::NEW_SPACE); 791 HEAP->CollectGarbage(i::NEW_SPACE);
792 in_new_space = HEAP->InNewSpace(*istring); 792 in_new_space = HEAP->InNewSpace(*istring);
793 CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring)); 793 CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring));
794 CHECK_EQ(0, dispose_count); 794 CHECK_EQ(0, dispose_count);
795 } 795 }
796 HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); 796 HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE);
797 CHECK_EQ(1, dispose_count); 797 CHECK_EQ(1, dispose_count);
798 } 798 }
799 799
800 800
801 THREADED_TEST(ScavengeExternalAsciiString) { 801 THREADED_TEST(ScavengeExternalAsciiString) {
802 i::FLAG_stress_compaction = false; 802 i::FLAG_stress_compaction = false;
803 i::FLAG_gc_global = false; 803 i::FLAG_gc_global = false;
804 int dispose_count = 0; 804 int dispose_count = 0;
805 bool in_new_space = false; 805 bool in_new_space = false;
806 { 806 {
807 v8::HandleScope scope(v8::Isolate::GetCurrent()); 807 v8::HandleScope scope(CcTest::isolate());
808 const char* one_byte_string = "test string"; 808 const char* one_byte_string = "test string";
809 Local<String> string = String::NewExternal( 809 Local<String> string = String::NewExternal(
810 new TestAsciiResource(i::StrDup(one_byte_string), &dispose_count)); 810 new TestAsciiResource(i::StrDup(one_byte_string), &dispose_count));
811 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); 811 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string);
812 HEAP->CollectGarbage(i::NEW_SPACE); 812 HEAP->CollectGarbage(i::NEW_SPACE);
813 in_new_space = HEAP->InNewSpace(*istring); 813 in_new_space = HEAP->InNewSpace(*istring);
814 CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring)); 814 CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring));
815 CHECK_EQ(0, dispose_count); 815 CHECK_EQ(0, dispose_count);
816 } 816 }
817 HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); 817 HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 global->Set(v8_str("pi"), v8_num(3.1415926)); 941 global->Set(v8_str("pi"), v8_num(3.1415926));
942 Local<Value> pi = global->Get(v8_str("pi")); 942 Local<Value> pi = global->Get(v8_str("pi"));
943 CHECK_EQ(3.1415926, pi->NumberValue()); 943 CHECK_EQ(3.1415926, pi->NumberValue());
944 } 944 }
945 945
946 946
947 template<typename T> 947 template<typename T>
948 static void CheckReturnValue(const T& t, i::Address callback) { 948 static void CheckReturnValue(const T& t, i::Address callback) {
949 v8::ReturnValue<v8::Value> rv = t.GetReturnValue(); 949 v8::ReturnValue<v8::Value> rv = t.GetReturnValue();
950 i::Object** o = *reinterpret_cast<i::Object***>(&rv); 950 i::Object** o = *reinterpret_cast<i::Object***>(&rv);
951 CHECK_EQ(v8::Isolate::GetCurrent(), t.GetIsolate()); 951 CHECK_EQ(CcTest::isolate(), t.GetIsolate());
952 CHECK_EQ(t.GetIsolate(), rv.GetIsolate()); 952 CHECK_EQ(t.GetIsolate(), rv.GetIsolate());
953 CHECK((*o)->IsTheHole() || (*o)->IsUndefined()); 953 CHECK((*o)->IsTheHole() || (*o)->IsUndefined());
954 // Verify reset 954 // Verify reset
955 bool is_runtime = (*o)->IsTheHole(); 955 bool is_runtime = (*o)->IsTheHole();
956 rv.Set(true); 956 rv.Set(true);
957 CHECK(!(*o)->IsTheHole() && !(*o)->IsUndefined()); 957 CHECK(!(*o)->IsTheHole() && !(*o)->IsUndefined());
958 rv.Set(v8::Handle<v8::Object>()); 958 rv.Set(v8::Handle<v8::Object>());
959 CHECK((*o)->IsTheHole() || (*o)->IsUndefined()); 959 CHECK((*o)->IsTheHole() || (*o)->IsUndefined());
960 CHECK_EQ(is_runtime, (*o)->IsTheHole()); 960 CHECK_EQ(is_runtime, (*o)->IsTheHole());
961 961
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
1193 v8::FunctionCallback callback = &FastReturnValueCallback<T>; 1193 v8::FunctionCallback callback = &FastReturnValueCallback<T>;
1194 object_template->Set("callback", v8::FunctionTemplate::New(callback)); 1194 object_template->Set("callback", v8::FunctionTemplate::New(callback));
1195 v8::Local<v8::Object> object = object_template->NewInstance(); 1195 v8::Local<v8::Object> object = object_template->NewInstance();
1196 (*env)->Global()->Set(v8_str("callback_object"), object); 1196 (*env)->Global()->Set(v8_str("callback_object"), object);
1197 return scope.Close(CompileRun("callback_object.callback()")); 1197 return scope.Close(CompileRun("callback_object.callback()"));
1198 } 1198 }
1199 1199
1200 1200
1201 THREADED_PROFILED_TEST(FastReturnValues) { 1201 THREADED_PROFILED_TEST(FastReturnValues) {
1202 LocalContext env; 1202 LocalContext env;
1203 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1203 v8::HandleScope scope(CcTest::isolate());
1204 v8::Handle<v8::Value> value; 1204 v8::Handle<v8::Value> value;
1205 // check int32_t and uint32_t 1205 // check int32_t and uint32_t
1206 int32_t int_values[] = { 1206 int32_t int_values[] = {
1207 0, 234, -723, 1207 0, 234, -723,
1208 i::Smi::kMinValue, i::Smi::kMaxValue 1208 i::Smi::kMinValue, i::Smi::kMaxValue
1209 }; 1209 };
1210 for (size_t i = 0; i < ARRAY_SIZE(int_values); i++) { 1210 for (size_t i = 0; i < ARRAY_SIZE(int_values); i++) {
1211 for (int modifier = -1; modifier <= 1; modifier++) { 1211 for (int modifier = -1; modifier <= 1; modifier++) {
1212 int int_value = int_values[i] + modifier; 1212 int int_value = int_values[i] + modifier;
1213 // check int32_t 1213 // check int32_t
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1413 CHECK_EQ(derived_instance2, 1413 CHECK_EQ(derived_instance2,
1414 other_instance->FindInstanceInPrototypeChain(derived)); 1414 other_instance->FindInstanceInPrototypeChain(derived));
1415 CHECK_EQ(other_instance, 1415 CHECK_EQ(other_instance,
1416 other_instance->FindInstanceInPrototypeChain(other)); 1416 other_instance->FindInstanceInPrototypeChain(other));
1417 } 1417 }
1418 1418
1419 1419
1420 THREADED_TEST(TinyInteger) { 1420 THREADED_TEST(TinyInteger) {
1421 LocalContext env; 1421 LocalContext env;
1422 v8::HandleScope scope(env->GetIsolate()); 1422 v8::HandleScope scope(env->GetIsolate());
1423 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1423 v8::Isolate* isolate = CcTest::isolate();
1424 1424
1425 int32_t value = 239; 1425 int32_t value = 239;
1426 Local<v8::Integer> value_obj = v8::Integer::New(value); 1426 Local<v8::Integer> value_obj = v8::Integer::New(value);
1427 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1427 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1428 1428
1429 value_obj = v8::Integer::New(value, isolate); 1429 value_obj = v8::Integer::New(value, isolate);
1430 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1430 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1431 } 1431 }
1432 1432
1433 1433
1434 THREADED_TEST(BigSmiInteger) { 1434 THREADED_TEST(BigSmiInteger) {
1435 LocalContext env; 1435 LocalContext env;
1436 v8::HandleScope scope(env->GetIsolate()); 1436 v8::HandleScope scope(env->GetIsolate());
1437 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1437 v8::Isolate* isolate = CcTest::isolate();
1438 1438
1439 int32_t value = i::Smi::kMaxValue; 1439 int32_t value = i::Smi::kMaxValue;
1440 // We cannot add one to a Smi::kMaxValue without wrapping. 1440 // We cannot add one to a Smi::kMaxValue without wrapping.
1441 if (i::SmiValuesAre31Bits()) { 1441 if (i::SmiValuesAre31Bits()) {
1442 CHECK(i::Smi::IsValid(value)); 1442 CHECK(i::Smi::IsValid(value));
1443 CHECK(!i::Smi::IsValid(value + 1)); 1443 CHECK(!i::Smi::IsValid(value + 1));
1444 1444
1445 Local<v8::Integer> value_obj = v8::Integer::New(value); 1445 Local<v8::Integer> value_obj = v8::Integer::New(value);
1446 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1446 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1447 1447
1448 value_obj = v8::Integer::New(value, isolate); 1448 value_obj = v8::Integer::New(value, isolate);
1449 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1449 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1450 } 1450 }
1451 } 1451 }
1452 1452
1453 1453
1454 THREADED_TEST(BigInteger) { 1454 THREADED_TEST(BigInteger) {
1455 LocalContext env; 1455 LocalContext env;
1456 v8::HandleScope scope(env->GetIsolate()); 1456 v8::HandleScope scope(env->GetIsolate());
1457 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1457 v8::Isolate* isolate = CcTest::isolate();
1458 1458
1459 // We cannot add one to a Smi::kMaxValue without wrapping. 1459 // We cannot add one to a Smi::kMaxValue without wrapping.
1460 if (i::SmiValuesAre31Bits()) { 1460 if (i::SmiValuesAre31Bits()) {
1461 // The casts allow this to compile, even if Smi::kMaxValue is 2^31-1. 1461 // The casts allow this to compile, even if Smi::kMaxValue is 2^31-1.
1462 // The code will not be run in that case, due to the "if" guard. 1462 // The code will not be run in that case, due to the "if" guard.
1463 int32_t value = 1463 int32_t value =
1464 static_cast<int32_t>(static_cast<uint32_t>(i::Smi::kMaxValue) + 1); 1464 static_cast<int32_t>(static_cast<uint32_t>(i::Smi::kMaxValue) + 1);
1465 CHECK(value > i::Smi::kMaxValue); 1465 CHECK(value > i::Smi::kMaxValue);
1466 CHECK(!i::Smi::IsValid(value)); 1466 CHECK(!i::Smi::IsValid(value));
1467 1467
1468 Local<v8::Integer> value_obj = v8::Integer::New(value); 1468 Local<v8::Integer> value_obj = v8::Integer::New(value);
1469 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1469 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1470 1470
1471 value_obj = v8::Integer::New(value, isolate); 1471 value_obj = v8::Integer::New(value, isolate);
1472 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1472 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1473 } 1473 }
1474 } 1474 }
1475 1475
1476 1476
1477 THREADED_TEST(TinyUnsignedInteger) { 1477 THREADED_TEST(TinyUnsignedInteger) {
1478 LocalContext env; 1478 LocalContext env;
1479 v8::HandleScope scope(env->GetIsolate()); 1479 v8::HandleScope scope(env->GetIsolate());
1480 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1480 v8::Isolate* isolate = CcTest::isolate();
1481 1481
1482 uint32_t value = 239; 1482 uint32_t value = 239;
1483 1483
1484 Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value); 1484 Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value);
1485 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1485 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1486 1486
1487 value_obj = v8::Integer::NewFromUnsigned(value, isolate); 1487 value_obj = v8::Integer::NewFromUnsigned(value, isolate);
1488 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1488 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1489 } 1489 }
1490 1490
1491 1491
1492 THREADED_TEST(BigUnsignedSmiInteger) { 1492 THREADED_TEST(BigUnsignedSmiInteger) {
1493 LocalContext env; 1493 LocalContext env;
1494 v8::HandleScope scope(env->GetIsolate()); 1494 v8::HandleScope scope(env->GetIsolate());
1495 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1495 v8::Isolate* isolate = CcTest::isolate();
1496 1496
1497 uint32_t value = static_cast<uint32_t>(i::Smi::kMaxValue); 1497 uint32_t value = static_cast<uint32_t>(i::Smi::kMaxValue);
1498 CHECK(i::Smi::IsValid(value)); 1498 CHECK(i::Smi::IsValid(value));
1499 CHECK(!i::Smi::IsValid(value + 1)); 1499 CHECK(!i::Smi::IsValid(value + 1));
1500 1500
1501 Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value); 1501 Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value);
1502 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1502 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1503 1503
1504 value_obj = v8::Integer::NewFromUnsigned(value, isolate); 1504 value_obj = v8::Integer::NewFromUnsigned(value, isolate);
1505 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1505 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1506 } 1506 }
1507 1507
1508 1508
1509 THREADED_TEST(BigUnsignedInteger) { 1509 THREADED_TEST(BigUnsignedInteger) {
1510 LocalContext env; 1510 LocalContext env;
1511 v8::HandleScope scope(env->GetIsolate()); 1511 v8::HandleScope scope(env->GetIsolate());
1512 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1512 v8::Isolate* isolate = CcTest::isolate();
1513 1513
1514 uint32_t value = static_cast<uint32_t>(i::Smi::kMaxValue) + 1; 1514 uint32_t value = static_cast<uint32_t>(i::Smi::kMaxValue) + 1;
1515 CHECK(value > static_cast<uint32_t>(i::Smi::kMaxValue)); 1515 CHECK(value > static_cast<uint32_t>(i::Smi::kMaxValue));
1516 CHECK(!i::Smi::IsValid(value)); 1516 CHECK(!i::Smi::IsValid(value));
1517 1517
1518 Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value); 1518 Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value);
1519 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1519 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1520 1520
1521 value_obj = v8::Integer::NewFromUnsigned(value, isolate); 1521 value_obj = v8::Integer::NewFromUnsigned(value, isolate);
1522 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1522 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1523 } 1523 }
1524 1524
1525 1525
1526 THREADED_TEST(OutOfSignedRangeUnsignedInteger) { 1526 THREADED_TEST(OutOfSignedRangeUnsignedInteger) {
1527 LocalContext env; 1527 LocalContext env;
1528 v8::HandleScope scope(env->GetIsolate()); 1528 v8::HandleScope scope(env->GetIsolate());
1529 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1529 v8::Isolate* isolate = CcTest::isolate();
1530 1530
1531 uint32_t INT32_MAX_AS_UINT = (1U << 31) - 1; 1531 uint32_t INT32_MAX_AS_UINT = (1U << 31) - 1;
1532 uint32_t value = INT32_MAX_AS_UINT + 1; 1532 uint32_t value = INT32_MAX_AS_UINT + 1;
1533 CHECK(value > INT32_MAX_AS_UINT); // No overflow. 1533 CHECK(value > INT32_MAX_AS_UINT); // No overflow.
1534 1534
1535 Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value); 1535 Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value);
1536 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1536 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1537 1537
1538 value_obj = v8::Integer::NewFromUnsigned(value, isolate); 1538 value_obj = v8::Integer::NewFromUnsigned(value, isolate);
1539 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1539 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
1738 1738
1739 1739
1740 static void GetM(Local<String> name, 1740 static void GetM(Local<String> name,
1741 const v8::PropertyCallbackInfo<v8::Value>& info) { 1741 const v8::PropertyCallbackInfo<v8::Value>& info) {
1742 ApiTestFuzzer::Fuzz(); 1742 ApiTestFuzzer::Fuzz();
1743 info.GetReturnValue().Set(v8_num(876)); 1743 info.GetReturnValue().Set(v8_num(876));
1744 } 1744 }
1745 1745
1746 1746
1747 THREADED_TEST(GlobalPrototype) { 1747 THREADED_TEST(GlobalPrototype) {
1748 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1748 v8::HandleScope scope(CcTest::isolate());
1749 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New(); 1749 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New();
1750 func_templ->PrototypeTemplate()->Set( 1750 func_templ->PrototypeTemplate()->Set(
1751 "dummy", 1751 "dummy",
1752 v8::FunctionTemplate::New(DummyCallHandler)); 1752 v8::FunctionTemplate::New(DummyCallHandler));
1753 v8::Handle<ObjectTemplate> templ = func_templ->InstanceTemplate(); 1753 v8::Handle<ObjectTemplate> templ = func_templ->InstanceTemplate();
1754 templ->Set("x", v8_num(200)); 1754 templ->Set("x", v8_num(200));
1755 templ->SetAccessor(v8_str("m"), GetM); 1755 templ->SetAccessor(v8_str("m"), GetM);
1756 LocalContext env(0, templ); 1756 LocalContext env(0, templ);
1757 v8::Handle<Script> script(v8_compile("dummy()")); 1757 v8::Handle<Script> script(v8_compile("dummy()"));
1758 v8::Handle<Value> result(script->Run()); 1758 v8::Handle<Value> result(script->Run());
1759 CHECK_EQ(13.4, result->NumberValue()); 1759 CHECK_EQ(13.4, result->NumberValue());
1760 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value()); 1760 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value());
1761 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value()); 1761 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value());
1762 } 1762 }
1763 1763
1764 1764
1765 THREADED_TEST(ObjectTemplate) { 1765 THREADED_TEST(ObjectTemplate) {
1766 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1766 v8::HandleScope scope(CcTest::isolate());
1767 Local<ObjectTemplate> templ1 = ObjectTemplate::New(); 1767 Local<ObjectTemplate> templ1 = ObjectTemplate::New();
1768 templ1->Set("x", v8_num(10)); 1768 templ1->Set("x", v8_num(10));
1769 templ1->Set("y", v8_num(13)); 1769 templ1->Set("y", v8_num(13));
1770 LocalContext env; 1770 LocalContext env;
1771 Local<v8::Object> instance1 = templ1->NewInstance(); 1771 Local<v8::Object> instance1 = templ1->NewInstance();
1772 env->Global()->Set(v8_str("p"), instance1); 1772 env->Global()->Set(v8_str("p"), instance1);
1773 CHECK(v8_compile("(p.x == 10)")->Run()->BooleanValue()); 1773 CHECK(v8_compile("(p.x == 10)")->Run()->BooleanValue());
1774 CHECK(v8_compile("(p.y == 13)")->Run()->BooleanValue()); 1774 CHECK(v8_compile("(p.y == 13)")->Run()->BooleanValue());
1775 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(); 1775 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New();
1776 fun->PrototypeTemplate()->Set("nirk", v8_num(123)); 1776 fun->PrototypeTemplate()->Set("nirk", v8_num(123));
(...skipping 16 matching lines...) Expand all
1793 1793
1794 1794
1795 static void GetKnurd(Local<String> property, 1795 static void GetKnurd(Local<String> property,
1796 const v8::PropertyCallbackInfo<v8::Value>& info) { 1796 const v8::PropertyCallbackInfo<v8::Value>& info) {
1797 ApiTestFuzzer::Fuzz(); 1797 ApiTestFuzzer::Fuzz();
1798 info.GetReturnValue().Set(v8_num(15.2)); 1798 info.GetReturnValue().Set(v8_num(15.2));
1799 } 1799 }
1800 1800
1801 1801
1802 THREADED_TEST(DescriptorInheritance) { 1802 THREADED_TEST(DescriptorInheritance) {
1803 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1803 v8::HandleScope scope(CcTest::isolate());
1804 v8::Handle<v8::FunctionTemplate> super = v8::FunctionTemplate::New(); 1804 v8::Handle<v8::FunctionTemplate> super = v8::FunctionTemplate::New();
1805 super->PrototypeTemplate()->Set("flabby", 1805 super->PrototypeTemplate()->Set("flabby",
1806 v8::FunctionTemplate::New(GetFlabby)); 1806 v8::FunctionTemplate::New(GetFlabby));
1807 super->PrototypeTemplate()->Set("PI", v8_num(3.14)); 1807 super->PrototypeTemplate()->Set("PI", v8_num(3.14));
1808 1808
1809 super->InstanceTemplate()->SetAccessor(v8_str("knurd"), GetKnurd); 1809 super->InstanceTemplate()->SetAccessor(v8_str("knurd"), GetKnurd);
1810 1810
1811 v8::Handle<v8::FunctionTemplate> base1 = v8::FunctionTemplate::New(); 1811 v8::Handle<v8::FunctionTemplate> base1 = v8::FunctionTemplate::New();
1812 base1->Inherit(super); 1812 base1->Inherit(super);
1813 base1->PrototypeTemplate()->Set("v1", v8_num(20.1)); 1813 base1->PrototypeTemplate()->Set("v1", v8_num(20.1));
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1934 } 1934 }
1935 1935
1936 void AddInterceptor(Handle<FunctionTemplate> templ, 1936 void AddInterceptor(Handle<FunctionTemplate> templ,
1937 v8::NamedPropertyGetterCallback getter, 1937 v8::NamedPropertyGetterCallback getter,
1938 v8::NamedPropertySetterCallback setter) { 1938 v8::NamedPropertySetterCallback setter) {
1939 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter); 1939 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter);
1940 } 1940 }
1941 1941
1942 1942
1943 THREADED_TEST(EmptyInterceptorDoesNotShadowAccessors) { 1943 THREADED_TEST(EmptyInterceptorDoesNotShadowAccessors) {
1944 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1944 v8::HandleScope scope(CcTest::isolate());
1945 Handle<FunctionTemplate> parent = FunctionTemplate::New(); 1945 Handle<FunctionTemplate> parent = FunctionTemplate::New();
1946 Handle<FunctionTemplate> child = FunctionTemplate::New(); 1946 Handle<FunctionTemplate> child = FunctionTemplate::New();
1947 child->Inherit(parent); 1947 child->Inherit(parent);
1948 AddAccessor(parent, v8_str("age"), 1948 AddAccessor(parent, v8_str("age"),
1949 SimpleAccessorGetter, SimpleAccessorSetter); 1949 SimpleAccessorGetter, SimpleAccessorSetter);
1950 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); 1950 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter);
1951 LocalContext env; 1951 LocalContext env;
1952 env->Global()->Set(v8_str("Child"), child->GetFunction()); 1952 env->Global()->Set(v8_str("Child"), child->GetFunction());
1953 CompileRun("var child = new Child;" 1953 CompileRun("var child = new Child;"
1954 "child.age = 10;"); 1954 "child.age = 10;");
1955 ExpectBoolean("child.hasOwnProperty('age')", false); 1955 ExpectBoolean("child.hasOwnProperty('age')", false);
1956 ExpectInt32("child.age", 10); 1956 ExpectInt32("child.age", 10);
1957 ExpectInt32("child.accessor_age", 10); 1957 ExpectInt32("child.accessor_age", 10);
1958 } 1958 }
1959 1959
1960 1960
1961 THREADED_TEST(EmptyInterceptorDoesNotShadowJSAccessors) { 1961 THREADED_TEST(EmptyInterceptorDoesNotShadowJSAccessors) {
1962 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1962 v8::HandleScope scope(CcTest::isolate());
1963 Handle<FunctionTemplate> parent = FunctionTemplate::New(); 1963 Handle<FunctionTemplate> parent = FunctionTemplate::New();
1964 Handle<FunctionTemplate> child = FunctionTemplate::New(); 1964 Handle<FunctionTemplate> child = FunctionTemplate::New();
1965 child->Inherit(parent); 1965 child->Inherit(parent);
1966 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); 1966 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter);
1967 LocalContext env; 1967 LocalContext env;
1968 env->Global()->Set(v8_str("Child"), child->GetFunction()); 1968 env->Global()->Set(v8_str("Child"), child->GetFunction());
1969 CompileRun("var child = new Child;" 1969 CompileRun("var child = new Child;"
1970 "var parent = child.__proto__;" 1970 "var parent = child.__proto__;"
1971 "Object.defineProperty(parent, 'age', " 1971 "Object.defineProperty(parent, 'age', "
1972 " {get: function(){ return this.accessor_age; }, " 1972 " {get: function(){ return this.accessor_age; }, "
1973 " set: function(v){ this.accessor_age = v; }, " 1973 " set: function(v){ this.accessor_age = v; }, "
1974 " enumerable: true, configurable: true});" 1974 " enumerable: true, configurable: true});"
1975 "child.age = 10;"); 1975 "child.age = 10;");
1976 ExpectBoolean("child.hasOwnProperty('age')", false); 1976 ExpectBoolean("child.hasOwnProperty('age')", false);
1977 ExpectInt32("child.age", 10); 1977 ExpectInt32("child.age", 10);
1978 ExpectInt32("child.accessor_age", 10); 1978 ExpectInt32("child.accessor_age", 10);
1979 } 1979 }
1980 1980
1981 1981
1982 THREADED_TEST(EmptyInterceptorDoesNotAffectJSProperties) { 1982 THREADED_TEST(EmptyInterceptorDoesNotAffectJSProperties) {
1983 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1983 v8::HandleScope scope(CcTest::isolate());
1984 Handle<FunctionTemplate> parent = FunctionTemplate::New(); 1984 Handle<FunctionTemplate> parent = FunctionTemplate::New();
1985 Handle<FunctionTemplate> child = FunctionTemplate::New(); 1985 Handle<FunctionTemplate> child = FunctionTemplate::New();
1986 child->Inherit(parent); 1986 child->Inherit(parent);
1987 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); 1987 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter);
1988 LocalContext env; 1988 LocalContext env;
1989 env->Global()->Set(v8_str("Child"), child->GetFunction()); 1989 env->Global()->Set(v8_str("Child"), child->GetFunction());
1990 CompileRun("var child = new Child;" 1990 CompileRun("var child = new Child;"
1991 "var parent = child.__proto__;" 1991 "var parent = child.__proto__;"
1992 "parent.name = 'Alice';"); 1992 "parent.name = 'Alice';");
1993 ExpectBoolean("child.hasOwnProperty('name')", false); 1993 ExpectBoolean("child.hasOwnProperty('name')", false);
1994 ExpectString("child.name", "Alice"); 1994 ExpectString("child.name", "Alice");
1995 CompileRun("child.name = 'Bob';"); 1995 CompileRun("child.name = 'Bob';");
1996 ExpectString("child.name", "Bob"); 1996 ExpectString("child.name", "Bob");
1997 ExpectBoolean("child.hasOwnProperty('name')", true); 1997 ExpectBoolean("child.hasOwnProperty('name')", true);
1998 ExpectString("parent.name", "Alice"); 1998 ExpectString("parent.name", "Alice");
1999 } 1999 }
2000 2000
2001 2001
2002 THREADED_TEST(SwitchFromInterceptorToAccessor) { 2002 THREADED_TEST(SwitchFromInterceptorToAccessor) {
2003 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2003 v8::HandleScope scope(CcTest::isolate());
2004 Handle<FunctionTemplate> templ = FunctionTemplate::New(); 2004 Handle<FunctionTemplate> templ = FunctionTemplate::New();
2005 AddAccessor(templ, v8_str("age"), 2005 AddAccessor(templ, v8_str("age"),
2006 SimpleAccessorGetter, SimpleAccessorSetter); 2006 SimpleAccessorGetter, SimpleAccessorSetter);
2007 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); 2007 AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
2008 LocalContext env; 2008 LocalContext env;
2009 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); 2009 env->Global()->Set(v8_str("Obj"), templ->GetFunction());
2010 CompileRun("var obj = new Obj;" 2010 CompileRun("var obj = new Obj;"
2011 "function setAge(i){ obj.age = i; };" 2011 "function setAge(i){ obj.age = i; };"
2012 "for(var i = 0; i <= 10000; i++) setAge(i);"); 2012 "for(var i = 0; i <= 10000; i++) setAge(i);");
2013 // All i < 10000 go to the interceptor. 2013 // All i < 10000 go to the interceptor.
2014 ExpectInt32("obj.interceptor_age", 9999); 2014 ExpectInt32("obj.interceptor_age", 9999);
2015 // The last i goes to the accessor. 2015 // The last i goes to the accessor.
2016 ExpectInt32("obj.accessor_age", 10000); 2016 ExpectInt32("obj.accessor_age", 10000);
2017 } 2017 }
2018 2018
2019 2019
2020 THREADED_TEST(SwitchFromAccessorToInterceptor) { 2020 THREADED_TEST(SwitchFromAccessorToInterceptor) {
2021 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2021 v8::HandleScope scope(CcTest::isolate());
2022 Handle<FunctionTemplate> templ = FunctionTemplate::New(); 2022 Handle<FunctionTemplate> templ = FunctionTemplate::New();
2023 AddAccessor(templ, v8_str("age"), 2023 AddAccessor(templ, v8_str("age"),
2024 SimpleAccessorGetter, SimpleAccessorSetter); 2024 SimpleAccessorGetter, SimpleAccessorSetter);
2025 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); 2025 AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
2026 LocalContext env; 2026 LocalContext env;
2027 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); 2027 env->Global()->Set(v8_str("Obj"), templ->GetFunction());
2028 CompileRun("var obj = new Obj;" 2028 CompileRun("var obj = new Obj;"
2029 "function setAge(i){ obj.age = i; };" 2029 "function setAge(i){ obj.age = i; };"
2030 "for(var i = 20000; i >= 9999; i--) setAge(i);"); 2030 "for(var i = 20000; i >= 9999; i--) setAge(i);");
2031 // All i >= 10000 go to the accessor. 2031 // All i >= 10000 go to the accessor.
2032 ExpectInt32("obj.accessor_age", 10000); 2032 ExpectInt32("obj.accessor_age", 10000);
2033 // The last i goes to the interceptor. 2033 // The last i goes to the interceptor.
2034 ExpectInt32("obj.interceptor_age", 9999); 2034 ExpectInt32("obj.interceptor_age", 9999);
2035 } 2035 }
2036 2036
2037 2037
2038 THREADED_TEST(SwitchFromInterceptorToAccessorWithInheritance) { 2038 THREADED_TEST(SwitchFromInterceptorToAccessorWithInheritance) {
2039 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2039 v8::HandleScope scope(CcTest::isolate());
2040 Handle<FunctionTemplate> parent = FunctionTemplate::New(); 2040 Handle<FunctionTemplate> parent = FunctionTemplate::New();
2041 Handle<FunctionTemplate> child = FunctionTemplate::New(); 2041 Handle<FunctionTemplate> child = FunctionTemplate::New();
2042 child->Inherit(parent); 2042 child->Inherit(parent);
2043 AddAccessor(parent, v8_str("age"), 2043 AddAccessor(parent, v8_str("age"),
2044 SimpleAccessorGetter, SimpleAccessorSetter); 2044 SimpleAccessorGetter, SimpleAccessorSetter);
2045 AddInterceptor(child, InterceptorGetter, InterceptorSetter); 2045 AddInterceptor(child, InterceptorGetter, InterceptorSetter);
2046 LocalContext env; 2046 LocalContext env;
2047 env->Global()->Set(v8_str("Child"), child->GetFunction()); 2047 env->Global()->Set(v8_str("Child"), child->GetFunction());
2048 CompileRun("var child = new Child;" 2048 CompileRun("var child = new Child;"
2049 "function setAge(i){ child.age = i; };" 2049 "function setAge(i){ child.age = i; };"
2050 "for(var i = 0; i <= 10000; i++) setAge(i);"); 2050 "for(var i = 0; i <= 10000; i++) setAge(i);");
2051 // All i < 10000 go to the interceptor. 2051 // All i < 10000 go to the interceptor.
2052 ExpectInt32("child.interceptor_age", 9999); 2052 ExpectInt32("child.interceptor_age", 9999);
2053 // The last i goes to the accessor. 2053 // The last i goes to the accessor.
2054 ExpectInt32("child.accessor_age", 10000); 2054 ExpectInt32("child.accessor_age", 10000);
2055 } 2055 }
2056 2056
2057 2057
2058 THREADED_TEST(SwitchFromAccessorToInterceptorWithInheritance) { 2058 THREADED_TEST(SwitchFromAccessorToInterceptorWithInheritance) {
2059 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2059 v8::HandleScope scope(CcTest::isolate());
2060 Handle<FunctionTemplate> parent = FunctionTemplate::New(); 2060 Handle<FunctionTemplate> parent = FunctionTemplate::New();
2061 Handle<FunctionTemplate> child = FunctionTemplate::New(); 2061 Handle<FunctionTemplate> child = FunctionTemplate::New();
2062 child->Inherit(parent); 2062 child->Inherit(parent);
2063 AddAccessor(parent, v8_str("age"), 2063 AddAccessor(parent, v8_str("age"),
2064 SimpleAccessorGetter, SimpleAccessorSetter); 2064 SimpleAccessorGetter, SimpleAccessorSetter);
2065 AddInterceptor(child, InterceptorGetter, InterceptorSetter); 2065 AddInterceptor(child, InterceptorGetter, InterceptorSetter);
2066 LocalContext env; 2066 LocalContext env;
2067 env->Global()->Set(v8_str("Child"), child->GetFunction()); 2067 env->Global()->Set(v8_str("Child"), child->GetFunction());
2068 CompileRun("var child = new Child;" 2068 CompileRun("var child = new Child;"
2069 "function setAge(i){ child.age = i; };" 2069 "function setAge(i){ child.age = i; };"
2070 "for(var i = 20000; i >= 9999; i--) setAge(i);"); 2070 "for(var i = 20000; i >= 9999; i--) setAge(i);");
2071 // All i >= 10000 go to the accessor. 2071 // All i >= 10000 go to the accessor.
2072 ExpectInt32("child.accessor_age", 10000); 2072 ExpectInt32("child.accessor_age", 10000);
2073 // The last i goes to the interceptor. 2073 // The last i goes to the interceptor.
2074 ExpectInt32("child.interceptor_age", 9999); 2074 ExpectInt32("child.interceptor_age", 9999);
2075 } 2075 }
2076 2076
2077 2077
2078 THREADED_TEST(SwitchFromInterceptorToJSAccessor) { 2078 THREADED_TEST(SwitchFromInterceptorToJSAccessor) {
2079 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2079 v8::HandleScope scope(CcTest::isolate());
2080 Handle<FunctionTemplate> templ = FunctionTemplate::New(); 2080 Handle<FunctionTemplate> templ = FunctionTemplate::New();
2081 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); 2081 AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
2082 LocalContext env; 2082 LocalContext env;
2083 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); 2083 env->Global()->Set(v8_str("Obj"), templ->GetFunction());
2084 CompileRun("var obj = new Obj;" 2084 CompileRun("var obj = new Obj;"
2085 "function setter(i) { this.accessor_age = i; };" 2085 "function setter(i) { this.accessor_age = i; };"
2086 "function getter() { return this.accessor_age; };" 2086 "function getter() { return this.accessor_age; };"
2087 "function setAge(i) { obj.age = i; };" 2087 "function setAge(i) { obj.age = i; };"
2088 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" 2088 "Object.defineProperty(obj, 'age', { get:getter, set:setter });"
2089 "for(var i = 0; i <= 10000; i++) setAge(i);"); 2089 "for(var i = 0; i <= 10000; i++) setAge(i);");
2090 // All i < 10000 go to the interceptor. 2090 // All i < 10000 go to the interceptor.
2091 ExpectInt32("obj.interceptor_age", 9999); 2091 ExpectInt32("obj.interceptor_age", 9999);
2092 // The last i goes to the JavaScript accessor. 2092 // The last i goes to the JavaScript accessor.
2093 ExpectInt32("obj.accessor_age", 10000); 2093 ExpectInt32("obj.accessor_age", 10000);
2094 // The installed JavaScript getter is still intact. 2094 // The installed JavaScript getter is still intact.
2095 // This last part is a regression test for issue 1651 and relies on the fact 2095 // This last part is a regression test for issue 1651 and relies on the fact
2096 // that both interceptor and accessor are being installed on the same object. 2096 // that both interceptor and accessor are being installed on the same object.
2097 ExpectInt32("obj.age", 10000); 2097 ExpectInt32("obj.age", 10000);
2098 ExpectBoolean("obj.hasOwnProperty('age')", true); 2098 ExpectBoolean("obj.hasOwnProperty('age')", true);
2099 ExpectUndefined("Object.getOwnPropertyDescriptor(obj, 'age').value"); 2099 ExpectUndefined("Object.getOwnPropertyDescriptor(obj, 'age').value");
2100 } 2100 }
2101 2101
2102 2102
2103 THREADED_TEST(SwitchFromJSAccessorToInterceptor) { 2103 THREADED_TEST(SwitchFromJSAccessorToInterceptor) {
2104 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2104 v8::HandleScope scope(CcTest::isolate());
2105 Handle<FunctionTemplate> templ = FunctionTemplate::New(); 2105 Handle<FunctionTemplate> templ = FunctionTemplate::New();
2106 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); 2106 AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
2107 LocalContext env; 2107 LocalContext env;
2108 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); 2108 env->Global()->Set(v8_str("Obj"), templ->GetFunction());
2109 CompileRun("var obj = new Obj;" 2109 CompileRun("var obj = new Obj;"
2110 "function setter(i) { this.accessor_age = i; };" 2110 "function setter(i) { this.accessor_age = i; };"
2111 "function getter() { return this.accessor_age; };" 2111 "function getter() { return this.accessor_age; };"
2112 "function setAge(i) { obj.age = i; };" 2112 "function setAge(i) { obj.age = i; };"
2113 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" 2113 "Object.defineProperty(obj, 'age', { get:getter, set:setter });"
2114 "for(var i = 20000; i >= 9999; i--) setAge(i);"); 2114 "for(var i = 20000; i >= 9999; i--) setAge(i);");
2115 // All i >= 10000 go to the accessor. 2115 // All i >= 10000 go to the accessor.
2116 ExpectInt32("obj.accessor_age", 10000); 2116 ExpectInt32("obj.accessor_age", 10000);
2117 // The last i goes to the interceptor. 2117 // The last i goes to the interceptor.
2118 ExpectInt32("obj.interceptor_age", 9999); 2118 ExpectInt32("obj.interceptor_age", 9999);
2119 // The installed JavaScript getter is still intact. 2119 // The installed JavaScript getter is still intact.
2120 // This last part is a regression test for issue 1651 and relies on the fact 2120 // This last part is a regression test for issue 1651 and relies on the fact
2121 // that both interceptor and accessor are being installed on the same object. 2121 // that both interceptor and accessor are being installed on the same object.
2122 ExpectInt32("obj.age", 10000); 2122 ExpectInt32("obj.age", 10000);
2123 ExpectBoolean("obj.hasOwnProperty('age')", true); 2123 ExpectBoolean("obj.hasOwnProperty('age')", true);
2124 ExpectUndefined("Object.getOwnPropertyDescriptor(obj, 'age').value"); 2124 ExpectUndefined("Object.getOwnPropertyDescriptor(obj, 'age').value");
2125 } 2125 }
2126 2126
2127 2127
2128 THREADED_TEST(SwitchFromInterceptorToProperty) { 2128 THREADED_TEST(SwitchFromInterceptorToProperty) {
2129 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2129 v8::HandleScope scope(CcTest::isolate());
2130 Handle<FunctionTemplate> parent = FunctionTemplate::New(); 2130 Handle<FunctionTemplate> parent = FunctionTemplate::New();
2131 Handle<FunctionTemplate> child = FunctionTemplate::New(); 2131 Handle<FunctionTemplate> child = FunctionTemplate::New();
2132 child->Inherit(parent); 2132 child->Inherit(parent);
2133 AddInterceptor(child, InterceptorGetter, InterceptorSetter); 2133 AddInterceptor(child, InterceptorGetter, InterceptorSetter);
2134 LocalContext env; 2134 LocalContext env;
2135 env->Global()->Set(v8_str("Child"), child->GetFunction()); 2135 env->Global()->Set(v8_str("Child"), child->GetFunction());
2136 CompileRun("var child = new Child;" 2136 CompileRun("var child = new Child;"
2137 "function setAge(i){ child.age = i; };" 2137 "function setAge(i){ child.age = i; };"
2138 "for(var i = 0; i <= 10000; i++) setAge(i);"); 2138 "for(var i = 0; i <= 10000; i++) setAge(i);");
2139 // All i < 10000 go to the interceptor. 2139 // All i < 10000 go to the interceptor.
2140 ExpectInt32("child.interceptor_age", 9999); 2140 ExpectInt32("child.interceptor_age", 9999);
2141 // The last i goes to child's own property. 2141 // The last i goes to child's own property.
2142 ExpectInt32("child.age", 10000); 2142 ExpectInt32("child.age", 10000);
2143 } 2143 }
2144 2144
2145 2145
2146 THREADED_TEST(SwitchFromPropertyToInterceptor) { 2146 THREADED_TEST(SwitchFromPropertyToInterceptor) {
2147 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2147 v8::HandleScope scope(CcTest::isolate());
2148 Handle<FunctionTemplate> parent = FunctionTemplate::New(); 2148 Handle<FunctionTemplate> parent = FunctionTemplate::New();
2149 Handle<FunctionTemplate> child = FunctionTemplate::New(); 2149 Handle<FunctionTemplate> child = FunctionTemplate::New();
2150 child->Inherit(parent); 2150 child->Inherit(parent);
2151 AddInterceptor(child, InterceptorGetter, InterceptorSetter); 2151 AddInterceptor(child, InterceptorGetter, InterceptorSetter);
2152 LocalContext env; 2152 LocalContext env;
2153 env->Global()->Set(v8_str("Child"), child->GetFunction()); 2153 env->Global()->Set(v8_str("Child"), child->GetFunction());
2154 CompileRun("var child = new Child;" 2154 CompileRun("var child = new Child;"
2155 "function setAge(i){ child.age = i; };" 2155 "function setAge(i){ child.age = i; };"
2156 "for(var i = 20000; i >= 9999; i--) setAge(i);"); 2156 "for(var i = 20000; i >= 9999; i--) setAge(i);");
2157 // All i >= 10000 go to child's own property. 2157 // All i >= 10000 go to child's own property.
2158 ExpectInt32("child.age", 10000); 2158 ExpectInt32("child.age", 10000);
2159 // The last i goes to the interceptor. 2159 // The last i goes to the interceptor.
2160 ExpectInt32("child.interceptor_age", 9999); 2160 ExpectInt32("child.interceptor_age", 9999);
2161 } 2161 }
2162 2162
2163 2163
2164 THREADED_TEST(NamedPropertyHandlerGetter) { 2164 THREADED_TEST(NamedPropertyHandlerGetter) {
2165 echo_named_call_count = 0; 2165 echo_named_call_count = 0;
2166 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2166 v8::HandleScope scope(CcTest::isolate());
2167 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); 2167 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New();
2168 templ->InstanceTemplate()->SetNamedPropertyHandler(EchoNamedProperty, 2168 templ->InstanceTemplate()->SetNamedPropertyHandler(EchoNamedProperty,
2169 0, 0, 0, 0, 2169 0, 0, 0, 0,
2170 v8_str("data")); 2170 v8_str("data"));
2171 LocalContext env; 2171 LocalContext env;
2172 env->Global()->Set(v8_str("obj"), 2172 env->Global()->Set(v8_str("obj"),
2173 templ->GetFunction()->NewInstance()); 2173 templ->GetFunction()->NewInstance());
2174 CHECK_EQ(echo_named_call_count, 0); 2174 CHECK_EQ(echo_named_call_count, 0);
2175 v8_compile("obj.x")->Run(); 2175 v8_compile("obj.x")->Run();
2176 CHECK_EQ(echo_named_call_count, 1); 2176 CHECK_EQ(echo_named_call_count, 1);
(...skipping 15 matching lines...) Expand all
2192 uint32_t index, 2192 uint32_t index,
2193 const v8::PropertyCallbackInfo<v8::Value>& info) { 2193 const v8::PropertyCallbackInfo<v8::Value>& info) {
2194 ApiTestFuzzer::Fuzz(); 2194 ApiTestFuzzer::Fuzz();
2195 CHECK_EQ(v8_num(637), info.Data()); 2195 CHECK_EQ(v8_num(637), info.Data());
2196 echo_indexed_call_count++; 2196 echo_indexed_call_count++;
2197 info.GetReturnValue().Set(v8_num(index)); 2197 info.GetReturnValue().Set(v8_num(index));
2198 } 2198 }
2199 2199
2200 2200
2201 THREADED_TEST(IndexedPropertyHandlerGetter) { 2201 THREADED_TEST(IndexedPropertyHandlerGetter) {
2202 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2202 v8::HandleScope scope(CcTest::isolate());
2203 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); 2203 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New();
2204 templ->InstanceTemplate()->SetIndexedPropertyHandler(EchoIndexedProperty, 2204 templ->InstanceTemplate()->SetIndexedPropertyHandler(EchoIndexedProperty,
2205 0, 0, 0, 0, 2205 0, 0, 0, 0,
2206 v8_num(637)); 2206 v8_num(637));
2207 LocalContext env; 2207 LocalContext env;
2208 env->Global()->Set(v8_str("obj"), 2208 env->Global()->Set(v8_str("obj"),
2209 templ->GetFunction()->NewInstance()); 2209 templ->GetFunction()->NewInstance());
2210 Local<Script> script = v8_compile("obj[900]"); 2210 Local<Script> script = v8_compile("obj[900]");
2211 CHECK_EQ(script->Run()->Int32Value(), 900); 2211 CHECK_EQ(script->Run()->Int32Value(), 900);
2212 } 2212 }
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
2363 static void PrePropertyHandlerQuery( 2363 static void PrePropertyHandlerQuery(
2364 Local<String> key, 2364 Local<String> key,
2365 const v8::PropertyCallbackInfo<v8::Integer>& info) { 2365 const v8::PropertyCallbackInfo<v8::Integer>& info) {
2366 if (v8_str("pre")->Equals(key)) { 2366 if (v8_str("pre")->Equals(key)) {
2367 info.GetReturnValue().Set(static_cast<int32_t>(v8::None)); 2367 info.GetReturnValue().Set(static_cast<int32_t>(v8::None));
2368 } 2368 }
2369 } 2369 }
2370 2370
2371 2371
2372 THREADED_TEST(PrePropertyHandler) { 2372 THREADED_TEST(PrePropertyHandler) {
2373 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2373 v8::HandleScope scope(CcTest::isolate());
2374 v8::Handle<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(); 2374 v8::Handle<v8::FunctionTemplate> desc = v8::FunctionTemplate::New();
2375 desc->InstanceTemplate()->SetNamedPropertyHandler(PrePropertyHandlerGet, 2375 desc->InstanceTemplate()->SetNamedPropertyHandler(PrePropertyHandlerGet,
2376 0, 2376 0,
2377 PrePropertyHandlerQuery); 2377 PrePropertyHandlerQuery);
2378 LocalContext env(NULL, desc->InstanceTemplate()); 2378 LocalContext env(NULL, desc->InstanceTemplate());
2379 Script::Compile(v8_str( 2379 Script::Compile(v8_str(
2380 "var pre = 'Object: pre'; var on = 'Object: on';"))->Run(); 2380 "var pre = 'Object: pre'; var on = 'Object: on';"))->Run();
2381 v8::Handle<Value> result_pre = Script::Compile(v8_str("pre"))->Run(); 2381 v8::Handle<Value> result_pre = Script::Compile(v8_str("pre"))->Run();
2382 CHECK_EQ(v8_str("PrePropertyHandler: pre"), result_pre); 2382 CHECK_EQ(v8_str("PrePropertyHandler: pre"), result_pre);
2383 v8::Handle<Value> result_on = Script::Compile(v8_str("on"))->Run(); 2383 v8::Handle<Value> result_on = Script::Compile(v8_str("on"))->Run();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2420 } 2420 }
2421 args.This()->Set(v8_str("depth"), v8::Integer::New(depth + 1)); 2421 args.This()->Set(v8_str("depth"), v8::Integer::New(depth + 1));
2422 v8::Handle<Value> function = 2422 v8::Handle<Value> function =
2423 args.This()->Get(v8_str("callFunctionRecursively")); 2423 args.This()->Get(v8_str("callFunctionRecursively"));
2424 args.GetReturnValue().Set( 2424 args.GetReturnValue().Set(
2425 function.As<Function>()->Call(args.This(), 0, NULL)); 2425 function.As<Function>()->Call(args.This(), 0, NULL));
2426 } 2426 }
2427 2427
2428 2428
2429 THREADED_TEST(DeepCrossLanguageRecursion) { 2429 THREADED_TEST(DeepCrossLanguageRecursion) {
2430 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2430 v8::HandleScope scope(CcTest::isolate());
2431 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); 2431 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New();
2432 global->Set(v8_str("callScriptRecursively"), 2432 global->Set(v8_str("callScriptRecursively"),
2433 v8::FunctionTemplate::New(CallScriptRecursivelyCall)); 2433 v8::FunctionTemplate::New(CallScriptRecursivelyCall));
2434 global->Set(v8_str("callFunctionRecursively"), 2434 global->Set(v8_str("callFunctionRecursively"),
2435 v8::FunctionTemplate::New(CallFunctionRecursivelyCall)); 2435 v8::FunctionTemplate::New(CallFunctionRecursivelyCall));
2436 LocalContext env(NULL, global); 2436 LocalContext env(NULL, global);
2437 2437
2438 env->Global()->Set(v8_str("depth"), v8::Integer::New(0)); 2438 env->Global()->Set(v8_str("depth"), v8::Integer::New(0));
2439 call_recursively_script = v8_compile("callScriptRecursively()"); 2439 call_recursively_script = v8_compile("callScriptRecursively()");
2440 call_recursively_script->Run(); 2440 call_recursively_script->Run();
(...skipping 15 matching lines...) Expand all
2456 static void ThrowingPropertyHandlerSet( 2456 static void ThrowingPropertyHandlerSet(
2457 Local<String> key, 2457 Local<String> key,
2458 Local<Value>, 2458 Local<Value>,
2459 const v8::PropertyCallbackInfo<v8::Value>& info) { 2459 const v8::PropertyCallbackInfo<v8::Value>& info) {
2460 v8::ThrowException(key); 2460 v8::ThrowException(key);
2461 info.GetReturnValue().SetUndefined(); // not the same as empty handle 2461 info.GetReturnValue().SetUndefined(); // not the same as empty handle
2462 } 2462 }
2463 2463
2464 2464
2465 THREADED_TEST(CallbackExceptionRegression) { 2465 THREADED_TEST(CallbackExceptionRegression) {
2466 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2466 v8::HandleScope scope(CcTest::isolate());
2467 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 2467 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
2468 obj->SetNamedPropertyHandler(ThrowingPropertyHandlerGet, 2468 obj->SetNamedPropertyHandler(ThrowingPropertyHandlerGet,
2469 ThrowingPropertyHandlerSet); 2469 ThrowingPropertyHandlerSet);
2470 LocalContext env; 2470 LocalContext env;
2471 env->Global()->Set(v8_str("obj"), obj->NewInstance()); 2471 env->Global()->Set(v8_str("obj"), obj->NewInstance());
2472 v8::Handle<Value> otto = Script::Compile(v8_str( 2472 v8::Handle<Value> otto = Script::Compile(v8_str(
2473 "try { with (obj) { otto; } } catch (e) { e; }"))->Run(); 2473 "try { with (obj) { otto; } } catch (e) { e; }"))->Run();
2474 CHECK_EQ(v8_str("otto"), otto); 2474 CHECK_EQ(v8_str("otto"), otto);
2475 v8::Handle<Value> netto = Script::Compile(v8_str( 2475 v8::Handle<Value> netto = Script::Compile(v8_str(
2476 "try { with (obj) { netto = 4; } } catch (e) { e; }"))->Run(); 2476 "try { with (obj) { netto = 4; } } catch (e) { e; }"))->Run();
2477 CHECK_EQ(v8_str("netto"), netto); 2477 CHECK_EQ(v8_str("netto"), netto);
2478 } 2478 }
2479 2479
2480 2480
2481 THREADED_TEST(FunctionPrototype) { 2481 THREADED_TEST(FunctionPrototype) {
2482 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2482 v8::HandleScope scope(CcTest::isolate());
2483 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(); 2483 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New();
2484 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321)); 2484 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321));
2485 LocalContext env; 2485 LocalContext env;
2486 env->Global()->Set(v8_str("Foo"), Foo->GetFunction()); 2486 env->Global()->Set(v8_str("Foo"), Foo->GetFunction());
2487 Local<Script> script = Script::Compile(v8_str("Foo.prototype.plak")); 2487 Local<Script> script = Script::Compile(v8_str("Foo.prototype.plak"));
2488 CHECK_EQ(script->Run()->Int32Value(), 321); 2488 CHECK_EQ(script->Run()->Int32Value(), 321);
2489 } 2489 }
2490 2490
2491 2491
2492 THREADED_TEST(InternalFields) { 2492 THREADED_TEST(InternalFields) {
2493 LocalContext env; 2493 LocalContext env;
2494 v8::HandleScope scope(env->GetIsolate()); 2494 v8::HandleScope scope(env->GetIsolate());
2495 2495
2496 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); 2496 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New();
2497 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); 2497 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate();
2498 instance_templ->SetInternalFieldCount(1); 2498 instance_templ->SetInternalFieldCount(1);
2499 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); 2499 Local<v8::Object> obj = templ->GetFunction()->NewInstance();
2500 CHECK_EQ(1, obj->InternalFieldCount()); 2500 CHECK_EQ(1, obj->InternalFieldCount());
2501 CHECK(obj->GetInternalField(0)->IsUndefined()); 2501 CHECK(obj->GetInternalField(0)->IsUndefined());
2502 obj->SetInternalField(0, v8_num(17)); 2502 obj->SetInternalField(0, v8_num(17));
2503 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value()); 2503 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value());
2504 } 2504 }
2505 2505
2506 2506
2507 THREADED_TEST(GlobalObjectInternalFields) { 2507 THREADED_TEST(GlobalObjectInternalFields) {
2508 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2508 v8::HandleScope scope(CcTest::isolate());
2509 Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 2509 Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
2510 global_template->SetInternalFieldCount(1); 2510 global_template->SetInternalFieldCount(1);
2511 LocalContext env(NULL, global_template); 2511 LocalContext env(NULL, global_template);
2512 v8::Handle<v8::Object> global_proxy = env->Global(); 2512 v8::Handle<v8::Object> global_proxy = env->Global();
2513 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); 2513 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>();
2514 CHECK_EQ(1, global->InternalFieldCount()); 2514 CHECK_EQ(1, global->InternalFieldCount());
2515 CHECK(global->GetInternalField(0)->IsUndefined()); 2515 CHECK(global->GetInternalField(0)->IsUndefined());
2516 global->SetInternalField(0, v8_num(17)); 2516 global->SetInternalField(0, v8_num(17));
2517 CHECK_EQ(17, global->GetInternalField(0)->Int32Value()); 2517 CHECK_EQ(17, global->GetInternalField(0)->Int32Value());
2518 } 2518 }
2519 2519
2520 2520
2521 THREADED_TEST(GlobalObjectHasRealIndexedProperty) { 2521 THREADED_TEST(GlobalObjectHasRealIndexedProperty) {
2522 LocalContext env; 2522 LocalContext env;
2523 v8::HandleScope scope(v8::Isolate::GetCurrent()); 2523 v8::HandleScope scope(CcTest::isolate());
2524 2524
2525 v8::Local<v8::Object> global = env->Global(); 2525 v8::Local<v8::Object> global = env->Global();
2526 global->Set(0, v8::String::New("value")); 2526 global->Set(0, v8::String::New("value"));
2527 CHECK(global->HasRealIndexedProperty(0)); 2527 CHECK(global->HasRealIndexedProperty(0));
2528 } 2528 }
2529 2529
2530 2530
2531 static void CheckAlignedPointerInInternalField(Handle<v8::Object> obj, 2531 static void CheckAlignedPointerInInternalField(Handle<v8::Object> obj,
2532 void* value) { 2532 void* value) {
2533 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); 2533 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1));
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
3112 instance_templ->SetNamedPropertyHandler(InterceptorForHiddenProperties); 3112 instance_templ->SetNamedPropertyHandler(InterceptorForHiddenProperties);
3113 Local<v8::Function> function = fun_templ->GetFunction(); 3113 Local<v8::Function> function = fun_templ->GetFunction();
3114 Local<v8::Object> obj = function->NewInstance(); 3114 Local<v8::Object> obj = function->NewInstance();
3115 CHECK(obj->SetHiddenValue(key, v8::Integer::New(2302))); 3115 CHECK(obj->SetHiddenValue(key, v8::Integer::New(2302)));
3116 CHECK_EQ(2302, obj->GetHiddenValue(key)->Int32Value()); 3116 CHECK_EQ(2302, obj->GetHiddenValue(key)->Int32Value());
3117 CHECK(!interceptor_for_hidden_properties_called); 3117 CHECK(!interceptor_for_hidden_properties_called);
3118 } 3118 }
3119 3119
3120 3120
3121 THREADED_TEST(External) { 3121 THREADED_TEST(External) {
3122 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3122 v8::HandleScope scope(CcTest::isolate());
3123 int x = 3; 3123 int x = 3;
3124 Local<v8::External> ext = v8::External::New(&x); 3124 Local<v8::External> ext = v8::External::New(&x);
3125 LocalContext env; 3125 LocalContext env;
3126 env->Global()->Set(v8_str("ext"), ext); 3126 env->Global()->Set(v8_str("ext"), ext);
3127 Local<Value> reext_obj = Script::Compile(v8_str("this.ext"))->Run(); 3127 Local<Value> reext_obj = Script::Compile(v8_str("this.ext"))->Run();
3128 v8::Handle<v8::External> reext = reext_obj.As<v8::External>(); 3128 v8::Handle<v8::External> reext = reext_obj.As<v8::External>();
3129 int* ptr = static_cast<int*>(reext->Value()); 3129 int* ptr = static_cast<int*>(reext->Value());
3130 CHECK_EQ(x, 3); 3130 CHECK_EQ(x, 3);
3131 *ptr = 10; 3131 *ptr = 10;
3132 CHECK_EQ(x, 10); 3132 CHECK_EQ(x, 10);
(...skipping 11 matching lines...) Expand all
3144 CHECK_EQ('1', *char_ptr); 3144 CHECK_EQ('1', *char_ptr);
3145 char_ptr = reinterpret_cast<char*>(v8::External::Cast(*two)->Value()); 3145 char_ptr = reinterpret_cast<char*>(v8::External::Cast(*two)->Value());
3146 CHECK_EQ('2', *char_ptr); 3146 CHECK_EQ('2', *char_ptr);
3147 char_ptr = reinterpret_cast<char*>(v8::External::Cast(*three)->Value()); 3147 char_ptr = reinterpret_cast<char*>(v8::External::Cast(*three)->Value());
3148 CHECK_EQ('3', *char_ptr); 3148 CHECK_EQ('3', *char_ptr);
3149 i::DeleteArray(data); 3149 i::DeleteArray(data);
3150 } 3150 }
3151 3151
3152 3152
3153 THREADED_TEST(GlobalHandle) { 3153 THREADED_TEST(GlobalHandle) {
3154 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 3154 v8::Isolate* isolate = CcTest::isolate();
3155 v8::Persistent<String> global; 3155 v8::Persistent<String> global;
3156 { 3156 {
3157 v8::HandleScope scope(isolate); 3157 v8::HandleScope scope(isolate);
3158 global.Reset(isolate, v8_str("str")); 3158 global.Reset(isolate, v8_str("str"));
3159 } 3159 }
3160 { 3160 {
3161 v8::HandleScope scope(isolate); 3161 v8::HandleScope scope(isolate);
3162 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3); 3162 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3);
3163 } 3163 }
3164 global.Dispose(); 3164 global.Dispose();
3165 global.Clear(); 3165 global.Clear();
3166 { 3166 {
3167 v8::HandleScope scope(isolate); 3167 v8::HandleScope scope(isolate);
3168 global.Reset(isolate, v8_str("str")); 3168 global.Reset(isolate, v8_str("str"));
3169 } 3169 }
3170 { 3170 {
3171 v8::HandleScope scope(isolate); 3171 v8::HandleScope scope(isolate);
3172 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3); 3172 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3);
3173 } 3173 }
3174 global.Dispose(); 3174 global.Dispose();
3175 } 3175 }
3176 3176
3177 3177
3178 THREADED_TEST(ResettingGlobalHandle) { 3178 THREADED_TEST(ResettingGlobalHandle) {
3179 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 3179 v8::Isolate* isolate = CcTest::isolate();
3180 v8::Persistent<String> global; 3180 v8::Persistent<String> global;
3181 { 3181 {
3182 v8::HandleScope scope(isolate); 3182 v8::HandleScope scope(isolate);
3183 global.Reset(isolate, v8_str("str")); 3183 global.Reset(isolate, v8_str("str"));
3184 } 3184 }
3185 v8::internal::GlobalHandles* global_handles = 3185 v8::internal::GlobalHandles* global_handles =
3186 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles(); 3186 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
3187 int initial_handle_count = global_handles->global_handles_count(); 3187 int initial_handle_count = global_handles->global_handles_count();
3188 { 3188 {
3189 v8::HandleScope scope(isolate); 3189 v8::HandleScope scope(isolate);
3190 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3); 3190 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3);
3191 } 3191 }
3192 { 3192 {
3193 v8::HandleScope scope(isolate); 3193 v8::HandleScope scope(isolate);
3194 global.Reset(isolate, v8_str("longer")); 3194 global.Reset(isolate, v8_str("longer"));
3195 } 3195 }
3196 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count); 3196 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count);
3197 { 3197 {
3198 v8::HandleScope scope(isolate); 3198 v8::HandleScope scope(isolate);
3199 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 6); 3199 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 6);
3200 } 3200 }
3201 global.Dispose(); 3201 global.Dispose();
3202 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count - 1); 3202 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count - 1);
3203 } 3203 }
3204 3204
3205 3205
3206 THREADED_TEST(ResettingGlobalHandleToEmpty) { 3206 THREADED_TEST(ResettingGlobalHandleToEmpty) {
3207 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 3207 v8::Isolate* isolate = CcTest::isolate();
3208 v8::Persistent<String> global; 3208 v8::Persistent<String> global;
3209 { 3209 {
3210 v8::HandleScope scope(isolate); 3210 v8::HandleScope scope(isolate);
3211 global.Reset(isolate, v8_str("str")); 3211 global.Reset(isolate, v8_str("str"));
3212 } 3212 }
3213 v8::internal::GlobalHandles* global_handles = 3213 v8::internal::GlobalHandles* global_handles =
3214 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles(); 3214 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
3215 int initial_handle_count = global_handles->global_handles_count(); 3215 int initial_handle_count = global_handles->global_handles_count();
3216 { 3216 {
3217 v8::HandleScope scope(isolate); 3217 v8::HandleScope scope(isolate);
3218 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3); 3218 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3);
3219 } 3219 }
3220 { 3220 {
3221 v8::HandleScope scope(isolate); 3221 v8::HandleScope scope(isolate);
3222 Local<String> empty; 3222 Local<String> empty;
3223 global.Reset(isolate, empty); 3223 global.Reset(isolate, empty);
3224 } 3224 }
3225 CHECK(global.IsEmpty()); 3225 CHECK(global.IsEmpty());
3226 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count - 1); 3226 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count - 1);
3227 } 3227 }
3228 3228
3229 3229
3230 THREADED_TEST(ClearAndLeakGlobal) { 3230 THREADED_TEST(ClearAndLeakGlobal) {
3231 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 3231 v8::Isolate* isolate = CcTest::isolate();
3232 v8::internal::GlobalHandles* global_handles = NULL; 3232 v8::internal::GlobalHandles* global_handles = NULL;
3233 int initial_handle_count = 0; 3233 int initial_handle_count = 0;
3234 v8::Persistent<String> global; 3234 v8::Persistent<String> global;
3235 { 3235 {
3236 v8::HandleScope scope(isolate); 3236 v8::HandleScope scope(isolate);
3237 Local<String> str = v8_str("str"); 3237 Local<String> str = v8_str("str");
3238 global_handles = 3238 global_handles =
3239 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles(); 3239 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
3240 initial_handle_count = global_handles->global_handles_count(); 3240 initial_handle_count = global_handles->global_handles_count();
3241 global.Reset(isolate, str); 3241 global.Reset(isolate, str);
3242 } 3242 }
3243 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count + 1); 3243 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count + 1);
3244 String* str = global.ClearAndLeak(); 3244 String* str = global.ClearAndLeak();
3245 CHECK(global.IsEmpty()); 3245 CHECK(global.IsEmpty());
3246 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count + 1); 3246 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count + 1);
3247 global_handles->Destroy(reinterpret_cast<i::Object**>(str)); 3247 global_handles->Destroy(reinterpret_cast<i::Object**>(str));
3248 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count); 3248 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count);
3249 } 3249 }
3250 3250
3251 3251
3252 THREADED_TEST(GlobalHandleUpcast) { 3252 THREADED_TEST(GlobalHandleUpcast) {
3253 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 3253 v8::Isolate* isolate = CcTest::isolate();
3254 v8::HandleScope scope(isolate); 3254 v8::HandleScope scope(isolate);
3255 v8::Local<String> local = v8::Local<String>::New(v8_str("str")); 3255 v8::Local<String> local = v8::Local<String>::New(v8_str("str"));
3256 v8::Persistent<String> global_string(isolate, local); 3256 v8::Persistent<String> global_string(isolate, local);
3257 v8::Persistent<Value>& global_value = 3257 v8::Persistent<Value>& global_value =
3258 v8::Persistent<Value>::Cast(global_string); 3258 v8::Persistent<Value>::Cast(global_string);
3259 CHECK(v8::Local<v8::Value>::New(isolate, global_value)->IsString()); 3259 CHECK(v8::Local<v8::Value>::New(isolate, global_value)->IsString());
3260 CHECK(global_string == v8::Persistent<String>::Cast(global_value)); 3260 CHECK(global_string == v8::Persistent<String>::Cast(global_value));
3261 global_string.Dispose(); 3261 global_string.Dispose();
3262 } 3262 }
3263 3263
3264 3264
3265 THREADED_TEST(HandleEquality) { 3265 THREADED_TEST(HandleEquality) {
3266 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 3266 v8::Isolate* isolate = CcTest::isolate();
3267 v8::Persistent<String> global1; 3267 v8::Persistent<String> global1;
3268 v8::Persistent<String> global2; 3268 v8::Persistent<String> global2;
3269 { 3269 {
3270 v8::HandleScope scope(isolate); 3270 v8::HandleScope scope(isolate);
3271 global1.Reset(isolate, v8_str("str")); 3271 global1.Reset(isolate, v8_str("str"));
3272 global2.Reset(isolate, v8_str("str2")); 3272 global2.Reset(isolate, v8_str("str2"));
3273 } 3273 }
3274 CHECK_EQ(global1 == global1, true); 3274 CHECK_EQ(global1 == global1, true);
3275 CHECK_EQ(global1 != global1, false); 3275 CHECK_EQ(global1 != global1, false);
3276 { 3276 {
(...skipping 17 matching lines...) Expand all
3294 Local<String> anotherLocal1 = Local<String>::New(isolate, global1); 3294 Local<String> anotherLocal1 = Local<String>::New(isolate, global1);
3295 CHECK_EQ(local1 == anotherLocal1, true); 3295 CHECK_EQ(local1 == anotherLocal1, true);
3296 CHECK_EQ(local1 != anotherLocal1, false); 3296 CHECK_EQ(local1 != anotherLocal1, false);
3297 } 3297 }
3298 global1.Dispose(); 3298 global1.Dispose();
3299 global2.Dispose(); 3299 global2.Dispose();
3300 } 3300 }
3301 3301
3302 3302
3303 THREADED_TEST(LocalHandle) { 3303 THREADED_TEST(LocalHandle) {
3304 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3304 v8::HandleScope scope(CcTest::isolate());
3305 v8::Local<String> local = v8::Local<String>::New(v8_str("str")); 3305 v8::Local<String> local = v8::Local<String>::New(v8_str("str"));
3306 CHECK_EQ(local->Length(), 3); 3306 CHECK_EQ(local->Length(), 3);
3307 3307
3308 local = v8::Local<String>::New(v8::Isolate::GetCurrent(), v8_str("str")); 3308 local = v8::Local<String>::New(CcTest::isolate(), v8_str("str"));
3309 CHECK_EQ(local->Length(), 3); 3309 CHECK_EQ(local->Length(), 3);
3310 } 3310 }
3311 3311
3312 3312
3313 class WeakCallCounter { 3313 class WeakCallCounter {
3314 public: 3314 public:
3315 explicit WeakCallCounter(int id) : id_(id), number_of_weak_calls_(0) { } 3315 explicit WeakCallCounter(int id) : id_(id), number_of_weak_calls_(0) { }
3316 int id() { return id_; } 3316 int id() { return id_; }
3317 void increment() { number_of_weak_calls_++; } 3317 void increment() { number_of_weak_calls_++; }
3318 int NumberOfWeakCalls() { return number_of_weak_calls_; } 3318 int NumberOfWeakCalls() { return number_of_weak_calls_; }
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
3676 CHECK_EQ(5.76, data->NumberValue()); 3676 CHECK_EQ(5.76, data->NumberValue());
3677 CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue()); 3677 CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue());
3678 CHECK_EQ(7.56, message->GetScriptData()->NumberValue()); 3678 CHECK_EQ(7.56, message->GetScriptData()->NumberValue());
3679 CHECK(!message->IsSharedCrossOrigin()); 3679 CHECK(!message->IsSharedCrossOrigin());
3680 message_received = true; 3680 message_received = true;
3681 } 3681 }
3682 3682
3683 3683
3684 THREADED_TEST(MessageHandler0) { 3684 THREADED_TEST(MessageHandler0) {
3685 message_received = false; 3685 message_received = false;
3686 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3686 v8::HandleScope scope(CcTest::isolate());
3687 CHECK(!message_received); 3687 CHECK(!message_received);
3688 v8::V8::AddMessageListener(check_message_0, v8_num(5.76)); 3688 v8::V8::AddMessageListener(check_message_0, v8_num(5.76));
3689 LocalContext context; 3689 LocalContext context;
3690 v8::ScriptOrigin origin = 3690 v8::ScriptOrigin origin =
3691 v8::ScriptOrigin(v8_str("6.75")); 3691 v8::ScriptOrigin(v8_str("6.75"));
3692 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"), 3692 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"),
3693 &origin); 3693 &origin);
3694 script->SetData(v8_str("7.56")); 3694 script->SetData(v8_str("7.56"));
3695 script->Run(); 3695 script->Run();
3696 CHECK(message_received); 3696 CHECK(message_received);
3697 // clear out the message listener 3697 // clear out the message listener
3698 v8::V8::RemoveMessageListeners(check_message_0); 3698 v8::V8::RemoveMessageListeners(check_message_0);
3699 } 3699 }
3700 3700
3701 3701
3702 static void check_message_1(v8::Handle<v8::Message> message, 3702 static void check_message_1(v8::Handle<v8::Message> message,
3703 v8::Handle<Value> data) { 3703 v8::Handle<Value> data) {
3704 CHECK(data->IsNumber()); 3704 CHECK(data->IsNumber());
3705 CHECK_EQ(1337, data->Int32Value()); 3705 CHECK_EQ(1337, data->Int32Value());
3706 CHECK(!message->IsSharedCrossOrigin()); 3706 CHECK(!message->IsSharedCrossOrigin());
3707 message_received = true; 3707 message_received = true;
3708 } 3708 }
3709 3709
3710 3710
3711 TEST(MessageHandler1) { 3711 TEST(MessageHandler1) {
3712 message_received = false; 3712 message_received = false;
3713 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3713 v8::HandleScope scope(CcTest::isolate());
3714 CHECK(!message_received); 3714 CHECK(!message_received);
3715 v8::V8::AddMessageListener(check_message_1); 3715 v8::V8::AddMessageListener(check_message_1);
3716 LocalContext context; 3716 LocalContext context;
3717 CompileRun("throw 1337;"); 3717 CompileRun("throw 1337;");
3718 CHECK(message_received); 3718 CHECK(message_received);
3719 // clear out the message listener 3719 // clear out the message listener
3720 v8::V8::RemoveMessageListeners(check_message_1); 3720 v8::V8::RemoveMessageListeners(check_message_1);
3721 } 3721 }
3722 3722
3723 3723
3724 static void check_message_2(v8::Handle<v8::Message> message, 3724 static void check_message_2(v8::Handle<v8::Message> message,
3725 v8::Handle<Value> data) { 3725 v8::Handle<Value> data) {
3726 LocalContext context; 3726 LocalContext context;
3727 CHECK(data->IsObject()); 3727 CHECK(data->IsObject());
3728 v8::Local<v8::Value> hidden_property = 3728 v8::Local<v8::Value> hidden_property =
3729 v8::Object::Cast(*data)->GetHiddenValue(v8_str("hidden key")); 3729 v8::Object::Cast(*data)->GetHiddenValue(v8_str("hidden key"));
3730 CHECK(v8_str("hidden value")->Equals(hidden_property)); 3730 CHECK(v8_str("hidden value")->Equals(hidden_property));
3731 CHECK(!message->IsSharedCrossOrigin()); 3731 CHECK(!message->IsSharedCrossOrigin());
3732 message_received = true; 3732 message_received = true;
3733 } 3733 }
3734 3734
3735 3735
3736 TEST(MessageHandler2) { 3736 TEST(MessageHandler2) {
3737 message_received = false; 3737 message_received = false;
3738 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3738 v8::HandleScope scope(CcTest::isolate());
3739 CHECK(!message_received); 3739 CHECK(!message_received);
3740 v8::V8::AddMessageListener(check_message_2); 3740 v8::V8::AddMessageListener(check_message_2);
3741 LocalContext context; 3741 LocalContext context;
3742 v8::Local<v8::Value> error = v8::Exception::Error(v8_str("custom error")); 3742 v8::Local<v8::Value> error = v8::Exception::Error(v8_str("custom error"));
3743 v8::Object::Cast(*error)->SetHiddenValue(v8_str("hidden key"), 3743 v8::Object::Cast(*error)->SetHiddenValue(v8_str("hidden key"),
3744 v8_str("hidden value")); 3744 v8_str("hidden value"));
3745 context->Global()->Set(v8_str("error"), error); 3745 context->Global()->Set(v8_str("error"), error);
3746 CompileRun("throw error;"); 3746 CompileRun("throw error;");
3747 CHECK(message_received); 3747 CHECK(message_received);
3748 // clear out the message listener 3748 // clear out the message listener
3749 v8::V8::RemoveMessageListeners(check_message_2); 3749 v8::V8::RemoveMessageListeners(check_message_2);
3750 } 3750 }
3751 3751
3752 3752
3753 static void check_message_3(v8::Handle<v8::Message> message, 3753 static void check_message_3(v8::Handle<v8::Message> message,
3754 v8::Handle<Value> data) { 3754 v8::Handle<Value> data) {
3755 CHECK(message->IsSharedCrossOrigin()); 3755 CHECK(message->IsSharedCrossOrigin());
3756 CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue()); 3756 CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue());
3757 message_received = true; 3757 message_received = true;
3758 } 3758 }
3759 3759
3760 3760
3761 TEST(MessageHandler3) { 3761 TEST(MessageHandler3) {
3762 message_received = false; 3762 message_received = false;
3763 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3763 v8::HandleScope scope(CcTest::isolate());
3764 CHECK(!message_received); 3764 CHECK(!message_received);
3765 v8::V8::AddMessageListener(check_message_3); 3765 v8::V8::AddMessageListener(check_message_3);
3766 LocalContext context; 3766 LocalContext context;
3767 v8::ScriptOrigin origin = 3767 v8::ScriptOrigin origin =
3768 v8::ScriptOrigin(v8_str("6.75"), 3768 v8::ScriptOrigin(v8_str("6.75"),
3769 v8::Integer::New(1), 3769 v8::Integer::New(1),
3770 v8::Integer::New(2), 3770 v8::Integer::New(2),
3771 v8::True()); 3771 v8::True());
3772 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"), 3772 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"),
3773 &origin); 3773 &origin);
3774 script->Run(); 3774 script->Run();
3775 CHECK(message_received); 3775 CHECK(message_received);
3776 // clear out the message listener 3776 // clear out the message listener
3777 v8::V8::RemoveMessageListeners(check_message_3); 3777 v8::V8::RemoveMessageListeners(check_message_3);
3778 } 3778 }
3779 3779
3780 3780
3781 static void check_message_4(v8::Handle<v8::Message> message, 3781 static void check_message_4(v8::Handle<v8::Message> message,
3782 v8::Handle<Value> data) { 3782 v8::Handle<Value> data) {
3783 CHECK(!message->IsSharedCrossOrigin()); 3783 CHECK(!message->IsSharedCrossOrigin());
3784 CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue()); 3784 CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue());
3785 message_received = true; 3785 message_received = true;
3786 } 3786 }
3787 3787
3788 3788
3789 TEST(MessageHandler4) { 3789 TEST(MessageHandler4) {
3790 message_received = false; 3790 message_received = false;
3791 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3791 v8::HandleScope scope(CcTest::isolate());
3792 CHECK(!message_received); 3792 CHECK(!message_received);
3793 v8::V8::AddMessageListener(check_message_4); 3793 v8::V8::AddMessageListener(check_message_4);
3794 LocalContext context; 3794 LocalContext context;
3795 v8::ScriptOrigin origin = 3795 v8::ScriptOrigin origin =
3796 v8::ScriptOrigin(v8_str("6.75"), 3796 v8::ScriptOrigin(v8_str("6.75"),
3797 v8::Integer::New(1), 3797 v8::Integer::New(1),
3798 v8::Integer::New(2), 3798 v8::Integer::New(2),
3799 v8::False()); 3799 v8::False());
3800 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"), 3800 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"),
3801 &origin); 3801 &origin);
(...skipping 15 matching lines...) Expand all
3817 static void check_message_5b(v8::Handle<v8::Message> message, 3817 static void check_message_5b(v8::Handle<v8::Message> message,
3818 v8::Handle<Value> data) { 3818 v8::Handle<Value> data) {
3819 CHECK(!message->IsSharedCrossOrigin()); 3819 CHECK(!message->IsSharedCrossOrigin());
3820 CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue()); 3820 CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue());
3821 message_received = true; 3821 message_received = true;
3822 } 3822 }
3823 3823
3824 3824
3825 TEST(MessageHandler5) { 3825 TEST(MessageHandler5) {
3826 message_received = false; 3826 message_received = false;
3827 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3827 v8::HandleScope scope(CcTest::isolate());
3828 CHECK(!message_received); 3828 CHECK(!message_received);
3829 v8::V8::AddMessageListener(check_message_5a); 3829 v8::V8::AddMessageListener(check_message_5a);
3830 LocalContext context; 3830 LocalContext context;
3831 v8::ScriptOrigin origin = 3831 v8::ScriptOrigin origin =
3832 v8::ScriptOrigin(v8_str("6.75"), 3832 v8::ScriptOrigin(v8_str("6.75"),
3833 v8::Integer::New(1), 3833 v8::Integer::New(1),
3834 v8::Integer::New(2), 3834 v8::Integer::New(2),
3835 v8::True()); 3835 v8::True());
3836 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"), 3836 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"),
3837 &origin); 3837 &origin);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
3959 v8::HandleScope scope(args.GetIsolate()); 3959 v8::HandleScope scope(args.GetIsolate());
3960 ApiTestFuzzer::Fuzz(); 3960 ApiTestFuzzer::Fuzz();
3961 Local<v8::Array> result = v8::Array::New(args.Length()); 3961 Local<v8::Array> result = v8::Array::New(args.Length());
3962 for (int i = 0; i < args.Length(); i++) 3962 for (int i = 0; i < args.Length(); i++)
3963 result->Set(i, args[i]); 3963 result->Set(i, args[i]);
3964 args.GetReturnValue().Set(scope.Close(result)); 3964 args.GetReturnValue().Set(scope.Close(result));
3965 } 3965 }
3966 3966
3967 3967
3968 THREADED_TEST(Vector) { 3968 THREADED_TEST(Vector) {
3969 v8::HandleScope scope(v8::Isolate::GetCurrent()); 3969 v8::HandleScope scope(CcTest::isolate());
3970 Local<ObjectTemplate> global = ObjectTemplate::New(); 3970 Local<ObjectTemplate> global = ObjectTemplate::New();
3971 global->Set(v8_str("f"), v8::FunctionTemplate::New(HandleF)); 3971 global->Set(v8_str("f"), v8::FunctionTemplate::New(HandleF));
3972 LocalContext context(0, global); 3972 LocalContext context(0, global);
3973 3973
3974 const char* fun = "f()"; 3974 const char* fun = "f()";
3975 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>(); 3975 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>();
3976 CHECK_EQ(0, a0->Length()); 3976 CHECK_EQ(0, a0->Length());
3977 3977
3978 const char* fun2 = "f(11)"; 3978 const char* fun2 = "f(11)";
3979 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>(); 3979 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>();
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
4105 TEST(OutOfMemoryNested) { 4105 TEST(OutOfMemoryNested) {
4106 // It's not possible to read a snapshot into a heap with different dimensions. 4106 // It's not possible to read a snapshot into a heap with different dimensions.
4107 if (i::Snapshot::IsEnabled()) return; 4107 if (i::Snapshot::IsEnabled()) return;
4108 // Set heap limits. 4108 // Set heap limits.
4109 static const int K = 1024; 4109 static const int K = 1024;
4110 v8::ResourceConstraints constraints; 4110 v8::ResourceConstraints constraints;
4111 constraints.set_max_young_space_size(256 * K); 4111 constraints.set_max_young_space_size(256 * K);
4112 constraints.set_max_old_space_size(5 * K * K); 4112 constraints.set_max_old_space_size(5 * K * K);
4113 v8::SetResourceConstraints(&constraints); 4113 v8::SetResourceConstraints(&constraints);
4114 4114
4115 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4115 v8::HandleScope scope(CcTest::isolate());
4116 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4116 Local<ObjectTemplate> templ = ObjectTemplate::New();
4117 templ->Set(v8_str("ProvokeOutOfMemory"), 4117 templ->Set(v8_str("ProvokeOutOfMemory"),
4118 v8::FunctionTemplate::New(ProvokeOutOfMemory)); 4118 v8::FunctionTemplate::New(ProvokeOutOfMemory));
4119 LocalContext context(0, templ); 4119 LocalContext context(0, templ);
4120 v8::V8::IgnoreOutOfMemoryException(); 4120 v8::V8::IgnoreOutOfMemoryException();
4121 Local<Value> result = CompileRun( 4121 Local<Value> result = CompileRun(
4122 "var thrown = false;" 4122 "var thrown = false;"
4123 "try {" 4123 "try {"
4124 " ProvokeOutOfMemory();" 4124 " ProvokeOutOfMemory();"
4125 "} catch (e) {" 4125 "} catch (e) {"
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
4384 } 4384 }
4385 v8::HandleScope scope(args.GetIsolate()); 4385 v8::HandleScope scope(args.GetIsolate());
4386 v8::TryCatch try_catch; 4386 v8::TryCatch try_catch;
4387 Local<Value> result = v8::Script::Compile(args[0]->ToString())->Run(); 4387 Local<Value> result = v8::Script::Compile(args[0]->ToString())->Run();
4388 CHECK(!try_catch.HasCaught() || result.IsEmpty()); 4388 CHECK(!try_catch.HasCaught() || result.IsEmpty());
4389 args.GetReturnValue().Set(try_catch.HasCaught()); 4389 args.GetReturnValue().Set(try_catch.HasCaught());
4390 } 4390 }
4391 4391
4392 4392
4393 THREADED_TEST(APICatch) { 4393 THREADED_TEST(APICatch) {
4394 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4394 v8::HandleScope scope(CcTest::isolate());
4395 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4395 Local<ObjectTemplate> templ = ObjectTemplate::New();
4396 templ->Set(v8_str("ThrowFromC"), 4396 templ->Set(v8_str("ThrowFromC"),
4397 v8::FunctionTemplate::New(ThrowFromC)); 4397 v8::FunctionTemplate::New(ThrowFromC));
4398 LocalContext context(0, templ); 4398 LocalContext context(0, templ);
4399 CompileRun( 4399 CompileRun(
4400 "var thrown = false;" 4400 "var thrown = false;"
4401 "try {" 4401 "try {"
4402 " ThrowFromC();" 4402 " ThrowFromC();"
4403 "} catch (e) {" 4403 "} catch (e) {"
4404 " thrown = true;" 4404 " thrown = true;"
4405 "}"); 4405 "}");
4406 Local<Value> thrown = context->Global()->Get(v8_str("thrown")); 4406 Local<Value> thrown = context->Global()->Get(v8_str("thrown"));
4407 CHECK(thrown->BooleanValue()); 4407 CHECK(thrown->BooleanValue());
4408 } 4408 }
4409 4409
4410 4410
4411 THREADED_TEST(APIThrowTryCatch) { 4411 THREADED_TEST(APIThrowTryCatch) {
4412 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4412 v8::HandleScope scope(CcTest::isolate());
4413 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4413 Local<ObjectTemplate> templ = ObjectTemplate::New();
4414 templ->Set(v8_str("ThrowFromC"), 4414 templ->Set(v8_str("ThrowFromC"),
4415 v8::FunctionTemplate::New(ThrowFromC)); 4415 v8::FunctionTemplate::New(ThrowFromC));
4416 LocalContext context(0, templ); 4416 LocalContext context(0, templ);
4417 v8::TryCatch try_catch; 4417 v8::TryCatch try_catch;
4418 CompileRun("ThrowFromC();"); 4418 CompileRun("ThrowFromC();");
4419 CHECK(try_catch.HasCaught()); 4419 CHECK(try_catch.HasCaught());
4420 } 4420 }
4421 4421
4422 4422
4423 // Test that a try-finally block doesn't shadow a try-catch block 4423 // Test that a try-finally block doesn't shadow a try-catch block
4424 // when setting up an external handler. 4424 // when setting up an external handler.
4425 // 4425 //
4426 // BUG(271): Some of the exception propagation does not work on the 4426 // BUG(271): Some of the exception propagation does not work on the
4427 // ARM simulator because the simulator separates the C++ stack and the 4427 // ARM simulator because the simulator separates the C++ stack and the
4428 // JS stack. This test therefore fails on the simulator. The test is 4428 // JS stack. This test therefore fails on the simulator. The test is
4429 // not threaded to allow the threading tests to run on the simulator. 4429 // not threaded to allow the threading tests to run on the simulator.
4430 TEST(TryCatchInTryFinally) { 4430 TEST(TryCatchInTryFinally) {
4431 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4431 v8::HandleScope scope(CcTest::isolate());
4432 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4432 Local<ObjectTemplate> templ = ObjectTemplate::New();
4433 templ->Set(v8_str("CCatcher"), 4433 templ->Set(v8_str("CCatcher"),
4434 v8::FunctionTemplate::New(CCatcher)); 4434 v8::FunctionTemplate::New(CCatcher));
4435 LocalContext context(0, templ); 4435 LocalContext context(0, templ);
4436 Local<Value> result = CompileRun("try {" 4436 Local<Value> result = CompileRun("try {"
4437 " try {" 4437 " try {"
4438 " CCatcher('throw 7;');" 4438 " CCatcher('throw 7;');"
4439 " } finally {" 4439 " } finally {"
4440 " }" 4440 " }"
4441 "} catch (e) {" 4441 "} catch (e) {"
(...skipping 13 matching lines...) Expand all
4455 static void Fail(const v8::FunctionCallbackInfo<v8::Value>& args) { 4455 static void Fail(const v8::FunctionCallbackInfo<v8::Value>& args) {
4456 ApiTestFuzzer::Fuzz(); 4456 ApiTestFuzzer::Fuzz();
4457 CHECK(false); 4457 CHECK(false);
4458 } 4458 }
4459 4459
4460 4460
4461 // Test that overwritten methods are not invoked on uncaught exception 4461 // Test that overwritten methods are not invoked on uncaught exception
4462 // formatting. However, they are invoked when performing normal error 4462 // formatting. However, they are invoked when performing normal error
4463 // string conversions. 4463 // string conversions.
4464 TEST(APIThrowMessageOverwrittenToString) { 4464 TEST(APIThrowMessageOverwrittenToString) {
4465 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4465 v8::HandleScope scope(CcTest::isolate());
4466 v8::V8::AddMessageListener(check_reference_error_message); 4466 v8::V8::AddMessageListener(check_reference_error_message);
4467 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4467 Local<ObjectTemplate> templ = ObjectTemplate::New();
4468 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(Fail)); 4468 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(Fail));
4469 LocalContext context(NULL, templ); 4469 LocalContext context(NULL, templ);
4470 CompileRun("asdf;"); 4470 CompileRun("asdf;");
4471 CompileRun("var limit = {};" 4471 CompileRun("var limit = {};"
4472 "limit.valueOf = fail;" 4472 "limit.valueOf = fail;"
4473 "Error.stackTraceLimit = limit;"); 4473 "Error.stackTraceLimit = limit;");
4474 CompileRun("asdf"); 4474 CompileRun("asdf");
4475 CompileRun("Array.prototype.pop = fail;"); 4475 CompileRun("Array.prototype.pop = fail;");
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
4579 4579
4580 static void receive_message(v8::Handle<v8::Message> message, 4580 static void receive_message(v8::Handle<v8::Message> message,
4581 v8::Handle<v8::Value> data) { 4581 v8::Handle<v8::Value> data) {
4582 message->Get(); 4582 message->Get();
4583 message_received = true; 4583 message_received = true;
4584 } 4584 }
4585 4585
4586 4586
4587 TEST(APIThrowMessage) { 4587 TEST(APIThrowMessage) {
4588 message_received = false; 4588 message_received = false;
4589 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4589 v8::HandleScope scope(CcTest::isolate());
4590 v8::V8::AddMessageListener(receive_message); 4590 v8::V8::AddMessageListener(receive_message);
4591 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4591 Local<ObjectTemplate> templ = ObjectTemplate::New();
4592 templ->Set(v8_str("ThrowFromC"), 4592 templ->Set(v8_str("ThrowFromC"),
4593 v8::FunctionTemplate::New(ThrowFromC)); 4593 v8::FunctionTemplate::New(ThrowFromC));
4594 LocalContext context(0, templ); 4594 LocalContext context(0, templ);
4595 CompileRun("ThrowFromC();"); 4595 CompileRun("ThrowFromC();");
4596 CHECK(message_received); 4596 CHECK(message_received);
4597 v8::V8::RemoveMessageListeners(receive_message); 4597 v8::V8::RemoveMessageListeners(receive_message);
4598 } 4598 }
4599 4599
4600 4600
4601 TEST(APIThrowMessageAndVerboseTryCatch) { 4601 TEST(APIThrowMessageAndVerboseTryCatch) {
4602 message_received = false; 4602 message_received = false;
4603 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4603 v8::HandleScope scope(CcTest::isolate());
4604 v8::V8::AddMessageListener(receive_message); 4604 v8::V8::AddMessageListener(receive_message);
4605 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4605 Local<ObjectTemplate> templ = ObjectTemplate::New();
4606 templ->Set(v8_str("ThrowFromC"), 4606 templ->Set(v8_str("ThrowFromC"),
4607 v8::FunctionTemplate::New(ThrowFromC)); 4607 v8::FunctionTemplate::New(ThrowFromC));
4608 LocalContext context(0, templ); 4608 LocalContext context(0, templ);
4609 v8::TryCatch try_catch; 4609 v8::TryCatch try_catch;
4610 try_catch.SetVerbose(true); 4610 try_catch.SetVerbose(true);
4611 Local<Value> result = CompileRun("ThrowFromC();"); 4611 Local<Value> result = CompileRun("ThrowFromC();");
4612 CHECK(try_catch.HasCaught()); 4612 CHECK(try_catch.HasCaught());
4613 CHECK(result.IsEmpty()); 4613 CHECK(result.IsEmpty());
(...skipping 11 matching lines...) Expand all
4625 try_catch.SetVerbose(true); 4625 try_catch.SetVerbose(true);
4626 Local<Value> result = CompileRun("function foo() { foo(); } foo();"); 4626 Local<Value> result = CompileRun("function foo() { foo(); } foo();");
4627 CHECK(try_catch.HasCaught()); 4627 CHECK(try_catch.HasCaught());
4628 CHECK(result.IsEmpty()); 4628 CHECK(result.IsEmpty());
4629 CHECK(message_received); 4629 CHECK(message_received);
4630 v8::V8::RemoveMessageListeners(receive_message); 4630 v8::V8::RemoveMessageListeners(receive_message);
4631 } 4631 }
4632 4632
4633 4633
4634 THREADED_TEST(ExternalScriptException) { 4634 THREADED_TEST(ExternalScriptException) {
4635 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4635 v8::HandleScope scope(CcTest::isolate());
4636 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4636 Local<ObjectTemplate> templ = ObjectTemplate::New();
4637 templ->Set(v8_str("ThrowFromC"), 4637 templ->Set(v8_str("ThrowFromC"),
4638 v8::FunctionTemplate::New(ThrowFromC)); 4638 v8::FunctionTemplate::New(ThrowFromC));
4639 LocalContext context(0, templ); 4639 LocalContext context(0, templ);
4640 4640
4641 v8::TryCatch try_catch; 4641 v8::TryCatch try_catch;
4642 Local<Script> script 4642 Local<Script> script
4643 = Script::Compile(v8_str("ThrowFromC(); throw 'panama';")); 4643 = Script::Compile(v8_str("ThrowFromC(); throw 'panama';"));
4644 Local<Value> result = script->Run(); 4644 Local<Value> result = script->Run();
4645 CHECK(result.IsEmpty()); 4645 CHECK(result.IsEmpty());
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
4729 // 4729 //
4730 // Each entry is an activation, either JS or C. The index is the count at that 4730 // Each entry is an activation, either JS or C. The index is the count at that
4731 // level. Stars identify activations with exception handlers, the @ identifies 4731 // level. Stars identify activations with exception handlers, the @ identifies
4732 // the exception handler that should catch the exception. 4732 // the exception handler that should catch the exception.
4733 // 4733 //
4734 // BUG(271): Some of the exception propagation does not work on the 4734 // BUG(271): Some of the exception propagation does not work on the
4735 // ARM simulator because the simulator separates the C++ stack and the 4735 // ARM simulator because the simulator separates the C++ stack and the
4736 // JS stack. This test therefore fails on the simulator. The test is 4736 // JS stack. This test therefore fails on the simulator. The test is
4737 // not threaded to allow the threading tests to run on the simulator. 4737 // not threaded to allow the threading tests to run on the simulator.
4738 TEST(ExceptionOrder) { 4738 TEST(ExceptionOrder) {
4739 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4739 v8::HandleScope scope(CcTest::isolate());
4740 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4740 Local<ObjectTemplate> templ = ObjectTemplate::New();
4741 templ->Set(v8_str("check"), v8::FunctionTemplate::New(JSCheck)); 4741 templ->Set(v8_str("check"), v8::FunctionTemplate::New(JSCheck));
4742 templ->Set(v8_str("CThrowCountDown"), 4742 templ->Set(v8_str("CThrowCountDown"),
4743 v8::FunctionTemplate::New(CThrowCountDown)); 4743 v8::FunctionTemplate::New(CThrowCountDown));
4744 LocalContext context(0, templ); 4744 LocalContext context(0, templ);
4745 CompileRun( 4745 CompileRun(
4746 "function JSThrowCountDown(count, jsInterval, cInterval, expected) {" 4746 "function JSThrowCountDown(count, jsInterval, cInterval, expected) {"
4747 " if (count == 0) throw 'FromJS';" 4747 " if (count == 0) throw 'FromJS';"
4748 " if (count % jsInterval == 0) {" 4748 " if (count % jsInterval == 0) {"
4749 " try {" 4749 " try {"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
4793 4793
4794 4794
4795 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) { 4795 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) {
4796 ApiTestFuzzer::Fuzz(); 4796 ApiTestFuzzer::Fuzz();
4797 CHECK_EQ(1, args.Length()); 4797 CHECK_EQ(1, args.Length());
4798 v8::ThrowException(args[0]); 4798 v8::ThrowException(args[0]);
4799 } 4799 }
4800 4800
4801 4801
4802 THREADED_TEST(ThrowValues) { 4802 THREADED_TEST(ThrowValues) {
4803 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4803 v8::HandleScope scope(CcTest::isolate());
4804 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4804 Local<ObjectTemplate> templ = ObjectTemplate::New();
4805 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(ThrowValue)); 4805 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(ThrowValue));
4806 LocalContext context(0, templ); 4806 LocalContext context(0, templ);
4807 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( 4807 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun(
4808 "function Run(obj) {" 4808 "function Run(obj) {"
4809 " try {" 4809 " try {"
4810 " Throw(obj);" 4810 " Throw(obj);"
4811 " } catch (e) {" 4811 " } catch (e) {"
4812 " return e;" 4812 " return e;"
4813 " }" 4813 " }"
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
4931 try_catch.ReThrow(); 4931 try_catch.ReThrow();
4932 } 4932 }
4933 4933
4934 4934
4935 // This test ensures that an outer TryCatch in the following situation: 4935 // This test ensures that an outer TryCatch in the following situation:
4936 // C++/TryCatch -> JS -> C++/TryCatch -> JS w/ SyntaxError 4936 // C++/TryCatch -> JS -> C++/TryCatch -> JS w/ SyntaxError
4937 // does not clobber the Message object generated for the inner TryCatch. 4937 // does not clobber the Message object generated for the inner TryCatch.
4938 // This exercises the ability of TryCatch.ReThrow() to restore the 4938 // This exercises the ability of TryCatch.ReThrow() to restore the
4939 // inner pending Message before throwing the exception again. 4939 // inner pending Message before throwing the exception again.
4940 TEST(TryCatchMixedNesting) { 4940 TEST(TryCatchMixedNesting) {
4941 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4941 v8::HandleScope scope(CcTest::isolate());
4942 v8::V8::Initialize(); 4942 v8::V8::Initialize();
4943 v8::TryCatch try_catch; 4943 v8::TryCatch try_catch;
4944 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4944 Local<ObjectTemplate> templ = ObjectTemplate::New();
4945 templ->Set(v8_str("TryCatchMixedNestingHelper"), 4945 templ->Set(v8_str("TryCatchMixedNestingHelper"),
4946 v8::FunctionTemplate::New(TryCatchMixedNestingHelper)); 4946 v8::FunctionTemplate::New(TryCatchMixedNestingHelper));
4947 LocalContext context(0, templ); 4947 LocalContext context(0, templ);
4948 CompileRunWithOrigin("TryCatchMixedNestingHelper();\n", "outer", 1, 1); 4948 CompileRunWithOrigin("TryCatchMixedNestingHelper();\n", "outer", 1, 1);
4949 TryCatchMixedNestingCheck(&try_catch); 4949 TryCatchMixedNestingCheck(&try_catch);
4950 } 4950 }
4951 4951
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
5057 // Make sure that it is not possible to redefine again 5057 // Make sure that it is not possible to redefine again
5058 v8::TryCatch try_catch; 5058 v8::TryCatch try_catch;
5059 result = script_define->Run(); 5059 result = script_define->Run();
5060 CHECK(try_catch.HasCaught()); 5060 CHECK(try_catch.HasCaught());
5061 String::Utf8Value exception_value(try_catch.Exception()); 5061 String::Utf8Value exception_value(try_catch.Exception());
5062 CHECK_EQ(*exception_value, "TypeError: Cannot redefine property: x"); 5062 CHECK_EQ(*exception_value, "TypeError: Cannot redefine property: x");
5063 } 5063 }
5064 5064
5065 5065
5066 THREADED_TEST(DefinePropertyOnDefineGetterSetter) { 5066 THREADED_TEST(DefinePropertyOnDefineGetterSetter) {
5067 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5067 v8::HandleScope scope(CcTest::isolate());
5068 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5068 Local<ObjectTemplate> templ = ObjectTemplate::New();
5069 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); 5069 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"));
5070 LocalContext context; 5070 LocalContext context;
5071 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5071 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5072 5072
5073 Local<Script> script_desc = Script::Compile(v8_str("var prop =" 5073 Local<Script> script_desc = Script::Compile(v8_str("var prop ="
5074 "Object.getOwnPropertyDescriptor( " 5074 "Object.getOwnPropertyDescriptor( "
5075 "obj, 'x');" 5075 "obj, 'x');"
5076 "prop.configurable;")); 5076 "prop.configurable;"));
5077 Local<Value> result = script_desc->Run(); 5077 Local<Value> result = script_desc->Run();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5109 } 5109 }
5110 5110
5111 5111
5112 static v8::Handle<v8::Object> GetGlobalProperty(LocalContext* context, 5112 static v8::Handle<v8::Object> GetGlobalProperty(LocalContext* context,
5113 char const* name) { 5113 char const* name) {
5114 return v8::Handle<v8::Object>::Cast((*context)->Global()->Get(v8_str(name))); 5114 return v8::Handle<v8::Object>::Cast((*context)->Global()->Get(v8_str(name)));
5115 } 5115 }
5116 5116
5117 5117
5118 THREADED_TEST(DefineAPIAccessorOnObject) { 5118 THREADED_TEST(DefineAPIAccessorOnObject) {
5119 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5119 v8::HandleScope scope(CcTest::isolate());
5120 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5120 Local<ObjectTemplate> templ = ObjectTemplate::New();
5121 LocalContext context; 5121 LocalContext context;
5122 5122
5123 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 5123 context->Global()->Set(v8_str("obj1"), templ->NewInstance());
5124 CompileRun("var obj2 = {};"); 5124 CompileRun("var obj2 = {};");
5125 5125
5126 CHECK(CompileRun("obj1.x")->IsUndefined()); 5126 CHECK(CompileRun("obj1.x")->IsUndefined());
5127 CHECK(CompileRun("obj2.x")->IsUndefined()); 5127 CHECK(CompileRun("obj2.x")->IsUndefined());
5128 5128
5129 CHECK(GetGlobalProperty(&context, "obj1")-> 5129 CHECK(GetGlobalProperty(&context, "obj1")->
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
5183 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 5183 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")));
5184 CHECK(!GetGlobalProperty(&context, "obj2")-> 5184 CHECK(!GetGlobalProperty(&context, "obj2")->
5185 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 5185 SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")));
5186 5186
5187 ExpectString("obj1.x", "z"); 5187 ExpectString("obj1.x", "z");
5188 ExpectString("obj2.x", "z"); 5188 ExpectString("obj2.x", "z");
5189 } 5189 }
5190 5190
5191 5191
5192 THREADED_TEST(DontDeleteAPIAccessorsCannotBeOverriden) { 5192 THREADED_TEST(DontDeleteAPIAccessorsCannotBeOverriden) {
5193 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5193 v8::HandleScope scope(CcTest::isolate());
5194 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5194 Local<ObjectTemplate> templ = ObjectTemplate::New();
5195 LocalContext context; 5195 LocalContext context;
5196 5196
5197 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 5197 context->Global()->Set(v8_str("obj1"), templ->NewInstance());
5198 CompileRun("var obj2 = {};"); 5198 CompileRun("var obj2 = {};");
5199 5199
5200 CHECK(GetGlobalProperty(&context, "obj1")->SetAccessor( 5200 CHECK(GetGlobalProperty(&context, "obj1")->SetAccessor(
5201 v8_str("x"), 5201 v8_str("x"),
5202 GetXValue, NULL, 5202 GetXValue, NULL,
5203 v8_str("donut"), v8::DEFAULT, v8::DontDelete)); 5203 v8_str("donut"), v8::DEFAULT, v8::DontDelete));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
5239 static void Get239Value(Local<String> name, 5239 static void Get239Value(Local<String> name,
5240 const v8::PropertyCallbackInfo<v8::Value>& info) { 5240 const v8::PropertyCallbackInfo<v8::Value>& info) {
5241 ApiTestFuzzer::Fuzz(); 5241 ApiTestFuzzer::Fuzz();
5242 CHECK_EQ(info.Data(), v8_str("donut")); 5242 CHECK_EQ(info.Data(), v8_str("donut"));
5243 CHECK_EQ(name, v8_str("239")); 5243 CHECK_EQ(name, v8_str("239"));
5244 info.GetReturnValue().Set(name); 5244 info.GetReturnValue().Set(name);
5245 } 5245 }
5246 5246
5247 5247
5248 THREADED_TEST(ElementAPIAccessor) { 5248 THREADED_TEST(ElementAPIAccessor) {
5249 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5249 v8::HandleScope scope(CcTest::isolate());
5250 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5250 Local<ObjectTemplate> templ = ObjectTemplate::New();
5251 LocalContext context; 5251 LocalContext context;
5252 5252
5253 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 5253 context->Global()->Set(v8_str("obj1"), templ->NewInstance());
5254 CompileRun("var obj2 = {};"); 5254 CompileRun("var obj2 = {};");
5255 5255
5256 CHECK(GetGlobalProperty(&context, "obj1")->SetAccessor( 5256 CHECK(GetGlobalProperty(&context, "obj1")->SetAccessor(
5257 v8_str("239"), 5257 v8_str("239"),
5258 Get239Value, NULL, 5258 Get239Value, NULL,
5259 v8_str("donut"))); 5259 v8_str("donut")));
(...skipping 17 matching lines...) Expand all
5277 const v8::PropertyCallbackInfo<void>& info) { 5277 const v8::PropertyCallbackInfo<void>& info) {
5278 CHECK_EQ(value, v8_num(4)); 5278 CHECK_EQ(value, v8_num(4));
5279 CHECK_EQ(info.Data(), v8_str("donut")); 5279 CHECK_EQ(info.Data(), v8_str("donut"));
5280 CHECK_EQ(name, v8_str("x")); 5280 CHECK_EQ(name, v8_str("x"));
5281 CHECK(xValue.IsEmpty()); 5281 CHECK(xValue.IsEmpty());
5282 xValue.Reset(info.GetIsolate(), value); 5282 xValue.Reset(info.GetIsolate(), value);
5283 } 5283 }
5284 5284
5285 5285
5286 THREADED_TEST(SimplePropertyWrite) { 5286 THREADED_TEST(SimplePropertyWrite) {
5287 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5287 v8::HandleScope scope(CcTest::isolate());
5288 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5288 Local<ObjectTemplate> templ = ObjectTemplate::New();
5289 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); 5289 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut"));
5290 LocalContext context; 5290 LocalContext context;
5291 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5291 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5292 Local<Script> script = Script::Compile(v8_str("obj.x = 4")); 5292 Local<Script> script = Script::Compile(v8_str("obj.x = 4"));
5293 for (int i = 0; i < 10; i++) { 5293 for (int i = 0; i < 10; i++) {
5294 CHECK(xValue.IsEmpty()); 5294 CHECK(xValue.IsEmpty());
5295 script->Run(); 5295 script->Run();
5296 CHECK_EQ(v8_num(4), Local<Value>::New(v8::Isolate::GetCurrent(), xValue)); 5296 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue));
5297 xValue.Dispose(); 5297 xValue.Dispose();
5298 xValue.Clear(); 5298 xValue.Clear();
5299 } 5299 }
5300 } 5300 }
5301 5301
5302 5302
5303 THREADED_TEST(SetterOnly) { 5303 THREADED_TEST(SetterOnly) {
5304 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5304 v8::HandleScope scope(CcTest::isolate());
5305 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5305 Local<ObjectTemplate> templ = ObjectTemplate::New();
5306 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); 5306 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut"));
5307 LocalContext context; 5307 LocalContext context;
5308 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5308 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5309 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); 5309 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x"));
5310 for (int i = 0; i < 10; i++) { 5310 for (int i = 0; i < 10; i++) {
5311 CHECK(xValue.IsEmpty()); 5311 CHECK(xValue.IsEmpty());
5312 script->Run(); 5312 script->Run();
5313 CHECK_EQ(v8_num(4), Local<Value>::New(v8::Isolate::GetCurrent(), xValue)); 5313 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue));
5314 xValue.Dispose(); 5314 xValue.Dispose();
5315 xValue.Clear(); 5315 xValue.Clear();
5316 } 5316 }
5317 } 5317 }
5318 5318
5319 5319
5320 THREADED_TEST(NoAccessors) { 5320 THREADED_TEST(NoAccessors) {
5321 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5321 v8::HandleScope scope(CcTest::isolate());
5322 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5322 Local<ObjectTemplate> templ = ObjectTemplate::New();
5323 templ->SetAccessor(v8_str("x"), 5323 templ->SetAccessor(v8_str("x"),
5324 static_cast<v8::AccessorGetterCallback>(NULL), 5324 static_cast<v8::AccessorGetterCallback>(NULL),
5325 NULL, 5325 NULL,
5326 v8_str("donut")); 5326 v8_str("donut"));
5327 LocalContext context; 5327 LocalContext context;
5328 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5328 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5329 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); 5329 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x"));
5330 for (int i = 0; i < 10; i++) { 5330 for (int i = 0; i < 10; i++) {
5331 script->Run(); 5331 script->Run();
5332 } 5332 }
5333 } 5333 }
5334 5334
5335 5335
5336 static void XPropertyGetter(Local<String> property, 5336 static void XPropertyGetter(Local<String> property,
5337 const v8::PropertyCallbackInfo<v8::Value>& info) { 5337 const v8::PropertyCallbackInfo<v8::Value>& info) {
5338 ApiTestFuzzer::Fuzz(); 5338 ApiTestFuzzer::Fuzz();
5339 CHECK(info.Data()->IsUndefined()); 5339 CHECK(info.Data()->IsUndefined());
5340 info.GetReturnValue().Set(property); 5340 info.GetReturnValue().Set(property);
5341 } 5341 }
5342 5342
5343 5343
5344 THREADED_TEST(NamedInterceptorPropertyRead) { 5344 THREADED_TEST(NamedInterceptorPropertyRead) {
5345 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5345 v8::HandleScope scope(CcTest::isolate());
5346 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5346 Local<ObjectTemplate> templ = ObjectTemplate::New();
5347 templ->SetNamedPropertyHandler(XPropertyGetter); 5347 templ->SetNamedPropertyHandler(XPropertyGetter);
5348 LocalContext context; 5348 LocalContext context;
5349 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5349 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5350 Local<Script> script = Script::Compile(v8_str("obj.x")); 5350 Local<Script> script = Script::Compile(v8_str("obj.x"));
5351 for (int i = 0; i < 10; i++) { 5351 for (int i = 0; i < 10; i++) {
5352 Local<Value> result = script->Run(); 5352 Local<Value> result = script->Run();
5353 CHECK_EQ(result, v8_str("x")); 5353 CHECK_EQ(result, v8_str("x"));
5354 } 5354 }
5355 } 5355 }
5356 5356
5357 5357
5358 THREADED_TEST(NamedInterceptorDictionaryIC) { 5358 THREADED_TEST(NamedInterceptorDictionaryIC) {
5359 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5359 v8::HandleScope scope(CcTest::isolate());
5360 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5360 Local<ObjectTemplate> templ = ObjectTemplate::New();
5361 templ->SetNamedPropertyHandler(XPropertyGetter); 5361 templ->SetNamedPropertyHandler(XPropertyGetter);
5362 LocalContext context; 5362 LocalContext context;
5363 // Create an object with a named interceptor. 5363 // Create an object with a named interceptor.
5364 context->Global()->Set(v8_str("interceptor_obj"), templ->NewInstance()); 5364 context->Global()->Set(v8_str("interceptor_obj"), templ->NewInstance());
5365 Local<Script> script = Script::Compile(v8_str("interceptor_obj.x")); 5365 Local<Script> script = Script::Compile(v8_str("interceptor_obj.x"));
5366 for (int i = 0; i < 10; i++) { 5366 for (int i = 0; i < 10; i++) {
5367 Local<Value> result = script->Run(); 5367 Local<Value> result = script->Run();
5368 CHECK_EQ(result, v8_str("x")); 5368 CHECK_EQ(result, v8_str("x"));
5369 } 5369 }
5370 // Create a slow case object and a function accessing a property in 5370 // Create a slow case object and a function accessing a property in
5371 // that slow case object (with dictionary probing in generated 5371 // that slow case object (with dictionary probing in generated
5372 // code). Then force object with a named interceptor into slow-case, 5372 // code). Then force object with a named interceptor into slow-case,
5373 // pass it to the function, and check that the interceptor is called 5373 // pass it to the function, and check that the interceptor is called
5374 // instead of accessing the local property. 5374 // instead of accessing the local property.
5375 Local<Value> result = 5375 Local<Value> result =
5376 CompileRun("function get_x(o) { return o.x; };" 5376 CompileRun("function get_x(o) { return o.x; };"
5377 "var obj = { x : 42, y : 0 };" 5377 "var obj = { x : 42, y : 0 };"
5378 "delete obj.y;" 5378 "delete obj.y;"
5379 "for (var i = 0; i < 10; i++) get_x(obj);" 5379 "for (var i = 0; i < 10; i++) get_x(obj);"
5380 "interceptor_obj.x = 42;" 5380 "interceptor_obj.x = 42;"
5381 "interceptor_obj.y = 10;" 5381 "interceptor_obj.y = 10;"
5382 "delete interceptor_obj.y;" 5382 "delete interceptor_obj.y;"
5383 "get_x(interceptor_obj)"); 5383 "get_x(interceptor_obj)");
5384 CHECK_EQ(result, v8_str("x")); 5384 CHECK_EQ(result, v8_str("x"));
5385 } 5385 }
5386 5386
5387 5387
5388 THREADED_TEST(NamedInterceptorDictionaryICMultipleContext) { 5388 THREADED_TEST(NamedInterceptorDictionaryICMultipleContext) {
5389 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 5389 v8::Isolate* isolate = CcTest::isolate();
5390 v8::HandleScope scope(isolate); 5390 v8::HandleScope scope(isolate);
5391 v8::Local<Context> context1 = Context::New(isolate); 5391 v8::Local<Context> context1 = Context::New(isolate);
5392 5392
5393 context1->Enter(); 5393 context1->Enter();
5394 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5394 Local<ObjectTemplate> templ = ObjectTemplate::New();
5395 templ->SetNamedPropertyHandler(XPropertyGetter); 5395 templ->SetNamedPropertyHandler(XPropertyGetter);
5396 // Create an object with a named interceptor. 5396 // Create an object with a named interceptor.
5397 v8::Local<v8::Object> object = templ->NewInstance(); 5397 v8::Local<v8::Object> object = templ->NewInstance();
5398 context1->Global()->Set(v8_str("interceptor_obj"), object); 5398 context1->Global()->Set(v8_str("interceptor_obj"), object);
5399 5399
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5431 const v8::PropertyCallbackInfo<v8::Value>& info) { 5431 const v8::PropertyCallbackInfo<v8::Value>& info) {
5432 // Set x on the prototype object and do not handle the get request. 5432 // Set x on the prototype object and do not handle the get request.
5433 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); 5433 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype();
5434 proto.As<v8::Object>()->Set(v8_str("x"), v8::Integer::New(23)); 5434 proto.As<v8::Object>()->Set(v8_str("x"), v8::Integer::New(23));
5435 } 5435 }
5436 5436
5437 5437
5438 // This is a regression test for http://crbug.com/20104. Map 5438 // This is a regression test for http://crbug.com/20104. Map
5439 // transitions should not interfere with post interceptor lookup. 5439 // transitions should not interfere with post interceptor lookup.
5440 THREADED_TEST(NamedInterceptorMapTransitionRead) { 5440 THREADED_TEST(NamedInterceptorMapTransitionRead) {
5441 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5441 v8::HandleScope scope(CcTest::isolate());
5442 Local<v8::FunctionTemplate> function_template = v8::FunctionTemplate::New(); 5442 Local<v8::FunctionTemplate> function_template = v8::FunctionTemplate::New();
5443 Local<v8::ObjectTemplate> instance_template 5443 Local<v8::ObjectTemplate> instance_template
5444 = function_template->InstanceTemplate(); 5444 = function_template->InstanceTemplate();
5445 instance_template->SetNamedPropertyHandler(SetXOnPrototypeGetter); 5445 instance_template->SetNamedPropertyHandler(SetXOnPrototypeGetter);
5446 LocalContext context; 5446 LocalContext context;
5447 context->Global()->Set(v8_str("F"), function_template->GetFunction()); 5447 context->Global()->Set(v8_str("F"), function_template->GetFunction());
5448 // Create an instance of F and introduce a map transition for x. 5448 // Create an instance of F and introduce a map transition for x.
5449 CompileRun("var o = new F(); o.x = 23;"); 5449 CompileRun("var o = new F(); o.x = 23;");
5450 // Create an instance of F and invoke the getter. The result should be 23. 5450 // Create an instance of F and invoke the getter. The result should be 23.
5451 Local<Value> result = CompileRun("o = new F(); o.x"); 5451 Local<Value> result = CompileRun("o = new F(); o.x");
(...skipping 16 matching lines...) Expand all
5468 Local<Value> value, 5468 Local<Value> value,
5469 const v8::PropertyCallbackInfo<v8::Value>& info) { 5469 const v8::PropertyCallbackInfo<v8::Value>& info) {
5470 ApiTestFuzzer::Fuzz(); 5470 ApiTestFuzzer::Fuzz();
5471 if (index == 39) { 5471 if (index == 39) {
5472 info.GetReturnValue().Set(value); 5472 info.GetReturnValue().Set(value);
5473 } 5473 }
5474 } 5474 }
5475 5475
5476 5476
5477 THREADED_TEST(IndexedInterceptorWithIndexedAccessor) { 5477 THREADED_TEST(IndexedInterceptorWithIndexedAccessor) {
5478 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5478 v8::HandleScope scope(CcTest::isolate());
5479 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5479 Local<ObjectTemplate> templ = ObjectTemplate::New();
5480 templ->SetIndexedPropertyHandler(IndexedPropertyGetter, 5480 templ->SetIndexedPropertyHandler(IndexedPropertyGetter,
5481 IndexedPropertySetter); 5481 IndexedPropertySetter);
5482 LocalContext context; 5482 LocalContext context;
5483 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5483 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5484 Local<Script> getter_script = Script::Compile(v8_str( 5484 Local<Script> getter_script = Script::Compile(v8_str(
5485 "obj.__defineGetter__(\"3\", function(){return 5;});obj[3];")); 5485 "obj.__defineGetter__(\"3\", function(){return 5;});obj[3];"));
5486 Local<Script> setter_script = Script::Compile(v8_str( 5486 Local<Script> setter_script = Script::Compile(v8_str(
5487 "obj.__defineSetter__(\"17\", function(val){this.foo = val;});" 5487 "obj.__defineSetter__(\"17\", function(val){this.foo = val;});"
5488 "obj[17] = 23;" 5488 "obj[17] = 23;"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
5533 "for(i = 0; i < 80000; i++) { keys[i] = i; };" 5533 "for(i = 0; i < 80000; i++) { keys[i] = i; };"
5534 "keys.length = 25; keys;")); 5534 "keys.length = 25; keys;"));
5535 Local<Value> result = indexed_property_names_script->Run(); 5535 Local<Value> result = indexed_property_names_script->Run();
5536 info.GetReturnValue().Set(Local<v8::Array>::Cast(result)); 5536 info.GetReturnValue().Set(Local<v8::Array>::Cast(result));
5537 } 5537 }
5538 5538
5539 5539
5540 // Make sure that the the interceptor code in the runtime properly handles 5540 // Make sure that the the interceptor code in the runtime properly handles
5541 // merging property name lists for double-array-backed arrays. 5541 // merging property name lists for double-array-backed arrays.
5542 THREADED_TEST(IndexedInterceptorUnboxedDoubleWithIndexedAccessor) { 5542 THREADED_TEST(IndexedInterceptorUnboxedDoubleWithIndexedAccessor) {
5543 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5543 v8::HandleScope scope(CcTest::isolate());
5544 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5544 Local<ObjectTemplate> templ = ObjectTemplate::New();
5545 templ->SetIndexedPropertyHandler(UnboxedDoubleIndexedPropertyGetter, 5545 templ->SetIndexedPropertyHandler(UnboxedDoubleIndexedPropertyGetter,
5546 UnboxedDoubleIndexedPropertySetter, 5546 UnboxedDoubleIndexedPropertySetter,
5547 0, 5547 0,
5548 0, 5548 0,
5549 UnboxedDoubleIndexedPropertyEnumerator); 5549 UnboxedDoubleIndexedPropertyEnumerator);
5550 LocalContext context; 5550 LocalContext context;
5551 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5551 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5552 // When obj is created, force it to be Stored in a FastDoubleArray. 5552 // When obj is created, force it to be Stored in a FastDoubleArray.
5553 Local<Script> create_unboxed_double_script = Script::Compile(v8_str( 5553 Local<Script> create_unboxed_double_script = Script::Compile(v8_str(
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
5589 ApiTestFuzzer::Fuzz(); 5589 ApiTestFuzzer::Fuzz();
5590 if (index < 4) { 5590 if (index < 4) {
5591 info.GetReturnValue().Set(v8_num(index)); 5591 info.GetReturnValue().Set(v8_num(index));
5592 } 5592 }
5593 } 5593 }
5594 5594
5595 5595
5596 // Make sure that the the interceptor code in the runtime properly handles 5596 // Make sure that the the interceptor code in the runtime properly handles
5597 // merging property name lists for non-string arguments arrays. 5597 // merging property name lists for non-string arguments arrays.
5598 THREADED_TEST(IndexedInterceptorNonStrictArgsWithIndexedAccessor) { 5598 THREADED_TEST(IndexedInterceptorNonStrictArgsWithIndexedAccessor) {
5599 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5599 v8::HandleScope scope(CcTest::isolate());
5600 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5600 Local<ObjectTemplate> templ = ObjectTemplate::New();
5601 templ->SetIndexedPropertyHandler(NonStrictIndexedPropertyGetter, 5601 templ->SetIndexedPropertyHandler(NonStrictIndexedPropertyGetter,
5602 0, 5602 0,
5603 0, 5603 0,
5604 0, 5604 0,
5605 NonStrictArgsIndexedPropertyEnumerator); 5605 NonStrictArgsIndexedPropertyEnumerator);
5606 LocalContext context; 5606 LocalContext context;
5607 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5607 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5608 Local<Script> create_args_script = 5608 Local<Script> create_args_script =
5609 Script::Compile(v8_str( 5609 Script::Compile(v8_str(
5610 "var key_count = 0;" 5610 "var key_count = 0;"
5611 "for (x in obj) {key_count++;} key_count;")); 5611 "for (x in obj) {key_count++;} key_count;"));
5612 Local<Value> result = create_args_script->Run(); 5612 Local<Value> result = create_args_script->Run();
5613 CHECK_EQ(v8_num(4), result); 5613 CHECK_EQ(v8_num(4), result);
5614 } 5614 }
5615 5615
5616 5616
5617 static void IdentityIndexedPropertyGetter( 5617 static void IdentityIndexedPropertyGetter(
5618 uint32_t index, 5618 uint32_t index,
5619 const v8::PropertyCallbackInfo<v8::Value>& info) { 5619 const v8::PropertyCallbackInfo<v8::Value>& info) {
5620 info.GetReturnValue().Set(index); 5620 info.GetReturnValue().Set(index);
5621 } 5621 }
5622 5622
5623 5623
5624 THREADED_TEST(IndexedInterceptorWithGetOwnPropertyDescriptor) { 5624 THREADED_TEST(IndexedInterceptorWithGetOwnPropertyDescriptor) {
5625 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5625 v8::HandleScope scope(CcTest::isolate());
5626 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5626 Local<ObjectTemplate> templ = ObjectTemplate::New();
5627 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5627 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5628 5628
5629 LocalContext context; 5629 LocalContext context;
5630 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5630 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5631 5631
5632 // Check fast object case. 5632 // Check fast object case.
5633 const char* fast_case_code = 5633 const char* fast_case_code =
5634 "Object.getOwnPropertyDescriptor(obj, 0).value.toString()"; 5634 "Object.getOwnPropertyDescriptor(obj, 0).value.toString()";
5635 ExpectString(fast_case_code, "0"); 5635 ExpectString(fast_case_code, "0");
5636 5636
5637 // Check slow case. 5637 // Check slow case.
5638 const char* slow_case_code = 5638 const char* slow_case_code =
5639 "obj.x = 1; delete obj.x;" 5639 "obj.x = 1; delete obj.x;"
5640 "Object.getOwnPropertyDescriptor(obj, 1).value.toString()"; 5640 "Object.getOwnPropertyDescriptor(obj, 1).value.toString()";
5641 ExpectString(slow_case_code, "1"); 5641 ExpectString(slow_case_code, "1");
5642 } 5642 }
5643 5643
5644 5644
5645 THREADED_TEST(IndexedInterceptorWithNoSetter) { 5645 THREADED_TEST(IndexedInterceptorWithNoSetter) {
5646 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5646 v8::HandleScope scope(CcTest::isolate());
5647 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5647 Local<ObjectTemplate> templ = ObjectTemplate::New();
5648 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5648 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5649 5649
5650 LocalContext context; 5650 LocalContext context;
5651 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5651 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5652 5652
5653 const char* code = 5653 const char* code =
5654 "try {" 5654 "try {"
5655 " obj[0] = 239;" 5655 " obj[0] = 239;"
5656 " for (var i = 0; i < 100; i++) {" 5656 " for (var i = 0; i < 100; i++) {"
5657 " var v = obj[0];" 5657 " var v = obj[0];"
5658 " if (v != 0) throw 'Wrong value ' + v + ' at iteration ' + i;" 5658 " if (v != 0) throw 'Wrong value ' + v + ' at iteration ' + i;"
5659 " }" 5659 " }"
5660 " 'PASSED'" 5660 " 'PASSED'"
5661 "} catch(e) {" 5661 "} catch(e) {"
5662 " e" 5662 " e"
5663 "}"; 5663 "}";
5664 ExpectString(code, "PASSED"); 5664 ExpectString(code, "PASSED");
5665 } 5665 }
5666 5666
5667 5667
5668 THREADED_TEST(IndexedInterceptorWithAccessorCheck) { 5668 THREADED_TEST(IndexedInterceptorWithAccessorCheck) {
5669 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5669 v8::HandleScope scope(CcTest::isolate());
5670 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5670 Local<ObjectTemplate> templ = ObjectTemplate::New();
5671 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5671 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5672 5672
5673 LocalContext context; 5673 LocalContext context;
5674 Local<v8::Object> obj = templ->NewInstance(); 5674 Local<v8::Object> obj = templ->NewInstance();
5675 obj->TurnOnAccessCheck(); 5675 obj->TurnOnAccessCheck();
5676 context->Global()->Set(v8_str("obj"), obj); 5676 context->Global()->Set(v8_str("obj"), obj);
5677 5677
5678 const char* code = 5678 const char* code =
5679 "try {" 5679 "try {"
5680 " for (var i = 0; i < 100; i++) {" 5680 " for (var i = 0; i < 100; i++) {"
5681 " var v = obj[0];" 5681 " var v = obj[0];"
5682 " if (v != undefined) throw 'Wrong value ' + v + ' at iteration ' + i;" 5682 " if (v != undefined) throw 'Wrong value ' + v + ' at iteration ' + i;"
5683 " }" 5683 " }"
5684 " 'PASSED'" 5684 " 'PASSED'"
5685 "} catch(e) {" 5685 "} catch(e) {"
5686 " e" 5686 " e"
5687 "}"; 5687 "}";
5688 ExpectString(code, "PASSED"); 5688 ExpectString(code, "PASSED");
5689 } 5689 }
5690 5690
5691 5691
5692 THREADED_TEST(IndexedInterceptorWithAccessorCheckSwitchedOn) { 5692 THREADED_TEST(IndexedInterceptorWithAccessorCheckSwitchedOn) {
5693 i::FLAG_allow_natives_syntax = true; 5693 i::FLAG_allow_natives_syntax = true;
5694 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5694 v8::HandleScope scope(CcTest::isolate());
5695 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5695 Local<ObjectTemplate> templ = ObjectTemplate::New();
5696 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5696 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5697 5697
5698 LocalContext context; 5698 LocalContext context;
5699 Local<v8::Object> obj = templ->NewInstance(); 5699 Local<v8::Object> obj = templ->NewInstance();
5700 context->Global()->Set(v8_str("obj"), obj); 5700 context->Global()->Set(v8_str("obj"), obj);
5701 5701
5702 const char* code = 5702 const char* code =
5703 "try {" 5703 "try {"
5704 " for (var i = 0; i < 100; i++) {" 5704 " for (var i = 0; i < 100; i++) {"
5705 " var expected = i;" 5705 " var expected = i;"
5706 " if (i == 5) {" 5706 " if (i == 5) {"
5707 " %EnableAccessChecks(obj);" 5707 " %EnableAccessChecks(obj);"
5708 " expected = undefined;" 5708 " expected = undefined;"
5709 " }" 5709 " }"
5710 " var v = obj[i];" 5710 " var v = obj[i];"
5711 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" 5711 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
5712 " if (i == 5) %DisableAccessChecks(obj);" 5712 " if (i == 5) %DisableAccessChecks(obj);"
5713 " }" 5713 " }"
5714 " 'PASSED'" 5714 " 'PASSED'"
5715 "} catch(e) {" 5715 "} catch(e) {"
5716 " e" 5716 " e"
5717 "}"; 5717 "}";
5718 ExpectString(code, "PASSED"); 5718 ExpectString(code, "PASSED");
5719 } 5719 }
5720 5720
5721 5721
5722 THREADED_TEST(IndexedInterceptorWithDifferentIndices) { 5722 THREADED_TEST(IndexedInterceptorWithDifferentIndices) {
5723 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5723 v8::HandleScope scope(CcTest::isolate());
5724 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5724 Local<ObjectTemplate> templ = ObjectTemplate::New();
5725 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5725 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5726 5726
5727 LocalContext context; 5727 LocalContext context;
5728 Local<v8::Object> obj = templ->NewInstance(); 5728 Local<v8::Object> obj = templ->NewInstance();
5729 context->Global()->Set(v8_str("obj"), obj); 5729 context->Global()->Set(v8_str("obj"), obj);
5730 5730
5731 const char* code = 5731 const char* code =
5732 "try {" 5732 "try {"
5733 " for (var i = 0; i < 100; i++) {" 5733 " for (var i = 0; i < 100; i++) {"
5734 " var v = obj[i];" 5734 " var v = obj[i];"
5735 " if (v != i) throw 'Wrong value ' + v + ' at iteration ' + i;" 5735 " if (v != i) throw 'Wrong value ' + v + ' at iteration ' + i;"
5736 " }" 5736 " }"
5737 " 'PASSED'" 5737 " 'PASSED'"
5738 "} catch(e) {" 5738 "} catch(e) {"
5739 " e" 5739 " e"
5740 "}"; 5740 "}";
5741 ExpectString(code, "PASSED"); 5741 ExpectString(code, "PASSED");
5742 } 5742 }
5743 5743
5744 5744
5745 THREADED_TEST(IndexedInterceptorWithNegativeIndices) { 5745 THREADED_TEST(IndexedInterceptorWithNegativeIndices) {
5746 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5746 v8::HandleScope scope(CcTest::isolate());
5747 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5747 Local<ObjectTemplate> templ = ObjectTemplate::New();
5748 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5748 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5749 5749
5750 LocalContext context; 5750 LocalContext context;
5751 Local<v8::Object> obj = templ->NewInstance(); 5751 Local<v8::Object> obj = templ->NewInstance();
5752 context->Global()->Set(v8_str("obj"), obj); 5752 context->Global()->Set(v8_str("obj"), obj);
5753 5753
5754 const char* code = 5754 const char* code =
5755 "try {" 5755 "try {"
5756 " for (var i = 0; i < 100; i++) {" 5756 " for (var i = 0; i < 100; i++) {"
(...skipping 18 matching lines...) Expand all
5775 " }" 5775 " }"
5776 " 'PASSED'" 5776 " 'PASSED'"
5777 "} catch(e) {" 5777 "} catch(e) {"
5778 " e" 5778 " e"
5779 "}"; 5779 "}";
5780 ExpectString(code, "PASSED"); 5780 ExpectString(code, "PASSED");
5781 } 5781 }
5782 5782
5783 5783
5784 THREADED_TEST(IndexedInterceptorWithNotSmiLookup) { 5784 THREADED_TEST(IndexedInterceptorWithNotSmiLookup) {
5785 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5785 v8::HandleScope scope(CcTest::isolate());
5786 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5786 Local<ObjectTemplate> templ = ObjectTemplate::New();
5787 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5787 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5788 5788
5789 LocalContext context; 5789 LocalContext context;
5790 Local<v8::Object> obj = templ->NewInstance(); 5790 Local<v8::Object> obj = templ->NewInstance();
5791 context->Global()->Set(v8_str("obj"), obj); 5791 context->Global()->Set(v8_str("obj"), obj);
5792 5792
5793 const char* code = 5793 const char* code =
5794 "try {" 5794 "try {"
5795 " for (var i = 0; i < 100; i++) {" 5795 " for (var i = 0; i < 100; i++) {"
5796 " var expected = i;" 5796 " var expected = i;"
5797 " var key = i;" 5797 " var key = i;"
5798 " if (i == 50) {" 5798 " if (i == 50) {"
5799 " key = 'foobar';" 5799 " key = 'foobar';"
5800 " expected = undefined;" 5800 " expected = undefined;"
5801 " }" 5801 " }"
5802 " var v = obj[key];" 5802 " var v = obj[key];"
5803 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" 5803 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
5804 " }" 5804 " }"
5805 " 'PASSED'" 5805 " 'PASSED'"
5806 "} catch(e) {" 5806 "} catch(e) {"
5807 " e" 5807 " e"
5808 "}"; 5808 "}";
5809 ExpectString(code, "PASSED"); 5809 ExpectString(code, "PASSED");
5810 } 5810 }
5811 5811
5812 5812
5813 THREADED_TEST(IndexedInterceptorGoingMegamorphic) { 5813 THREADED_TEST(IndexedInterceptorGoingMegamorphic) {
5814 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5814 v8::HandleScope scope(CcTest::isolate());
5815 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5815 Local<ObjectTemplate> templ = ObjectTemplate::New();
5816 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5816 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5817 5817
5818 LocalContext context; 5818 LocalContext context;
5819 Local<v8::Object> obj = templ->NewInstance(); 5819 Local<v8::Object> obj = templ->NewInstance();
5820 context->Global()->Set(v8_str("obj"), obj); 5820 context->Global()->Set(v8_str("obj"), obj);
5821 5821
5822 const char* code = 5822 const char* code =
5823 "var original = obj;" 5823 "var original = obj;"
5824 "try {" 5824 "try {"
5825 " for (var i = 0; i < 100; i++) {" 5825 " for (var i = 0; i < 100; i++) {"
5826 " var expected = i;" 5826 " var expected = i;"
5827 " if (i == 50) {" 5827 " if (i == 50) {"
5828 " obj = {50: 'foobar'};" 5828 " obj = {50: 'foobar'};"
5829 " expected = 'foobar';" 5829 " expected = 'foobar';"
5830 " }" 5830 " }"
5831 " var v = obj[i];" 5831 " var v = obj[i];"
5832 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" 5832 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
5833 " if (i == 50) obj = original;" 5833 " if (i == 50) obj = original;"
5834 " }" 5834 " }"
5835 " 'PASSED'" 5835 " 'PASSED'"
5836 "} catch(e) {" 5836 "} catch(e) {"
5837 " e" 5837 " e"
5838 "}"; 5838 "}";
5839 ExpectString(code, "PASSED"); 5839 ExpectString(code, "PASSED");
5840 } 5840 }
5841 5841
5842 5842
5843 THREADED_TEST(IndexedInterceptorReceiverTurningSmi) { 5843 THREADED_TEST(IndexedInterceptorReceiverTurningSmi) {
5844 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5844 v8::HandleScope scope(CcTest::isolate());
5845 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5845 Local<ObjectTemplate> templ = ObjectTemplate::New();
5846 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5846 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5847 5847
5848 LocalContext context; 5848 LocalContext context;
5849 Local<v8::Object> obj = templ->NewInstance(); 5849 Local<v8::Object> obj = templ->NewInstance();
5850 context->Global()->Set(v8_str("obj"), obj); 5850 context->Global()->Set(v8_str("obj"), obj);
5851 5851
5852 const char* code = 5852 const char* code =
5853 "var original = obj;" 5853 "var original = obj;"
5854 "try {" 5854 "try {"
5855 " for (var i = 0; i < 100; i++) {" 5855 " for (var i = 0; i < 100; i++) {"
5856 " var expected = i;" 5856 " var expected = i;"
5857 " if (i == 5) {" 5857 " if (i == 5) {"
5858 " obj = 239;" 5858 " obj = 239;"
5859 " expected = undefined;" 5859 " expected = undefined;"
5860 " }" 5860 " }"
5861 " var v = obj[i];" 5861 " var v = obj[i];"
5862 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" 5862 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
5863 " if (i == 5) obj = original;" 5863 " if (i == 5) obj = original;"
5864 " }" 5864 " }"
5865 " 'PASSED'" 5865 " 'PASSED'"
5866 "} catch(e) {" 5866 "} catch(e) {"
5867 " e" 5867 " e"
5868 "}"; 5868 "}";
5869 ExpectString(code, "PASSED"); 5869 ExpectString(code, "PASSED");
5870 } 5870 }
5871 5871
5872 5872
5873 THREADED_TEST(IndexedInterceptorOnProto) { 5873 THREADED_TEST(IndexedInterceptorOnProto) {
5874 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5874 v8::HandleScope scope(CcTest::isolate());
5875 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5875 Local<ObjectTemplate> templ = ObjectTemplate::New();
5876 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); 5876 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
5877 5877
5878 LocalContext context; 5878 LocalContext context;
5879 Local<v8::Object> obj = templ->NewInstance(); 5879 Local<v8::Object> obj = templ->NewInstance();
5880 context->Global()->Set(v8_str("obj"), obj); 5880 context->Global()->Set(v8_str("obj"), obj);
5881 5881
5882 const char* code = 5882 const char* code =
5883 "var o = {__proto__: obj};" 5883 "var o = {__proto__: obj};"
5884 "try {" 5884 "try {"
5885 " for (var i = 0; i < 100; i++) {" 5885 " for (var i = 0; i < 100; i++) {"
5886 " var v = o[i];" 5886 " var v = o[i];"
5887 " if (v != i) throw 'Wrong value ' + v + ' at iteration ' + i;" 5887 " if (v != i) throw 'Wrong value ' + v + ' at iteration ' + i;"
5888 " }" 5888 " }"
5889 " 'PASSED'" 5889 " 'PASSED'"
5890 "} catch(e) {" 5890 "} catch(e) {"
5891 " e" 5891 " e"
5892 "}"; 5892 "}";
5893 ExpectString(code, "PASSED"); 5893 ExpectString(code, "PASSED");
5894 } 5894 }
5895 5895
5896 5896
5897 THREADED_TEST(MultiContexts) { 5897 THREADED_TEST(MultiContexts) {
5898 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5898 v8::HandleScope scope(CcTest::isolate());
5899 v8::Handle<ObjectTemplate> templ = ObjectTemplate::New(); 5899 v8::Handle<ObjectTemplate> templ = ObjectTemplate::New();
5900 templ->Set(v8_str("dummy"), v8::FunctionTemplate::New(DummyCallHandler)); 5900 templ->Set(v8_str("dummy"), v8::FunctionTemplate::New(DummyCallHandler));
5901 5901
5902 Local<String> password = v8_str("Password"); 5902 Local<String> password = v8_str("Password");
5903 5903
5904 // Create an environment 5904 // Create an environment
5905 LocalContext context0(0, templ); 5905 LocalContext context0(0, templ);
5906 context0->SetSecurityToken(password); 5906 context0->SetSecurityToken(password);
5907 v8::Handle<v8::Object> global0 = context0->Global(); 5907 v8::Handle<v8::Object> global0 = context0->Global();
5908 global0->Set(v8_str("custom"), v8_num(1234)); 5908 global0->Set(v8_str("custom"), v8_num(1234));
(...skipping 15 matching lines...) Expand all
5924 CHECK_EQ(global1, global2); 5924 CHECK_EQ(global1, global2);
5925 CHECK_EQ(0, global1->Get(v8_str("custom"))->Int32Value()); 5925 CHECK_EQ(0, global1->Get(v8_str("custom"))->Int32Value());
5926 CHECK_EQ(0, global2->Get(v8_str("custom"))->Int32Value()); 5926 CHECK_EQ(0, global2->Get(v8_str("custom"))->Int32Value());
5927 } 5927 }
5928 5928
5929 5929
5930 THREADED_TEST(FunctionPrototypeAcrossContexts) { 5930 THREADED_TEST(FunctionPrototypeAcrossContexts) {
5931 // Make sure that functions created by cloning boilerplates cannot 5931 // Make sure that functions created by cloning boilerplates cannot
5932 // communicate through their __proto__ field. 5932 // communicate through their __proto__ field.
5933 5933
5934 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5934 v8::HandleScope scope(CcTest::isolate());
5935 5935
5936 LocalContext env0; 5936 LocalContext env0;
5937 v8::Handle<v8::Object> global0 = 5937 v8::Handle<v8::Object> global0 =
5938 env0->Global(); 5938 env0->Global();
5939 v8::Handle<v8::Object> object0 = 5939 v8::Handle<v8::Object> object0 =
5940 global0->Get(v8_str("Object")).As<v8::Object>(); 5940 global0->Get(v8_str("Object")).As<v8::Object>();
5941 v8::Handle<v8::Object> tostring0 = 5941 v8::Handle<v8::Object> tostring0 =
5942 object0->Get(v8_str("toString")).As<v8::Object>(); 5942 object0->Get(v8_str("toString")).As<v8::Object>();
5943 v8::Handle<v8::Object> proto0 = 5943 v8::Handle<v8::Object> proto0 =
5944 tostring0->Get(v8_str("__proto__")).As<v8::Object>(); 5944 tostring0->Get(v8_str("__proto__")).As<v8::Object>();
(...skipping 12 matching lines...) Expand all
5957 } 5957 }
5958 5958
5959 5959
5960 THREADED_TEST(Regress892105) { 5960 THREADED_TEST(Regress892105) {
5961 // Make sure that object and array literals created by cloning 5961 // Make sure that object and array literals created by cloning
5962 // boilerplates cannot communicate through their __proto__ 5962 // boilerplates cannot communicate through their __proto__
5963 // field. This is rather difficult to check, but we try to add stuff 5963 // field. This is rather difficult to check, but we try to add stuff
5964 // to Object.prototype and Array.prototype and create a new 5964 // to Object.prototype and Array.prototype and create a new
5965 // environment. This should succeed. 5965 // environment. This should succeed.
5966 5966
5967 v8::HandleScope scope(v8::Isolate::GetCurrent()); 5967 v8::HandleScope scope(CcTest::isolate());
5968 5968
5969 Local<String> source = v8_str("Object.prototype.obj = 1234;" 5969 Local<String> source = v8_str("Object.prototype.obj = 1234;"
5970 "Array.prototype.arr = 4567;" 5970 "Array.prototype.arr = 4567;"
5971 "8901"); 5971 "8901");
5972 5972
5973 LocalContext env0; 5973 LocalContext env0;
5974 Local<Script> script0 = Script::Compile(source); 5974 Local<Script> script0 = Script::Compile(source);
5975 CHECK_EQ(8901.0, script0->Run()->NumberValue()); 5975 CHECK_EQ(8901.0, script0->Run()->NumberValue());
5976 5976
5977 LocalContext env1; 5977 LocalContext env1;
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
6188 } 6188 }
6189 6189
6190 6190
6191 static void HandleLogDelegator( 6191 static void HandleLogDelegator(
6192 const v8::FunctionCallbackInfo<v8::Value>& args) { 6192 const v8::FunctionCallbackInfo<v8::Value>& args) {
6193 ApiTestFuzzer::Fuzz(); 6193 ApiTestFuzzer::Fuzz();
6194 } 6194 }
6195 6195
6196 6196
6197 THREADED_TEST(GlobalObjectTemplate) { 6197 THREADED_TEST(GlobalObjectTemplate) {
6198 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 6198 v8::Isolate* isolate = CcTest::isolate();
6199 v8::HandleScope handle_scope(isolate); 6199 v8::HandleScope handle_scope(isolate);
6200 Local<ObjectTemplate> global_template = ObjectTemplate::New(); 6200 Local<ObjectTemplate> global_template = ObjectTemplate::New();
6201 global_template->Set(v8_str("JSNI_Log"), 6201 global_template->Set(v8_str("JSNI_Log"),
6202 v8::FunctionTemplate::New(HandleLogDelegator)); 6202 v8::FunctionTemplate::New(HandleLogDelegator));
6203 v8::Local<Context> context = Context::New(isolate, 0, global_template); 6203 v8::Local<Context> context = Context::New(isolate, 0, global_template);
6204 Context::Scope context_scope(context); 6204 Context::Scope context_scope(context);
6205 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); 6205 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run();
6206 } 6206 }
6207 6207
6208 6208
6209 static const char* kSimpleExtensionSource = 6209 static const char* kSimpleExtensionSource =
6210 "function Foo() {" 6210 "function Foo() {"
6211 " return 4;" 6211 " return 4;"
6212 "}"; 6212 "}";
6213 6213
6214 6214
6215 THREADED_TEST(SimpleExtensions) { 6215 THREADED_TEST(SimpleExtensions) {
6216 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6216 v8::HandleScope handle_scope(CcTest::isolate());
6217 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource)); 6217 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource));
6218 const char* extension_names[] = { "simpletest" }; 6218 const char* extension_names[] = { "simpletest" };
6219 v8::ExtensionConfiguration extensions(1, extension_names); 6219 v8::ExtensionConfiguration extensions(1, extension_names);
6220 v8::Handle<Context> context = 6220 v8::Handle<Context> context =
6221 Context::New(v8::Isolate::GetCurrent(), &extensions); 6221 Context::New(CcTest::isolate(), &extensions);
6222 Context::Scope lock(context); 6222 Context::Scope lock(context);
6223 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); 6223 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run();
6224 CHECK_EQ(result, v8::Integer::New(4)); 6224 CHECK_EQ(result, v8::Integer::New(4));
6225 } 6225 }
6226 6226
6227 6227
6228 THREADED_TEST(NullExtensions) { 6228 THREADED_TEST(NullExtensions) {
6229 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6229 v8::HandleScope handle_scope(CcTest::isolate());
6230 v8::RegisterExtension(new Extension("nulltest", NULL)); 6230 v8::RegisterExtension(new Extension("nulltest", NULL));
6231 const char* extension_names[] = { "nulltest" }; 6231 const char* extension_names[] = { "nulltest" };
6232 v8::ExtensionConfiguration extensions(1, extension_names); 6232 v8::ExtensionConfiguration extensions(1, extension_names);
6233 v8::Handle<Context> context = 6233 v8::Handle<Context> context =
6234 Context::New(v8::Isolate::GetCurrent(), &extensions); 6234 Context::New(CcTest::isolate(), &extensions);
6235 Context::Scope lock(context); 6235 Context::Scope lock(context);
6236 v8::Handle<Value> result = Script::Compile(v8_str("1+3"))->Run(); 6236 v8::Handle<Value> result = Script::Compile(v8_str("1+3"))->Run();
6237 CHECK_EQ(result, v8::Integer::New(4)); 6237 CHECK_EQ(result, v8::Integer::New(4));
6238 } 6238 }
6239 6239
6240 6240
6241 static const char* kEmbeddedExtensionSource = 6241 static const char* kEmbeddedExtensionSource =
6242 "function Ret54321(){return 54321;}~~@@$" 6242 "function Ret54321(){return 54321;}~~@@$"
6243 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS."; 6243 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS.";
6244 static const int kEmbeddedExtensionSourceValidLen = 34; 6244 static const int kEmbeddedExtensionSourceValidLen = 34;
6245 6245
6246 6246
6247 THREADED_TEST(ExtensionMissingSourceLength) { 6247 THREADED_TEST(ExtensionMissingSourceLength) {
6248 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6248 v8::HandleScope handle_scope(CcTest::isolate());
6249 v8::RegisterExtension(new Extension("srclentest_fail", 6249 v8::RegisterExtension(new Extension("srclentest_fail",
6250 kEmbeddedExtensionSource)); 6250 kEmbeddedExtensionSource));
6251 const char* extension_names[] = { "srclentest_fail" }; 6251 const char* extension_names[] = { "srclentest_fail" };
6252 v8::ExtensionConfiguration extensions(1, extension_names); 6252 v8::ExtensionConfiguration extensions(1, extension_names);
6253 v8::Handle<Context> context = 6253 v8::Handle<Context> context =
6254 Context::New(v8::Isolate::GetCurrent(), &extensions); 6254 Context::New(CcTest::isolate(), &extensions);
6255 CHECK_EQ(0, *context); 6255 CHECK_EQ(0, *context);
6256 } 6256 }
6257 6257
6258 6258
6259 THREADED_TEST(ExtensionWithSourceLength) { 6259 THREADED_TEST(ExtensionWithSourceLength) {
6260 for (int source_len = kEmbeddedExtensionSourceValidLen - 1; 6260 for (int source_len = kEmbeddedExtensionSourceValidLen - 1;
6261 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) { 6261 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) {
6262 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6262 v8::HandleScope handle_scope(CcTest::isolate());
6263 i::ScopedVector<char> extension_name(32); 6263 i::ScopedVector<char> extension_name(32);
6264 i::OS::SNPrintF(extension_name, "ext #%d", source_len); 6264 i::OS::SNPrintF(extension_name, "ext #%d", source_len);
6265 v8::RegisterExtension(new Extension(extension_name.start(), 6265 v8::RegisterExtension(new Extension(extension_name.start(),
6266 kEmbeddedExtensionSource, 0, 0, 6266 kEmbeddedExtensionSource, 0, 0,
6267 source_len)); 6267 source_len));
6268 const char* extension_names[1] = { extension_name.start() }; 6268 const char* extension_names[1] = { extension_name.start() };
6269 v8::ExtensionConfiguration extensions(1, extension_names); 6269 v8::ExtensionConfiguration extensions(1, extension_names);
6270 v8::Handle<Context> context = 6270 v8::Handle<Context> context =
6271 Context::New(v8::Isolate::GetCurrent(), &extensions); 6271 Context::New(CcTest::isolate(), &extensions);
6272 if (source_len == kEmbeddedExtensionSourceValidLen) { 6272 if (source_len == kEmbeddedExtensionSourceValidLen) {
6273 Context::Scope lock(context); 6273 Context::Scope lock(context);
6274 v8::Handle<Value> result = Script::Compile(v8_str("Ret54321()"))->Run(); 6274 v8::Handle<Value> result = Script::Compile(v8_str("Ret54321()"))->Run();
6275 CHECK_EQ(v8::Integer::New(54321), result); 6275 CHECK_EQ(v8::Integer::New(54321), result);
6276 } else { 6276 } else {
6277 // Anything but exactly the right length should fail to compile. 6277 // Anything but exactly the right length should fail to compile.
6278 CHECK_EQ(0, *context); 6278 CHECK_EQ(0, *context);
6279 } 6279 }
6280 } 6280 }
6281 } 6281 }
(...skipping 10 matching lines...) Expand all
6292 "(function() {" 6292 "(function() {"
6293 " var x = 42;" 6293 " var x = 42;"
6294 " function e() {" 6294 " function e() {"
6295 " return eval('x');" 6295 " return eval('x');"
6296 " }" 6296 " }"
6297 " this.UseEval2 = e;" 6297 " this.UseEval2 = e;"
6298 "})()"; 6298 "})()";
6299 6299
6300 6300
6301 THREADED_TEST(UseEvalFromExtension) { 6301 THREADED_TEST(UseEvalFromExtension) {
6302 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6302 v8::HandleScope handle_scope(CcTest::isolate());
6303 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); 6303 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1));
6304 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); 6304 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2));
6305 const char* extension_names[] = { "evaltest1", "evaltest2" }; 6305 const char* extension_names[] = { "evaltest1", "evaltest2" };
6306 v8::ExtensionConfiguration extensions(2, extension_names); 6306 v8::ExtensionConfiguration extensions(2, extension_names);
6307 v8::Handle<Context> context = 6307 v8::Handle<Context> context =
6308 Context::New(v8::Isolate::GetCurrent(), &extensions); 6308 Context::New(CcTest::isolate(), &extensions);
6309 Context::Scope lock(context); 6309 Context::Scope lock(context);
6310 v8::Handle<Value> result = Script::Compile(v8_str("UseEval1()"))->Run(); 6310 v8::Handle<Value> result = Script::Compile(v8_str("UseEval1()"))->Run();
6311 CHECK_EQ(result, v8::Integer::New(42)); 6311 CHECK_EQ(result, v8::Integer::New(42));
6312 result = Script::Compile(v8_str("UseEval2()"))->Run(); 6312 result = Script::Compile(v8_str("UseEval2()"))->Run();
6313 CHECK_EQ(result, v8::Integer::New(42)); 6313 CHECK_EQ(result, v8::Integer::New(42));
6314 } 6314 }
6315 6315
6316 6316
6317 static const char* kWithExtensionSource1 = 6317 static const char* kWithExtensionSource1 =
6318 "function UseWith1() {" 6318 "function UseWith1() {"
6319 " var x = 42;" 6319 " var x = 42;"
6320 " with({x:87}) { return x; }" 6320 " with({x:87}) { return x; }"
6321 "}"; 6321 "}";
6322 6322
6323 6323
6324 6324
6325 static const char* kWithExtensionSource2 = 6325 static const char* kWithExtensionSource2 =
6326 "(function() {" 6326 "(function() {"
6327 " var x = 42;" 6327 " var x = 42;"
6328 " function e() {" 6328 " function e() {"
6329 " with ({x:87}) { return x; }" 6329 " with ({x:87}) { return x; }"
6330 " }" 6330 " }"
6331 " this.UseWith2 = e;" 6331 " this.UseWith2 = e;"
6332 "})()"; 6332 "})()";
6333 6333
6334 6334
6335 THREADED_TEST(UseWithFromExtension) { 6335 THREADED_TEST(UseWithFromExtension) {
6336 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6336 v8::HandleScope handle_scope(CcTest::isolate());
6337 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); 6337 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1));
6338 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); 6338 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2));
6339 const char* extension_names[] = { "withtest1", "withtest2" }; 6339 const char* extension_names[] = { "withtest1", "withtest2" };
6340 v8::ExtensionConfiguration extensions(2, extension_names); 6340 v8::ExtensionConfiguration extensions(2, extension_names);
6341 v8::Handle<Context> context = 6341 v8::Handle<Context> context =
6342 Context::New(v8::Isolate::GetCurrent(), &extensions); 6342 Context::New(CcTest::isolate(), &extensions);
6343 Context::Scope lock(context); 6343 Context::Scope lock(context);
6344 v8::Handle<Value> result = Script::Compile(v8_str("UseWith1()"))->Run(); 6344 v8::Handle<Value> result = Script::Compile(v8_str("UseWith1()"))->Run();
6345 CHECK_EQ(result, v8::Integer::New(87)); 6345 CHECK_EQ(result, v8::Integer::New(87));
6346 result = Script::Compile(v8_str("UseWith2()"))->Run(); 6346 result = Script::Compile(v8_str("UseWith2()"))->Run();
6347 CHECK_EQ(result, v8::Integer::New(87)); 6347 CHECK_EQ(result, v8::Integer::New(87));
6348 } 6348 }
6349 6349
6350 6350
6351 THREADED_TEST(AutoExtensions) { 6351 THREADED_TEST(AutoExtensions) {
6352 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6352 v8::HandleScope handle_scope(CcTest::isolate());
6353 Extension* extension = new Extension("autotest", kSimpleExtensionSource); 6353 Extension* extension = new Extension("autotest", kSimpleExtensionSource);
6354 extension->set_auto_enable(true); 6354 extension->set_auto_enable(true);
6355 v8::RegisterExtension(extension); 6355 v8::RegisterExtension(extension);
6356 v8::Handle<Context> context = 6356 v8::Handle<Context> context =
6357 Context::New(v8::Isolate::GetCurrent()); 6357 Context::New(CcTest::isolate());
6358 Context::Scope lock(context); 6358 Context::Scope lock(context);
6359 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); 6359 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run();
6360 CHECK_EQ(result, v8::Integer::New(4)); 6360 CHECK_EQ(result, v8::Integer::New(4));
6361 } 6361 }
6362 6362
6363 6363
6364 static const char* kSyntaxErrorInExtensionSource = 6364 static const char* kSyntaxErrorInExtensionSource =
6365 "["; 6365 "[";
6366 6366
6367 6367
6368 // Test that a syntax error in an extension does not cause a fatal 6368 // Test that a syntax error in an extension does not cause a fatal
6369 // error but results in an empty context. 6369 // error but results in an empty context.
6370 THREADED_TEST(SyntaxErrorExtensions) { 6370 THREADED_TEST(SyntaxErrorExtensions) {
6371 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6371 v8::HandleScope handle_scope(CcTest::isolate());
6372 v8::RegisterExtension(new Extension("syntaxerror", 6372 v8::RegisterExtension(new Extension("syntaxerror",
6373 kSyntaxErrorInExtensionSource)); 6373 kSyntaxErrorInExtensionSource));
6374 const char* extension_names[] = { "syntaxerror" }; 6374 const char* extension_names[] = { "syntaxerror" };
6375 v8::ExtensionConfiguration extensions(1, extension_names); 6375 v8::ExtensionConfiguration extensions(1, extension_names);
6376 v8::Handle<Context> context = 6376 v8::Handle<Context> context =
6377 Context::New(v8::Isolate::GetCurrent(), &extensions); 6377 Context::New(CcTest::isolate(), &extensions);
6378 CHECK(context.IsEmpty()); 6378 CHECK(context.IsEmpty());
6379 } 6379 }
6380 6380
6381 6381
6382 static const char* kExceptionInExtensionSource = 6382 static const char* kExceptionInExtensionSource =
6383 "throw 42"; 6383 "throw 42";
6384 6384
6385 6385
6386 // Test that an exception when installing an extension does not cause 6386 // Test that an exception when installing an extension does not cause
6387 // a fatal error but results in an empty context. 6387 // a fatal error but results in an empty context.
6388 THREADED_TEST(ExceptionExtensions) { 6388 THREADED_TEST(ExceptionExtensions) {
6389 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6389 v8::HandleScope handle_scope(CcTest::isolate());
6390 v8::RegisterExtension(new Extension("exception", 6390 v8::RegisterExtension(new Extension("exception",
6391 kExceptionInExtensionSource)); 6391 kExceptionInExtensionSource));
6392 const char* extension_names[] = { "exception" }; 6392 const char* extension_names[] = { "exception" };
6393 v8::ExtensionConfiguration extensions(1, extension_names); 6393 v8::ExtensionConfiguration extensions(1, extension_names);
6394 v8::Handle<Context> context = 6394 v8::Handle<Context> context =
6395 Context::New(v8::Isolate::GetCurrent(), &extensions); 6395 Context::New(CcTest::isolate(), &extensions);
6396 CHECK(context.IsEmpty()); 6396 CHECK(context.IsEmpty());
6397 } 6397 }
6398 6398
6399 6399
6400 static const char* kNativeCallInExtensionSource = 6400 static const char* kNativeCallInExtensionSource =
6401 "function call_runtime_last_index_of(x) {" 6401 "function call_runtime_last_index_of(x) {"
6402 " return %StringLastIndexOf(x, 'bob', 10);" 6402 " return %StringLastIndexOf(x, 'bob', 10);"
6403 "}"; 6403 "}";
6404 6404
6405 6405
6406 static const char* kNativeCallTest = 6406 static const char* kNativeCallTest =
6407 "call_runtime_last_index_of('bobbobboellebobboellebobbob');"; 6407 "call_runtime_last_index_of('bobbobboellebobboellebobbob');";
6408 6408
6409 // Test that a native runtime calls are supported in extensions. 6409 // Test that a native runtime calls are supported in extensions.
6410 THREADED_TEST(NativeCallInExtensions) { 6410 THREADED_TEST(NativeCallInExtensions) {
6411 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6411 v8::HandleScope handle_scope(CcTest::isolate());
6412 v8::RegisterExtension(new Extension("nativecall", 6412 v8::RegisterExtension(new Extension("nativecall",
6413 kNativeCallInExtensionSource)); 6413 kNativeCallInExtensionSource));
6414 const char* extension_names[] = { "nativecall" }; 6414 const char* extension_names[] = { "nativecall" };
6415 v8::ExtensionConfiguration extensions(1, extension_names); 6415 v8::ExtensionConfiguration extensions(1, extension_names);
6416 v8::Handle<Context> context = 6416 v8::Handle<Context> context =
6417 Context::New(v8::Isolate::GetCurrent(), &extensions); 6417 Context::New(CcTest::isolate(), &extensions);
6418 Context::Scope lock(context); 6418 Context::Scope lock(context);
6419 v8::Handle<Value> result = Script::Compile(v8_str(kNativeCallTest))->Run(); 6419 v8::Handle<Value> result = Script::Compile(v8_str(kNativeCallTest))->Run();
6420 CHECK_EQ(result, v8::Integer::New(3)); 6420 CHECK_EQ(result, v8::Integer::New(3));
6421 } 6421 }
6422 6422
6423 6423
6424 class NativeFunctionExtension : public Extension { 6424 class NativeFunctionExtension : public Extension {
6425 public: 6425 public:
6426 NativeFunctionExtension(const char* name, 6426 NativeFunctionExtension(const char* name,
6427 const char* source, 6427 const char* source,
6428 v8::FunctionCallback fun = &Echo) 6428 v8::FunctionCallback fun = &Echo)
6429 : Extension(name, source), 6429 : Extension(name, source),
6430 function_(fun) { } 6430 function_(fun) { }
6431 6431
6432 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( 6432 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
6433 v8::Handle<v8::String> name) { 6433 v8::Handle<v8::String> name) {
6434 return v8::FunctionTemplate::New(function_); 6434 return v8::FunctionTemplate::New(function_);
6435 } 6435 }
6436 6436
6437 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) { 6437 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) {
6438 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]); 6438 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]);
6439 } 6439 }
6440 private: 6440 private:
6441 v8::FunctionCallback function_; 6441 v8::FunctionCallback function_;
6442 }; 6442 };
6443 6443
6444 6444
6445 THREADED_TEST(NativeFunctionDeclaration) { 6445 THREADED_TEST(NativeFunctionDeclaration) {
6446 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6446 v8::HandleScope handle_scope(CcTest::isolate());
6447 const char* name = "nativedecl"; 6447 const char* name = "nativedecl";
6448 v8::RegisterExtension(new NativeFunctionExtension(name, 6448 v8::RegisterExtension(new NativeFunctionExtension(name,
6449 "native function foo();")); 6449 "native function foo();"));
6450 const char* extension_names[] = { name }; 6450 const char* extension_names[] = { name };
6451 v8::ExtensionConfiguration extensions(1, extension_names); 6451 v8::ExtensionConfiguration extensions(1, extension_names);
6452 v8::Handle<Context> context = 6452 v8::Handle<Context> context =
6453 Context::New(v8::Isolate::GetCurrent(), &extensions); 6453 Context::New(CcTest::isolate(), &extensions);
6454 Context::Scope lock(context); 6454 Context::Scope lock(context);
6455 v8::Handle<Value> result = Script::Compile(v8_str("foo(42);"))->Run(); 6455 v8::Handle<Value> result = Script::Compile(v8_str("foo(42);"))->Run();
6456 CHECK_EQ(result, v8::Integer::New(42)); 6456 CHECK_EQ(result, v8::Integer::New(42));
6457 } 6457 }
6458 6458
6459 6459
6460 THREADED_TEST(NativeFunctionDeclarationError) { 6460 THREADED_TEST(NativeFunctionDeclarationError) {
6461 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6461 v8::HandleScope handle_scope(CcTest::isolate());
6462 const char* name = "nativedeclerr"; 6462 const char* name = "nativedeclerr";
6463 // Syntax error in extension code. 6463 // Syntax error in extension code.
6464 v8::RegisterExtension(new NativeFunctionExtension(name, 6464 v8::RegisterExtension(new NativeFunctionExtension(name,
6465 "native\nfunction foo();")); 6465 "native\nfunction foo();"));
6466 const char* extension_names[] = { name }; 6466 const char* extension_names[] = { name };
6467 v8::ExtensionConfiguration extensions(1, extension_names); 6467 v8::ExtensionConfiguration extensions(1, extension_names);
6468 v8::Handle<Context> context = 6468 v8::Handle<Context> context =
6469 Context::New(v8::Isolate::GetCurrent(), &extensions); 6469 Context::New(CcTest::isolate(), &extensions);
6470 CHECK(context.IsEmpty()); 6470 CHECK(context.IsEmpty());
6471 } 6471 }
6472 6472
6473 6473
6474 THREADED_TEST(NativeFunctionDeclarationErrorEscape) { 6474 THREADED_TEST(NativeFunctionDeclarationErrorEscape) {
6475 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6475 v8::HandleScope handle_scope(CcTest::isolate());
6476 const char* name = "nativedeclerresc"; 6476 const char* name = "nativedeclerresc";
6477 // Syntax error in extension code - escape code in "native" means that 6477 // Syntax error in extension code - escape code in "native" means that
6478 // it's not treated as a keyword. 6478 // it's not treated as a keyword.
6479 v8::RegisterExtension(new NativeFunctionExtension( 6479 v8::RegisterExtension(new NativeFunctionExtension(
6480 name, 6480 name,
6481 "nativ\\u0065 function foo();")); 6481 "nativ\\u0065 function foo();"));
6482 const char* extension_names[] = { name }; 6482 const char* extension_names[] = { name };
6483 v8::ExtensionConfiguration extensions(1, extension_names); 6483 v8::ExtensionConfiguration extensions(1, extension_names);
6484 v8::Handle<Context> context = 6484 v8::Handle<Context> context =
6485 Context::New(v8::Isolate::GetCurrent(), &extensions); 6485 Context::New(CcTest::isolate(), &extensions);
6486 CHECK(context.IsEmpty()); 6486 CHECK(context.IsEmpty());
6487 } 6487 }
6488 6488
6489 6489
6490 static void CheckDependencies(const char* name, const char* expected) { 6490 static void CheckDependencies(const char* name, const char* expected) {
6491 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6491 v8::HandleScope handle_scope(CcTest::isolate());
6492 v8::ExtensionConfiguration config(1, &name); 6492 v8::ExtensionConfiguration config(1, &name);
6493 LocalContext context(&config); 6493 LocalContext context(&config);
6494 CHECK_EQ(String::New(expected), context->Global()->Get(v8_str("loaded"))); 6494 CHECK_EQ(String::New(expected), context->Global()->Get(v8_str("loaded")));
6495 } 6495 }
6496 6496
6497 6497
6498 /* 6498 /*
6499 * Configuration: 6499 * Configuration:
6500 * 6500 *
6501 * /-- B <--\ 6501 * /-- B <--\
6502 * A <- -- D <-- E 6502 * A <- -- D <-- E
6503 * \-- C <--/ 6503 * \-- C <--/
6504 */ 6504 */
6505 THREADED_TEST(ExtensionDependency) { 6505 THREADED_TEST(ExtensionDependency) {
6506 static const char* kEDeps[] = { "D" }; 6506 static const char* kEDeps[] = { "D" };
6507 v8::RegisterExtension(new Extension("E", "this.loaded += 'E';", 1, kEDeps)); 6507 v8::RegisterExtension(new Extension("E", "this.loaded += 'E';", 1, kEDeps));
6508 static const char* kDDeps[] = { "B", "C" }; 6508 static const char* kDDeps[] = { "B", "C" };
6509 v8::RegisterExtension(new Extension("D", "this.loaded += 'D';", 2, kDDeps)); 6509 v8::RegisterExtension(new Extension("D", "this.loaded += 'D';", 2, kDDeps));
6510 static const char* kBCDeps[] = { "A" }; 6510 static const char* kBCDeps[] = { "A" };
6511 v8::RegisterExtension(new Extension("B", "this.loaded += 'B';", 1, kBCDeps)); 6511 v8::RegisterExtension(new Extension("B", "this.loaded += 'B';", 1, kBCDeps));
6512 v8::RegisterExtension(new Extension("C", "this.loaded += 'C';", 1, kBCDeps)); 6512 v8::RegisterExtension(new Extension("C", "this.loaded += 'C';", 1, kBCDeps));
6513 v8::RegisterExtension(new Extension("A", "this.loaded += 'A';")); 6513 v8::RegisterExtension(new Extension("A", "this.loaded += 'A';"));
6514 CheckDependencies("A", "undefinedA"); 6514 CheckDependencies("A", "undefinedA");
6515 CheckDependencies("B", "undefinedAB"); 6515 CheckDependencies("B", "undefinedAB");
6516 CheckDependencies("C", "undefinedAC"); 6516 CheckDependencies("C", "undefinedAC");
6517 CheckDependencies("D", "undefinedABCD"); 6517 CheckDependencies("D", "undefinedABCD");
6518 CheckDependencies("E", "undefinedABCDE"); 6518 CheckDependencies("E", "undefinedABCDE");
6519 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6519 v8::HandleScope handle_scope(CcTest::isolate());
6520 static const char* exts[2] = { "C", "E" }; 6520 static const char* exts[2] = { "C", "E" };
6521 v8::ExtensionConfiguration config(2, exts); 6521 v8::ExtensionConfiguration config(2, exts);
6522 LocalContext context(&config); 6522 LocalContext context(&config);
6523 CHECK_EQ(v8_str("undefinedACBDE"), context->Global()->Get(v8_str("loaded"))); 6523 CHECK_EQ(v8_str("undefinedACBDE"), context->Global()->Get(v8_str("loaded")));
6524 } 6524 }
6525 6525
6526 6526
6527 static const char* kExtensionTestScript = 6527 static const char* kExtensionTestScript =
6528 "native function A();" 6528 "native function A();"
6529 "native function B();" 6529 "native function B();"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
6565 } else if (name->Equals(v8_str("C"))) { 6565 } else if (name->Equals(v8_str("C"))) {
6566 return v8::FunctionTemplate::New(CallFun, v8::Integer::New(6)); 6566 return v8::FunctionTemplate::New(CallFun, v8::Integer::New(6));
6567 } else { 6567 } else {
6568 return v8::Handle<v8::FunctionTemplate>(); 6568 return v8::Handle<v8::FunctionTemplate>();
6569 } 6569 }
6570 } 6570 }
6571 6571
6572 6572
6573 THREADED_TEST(FunctionLookup) { 6573 THREADED_TEST(FunctionLookup) {
6574 v8::RegisterExtension(new FunctionExtension()); 6574 v8::RegisterExtension(new FunctionExtension());
6575 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6575 v8::HandleScope handle_scope(CcTest::isolate());
6576 static const char* exts[1] = { "functiontest" }; 6576 static const char* exts[1] = { "functiontest" };
6577 v8::ExtensionConfiguration config(1, exts); 6577 v8::ExtensionConfiguration config(1, exts);
6578 LocalContext context(&config); 6578 LocalContext context(&config);
6579 CHECK_EQ(3, lookup_count); 6579 CHECK_EQ(3, lookup_count);
6580 CHECK_EQ(v8::Integer::New(8), Script::Compile(v8_str("Foo(0)"))->Run()); 6580 CHECK_EQ(v8::Integer::New(8), Script::Compile(v8_str("Foo(0)"))->Run());
6581 CHECK_EQ(v8::Integer::New(7), Script::Compile(v8_str("Foo(1)"))->Run()); 6581 CHECK_EQ(v8::Integer::New(7), Script::Compile(v8_str("Foo(1)"))->Run());
6582 CHECK_EQ(v8::Integer::New(6), Script::Compile(v8_str("Foo(2)"))->Run()); 6582 CHECK_EQ(v8::Integer::New(6), Script::Compile(v8_str("Foo(2)"))->Run());
6583 } 6583 }
6584 6584
6585 6585
6586 THREADED_TEST(NativeFunctionConstructCall) { 6586 THREADED_TEST(NativeFunctionConstructCall) {
6587 v8::RegisterExtension(new FunctionExtension()); 6587 v8::RegisterExtension(new FunctionExtension());
6588 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6588 v8::HandleScope handle_scope(CcTest::isolate());
6589 static const char* exts[1] = { "functiontest" }; 6589 static const char* exts[1] = { "functiontest" };
6590 v8::ExtensionConfiguration config(1, exts); 6590 v8::ExtensionConfiguration config(1, exts);
6591 LocalContext context(&config); 6591 LocalContext context(&config);
6592 for (int i = 0; i < 10; i++) { 6592 for (int i = 0; i < 10; i++) {
6593 // Run a few times to ensure that allocation of objects doesn't 6593 // Run a few times to ensure that allocation of objects doesn't
6594 // change behavior of a constructor function. 6594 // change behavior of a constructor function.
6595 CHECK_EQ(v8::Integer::New(8), 6595 CHECK_EQ(v8::Integer::New(8),
6596 Script::Compile(v8_str("(new A()).data"))->Run()); 6596 Script::Compile(v8_str("(new A()).data"))->Run());
6597 CHECK_EQ(v8::Integer::New(7), 6597 CHECK_EQ(v8::Integer::New(7),
6598 Script::Compile(v8_str("(new B()).data"))->Run()); 6598 Script::Compile(v8_str("(new B()).data"))->Run());
(...skipping 18 matching lines...) Expand all
6617 // unusable and therefore this test cannot be run in parallel. 6617 // unusable and therefore this test cannot be run in parallel.
6618 TEST(ErrorReporting) { 6618 TEST(ErrorReporting) {
6619 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 6619 v8::V8::SetFatalErrorHandler(StoringErrorCallback);
6620 static const char* aDeps[] = { "B" }; 6620 static const char* aDeps[] = { "B" };
6621 v8::RegisterExtension(new Extension("A", "", 1, aDeps)); 6621 v8::RegisterExtension(new Extension("A", "", 1, aDeps));
6622 static const char* bDeps[] = { "A" }; 6622 static const char* bDeps[] = { "A" };
6623 v8::RegisterExtension(new Extension("B", "", 1, bDeps)); 6623 v8::RegisterExtension(new Extension("B", "", 1, bDeps));
6624 last_location = NULL; 6624 last_location = NULL;
6625 v8::ExtensionConfiguration config(1, bDeps); 6625 v8::ExtensionConfiguration config(1, bDeps);
6626 v8::Handle<Context> context = 6626 v8::Handle<Context> context =
6627 Context::New(v8::Isolate::GetCurrent(), &config); 6627 Context::New(CcTest::isolate(), &config);
6628 CHECK(context.IsEmpty()); 6628 CHECK(context.IsEmpty());
6629 CHECK_NE(last_location, NULL); 6629 CHECK_NE(last_location, NULL);
6630 } 6630 }
6631 6631
6632 6632
6633 static const char* js_code_causing_huge_string_flattening = 6633 static const char* js_code_causing_huge_string_flattening =
6634 "var str = 'X';" 6634 "var str = 'X';"
6635 "for (var i = 0; i < 30; i++) {" 6635 "for (var i = 0; i < 30; i++) {"
6636 " str = str + str;" 6636 " str = str + str;"
6637 "}" 6637 "}"
6638 "str.match(/X/);"; 6638 "str.match(/X/);";
6639 6639
6640 6640
6641 void OOMCallback(const char* location, const char* message) { 6641 void OOMCallback(const char* location, const char* message) {
6642 exit(0); 6642 exit(0);
6643 } 6643 }
6644 6644
6645 6645
6646 TEST(RegexpOutOfMemory) { 6646 TEST(RegexpOutOfMemory) {
6647 // Execute a script that causes out of memory when flattening a string. 6647 // Execute a script that causes out of memory when flattening a string.
6648 v8::HandleScope scope(v8::Isolate::GetCurrent()); 6648 v8::HandleScope scope(CcTest::isolate());
6649 v8::V8::SetFatalErrorHandler(OOMCallback); 6649 v8::V8::SetFatalErrorHandler(OOMCallback);
6650 LocalContext context; 6650 LocalContext context;
6651 Local<Script> script = 6651 Local<Script> script =
6652 Script::Compile(String::New(js_code_causing_huge_string_flattening)); 6652 Script::Compile(String::New(js_code_causing_huge_string_flattening));
6653 last_location = NULL; 6653 last_location = NULL;
6654 script->Run(); 6654 script->Run();
6655 6655
6656 CHECK(false); // Should not return. 6656 CHECK(false); // Should not return.
6657 } 6657 }
6658 6658
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
6721 prev.MakeWeak<Value, Snorkel>(new Snorkel(), &HandleWeakReference); 6721 prev.MakeWeak<Value, Snorkel>(new Snorkel(), &HandleWeakReference);
6722 whammy->objects_[whammy->cursor_].Clear(); 6722 whammy->objects_[whammy->cursor_].Clear();
6723 } 6723 }
6724 whammy->objects_[whammy->cursor_].Reset(info.GetIsolate(), obj); 6724 whammy->objects_[whammy->cursor_].Reset(info.GetIsolate(), obj);
6725 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount; 6725 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount;
6726 info.GetReturnValue().Set(whammy->getScript()->Run()); 6726 info.GetReturnValue().Set(whammy->getScript()->Run());
6727 } 6727 }
6728 6728
6729 6729
6730 THREADED_TEST(WeakReference) { 6730 THREADED_TEST(WeakReference) {
6731 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 6731 v8::HandleScope handle_scope(CcTest::isolate());
6732 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(); 6732 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New();
6733 Whammy* whammy = new Whammy(v8::Isolate::GetCurrent()); 6733 Whammy* whammy = new Whammy(CcTest::isolate());
6734 templ->SetNamedPropertyHandler(WhammyPropertyGetter, 6734 templ->SetNamedPropertyHandler(WhammyPropertyGetter,
6735 0, 0, 0, 0, 6735 0, 0, 0, 0,
6736 v8::External::New(whammy)); 6736 v8::External::New(whammy));
6737 const char* extension_list[] = { "v8/gc" }; 6737 const char* extension_list[] = { "v8/gc" };
6738 v8::ExtensionConfiguration extensions(1, extension_list); 6738 v8::ExtensionConfiguration extensions(1, extension_list);
6739 v8::Handle<Context> context = 6739 v8::Handle<Context> context =
6740 Context::New(v8::Isolate::GetCurrent(), &extensions); 6740 Context::New(CcTest::isolate(), &extensions);
6741 Context::Scope context_scope(context); 6741 Context::Scope context_scope(context);
6742 6742
6743 v8::Handle<v8::Object> interceptor = templ->NewInstance(); 6743 v8::Handle<v8::Object> interceptor = templ->NewInstance();
6744 context->Global()->Set(v8_str("whammy"), interceptor); 6744 context->Global()->Set(v8_str("whammy"), interceptor);
6745 const char* code = 6745 const char* code =
6746 "var last;" 6746 "var last;"
6747 "for (var i = 0; i < 10000; i++) {" 6747 "for (var i = 0; i < 10000; i++) {"
6748 " var obj = whammy.length;" 6748 " var obj = whammy.length;"
6749 " if (last) last.next = obj;" 6749 " if (last) last.next = obj;"
6750 " last = obj;" 6750 " last = obj;"
6751 "}" 6751 "}"
6752 "gc();" 6752 "gc();"
6753 "4"; 6753 "4";
6754 v8::Handle<Value> result = CompileRun(code); 6754 v8::Handle<Value> result = CompileRun(code);
6755 CHECK_EQ(4.0, result->NumberValue()); 6755 CHECK_EQ(4.0, result->NumberValue());
6756 delete whammy; 6756 delete whammy;
6757 } 6757 }
6758 6758
6759 6759
6760 static void DisposeAndSetFlag(v8::Isolate* isolate, 6760 static void DisposeAndSetFlag(v8::Isolate* isolate,
6761 v8::Persistent<v8::Object>* obj, 6761 v8::Persistent<v8::Object>* obj,
6762 bool* data) { 6762 bool* data) {
6763 obj->Dispose(); 6763 obj->Dispose();
6764 *(data) = true; 6764 *(data) = true;
6765 } 6765 }
6766 6766
6767 6767
6768 THREADED_TEST(IndependentWeakHandle) { 6768 THREADED_TEST(IndependentWeakHandle) {
6769 v8::Isolate* iso = v8::Isolate::GetCurrent(); 6769 v8::Isolate* iso = CcTest::isolate();
6770 v8::HandleScope scope(iso); 6770 v8::HandleScope scope(iso);
6771 v8::Handle<Context> context = Context::New(iso); 6771 v8::Handle<Context> context = Context::New(iso);
6772 Context::Scope context_scope(context); 6772 Context::Scope context_scope(context);
6773 6773
6774 v8::Persistent<v8::Object> object_a, object_b; 6774 v8::Persistent<v8::Object> object_a, object_b;
6775 6775
6776 { 6776 {
6777 v8::HandleScope handle_scope(iso); 6777 v8::HandleScope handle_scope(iso);
6778 object_a.Reset(iso, v8::Object::New()); 6778 object_a.Reset(iso, v8::Object::New());
6779 object_b.Reset(iso, v8::Object::New()); 6779 object_b.Reset(iso, v8::Object::New());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
6815 static void ForceMarkSweep(v8::Isolate* isolate, 6815 static void ForceMarkSweep(v8::Isolate* isolate,
6816 v8::Persistent<v8::Object>* obj, 6816 v8::Persistent<v8::Object>* obj,
6817 bool* data) { 6817 bool* data) {
6818 obj->Dispose(); 6818 obj->Dispose();
6819 *(data) = true; 6819 *(data) = true;
6820 InvokeMarkSweep(); 6820 InvokeMarkSweep();
6821 } 6821 }
6822 6822
6823 6823
6824 THREADED_TEST(GCFromWeakCallbacks) { 6824 THREADED_TEST(GCFromWeakCallbacks) {
6825 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 6825 v8::Isolate* isolate = CcTest::isolate();
6826 v8::HandleScope scope(isolate); 6826 v8::HandleScope scope(isolate);
6827 v8::Handle<Context> context = Context::New(isolate); 6827 v8::Handle<Context> context = Context::New(isolate);
6828 Context::Scope context_scope(context); 6828 Context::Scope context_scope(context);
6829 6829
6830 static const int kNumberOfGCTypes = 2; 6830 static const int kNumberOfGCTypes = 2;
6831 typedef v8::WeakReferenceCallbacks<v8::Object, bool>::Revivable Callback; 6831 typedef v8::WeakReferenceCallbacks<v8::Object, bool>::Revivable Callback;
6832 Callback gc_forcing_callback[kNumberOfGCTypes] = 6832 Callback gc_forcing_callback[kNumberOfGCTypes] =
6833 {&ForceScavenge, &ForceMarkSweep}; 6833 {&ForceScavenge, &ForceMarkSweep};
6834 6834
6835 typedef void (*GCInvoker)(); 6835 typedef void (*GCInvoker)();
(...skipping 18 matching lines...) Expand all
6854 6854
6855 static void RevivingCallback(v8::Isolate* isolate, 6855 static void RevivingCallback(v8::Isolate* isolate,
6856 v8::Persistent<v8::Object>* obj, 6856 v8::Persistent<v8::Object>* obj,
6857 bool* data) { 6857 bool* data) {
6858 obj->ClearWeak(); 6858 obj->ClearWeak();
6859 *(data) = true; 6859 *(data) = true;
6860 } 6860 }
6861 6861
6862 6862
6863 THREADED_TEST(IndependentHandleRevival) { 6863 THREADED_TEST(IndependentHandleRevival) {
6864 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 6864 v8::Isolate* isolate = CcTest::isolate();
6865 v8::HandleScope scope(isolate); 6865 v8::HandleScope scope(isolate);
6866 v8::Handle<Context> context = Context::New(isolate); 6866 v8::Handle<Context> context = Context::New(isolate);
6867 Context::Scope context_scope(context); 6867 Context::Scope context_scope(context);
6868 6868
6869 v8::Persistent<v8::Object> object; 6869 v8::Persistent<v8::Object> object;
6870 { 6870 {
6871 v8::HandleScope handle_scope(isolate); 6871 v8::HandleScope handle_scope(isolate);
6872 v8::Local<v8::Object> o = v8::Object::New(); 6872 v8::Local<v8::Object> o = v8::Object::New();
6873 object.Reset(isolate, o); 6873 object.Reset(isolate, o);
6874 o->Set(v8_str("x"), v8::Integer::New(1)); 6874 o->Set(v8_str("x"), v8::Integer::New(1));
(...skipping 27 matching lines...) Expand all
6902 CHECK_EQ(v8::Integer::New(1), args[0]); 6902 CHECK_EQ(v8::Integer::New(1), args[0]);
6903 CHECK_EQ(v8::Integer::New(2), args[1]); 6903 CHECK_EQ(v8::Integer::New(2), args[1]);
6904 CHECK_EQ(v8::Integer::New(3), args[2]); 6904 CHECK_EQ(v8::Integer::New(3), args[2]);
6905 CHECK_EQ(v8::Undefined(), args[3]); 6905 CHECK_EQ(v8::Undefined(), args[3]);
6906 v8::HandleScope scope(args.GetIsolate()); 6906 v8::HandleScope scope(args.GetIsolate());
6907 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 6907 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
6908 } 6908 }
6909 6909
6910 6910
6911 THREADED_TEST(Arguments) { 6911 THREADED_TEST(Arguments) {
6912 v8::HandleScope scope(v8::Isolate::GetCurrent()); 6912 v8::HandleScope scope(CcTest::isolate());
6913 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); 6913 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New();
6914 global->Set(v8_str("f"), v8::FunctionTemplate::New(ArgumentsTestCallback)); 6914 global->Set(v8_str("f"), v8::FunctionTemplate::New(ArgumentsTestCallback));
6915 LocalContext context(NULL, global); 6915 LocalContext context(NULL, global);
6916 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); 6916 args_fun = context->Global()->Get(v8_str("f")).As<Function>();
6917 v8_compile("f(1, 2, 3)")->Run(); 6917 v8_compile("f(1, 2, 3)")->Run();
6918 } 6918 }
6919 6919
6920 6920
6921 static void NoBlockGetterX(Local<String> name, 6921 static void NoBlockGetterX(Local<String> name,
6922 const v8::PropertyCallbackInfo<v8::Value>&) { 6922 const v8::PropertyCallbackInfo<v8::Value>&) {
(...skipping 19 matching lines...) Expand all
6942 const v8::PropertyCallbackInfo<v8::Boolean>& info) { 6942 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
6943 if (index != 2) { 6943 if (index != 2) {
6944 return; // not intercepted 6944 return; // not intercepted
6945 } 6945 }
6946 6946
6947 info.GetReturnValue().Set(false); // intercepted, don't delete the property 6947 info.GetReturnValue().Set(false); // intercepted, don't delete the property
6948 } 6948 }
6949 6949
6950 6950
6951 THREADED_TEST(Deleter) { 6951 THREADED_TEST(Deleter) {
6952 v8::HandleScope scope(v8::Isolate::GetCurrent()); 6952 v8::HandleScope scope(CcTest::isolate());
6953 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 6953 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
6954 obj->SetNamedPropertyHandler(NoBlockGetterX, NULL, NULL, PDeleter, NULL); 6954 obj->SetNamedPropertyHandler(NoBlockGetterX, NULL, NULL, PDeleter, NULL);
6955 obj->SetIndexedPropertyHandler(NoBlockGetterI, NULL, NULL, IDeleter, NULL); 6955 obj->SetIndexedPropertyHandler(NoBlockGetterI, NULL, NULL, IDeleter, NULL);
6956 LocalContext context; 6956 LocalContext context;
6957 context->Global()->Set(v8_str("k"), obj->NewInstance()); 6957 context->Global()->Set(v8_str("k"), obj->NewInstance());
6958 CompileRun( 6958 CompileRun(
6959 "k.foo = 'foo';" 6959 "k.foo = 'foo';"
6960 "k.bar = 'bar';" 6960 "k.bar = 'bar';"
6961 "k[2] = 2;" 6961 "k[2] = 2;"
6962 "k[4] = 4;"); 6962 "k[4] = 4;");
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
7005 static void IndexedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { 7005 static void IndexedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) {
7006 ApiTestFuzzer::Fuzz(); 7006 ApiTestFuzzer::Fuzz();
7007 v8::Handle<v8::Array> result = v8::Array::New(2); 7007 v8::Handle<v8::Array> result = v8::Array::New(2);
7008 result->Set(v8::Integer::New(0), v8_str("0")); 7008 result->Set(v8::Integer::New(0), v8_str("0"));
7009 result->Set(v8::Integer::New(1), v8_str("1")); 7009 result->Set(v8::Integer::New(1), v8_str("1"));
7010 info.GetReturnValue().Set(result); 7010 info.GetReturnValue().Set(result);
7011 } 7011 }
7012 7012
7013 7013
7014 THREADED_TEST(Enumerators) { 7014 THREADED_TEST(Enumerators) {
7015 v8::HandleScope scope(v8::Isolate::GetCurrent()); 7015 v8::HandleScope scope(CcTest::isolate());
7016 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 7016 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
7017 obj->SetNamedPropertyHandler(GetK, NULL, NULL, NULL, NamedEnum); 7017 obj->SetNamedPropertyHandler(GetK, NULL, NULL, NULL, NamedEnum);
7018 obj->SetIndexedPropertyHandler(IndexedGetK, NULL, NULL, NULL, IndexedEnum); 7018 obj->SetIndexedPropertyHandler(IndexedGetK, NULL, NULL, NULL, IndexedEnum);
7019 LocalContext context; 7019 LocalContext context;
7020 context->Global()->Set(v8_str("k"), obj->NewInstance()); 7020 context->Global()->Set(v8_str("k"), obj->NewInstance());
7021 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( 7021 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun(
7022 "k[10] = 0;" 7022 "k[10] = 0;"
7023 "k.a = 0;" 7023 "k.a = 0;"
7024 "k[5] = 0;" 7024 "k[5] = 0;"
7025 "k.b = 0;" 7025 "k.b = 0;"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
7118 CHECK_EQ(info.This(), global->Get(v8_str("o2"))); 7118 CHECK_EQ(info.This(), global->Get(v8_str("o2")));
7119 } else if (name->Equals(v8_str("p3"))) { 7119 } else if (name->Equals(v8_str("p3"))) {
7120 CHECK_EQ(info.This(), global->Get(v8_str("o3"))); 7120 CHECK_EQ(info.This(), global->Get(v8_str("o3")));
7121 } else if (name->Equals(v8_str("p4"))) { 7121 } else if (name->Equals(v8_str("p4"))) {
7122 CHECK_EQ(info.This(), global->Get(v8_str("o4"))); 7122 CHECK_EQ(info.This(), global->Get(v8_str("o4")));
7123 } 7123 }
7124 } 7124 }
7125 7125
7126 7126
7127 THREADED_TEST(GetterHolders) { 7127 THREADED_TEST(GetterHolders) {
7128 v8::HandleScope scope(v8::Isolate::GetCurrent()); 7128 v8::HandleScope scope(CcTest::isolate());
7129 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 7129 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
7130 obj->SetAccessor(v8_str("p1"), PGetter); 7130 obj->SetAccessor(v8_str("p1"), PGetter);
7131 obj->SetAccessor(v8_str("p2"), PGetter); 7131 obj->SetAccessor(v8_str("p2"), PGetter);
7132 obj->SetAccessor(v8_str("p3"), PGetter); 7132 obj->SetAccessor(v8_str("p3"), PGetter);
7133 obj->SetAccessor(v8_str("p4"), PGetter); 7133 obj->SetAccessor(v8_str("p4"), PGetter);
7134 p_getter_count = 0; 7134 p_getter_count = 0;
7135 RunHolderTest(obj); 7135 RunHolderTest(obj);
7136 CHECK_EQ(40, p_getter_count); 7136 CHECK_EQ(40, p_getter_count);
7137 } 7137 }
7138 7138
7139 7139
7140 THREADED_TEST(PreInterceptorHolders) { 7140 THREADED_TEST(PreInterceptorHolders) {
7141 v8::HandleScope scope(v8::Isolate::GetCurrent()); 7141 v8::HandleScope scope(CcTest::isolate());
7142 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 7142 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
7143 obj->SetNamedPropertyHandler(PGetter2); 7143 obj->SetNamedPropertyHandler(PGetter2);
7144 p_getter_count2 = 0; 7144 p_getter_count2 = 0;
7145 RunHolderTest(obj); 7145 RunHolderTest(obj);
7146 CHECK_EQ(40, p_getter_count2); 7146 CHECK_EQ(40, p_getter_count2);
7147 } 7147 }
7148 7148
7149 7149
7150 THREADED_TEST(ObjectInstantiation) { 7150 THREADED_TEST(ObjectInstantiation) {
7151 v8::HandleScope scope(v8::Isolate::GetCurrent()); 7151 v8::HandleScope scope(CcTest::isolate());
7152 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 7152 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
7153 templ->SetAccessor(v8_str("t"), PGetter2); 7153 templ->SetAccessor(v8_str("t"), PGetter2);
7154 LocalContext context; 7154 LocalContext context;
7155 context->Global()->Set(v8_str("o"), templ->NewInstance()); 7155 context->Global()->Set(v8_str("o"), templ->NewInstance());
7156 for (int i = 0; i < 100; i++) { 7156 for (int i = 0; i < 100; i++) {
7157 v8::HandleScope inner_scope(v8::Isolate::GetCurrent()); 7157 v8::HandleScope inner_scope(CcTest::isolate());
7158 v8::Handle<v8::Object> obj = templ->NewInstance(); 7158 v8::Handle<v8::Object> obj = templ->NewInstance();
7159 CHECK_NE(obj, context->Global()->Get(v8_str("o"))); 7159 CHECK_NE(obj, context->Global()->Get(v8_str("o")));
7160 context->Global()->Set(v8_str("o2"), obj); 7160 context->Global()->Set(v8_str("o2"), obj);
7161 v8::Handle<Value> value = 7161 v8::Handle<Value> value =
7162 Script::Compile(v8_str("o.__proto__ === o2.__proto__"))->Run(); 7162 Script::Compile(v8_str("o.__proto__ === o2.__proto__"))->Run();
7163 CHECK_EQ(v8::True(), value); 7163 CHECK_EQ(v8::True(), value);
7164 context->Global()->Set(v8_str("o"), obj); 7164 context->Global()->Set(v8_str("o"), obj);
7165 } 7165 }
7166 } 7166 }
7167 7167
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
7725 Local<Value> value, 7725 Local<Value> value,
7726 const v8::PropertyCallbackInfo<void>& info) { 7726 const v8::PropertyCallbackInfo<void>& info) {
7727 if (info.This()->Has(name)) { 7727 if (info.This()->Has(name)) {
7728 info.This()->Delete(name); 7728 info.This()->Delete(name);
7729 } 7729 }
7730 info.This()->Set(name, value); 7730 info.This()->Set(name, value);
7731 } 7731 }
7732 7732
7733 7733
7734 THREADED_TEST(DeleteAccessor) { 7734 THREADED_TEST(DeleteAccessor) {
7735 v8::HandleScope scope(v8::Isolate::GetCurrent()); 7735 v8::HandleScope scope(CcTest::isolate());
7736 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); 7736 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
7737 obj->SetAccessor(v8_str("y"), YGetter, YSetter); 7737 obj->SetAccessor(v8_str("y"), YGetter, YSetter);
7738 LocalContext context; 7738 LocalContext context;
7739 v8::Handle<v8::Object> holder = obj->NewInstance(); 7739 v8::Handle<v8::Object> holder = obj->NewInstance();
7740 context->Global()->Set(v8_str("holder"), holder); 7740 context->Global()->Set(v8_str("holder"), holder);
7741 v8::Handle<Value> result = CompileRun( 7741 v8::Handle<Value> result = CompileRun(
7742 "holder.y = 11; holder.y = 12; holder.y"); 7742 "holder.y = 11; holder.y = 12; holder.y");
7743 CHECK_EQ(12, result->Uint32Value()); 7743 CHECK_EQ(12, result->Uint32Value());
7744 } 7744 }
7745 7745
7746 7746
7747 THREADED_TEST(TypeSwitch) { 7747 THREADED_TEST(TypeSwitch) {
7748 v8::HandleScope scope(v8::Isolate::GetCurrent()); 7748 v8::HandleScope scope(CcTest::isolate());
7749 v8::Handle<v8::FunctionTemplate> templ1 = v8::FunctionTemplate::New(); 7749 v8::Handle<v8::FunctionTemplate> templ1 = v8::FunctionTemplate::New();
7750 v8::Handle<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(); 7750 v8::Handle<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New();
7751 v8::Handle<v8::FunctionTemplate> templ3 = v8::FunctionTemplate::New(); 7751 v8::Handle<v8::FunctionTemplate> templ3 = v8::FunctionTemplate::New();
7752 v8::Handle<v8::FunctionTemplate> templs[3] = { templ1, templ2, templ3 }; 7752 v8::Handle<v8::FunctionTemplate> templs[3] = { templ1, templ2, templ3 };
7753 v8::Handle<v8::TypeSwitch> type_switch = v8::TypeSwitch::New(3, templs); 7753 v8::Handle<v8::TypeSwitch> type_switch = v8::TypeSwitch::New(3, templs);
7754 LocalContext context; 7754 LocalContext context;
7755 v8::Handle<v8::Object> obj0 = v8::Object::New(); 7755 v8::Handle<v8::Object> obj0 = v8::Object::New();
7756 v8::Handle<v8::Object> obj1 = templ1->GetFunction()->NewInstance(); 7756 v8::Handle<v8::Object> obj1 = templ1->GetFunction()->NewInstance();
7757 v8::Handle<v8::Object> obj2 = templ2->GetFunction()->NewInstance(); 7757 v8::Handle<v8::Object> obj2 = templ2->GetFunction()->NewInstance();
7758 v8::Handle<v8::Object> obj3 = templ3->GetFunction()->NewInstance(); 7758 v8::Handle<v8::Object> obj3 = templ3->GetFunction()->NewInstance();
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
7908 CHECK(!try_catch.HasCaught()); 7908 CHECK(!try_catch.HasCaught());
7909 Script::Compile(v8_str("(function()" 7909 Script::Compile(v8_str("(function()"
7910 " { try { throw ''; } finally { throw 0; }" 7910 " { try { throw ''; } finally { throw 0; }"
7911 "})()"))->Run(); 7911 "})()"))->Run();
7912 CHECK(try_catch.HasCaught()); 7912 CHECK(try_catch.HasCaught());
7913 } 7913 }
7914 7914
7915 7915
7916 // SecurityHandler can't be run twice 7916 // SecurityHandler can't be run twice
7917 TEST(SecurityHandler) { 7917 TEST(SecurityHandler) {
7918 v8::HandleScope scope0(v8::Isolate::GetCurrent()); 7918 v8::HandleScope scope0(CcTest::isolate());
7919 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 7919 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
7920 global_template->SetAccessCheckCallbacks(NamedSecurityTestCallback, 7920 global_template->SetAccessCheckCallbacks(NamedSecurityTestCallback,
7921 IndexedSecurityTestCallback); 7921 IndexedSecurityTestCallback);
7922 // Create an environment 7922 // Create an environment
7923 v8::Handle<Context> context0 = 7923 v8::Handle<Context> context0 =
7924 Context::New(v8::Isolate::GetCurrent(), NULL, global_template); 7924 Context::New(CcTest::isolate(), NULL, global_template);
7925 context0->Enter(); 7925 context0->Enter();
7926 7926
7927 v8::Handle<v8::Object> global0 = context0->Global(); 7927 v8::Handle<v8::Object> global0 = context0->Global();
7928 v8::Handle<Script> script0 = v8_compile("foo = 111"); 7928 v8::Handle<Script> script0 = v8_compile("foo = 111");
7929 script0->Run(); 7929 script0->Run();
7930 global0->Set(v8_str("0"), v8_num(999)); 7930 global0->Set(v8_str("0"), v8_num(999));
7931 v8::Handle<Value> foo0 = global0->Get(v8_str("foo")); 7931 v8::Handle<Value> foo0 = global0->Get(v8_str("foo"));
7932 CHECK_EQ(111, foo0->Int32Value()); 7932 CHECK_EQ(111, foo0->Int32Value());
7933 v8::Handle<Value> z0 = global0->Get(v8_str("0")); 7933 v8::Handle<Value> z0 = global0->Get(v8_str("0"));
7934 CHECK_EQ(999, z0->Int32Value()); 7934 CHECK_EQ(999, z0->Int32Value());
7935 7935
7936 // Create another environment, should fail security checks. 7936 // Create another environment, should fail security checks.
7937 v8::HandleScope scope1(v8::Isolate::GetCurrent()); 7937 v8::HandleScope scope1(CcTest::isolate());
7938 7938
7939 v8::Handle<Context> context1 = 7939 v8::Handle<Context> context1 =
7940 Context::New(v8::Isolate::GetCurrent(), NULL, global_template); 7940 Context::New(CcTest::isolate(), NULL, global_template);
7941 context1->Enter(); 7941 context1->Enter();
7942 7942
7943 v8::Handle<v8::Object> global1 = context1->Global(); 7943 v8::Handle<v8::Object> global1 = context1->Global();
7944 global1->Set(v8_str("othercontext"), global0); 7944 global1->Set(v8_str("othercontext"), global0);
7945 // This set will fail the security check. 7945 // This set will fail the security check.
7946 v8::Handle<Script> script1 = 7946 v8::Handle<Script> script1 =
7947 v8_compile("othercontext.foo = 222; othercontext[0] = 888;"); 7947 v8_compile("othercontext.foo = 222; othercontext[0] = 888;");
7948 script1->Run(); 7948 script1->Run();
7949 // This read will pass the security check. 7949 // This read will pass the security check.
7950 v8::Handle<Value> foo1 = global0->Get(v8_str("foo")); 7950 v8::Handle<Value> foo1 = global0->Get(v8_str("foo"));
7951 CHECK_EQ(111, foo1->Int32Value()); 7951 CHECK_EQ(111, foo1->Int32Value());
7952 // This read will pass the security check. 7952 // This read will pass the security check.
7953 v8::Handle<Value> z1 = global0->Get(v8_str("0")); 7953 v8::Handle<Value> z1 = global0->Get(v8_str("0"));
7954 CHECK_EQ(999, z1->Int32Value()); 7954 CHECK_EQ(999, z1->Int32Value());
7955 7955
7956 // Create another environment, should pass security checks. 7956 // Create another environment, should pass security checks.
7957 { g_security_callback_result = true; // allow security handler to pass. 7957 { g_security_callback_result = true; // allow security handler to pass.
7958 v8::HandleScope scope2(v8::Isolate::GetCurrent()); 7958 v8::HandleScope scope2(CcTest::isolate());
7959 LocalContext context2; 7959 LocalContext context2;
7960 v8::Handle<v8::Object> global2 = context2->Global(); 7960 v8::Handle<v8::Object> global2 = context2->Global();
7961 global2->Set(v8_str("othercontext"), global0); 7961 global2->Set(v8_str("othercontext"), global0);
7962 v8::Handle<Script> script2 = 7962 v8::Handle<Script> script2 =
7963 v8_compile("othercontext.foo = 333; othercontext[0] = 888;"); 7963 v8_compile("othercontext.foo = 333; othercontext[0] = 888;");
7964 script2->Run(); 7964 script2->Run();
7965 v8::Handle<Value> foo2 = global0->Get(v8_str("foo")); 7965 v8::Handle<Value> foo2 = global0->Get(v8_str("foo"));
7966 CHECK_EQ(333, foo2->Int32Value()); 7966 CHECK_EQ(333, foo2->Int32Value());
7967 v8::Handle<Value> z2 = global0->Get(v8_str("0")); 7967 v8::Handle<Value> z2 = global0->Get(v8_str("0"));
7968 CHECK_EQ(888, z2->Int32Value()); 7968 CHECK_EQ(888, z2->Int32Value());
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
8384 } 8384 }
8385 8385
8386 8386
8387 static void UnreachableFunction( 8387 static void UnreachableFunction(
8388 const v8::FunctionCallbackInfo<v8::Value>& info) { 8388 const v8::FunctionCallbackInfo<v8::Value>& info) {
8389 CHECK(false); // This function should not be called.. 8389 CHECK(false); // This function should not be called..
8390 } 8390 }
8391 8391
8392 8392
8393 TEST(AccessControl) { 8393 TEST(AccessControl) {
8394 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 8394 v8::Isolate* isolate = CcTest::isolate();
8395 v8::HandleScope handle_scope(isolate); 8395 v8::HandleScope handle_scope(isolate);
8396 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 8396 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
8397 8397
8398 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, 8398 global_template->SetAccessCheckCallbacks(NamedAccessBlocker,
8399 IndexedAccessBlocker); 8399 IndexedAccessBlocker);
8400 8400
8401 // Add an accessor accessible by cross-domain JS code. 8401 // Add an accessor accessible by cross-domain JS code.
8402 global_template->SetAccessor( 8402 global_template->SetAccessor(
8403 v8_str("accessible_prop"), 8403 v8_str("accessible_prop"),
8404 EchoGetter, EchoSetter, 8404 EchoGetter, EchoSetter,
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
8663 " }" 8663 " }"
8664 "return true;})()"); 8664 "return true;})()");
8665 CHECK(value->IsTrue()); 8665 CHECK(value->IsTrue());
8666 8666
8667 context1->Exit(); 8667 context1->Exit();
8668 context0->Exit(); 8668 context0->Exit();
8669 } 8669 }
8670 8670
8671 8671
8672 TEST(AccessControlES5) { 8672 TEST(AccessControlES5) {
8673 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 8673 v8::Isolate* isolate = CcTest::isolate();
8674 v8::HandleScope handle_scope(isolate); 8674 v8::HandleScope handle_scope(isolate);
8675 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 8675 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
8676 8676
8677 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, 8677 global_template->SetAccessCheckCallbacks(NamedAccessBlocker,
8678 IndexedAccessBlocker); 8678 IndexedAccessBlocker);
8679 8679
8680 // Add accessible accessor. 8680 // Add accessible accessor.
8681 global_template->SetAccessor( 8681 global_template->SetAccessor(
8682 v8_str("accessible_prop"), 8682 v8_str("accessible_prop"),
8683 EchoGetter, EchoSetter, 8683 EchoGetter, EchoSetter,
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
8750 8750
8751 static bool GetOwnPropertyNamesIndexedBlocker(Local<v8::Object> global, 8751 static bool GetOwnPropertyNamesIndexedBlocker(Local<v8::Object> global,
8752 uint32_t key, 8752 uint32_t key,
8753 v8::AccessType type, 8753 v8::AccessType type,
8754 Local<Value> data) { 8754 Local<Value> data) {
8755 return false; 8755 return false;
8756 } 8756 }
8757 8757
8758 8758
8759 THREADED_TEST(AccessControlGetOwnPropertyNames) { 8759 THREADED_TEST(AccessControlGetOwnPropertyNames) {
8760 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 8760 v8::Isolate* isolate = CcTest::isolate();
8761 v8::HandleScope handle_scope(isolate); 8761 v8::HandleScope handle_scope(isolate);
8762 v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(); 8762 v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New();
8763 8763
8764 obj_template->Set(v8_str("x"), v8::Integer::New(42)); 8764 obj_template->Set(v8_str("x"), v8::Integer::New(42));
8765 obj_template->SetAccessCheckCallbacks(GetOwnPropertyNamesNamedBlocker, 8765 obj_template->SetAccessCheckCallbacks(GetOwnPropertyNamesNamedBlocker,
8766 GetOwnPropertyNamesIndexedBlocker); 8766 GetOwnPropertyNamesIndexedBlocker);
8767 8767
8768 // Create an environment 8768 // Create an environment
8769 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 8769 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
8770 context0->Enter(); 8770 context0->Enter();
8771 8771
8772 v8::Handle<v8::Object> global0 = context0->Global(); 8772 v8::Handle<v8::Object> global0 = context0->Global();
8773 8773
8774 v8::HandleScope scope1(v8::Isolate::GetCurrent()); 8774 v8::HandleScope scope1(CcTest::isolate());
8775 8775
8776 v8::Local<Context> context1 = Context::New(isolate); 8776 v8::Local<Context> context1 = Context::New(isolate);
8777 context1->Enter(); 8777 context1->Enter();
8778 8778
8779 v8::Handle<v8::Object> global1 = context1->Global(); 8779 v8::Handle<v8::Object> global1 = context1->Global();
8780 global1->Set(v8_str("other"), global0); 8780 global1->Set(v8_str("other"), global0);
8781 global1->Set(v8_str("object"), obj_template->NewInstance()); 8781 global1->Set(v8_str("object"), obj_template->NewInstance());
8782 8782
8783 v8::Handle<Value> value; 8783 v8::Handle<Value> value;
8784 8784
(...skipping 25 matching lines...) Expand all
8810 static void NamedPropertyEnumerator( 8810 static void NamedPropertyEnumerator(
8811 const v8::PropertyCallbackInfo<v8::Array>& info) { 8811 const v8::PropertyCallbackInfo<v8::Array>& info) {
8812 v8::Handle<v8::Array> result = v8::Array::New(2); 8812 v8::Handle<v8::Array> result = v8::Array::New(2);
8813 result->Set(0, v8_str("x")); 8813 result->Set(0, v8_str("x"));
8814 result->Set(1, v8::Object::New()); 8814 result->Set(1, v8::Object::New());
8815 info.GetReturnValue().Set(result); 8815 info.GetReturnValue().Set(result);
8816 } 8816 }
8817 8817
8818 8818
8819 THREADED_TEST(GetOwnPropertyNamesWithInterceptor) { 8819 THREADED_TEST(GetOwnPropertyNamesWithInterceptor) {
8820 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 8820 v8::HandleScope handle_scope(CcTest::isolate());
8821 v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(); 8821 v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New();
8822 8822
8823 obj_template->Set(v8_str("7"), v8::Integer::New(7)); 8823 obj_template->Set(v8_str("7"), v8::Integer::New(7));
8824 obj_template->Set(v8_str("x"), v8::Integer::New(42)); 8824 obj_template->Set(v8_str("x"), v8::Integer::New(42));
8825 obj_template->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL, 8825 obj_template->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL,
8826 IndexedPropertyEnumerator); 8826 IndexedPropertyEnumerator);
8827 obj_template->SetNamedPropertyHandler(NULL, NULL, NULL, NULL, 8827 obj_template->SetNamedPropertyHandler(NULL, NULL, NULL, NULL,
8828 NamedPropertyEnumerator); 8828 NamedPropertyEnumerator);
8829 8829
8830 LocalContext context; 8830 LocalContext context;
(...skipping 14 matching lines...) Expand all
8845 } 8845 }
8846 8846
8847 8847
8848 static void ConstTenGetter(Local<String> name, 8848 static void ConstTenGetter(Local<String> name,
8849 const v8::PropertyCallbackInfo<v8::Value>& info) { 8849 const v8::PropertyCallbackInfo<v8::Value>& info) {
8850 info.GetReturnValue().Set(v8_num(10)); 8850 info.GetReturnValue().Set(v8_num(10));
8851 } 8851 }
8852 8852
8853 8853
8854 THREADED_TEST(CrossDomainAccessors) { 8854 THREADED_TEST(CrossDomainAccessors) {
8855 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 8855 v8::Isolate* isolate = CcTest::isolate();
8856 v8::HandleScope handle_scope(isolate); 8856 v8::HandleScope handle_scope(isolate);
8857 8857
8858 v8::Handle<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New(); 8858 v8::Handle<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New();
8859 8859
8860 v8::Handle<v8::ObjectTemplate> global_template = 8860 v8::Handle<v8::ObjectTemplate> global_template =
8861 func_template->InstanceTemplate(); 8861 func_template->InstanceTemplate();
8862 8862
8863 v8::Handle<v8::ObjectTemplate> proto_template = 8863 v8::Handle<v8::ObjectTemplate> proto_template =
8864 func_template->PrototypeTemplate(); 8864 func_template->PrototypeTemplate();
8865 8865
(...skipping 10 matching lines...) Expand all
8876 v8::DEFAULT); 8876 v8::DEFAULT);
8877 8877
8878 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); 8878 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template);
8879 context0->Enter(); 8879 context0->Enter();
8880 8880
8881 Local<v8::Object> global = context0->Global(); 8881 Local<v8::Object> global = context0->Global();
8882 // Add a normal property that shadows 'accessible' 8882 // Add a normal property that shadows 'accessible'
8883 global->Set(v8_str("accessible"), v8_num(11)); 8883 global->Set(v8_str("accessible"), v8_num(11));
8884 8884
8885 // Enter a new context. 8885 // Enter a new context.
8886 v8::HandleScope scope1(v8::Isolate::GetCurrent()); 8886 v8::HandleScope scope1(CcTest::isolate());
8887 v8::Local<Context> context1 = Context::New(isolate); 8887 v8::Local<Context> context1 = Context::New(isolate);
8888 context1->Enter(); 8888 context1->Enter();
8889 8889
8890 v8::Handle<v8::Object> global1 = context1->Global(); 8890 v8::Handle<v8::Object> global1 = context1->Global();
8891 global1->Set(v8_str("other"), global); 8891 global1->Set(v8_str("other"), global);
8892 8892
8893 // Should return 10, instead of 11 8893 // Should return 10, instead of 11
8894 v8::Handle<Value> value = v8_compile("other.accessible")->Run(); 8894 v8::Handle<Value> value = v8_compile("other.accessible")->Run();
8895 CHECK(value->IsNumber()); 8895 CHECK(value->IsNumber());
8896 CHECK_EQ(10, value->Int32Value()); 8896 CHECK_EQ(10, value->Int32Value());
(...skipping 25 matching lines...) Expand all
8922 indexed_access_count++; 8922 indexed_access_count++;
8923 return true; 8923 return true;
8924 } 8924 }
8925 8925
8926 8926
8927 // This one is too easily disturbed by other tests. 8927 // This one is too easily disturbed by other tests.
8928 TEST(AccessControlIC) { 8928 TEST(AccessControlIC) {
8929 named_access_count = 0; 8929 named_access_count = 0;
8930 indexed_access_count = 0; 8930 indexed_access_count = 0;
8931 8931
8932 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 8932 v8::Isolate* isolate = CcTest::isolate();
8933 v8::HandleScope handle_scope(isolate); 8933 v8::HandleScope handle_scope(isolate);
8934 8934
8935 // Create an environment. 8935 // Create an environment.
8936 v8::Local<Context> context0 = Context::New(isolate); 8936 v8::Local<Context> context0 = Context::New(isolate);
8937 context0->Enter(); 8937 context0->Enter();
8938 8938
8939 // Create an object that requires access-check functions to be 8939 // Create an object that requires access-check functions to be
8940 // called for cross-domain access. 8940 // called for cross-domain access.
8941 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); 8941 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New();
8942 object_template->SetAccessCheckCallbacks(NamedAccessCounter, 8942 object_template->SetAccessCheckCallbacks(NamedAccessCounter,
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
9070 9070
9071 // Regression test. In access checks, operations that may cause 9071 // Regression test. In access checks, operations that may cause
9072 // garbage collection are not allowed. It used to be the case that 9072 // garbage collection are not allowed. It used to be the case that
9073 // using the Write operation on a string could cause a garbage 9073 // using the Write operation on a string could cause a garbage
9074 // collection due to flattening of the string. This is no longer the 9074 // collection due to flattening of the string. This is no longer the
9075 // case. 9075 // case.
9076 THREADED_TEST(AccessControlFlatten) { 9076 THREADED_TEST(AccessControlFlatten) {
9077 named_access_count = 0; 9077 named_access_count = 0;
9078 indexed_access_count = 0; 9078 indexed_access_count = 0;
9079 9079
9080 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 9080 v8::Isolate* isolate = CcTest::isolate();
9081 v8::HandleScope handle_scope(isolate); 9081 v8::HandleScope handle_scope(isolate);
9082 9082
9083 // Create an environment. 9083 // Create an environment.
9084 v8::Local<Context> context0 = Context::New(isolate); 9084 v8::Local<Context> context0 = Context::New(isolate);
9085 context0->Enter(); 9085 context0->Enter();
9086 9086
9087 // Create an object that requires access-check functions to be 9087 // Create an object that requires access-check functions to be
9088 // called for cross-domain access. 9088 // called for cross-domain access.
9089 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); 9089 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New();
9090 object_template->SetAccessCheckCallbacks(NamedAccessFlatten, 9090 object_template->SetAccessCheckCallbacks(NamedAccessFlatten,
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
9138 Local<Value> value, 9138 Local<Value> value,
9139 const v8::PropertyCallbackInfo<v8::Value>& info) { 9139 const v8::PropertyCallbackInfo<v8::Value>& info) {
9140 info.GetReturnValue().Set(value); 9140 info.GetReturnValue().Set(value);
9141 } 9141 }
9142 9142
9143 9143
9144 THREADED_TEST(AccessControlInterceptorIC) { 9144 THREADED_TEST(AccessControlInterceptorIC) {
9145 named_access_count = 0; 9145 named_access_count = 0;
9146 indexed_access_count = 0; 9146 indexed_access_count = 0;
9147 9147
9148 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 9148 v8::Isolate* isolate = CcTest::isolate();
9149 v8::HandleScope handle_scope(isolate); 9149 v8::HandleScope handle_scope(isolate);
9150 9150
9151 // Create an environment. 9151 // Create an environment.
9152 v8::Local<Context> context0 = Context::New(isolate); 9152 v8::Local<Context> context0 = Context::New(isolate);
9153 context0->Enter(); 9153 context0->Enter();
9154 9154
9155 // Create an object that requires access-check functions to be 9155 // Create an object that requires access-check functions to be
9156 // called for cross-domain access. The object also has interceptors 9156 // called for cross-domain access. The object also has interceptors
9157 // interceptor. 9157 // interceptor.
9158 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); 9158 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New();
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
9242 9242
9243 9243
9244 static void GlobalObjectInstancePropertiesGet( 9244 static void GlobalObjectInstancePropertiesGet(
9245 Local<String> key, 9245 Local<String> key,
9246 const v8::PropertyCallbackInfo<v8::Value>&) { 9246 const v8::PropertyCallbackInfo<v8::Value>&) {
9247 ApiTestFuzzer::Fuzz(); 9247 ApiTestFuzzer::Fuzz();
9248 } 9248 }
9249 9249
9250 9250
9251 THREADED_TEST(GlobalObjectInstanceProperties) { 9251 THREADED_TEST(GlobalObjectInstanceProperties) {
9252 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 9252 v8::HandleScope handle_scope(CcTest::isolate());
9253 9253
9254 Local<Value> global_object; 9254 Local<Value> global_object;
9255 9255
9256 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); 9256 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
9257 t->InstanceTemplate()->SetNamedPropertyHandler( 9257 t->InstanceTemplate()->SetNamedPropertyHandler(
9258 GlobalObjectInstancePropertiesGet); 9258 GlobalObjectInstancePropertiesGet);
9259 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); 9259 Local<ObjectTemplate> instance_template = t->InstanceTemplate();
9260 instance_template->Set(v8_str("x"), v8_num(42)); 9260 instance_template->Set(v8_str("x"), v8_num(42));
9261 instance_template->Set(v8_str("f"), 9261 instance_template->Set(v8_str("f"),
9262 v8::FunctionTemplate::New(InstanceFunctionCallback)); 9262 v8::FunctionTemplate::New(InstanceFunctionCallback));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
9298 CHECK_EQ(42, value->Int32Value()); 9298 CHECK_EQ(42, value->Int32Value());
9299 value = Script::Compile(v8_str("f()"))->Run(); 9299 value = Script::Compile(v8_str("f()"))->Run();
9300 CHECK_EQ(12, value->Int32Value()); 9300 CHECK_EQ(12, value->Int32Value());
9301 value = Script::Compile(v8_str(script))->Run(); 9301 value = Script::Compile(v8_str(script))->Run();
9302 CHECK_EQ(1, value->Int32Value()); 9302 CHECK_EQ(1, value->Int32Value());
9303 } 9303 }
9304 } 9304 }
9305 9305
9306 9306
9307 THREADED_TEST(CallKnownGlobalReceiver) { 9307 THREADED_TEST(CallKnownGlobalReceiver) {
9308 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 9308 v8::HandleScope handle_scope(CcTest::isolate());
9309 9309
9310 Local<Value> global_object; 9310 Local<Value> global_object;
9311 9311
9312 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); 9312 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
9313 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); 9313 Local<ObjectTemplate> instance_template = t->InstanceTemplate();
9314 9314
9315 // The script to check that we leave global object not 9315 // The script to check that we leave global object not
9316 // global object proxy on stack when we deoptimize from inside 9316 // global object proxy on stack when we deoptimize from inside
9317 // arguments evaluation. 9317 // arguments evaluation.
9318 // To provoke error we need to both force deoptimization 9318 // To provoke error we need to both force deoptimization
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
9377 } 9377 }
9378 9378
9379 9379
9380 static void ShadowNamedGet(Local<String> key, 9380 static void ShadowNamedGet(Local<String> key,
9381 const v8::PropertyCallbackInfo<v8::Value>&) { 9381 const v8::PropertyCallbackInfo<v8::Value>&) {
9382 } 9382 }
9383 9383
9384 9384
9385 THREADED_TEST(ShadowObject) { 9385 THREADED_TEST(ShadowObject) {
9386 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0; 9386 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0;
9387 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 9387 v8::HandleScope handle_scope(CcTest::isolate());
9388 9388
9389 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(); 9389 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New();
9390 LocalContext context(NULL, global_template); 9390 LocalContext context(NULL, global_template);
9391 9391
9392 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); 9392 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
9393 t->InstanceTemplate()->SetNamedPropertyHandler(ShadowNamedGet); 9393 t->InstanceTemplate()->SetNamedPropertyHandler(ShadowNamedGet);
9394 t->InstanceTemplate()->SetIndexedPropertyHandler(ShadowIndexedGet); 9394 t->InstanceTemplate()->SetIndexedPropertyHandler(ShadowIndexedGet);
9395 Local<ObjectTemplate> proto = t->PrototypeTemplate(); 9395 Local<ObjectTemplate> proto = t->PrototypeTemplate();
9396 Local<ObjectTemplate> instance = t->InstanceTemplate(); 9396 Local<ObjectTemplate> instance = t->InstanceTemplate();
9397 9397
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
9998 "result4 = f(this)")); 9998 "result4 = f(this)"));
9999 script->Run(); 9999 script->Run();
10000 CHECK(!try_catch.HasCaught()); 10000 CHECK(!try_catch.HasCaught());
10001 CHECK_EQ(2, current->Global()->Get(v8_str("result4"))->Int32Value()); 10001 CHECK_EQ(2, current->Global()->Get(v8_str("result4"))->Int32Value());
10002 10002
10003 try_catch.Reset(); 10003 try_catch.Reset();
10004 } 10004 }
10005 10005
10006 10006
10007 THREADED_TEST(CrossEval) { 10007 THREADED_TEST(CrossEval) {
10008 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10008 v8::HandleScope scope(CcTest::isolate());
10009 LocalContext other; 10009 LocalContext other;
10010 LocalContext current; 10010 LocalContext current;
10011 10011
10012 Local<String> token = v8_str("<security token>"); 10012 Local<String> token = v8_str("<security token>");
10013 other->SetSecurityToken(token); 10013 other->SetSecurityToken(token);
10014 current->SetSecurityToken(token); 10014 current->SetSecurityToken(token);
10015 10015
10016 // Set up reference from current to other. 10016 // Set up reference from current to other.
10017 current->Global()->Set(v8_str("other"), other->Global()); 10017 current->Global()->Set(v8_str("other"), other->Global());
10018 10018
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
10081 Script::Compile(v8_str("other.y = 1; eval.call(other, 'y')")); 10081 Script::Compile(v8_str("other.y = 1; eval.call(other, 'y')"));
10082 result = script->Run(); 10082 result = script->Run();
10083 CHECK(try_catch.HasCaught()); 10083 CHECK(try_catch.HasCaught());
10084 } 10084 }
10085 10085
10086 10086
10087 // Test that calling eval in a context which has been detached from 10087 // Test that calling eval in a context which has been detached from
10088 // its global throws an exception. This behavior is consistent with 10088 // its global throws an exception. This behavior is consistent with
10089 // other JavaScript implementations. 10089 // other JavaScript implementations.
10090 THREADED_TEST(EvalInDetachedGlobal) { 10090 THREADED_TEST(EvalInDetachedGlobal) {
10091 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 10091 v8::Isolate* isolate = CcTest::isolate();
10092 v8::HandleScope scope(isolate); 10092 v8::HandleScope scope(isolate);
10093 10093
10094 v8::Local<Context> context0 = Context::New(isolate); 10094 v8::Local<Context> context0 = Context::New(isolate);
10095 v8::Local<Context> context1 = Context::New(isolate); 10095 v8::Local<Context> context1 = Context::New(isolate);
10096 10096
10097 // Set up function in context0 that uses eval from context0. 10097 // Set up function in context0 that uses eval from context0.
10098 context0->Enter(); 10098 context0->Enter();
10099 v8::Handle<v8::Value> fun = 10099 v8::Handle<v8::Value> fun =
10100 CompileRun("var x = 42;" 10100 CompileRun("var x = 42;"
10101 "(function() {" 10101 "(function() {"
(...skipping 12 matching lines...) Expand all
10114 context0->DetachGlobal(); 10114 context0->DetachGlobal();
10115 v8::TryCatch catcher; 10115 v8::TryCatch catcher;
10116 x_value = CompileRun("fun('x')"); 10116 x_value = CompileRun("fun('x')");
10117 CHECK(x_value.IsEmpty()); 10117 CHECK(x_value.IsEmpty());
10118 CHECK(catcher.HasCaught()); 10118 CHECK(catcher.HasCaught());
10119 context1->Exit(); 10119 context1->Exit();
10120 } 10120 }
10121 10121
10122 10122
10123 THREADED_TEST(CrossLazyLoad) { 10123 THREADED_TEST(CrossLazyLoad) {
10124 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10124 v8::HandleScope scope(CcTest::isolate());
10125 LocalContext other; 10125 LocalContext other;
10126 LocalContext current; 10126 LocalContext current;
10127 10127
10128 Local<String> token = v8_str("<security token>"); 10128 Local<String> token = v8_str("<security token>");
10129 other->SetSecurityToken(token); 10129 other->SetSecurityToken(token);
10130 current->SetSecurityToken(token); 10130 current->SetSecurityToken(token);
10131 10131
10132 // Set up reference from current to other. 10132 // Set up reference from current to other.
10133 current->Global()->Set(v8_str("other"), other->Global()); 10133 current->Global()->Set(v8_str("other"), other->Global());
10134 10134
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
10310 } 10310 }
10311 } 10311 }
10312 10312
10313 10313
10314 static int CountHandles() { 10314 static int CountHandles() {
10315 return v8::HandleScope::NumberOfHandles(); 10315 return v8::HandleScope::NumberOfHandles();
10316 } 10316 }
10317 10317
10318 10318
10319 static int Recurse(int depth, int iterations) { 10319 static int Recurse(int depth, int iterations) {
10320 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10320 v8::HandleScope scope(CcTest::isolate());
10321 if (depth == 0) return CountHandles(); 10321 if (depth == 0) return CountHandles();
10322 for (int i = 0; i < iterations; i++) { 10322 for (int i = 0; i < iterations; i++) {
10323 Local<v8::Number> n(v8::Integer::New(42)); 10323 Local<v8::Number> n(v8::Integer::New(42));
10324 } 10324 }
10325 return Recurse(depth - 1, iterations); 10325 return Recurse(depth - 1, iterations);
10326 } 10326 }
10327 10327
10328 10328
10329 THREADED_TEST(HandleIteration) { 10329 THREADED_TEST(HandleIteration) {
10330 static const int kIterations = 500; 10330 static const int kIterations = 500;
10331 static const int kNesting = 200; 10331 static const int kNesting = 200;
10332 CHECK_EQ(0, CountHandles()); 10332 CHECK_EQ(0, CountHandles());
10333 { 10333 {
10334 v8::HandleScope scope1(v8::Isolate::GetCurrent()); 10334 v8::HandleScope scope1(CcTest::isolate());
10335 CHECK_EQ(0, CountHandles()); 10335 CHECK_EQ(0, CountHandles());
10336 for (int i = 0; i < kIterations; i++) { 10336 for (int i = 0; i < kIterations; i++) {
10337 Local<v8::Number> n(v8::Integer::New(42)); 10337 Local<v8::Number> n(v8::Integer::New(42));
10338 CHECK_EQ(i + 1, CountHandles()); 10338 CHECK_EQ(i + 1, CountHandles());
10339 } 10339 }
10340 10340
10341 CHECK_EQ(kIterations, CountHandles()); 10341 CHECK_EQ(kIterations, CountHandles());
10342 { 10342 {
10343 v8::HandleScope scope2(v8::Isolate::GetCurrent()); 10343 v8::HandleScope scope2(CcTest::isolate());
10344 for (int j = 0; j < kIterations; j++) { 10344 for (int j = 0; j < kIterations; j++) {
10345 Local<v8::Number> n(v8::Integer::New(42)); 10345 Local<v8::Number> n(v8::Integer::New(42));
10346 CHECK_EQ(j + 1 + kIterations, CountHandles()); 10346 CHECK_EQ(j + 1 + kIterations, CountHandles());
10347 } 10347 }
10348 } 10348 }
10349 CHECK_EQ(kIterations, CountHandles()); 10349 CHECK_EQ(kIterations, CountHandles());
10350 } 10350 }
10351 CHECK_EQ(0, CountHandles()); 10351 CHECK_EQ(0, CountHandles());
10352 CHECK_EQ(kNesting * kIterations, Recurse(kNesting, kIterations)); 10352 CHECK_EQ(kNesting * kIterations, Recurse(kNesting, kIterations));
10353 } 10353 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
10421 10421
10422 10422
10423 typedef void (*NamedPropertyGetter)( 10423 typedef void (*NamedPropertyGetter)(
10424 Local<String> property, 10424 Local<String> property,
10425 const v8::PropertyCallbackInfo<v8::Value>& info); 10425 const v8::PropertyCallbackInfo<v8::Value>& info);
10426 10426
10427 10427
10428 static void CheckInterceptorLoadIC(NamedPropertyGetter getter, 10428 static void CheckInterceptorLoadIC(NamedPropertyGetter getter,
10429 const char* source, 10429 const char* source,
10430 int expected) { 10430 int expected) {
10431 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10431 v8::HandleScope scope(CcTest::isolate());
10432 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10432 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10433 templ->SetNamedPropertyHandler(getter, 0, 0, 0, 0, v8_str("data")); 10433 templ->SetNamedPropertyHandler(getter, 0, 0, 0, 0, v8_str("data"));
10434 LocalContext context; 10434 LocalContext context;
10435 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10435 context->Global()->Set(v8_str("o"), templ->NewInstance());
10436 v8::Handle<Value> value = CompileRun(source); 10436 v8::Handle<Value> value = CompileRun(source);
10437 CHECK_EQ(expected, value->Int32Value()); 10437 CHECK_EQ(expected, value->Int32Value());
10438 } 10438 }
10439 10439
10440 10440
10441 static void InterceptorLoadICGetter( 10441 static void InterceptorLoadICGetter(
10442 Local<String> name, 10442 Local<String> name,
10443 const v8::PropertyCallbackInfo<v8::Value>& info) { 10443 const v8::PropertyCallbackInfo<v8::Value>& info) {
10444 ApiTestFuzzer::Fuzz(); 10444 ApiTestFuzzer::Fuzz();
10445 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 10445 v8::Isolate* isolate = CcTest::isolate();
10446 CHECK_EQ(isolate, info.GetIsolate()); 10446 CHECK_EQ(isolate, info.GetIsolate());
10447 CHECK_EQ(v8_str("data"), info.Data()); 10447 CHECK_EQ(v8_str("data"), info.Data());
10448 CHECK_EQ(v8_str("x"), name); 10448 CHECK_EQ(v8_str("x"), name);
10449 info.GetReturnValue().Set(v8::Integer::New(42)); 10449 info.GetReturnValue().Set(v8::Integer::New(42));
10450 } 10450 }
10451 10451
10452 10452
10453 // This test should hit the load IC for the interceptor case. 10453 // This test should hit the load IC for the interceptor case.
10454 THREADED_TEST(InterceptorLoadIC) { 10454 THREADED_TEST(InterceptorLoadIC) {
10455 CheckInterceptorLoadIC(InterceptorLoadICGetter, 10455 CheckInterceptorLoadIC(InterceptorLoadICGetter,
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
10634 10634
10635 10635
10636 static void SetOnThis(Local<String> name, 10636 static void SetOnThis(Local<String> name,
10637 Local<Value> value, 10637 Local<Value> value,
10638 const v8::PropertyCallbackInfo<void>& info) { 10638 const v8::PropertyCallbackInfo<void>& info) {
10639 info.This()->ForceSet(name, value); 10639 info.This()->ForceSet(name, value);
10640 } 10640 }
10641 10641
10642 10642
10643 THREADED_TEST(InterceptorLoadICWithCallbackOnHolder) { 10643 THREADED_TEST(InterceptorLoadICWithCallbackOnHolder) {
10644 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10644 v8::HandleScope scope(CcTest::isolate());
10645 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10645 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10646 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter); 10646 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter);
10647 templ->SetAccessor(v8_str("y"), Return239Callback); 10647 templ->SetAccessor(v8_str("y"), Return239Callback);
10648 LocalContext context; 10648 LocalContext context;
10649 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10649 context->Global()->Set(v8_str("o"), templ->NewInstance());
10650 10650
10651 // Check the case when receiver and interceptor's holder 10651 // Check the case when receiver and interceptor's holder
10652 // are the same objects. 10652 // are the same objects.
10653 v8::Handle<Value> value = CompileRun( 10653 v8::Handle<Value> value = CompileRun(
10654 "var result = 0;" 10654 "var result = 0;"
10655 "for (var i = 0; i < 7; i++) {" 10655 "for (var i = 0; i < 7; i++) {"
10656 " result = o.y;" 10656 " result = o.y;"
10657 "}"); 10657 "}");
10658 CHECK_EQ(239, value->Int32Value()); 10658 CHECK_EQ(239, value->Int32Value());
10659 10659
10660 // Check the case when interceptor's holder is in proto chain 10660 // Check the case when interceptor's holder is in proto chain
10661 // of receiver. 10661 // of receiver.
10662 value = CompileRun( 10662 value = CompileRun(
10663 "r = { __proto__: o };" 10663 "r = { __proto__: o };"
10664 "var result = 0;" 10664 "var result = 0;"
10665 "for (var i = 0; i < 7; i++) {" 10665 "for (var i = 0; i < 7; i++) {"
10666 " result = r.y;" 10666 " result = r.y;"
10667 "}"); 10667 "}");
10668 CHECK_EQ(239, value->Int32Value()); 10668 CHECK_EQ(239, value->Int32Value());
10669 } 10669 }
10670 10670
10671 10671
10672 THREADED_TEST(InterceptorLoadICWithCallbackOnProto) { 10672 THREADED_TEST(InterceptorLoadICWithCallbackOnProto) {
10673 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10673 v8::HandleScope scope(CcTest::isolate());
10674 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 10674 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
10675 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter); 10675 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter);
10676 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(); 10676 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New();
10677 templ_p->SetAccessor(v8_str("y"), Return239Callback); 10677 templ_p->SetAccessor(v8_str("y"), Return239Callback);
10678 10678
10679 LocalContext context; 10679 LocalContext context;
10680 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 10680 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
10681 context->Global()->Set(v8_str("p"), templ_p->NewInstance()); 10681 context->Global()->Set(v8_str("p"), templ_p->NewInstance());
10682 10682
10683 // Check the case when receiver and interceptor's holder 10683 // Check the case when receiver and interceptor's holder
(...skipping 12 matching lines...) Expand all
10696 "r = { __proto__: o };" 10696 "r = { __proto__: o };"
10697 "var result = 0;" 10697 "var result = 0;"
10698 "for (var i = 0; i < 7; i++) {" 10698 "for (var i = 0; i < 7; i++) {"
10699 " result = r.x + r.y;" 10699 " result = r.x + r.y;"
10700 "}"); 10700 "}");
10701 CHECK_EQ(239 + 42, value->Int32Value()); 10701 CHECK_EQ(239 + 42, value->Int32Value());
10702 } 10702 }
10703 10703
10704 10704
10705 THREADED_TEST(InterceptorLoadICForCallbackWithOverride) { 10705 THREADED_TEST(InterceptorLoadICForCallbackWithOverride) {
10706 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10706 v8::HandleScope scope(CcTest::isolate());
10707 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10707 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10708 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter); 10708 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter);
10709 templ->SetAccessor(v8_str("y"), Return239Callback); 10709 templ->SetAccessor(v8_str("y"), Return239Callback);
10710 10710
10711 LocalContext context; 10711 LocalContext context;
10712 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10712 context->Global()->Set(v8_str("o"), templ->NewInstance());
10713 10713
10714 v8::Handle<Value> value = CompileRun( 10714 v8::Handle<Value> value = CompileRun(
10715 "fst = new Object(); fst.__proto__ = o;" 10715 "fst = new Object(); fst.__proto__ = o;"
10716 "snd = new Object(); snd.__proto__ = fst;" 10716 "snd = new Object(); snd.__proto__ = fst;"
10717 "var result1 = 0;" 10717 "var result1 = 0;"
10718 "for (var i = 0; i < 7; i++) {" 10718 "for (var i = 0; i < 7; i++) {"
10719 " result1 = snd.x;" 10719 " result1 = snd.x;"
10720 "}" 10720 "}"
10721 "fst.x = 239;" 10721 "fst.x = 239;"
10722 "var result = 0;" 10722 "var result = 0;"
10723 "for (var i = 0; i < 7; i++) {" 10723 "for (var i = 0; i < 7; i++) {"
10724 " result = snd.x;" 10724 " result = snd.x;"
10725 "}" 10725 "}"
10726 "result + result1"); 10726 "result + result1");
10727 CHECK_EQ(239 + 42, value->Int32Value()); 10727 CHECK_EQ(239 + 42, value->Int32Value());
10728 } 10728 }
10729 10729
10730 10730
10731 // Test the case when we stored callback into 10731 // Test the case when we stored callback into
10732 // a stub, but interceptor produced value on its own. 10732 // a stub, but interceptor produced value on its own.
10733 THREADED_TEST(InterceptorLoadICCallbackNotNeeded) { 10733 THREADED_TEST(InterceptorLoadICCallbackNotNeeded) {
10734 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10734 v8::HandleScope scope(CcTest::isolate());
10735 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 10735 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
10736 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter); 10736 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter);
10737 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(); 10737 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New();
10738 templ_p->SetAccessor(v8_str("y"), Return239Callback); 10738 templ_p->SetAccessor(v8_str("y"), Return239Callback);
10739 10739
10740 LocalContext context; 10740 LocalContext context;
10741 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 10741 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
10742 context->Global()->Set(v8_str("p"), templ_p->NewInstance()); 10742 context->Global()->Set(v8_str("p"), templ_p->NewInstance());
10743 10743
10744 v8::Handle<Value> value = CompileRun( 10744 v8::Handle<Value> value = CompileRun(
10745 "o.__proto__ = p;" 10745 "o.__proto__ = p;"
10746 "for (var i = 0; i < 7; i++) {" 10746 "for (var i = 0; i < 7; i++) {"
10747 " o.x;" 10747 " o.x;"
10748 // Now it should be ICed and keep a reference to x defined on p 10748 // Now it should be ICed and keep a reference to x defined on p
10749 "}" 10749 "}"
10750 "var result = 0;" 10750 "var result = 0;"
10751 "for (var i = 0; i < 7; i++) {" 10751 "for (var i = 0; i < 7; i++) {"
10752 " result += o.x;" 10752 " result += o.x;"
10753 "}" 10753 "}"
10754 "result"); 10754 "result");
10755 CHECK_EQ(42 * 7, value->Int32Value()); 10755 CHECK_EQ(42 * 7, value->Int32Value());
10756 } 10756 }
10757 10757
10758 10758
10759 // Test the case when we stored callback into 10759 // Test the case when we stored callback into
10760 // a stub, but it got invalidated later on. 10760 // a stub, but it got invalidated later on.
10761 THREADED_TEST(InterceptorLoadICInvalidatedCallback) { 10761 THREADED_TEST(InterceptorLoadICInvalidatedCallback) {
10762 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10762 v8::HandleScope scope(CcTest::isolate());
10763 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 10763 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
10764 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter); 10764 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter);
10765 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(); 10765 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New();
10766 templ_p->SetAccessor(v8_str("y"), Return239Callback, SetOnThis); 10766 templ_p->SetAccessor(v8_str("y"), Return239Callback, SetOnThis);
10767 10767
10768 LocalContext context; 10768 LocalContext context;
10769 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 10769 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
10770 context->Global()->Set(v8_str("p"), templ_p->NewInstance()); 10770 context->Global()->Set(v8_str("p"), templ_p->NewInstance());
10771 10771
10772 v8::Handle<Value> value = CompileRun( 10772 v8::Handle<Value> value = CompileRun(
(...skipping 11 matching lines...) Expand all
10784 "}" 10784 "}"
10785 "result"); 10785 "result");
10786 CHECK_EQ(42 * 10, value->Int32Value()); 10786 CHECK_EQ(42 * 10, value->Int32Value());
10787 } 10787 }
10788 10788
10789 10789
10790 // Test the case when we stored callback into 10790 // Test the case when we stored callback into
10791 // a stub, but it got invalidated later on due to override on 10791 // a stub, but it got invalidated later on due to override on
10792 // global object which is between interceptor and callbacks' holders. 10792 // global object which is between interceptor and callbacks' holders.
10793 THREADED_TEST(InterceptorLoadICInvalidatedCallbackViaGlobal) { 10793 THREADED_TEST(InterceptorLoadICInvalidatedCallbackViaGlobal) {
10794 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10794 v8::HandleScope scope(CcTest::isolate());
10795 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 10795 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
10796 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter); 10796 templ_o->SetNamedPropertyHandler(InterceptorLoadXICGetter);
10797 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New(); 10797 v8::Handle<v8::ObjectTemplate> templ_p = ObjectTemplate::New();
10798 templ_p->SetAccessor(v8_str("y"), Return239Callback, SetOnThis); 10798 templ_p->SetAccessor(v8_str("y"), Return239Callback, SetOnThis);
10799 10799
10800 LocalContext context; 10800 LocalContext context;
10801 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 10801 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
10802 context->Global()->Set(v8_str("p"), templ_p->NewInstance()); 10802 context->Global()->Set(v8_str("p"), templ_p->NewInstance());
10803 10803
10804 v8::Handle<Value> value = CompileRun( 10804 v8::Handle<Value> value = CompileRun(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
10839 Local<Value> value, 10839 Local<Value> value,
10840 const v8::PropertyCallbackInfo<v8::Value>& info) { 10840 const v8::PropertyCallbackInfo<v8::Value>& info) {
10841 CHECK(v8_str("x")->Equals(key)); 10841 CHECK(v8_str("x")->Equals(key));
10842 CHECK_EQ(42, value->Int32Value()); 10842 CHECK_EQ(42, value->Int32Value());
10843 info.GetReturnValue().Set(value); 10843 info.GetReturnValue().Set(value);
10844 } 10844 }
10845 10845
10846 10846
10847 // This test should hit the store IC for the interceptor case. 10847 // This test should hit the store IC for the interceptor case.
10848 THREADED_TEST(InterceptorStoreIC) { 10848 THREADED_TEST(InterceptorStoreIC) {
10849 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10849 v8::HandleScope scope(CcTest::isolate());
10850 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10850 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10851 templ->SetNamedPropertyHandler(InterceptorLoadICGetter, 10851 templ->SetNamedPropertyHandler(InterceptorLoadICGetter,
10852 InterceptorStoreICSetter, 10852 InterceptorStoreICSetter,
10853 0, 0, 0, v8_str("data")); 10853 0, 0, 0, v8_str("data"));
10854 LocalContext context; 10854 LocalContext context;
10855 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10855 context->Global()->Set(v8_str("o"), templ->NewInstance());
10856 CompileRun( 10856 CompileRun(
10857 "for (var i = 0; i < 1000; i++) {" 10857 "for (var i = 0; i < 1000; i++) {"
10858 " o.x = 42;" 10858 " o.x = 42;"
10859 "}"); 10859 "}");
10860 } 10860 }
10861 10861
10862 10862
10863 THREADED_TEST(InterceptorStoreICWithNoSetter) { 10863 THREADED_TEST(InterceptorStoreICWithNoSetter) {
10864 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10864 v8::HandleScope scope(CcTest::isolate());
10865 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10865 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10866 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter); 10866 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter);
10867 LocalContext context; 10867 LocalContext context;
10868 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10868 context->Global()->Set(v8_str("o"), templ->NewInstance());
10869 v8::Handle<Value> value = CompileRun( 10869 v8::Handle<Value> value = CompileRun(
10870 "for (var i = 0; i < 1000; i++) {" 10870 "for (var i = 0; i < 1000; i++) {"
10871 " o.y = 239;" 10871 " o.y = 239;"
10872 "}" 10872 "}"
10873 "42 + o.y"); 10873 "42 + o.y");
10874 CHECK_EQ(239 + 42, value->Int32Value()); 10874 CHECK_EQ(239 + 42, value->Int32Value());
(...skipping 10 matching lines...) Expand all
10885 Local<String> name, 10885 Local<String> name,
10886 const v8::PropertyCallbackInfo<v8::Value>& info) { 10886 const v8::PropertyCallbackInfo<v8::Value>& info) {
10887 ApiTestFuzzer::Fuzz(); 10887 ApiTestFuzzer::Fuzz();
10888 CHECK(v8_str("x")->Equals(name)); 10888 CHECK(v8_str("x")->Equals(name));
10889 info.GetReturnValue().Set(call_ic_function); 10889 info.GetReturnValue().Set(call_ic_function);
10890 } 10890 }
10891 10891
10892 10892
10893 // This test should hit the call IC for the interceptor case. 10893 // This test should hit the call IC for the interceptor case.
10894 THREADED_TEST(InterceptorCallIC) { 10894 THREADED_TEST(InterceptorCallIC) {
10895 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10895 v8::HandleScope scope(CcTest::isolate());
10896 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10896 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10897 templ->SetNamedPropertyHandler(InterceptorCallICGetter); 10897 templ->SetNamedPropertyHandler(InterceptorCallICGetter);
10898 LocalContext context; 10898 LocalContext context;
10899 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10899 context->Global()->Set(v8_str("o"), templ->NewInstance());
10900 call_ic_function = 10900 call_ic_function =
10901 v8_compile("function f(x) { return x + 1; }; f")->Run(); 10901 v8_compile("function f(x) { return x + 1; }; f")->Run();
10902 v8::Handle<Value> value = CompileRun( 10902 v8::Handle<Value> value = CompileRun(
10903 "var result = 0;" 10903 "var result = 0;"
10904 "for (var i = 0; i < 1000; i++) {" 10904 "for (var i = 0; i < 1000; i++) {"
10905 " result = o.x(41);" 10905 " result = o.x(41);"
10906 "}"); 10906 "}");
10907 CHECK_EQ(42, value->Int32Value()); 10907 CHECK_EQ(42, value->Int32Value());
10908 } 10908 }
10909 10909
10910 10910
10911 // This test checks that if interceptor doesn't provide 10911 // This test checks that if interceptor doesn't provide
10912 // a value, we can fetch regular value. 10912 // a value, we can fetch regular value.
10913 THREADED_TEST(InterceptorCallICSeesOthers) { 10913 THREADED_TEST(InterceptorCallICSeesOthers) {
10914 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10914 v8::HandleScope scope(CcTest::isolate());
10915 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10915 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10916 templ->SetNamedPropertyHandler(NoBlockGetterX); 10916 templ->SetNamedPropertyHandler(NoBlockGetterX);
10917 LocalContext context; 10917 LocalContext context;
10918 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10918 context->Global()->Set(v8_str("o"), templ->NewInstance());
10919 v8::Handle<Value> value = CompileRun( 10919 v8::Handle<Value> value = CompileRun(
10920 "o.x = function f(x) { return x + 1; };" 10920 "o.x = function f(x) { return x + 1; };"
10921 "var result = 0;" 10921 "var result = 0;"
10922 "for (var i = 0; i < 7; i++) {" 10922 "for (var i = 0; i < 7; i++) {"
10923 " result = o.x(41);" 10923 " result = o.x(41);"
10924 "}"); 10924 "}");
10925 CHECK_EQ(42, value->Int32Value()); 10925 CHECK_EQ(42, value->Int32Value());
10926 } 10926 }
10927 10927
10928 10928
10929 static v8::Handle<Value> call_ic_function4; 10929 static v8::Handle<Value> call_ic_function4;
10930 static void InterceptorCallICGetter4( 10930 static void InterceptorCallICGetter4(
10931 Local<String> name, 10931 Local<String> name,
10932 const v8::PropertyCallbackInfo<v8::Value>& info) { 10932 const v8::PropertyCallbackInfo<v8::Value>& info) {
10933 ApiTestFuzzer::Fuzz(); 10933 ApiTestFuzzer::Fuzz();
10934 CHECK(v8_str("x")->Equals(name)); 10934 CHECK(v8_str("x")->Equals(name));
10935 info.GetReturnValue().Set(call_ic_function4); 10935 info.GetReturnValue().Set(call_ic_function4);
10936 } 10936 }
10937 10937
10938 10938
10939 // This test checks that if interceptor provides a function, 10939 // This test checks that if interceptor provides a function,
10940 // even if we cached shadowed variant, interceptor's function 10940 // even if we cached shadowed variant, interceptor's function
10941 // is invoked 10941 // is invoked
10942 THREADED_TEST(InterceptorCallICCacheableNotNeeded) { 10942 THREADED_TEST(InterceptorCallICCacheableNotNeeded) {
10943 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10943 v8::HandleScope scope(CcTest::isolate());
10944 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10944 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10945 templ->SetNamedPropertyHandler(InterceptorCallICGetter4); 10945 templ->SetNamedPropertyHandler(InterceptorCallICGetter4);
10946 LocalContext context; 10946 LocalContext context;
10947 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10947 context->Global()->Set(v8_str("o"), templ->NewInstance());
10948 call_ic_function4 = 10948 call_ic_function4 =
10949 v8_compile("function f(x) { return x - 1; }; f")->Run(); 10949 v8_compile("function f(x) { return x - 1; }; f")->Run();
10950 v8::Handle<Value> value = CompileRun( 10950 v8::Handle<Value> value = CompileRun(
10951 "Object.getPrototypeOf(o).x = function(x) { return x + 1; };" 10951 "Object.getPrototypeOf(o).x = function(x) { return x + 1; };"
10952 "var result = 0;" 10952 "var result = 0;"
10953 "for (var i = 0; i < 1000; i++) {" 10953 "for (var i = 0; i < 1000; i++) {"
10954 " result = o.x(42);" 10954 " result = o.x(42);"
10955 "}"); 10955 "}");
10956 CHECK_EQ(41, value->Int32Value()); 10956 CHECK_EQ(41, value->Int32Value());
10957 } 10957 }
10958 10958
10959 10959
10960 // Test the case when we stored cacheable lookup into 10960 // Test the case when we stored cacheable lookup into
10961 // a stub, but it got invalidated later on 10961 // a stub, but it got invalidated later on
10962 THREADED_TEST(InterceptorCallICInvalidatedCacheable) { 10962 THREADED_TEST(InterceptorCallICInvalidatedCacheable) {
10963 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10963 v8::HandleScope scope(CcTest::isolate());
10964 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10964 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10965 templ->SetNamedPropertyHandler(NoBlockGetterX); 10965 templ->SetNamedPropertyHandler(NoBlockGetterX);
10966 LocalContext context; 10966 LocalContext context;
10967 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10967 context->Global()->Set(v8_str("o"), templ->NewInstance());
10968 v8::Handle<Value> value = CompileRun( 10968 v8::Handle<Value> value = CompileRun(
10969 "proto1 = new Object();" 10969 "proto1 = new Object();"
10970 "proto2 = new Object();" 10970 "proto2 = new Object();"
10971 "o.__proto__ = proto1;" 10971 "o.__proto__ = proto1;"
10972 "proto1.__proto__ = proto2;" 10972 "proto1.__proto__ = proto2;"
10973 "proto2.y = function(x) { return x + 1; };" 10973 "proto2.y = function(x) { return x + 1; };"
10974 // Invoke it many times to compile a stub 10974 // Invoke it many times to compile a stub
10975 "for (var i = 0; i < 7; i++) {" 10975 "for (var i = 0; i < 7; i++) {"
10976 " o.y(42);" 10976 " o.y(42);"
10977 "}" 10977 "}"
10978 "proto1.y = function(x) { return x - 1; };" 10978 "proto1.y = function(x) { return x - 1; };"
10979 "var result = 0;" 10979 "var result = 0;"
10980 "for (var i = 0; i < 7; i++) {" 10980 "for (var i = 0; i < 7; i++) {"
10981 " result += o.y(42);" 10981 " result += o.y(42);"
10982 "}"); 10982 "}");
10983 CHECK_EQ(41 * 7, value->Int32Value()); 10983 CHECK_EQ(41 * 7, value->Int32Value());
10984 } 10984 }
10985 10985
10986 10986
10987 // This test checks that if interceptor doesn't provide a function, 10987 // This test checks that if interceptor doesn't provide a function,
10988 // cached constant function is used 10988 // cached constant function is used
10989 THREADED_TEST(InterceptorCallICConstantFunctionUsed) { 10989 THREADED_TEST(InterceptorCallICConstantFunctionUsed) {
10990 v8::HandleScope scope(v8::Isolate::GetCurrent()); 10990 v8::HandleScope scope(CcTest::isolate());
10991 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 10991 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
10992 templ->SetNamedPropertyHandler(NoBlockGetterX); 10992 templ->SetNamedPropertyHandler(NoBlockGetterX);
10993 LocalContext context; 10993 LocalContext context;
10994 context->Global()->Set(v8_str("o"), templ->NewInstance()); 10994 context->Global()->Set(v8_str("o"), templ->NewInstance());
10995 v8::Handle<Value> value = CompileRun( 10995 v8::Handle<Value> value = CompileRun(
10996 "function inc(x) { return x + 1; };" 10996 "function inc(x) { return x + 1; };"
10997 "inc(1);" 10997 "inc(1);"
10998 "o.x = inc;" 10998 "o.x = inc;"
10999 "var result = 0;" 10999 "var result = 0;"
11000 "for (var i = 0; i < 1000; i++) {" 11000 "for (var i = 0; i < 1000; i++) {"
(...skipping 10 matching lines...) Expand all
11011 ApiTestFuzzer::Fuzz(); 11011 ApiTestFuzzer::Fuzz();
11012 if (v8_str("x")->Equals(name)) 11012 if (v8_str("x")->Equals(name))
11013 info.GetReturnValue().Set(call_ic_function5); 11013 info.GetReturnValue().Set(call_ic_function5);
11014 } 11014 }
11015 11015
11016 11016
11017 // This test checks that if interceptor provides a function, 11017 // This test checks that if interceptor provides a function,
11018 // even if we cached constant function, interceptor's function 11018 // even if we cached constant function, interceptor's function
11019 // is invoked 11019 // is invoked
11020 THREADED_TEST(InterceptorCallICConstantFunctionNotNeeded) { 11020 THREADED_TEST(InterceptorCallICConstantFunctionNotNeeded) {
11021 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11021 v8::HandleScope scope(CcTest::isolate());
11022 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11022 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11023 templ->SetNamedPropertyHandler(InterceptorCallICGetter5); 11023 templ->SetNamedPropertyHandler(InterceptorCallICGetter5);
11024 LocalContext context; 11024 LocalContext context;
11025 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11025 context->Global()->Set(v8_str("o"), templ->NewInstance());
11026 call_ic_function5 = 11026 call_ic_function5 =
11027 v8_compile("function f(x) { return x - 1; }; f")->Run(); 11027 v8_compile("function f(x) { return x - 1; }; f")->Run();
11028 v8::Handle<Value> value = CompileRun( 11028 v8::Handle<Value> value = CompileRun(
11029 "function inc(x) { return x + 1; };" 11029 "function inc(x) { return x + 1; };"
11030 "inc(1);" 11030 "inc(1);"
11031 "o.x = inc;" 11031 "o.x = inc;"
(...skipping 12 matching lines...) Expand all
11044 ApiTestFuzzer::Fuzz(); 11044 ApiTestFuzzer::Fuzz();
11045 if (v8_str("x")->Equals(name)) 11045 if (v8_str("x")->Equals(name))
11046 info.GetReturnValue().Set(call_ic_function6); 11046 info.GetReturnValue().Set(call_ic_function6);
11047 } 11047 }
11048 11048
11049 11049
11050 // Same test as above, except the code is wrapped in a function 11050 // Same test as above, except the code is wrapped in a function
11051 // to test the optimized compiler. 11051 // to test the optimized compiler.
11052 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) { 11052 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) {
11053 i::FLAG_allow_natives_syntax = true; 11053 i::FLAG_allow_natives_syntax = true;
11054 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11054 v8::HandleScope scope(CcTest::isolate());
11055 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11055 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11056 templ->SetNamedPropertyHandler(InterceptorCallICGetter6); 11056 templ->SetNamedPropertyHandler(InterceptorCallICGetter6);
11057 LocalContext context; 11057 LocalContext context;
11058 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11058 context->Global()->Set(v8_str("o"), templ->NewInstance());
11059 call_ic_function6 = 11059 call_ic_function6 =
11060 v8_compile("function f(x) { return x - 1; }; f")->Run(); 11060 v8_compile("function f(x) { return x - 1; }; f")->Run();
11061 v8::Handle<Value> value = CompileRun( 11061 v8::Handle<Value> value = CompileRun(
11062 "function inc(x) { return x + 1; };" 11062 "function inc(x) { return x + 1; };"
11063 "inc(1);" 11063 "inc(1);"
11064 "o.x = inc;" 11064 "o.x = inc;"
11065 "function test() {" 11065 "function test() {"
11066 " var result = 0;" 11066 " var result = 0;"
11067 " for (var i = 0; i < 1000; i++) {" 11067 " for (var i = 0; i < 1000; i++) {"
11068 " result = o.x(42);" 11068 " result = o.x(42);"
11069 " }" 11069 " }"
11070 " return result;" 11070 " return result;"
11071 "};" 11071 "};"
11072 "test();" 11072 "test();"
11073 "test();" 11073 "test();"
11074 "test();" 11074 "test();"
11075 "%OptimizeFunctionOnNextCall(test);" 11075 "%OptimizeFunctionOnNextCall(test);"
11076 "test()"); 11076 "test()");
11077 CHECK_EQ(41, value->Int32Value()); 11077 CHECK_EQ(41, value->Int32Value());
11078 } 11078 }
11079 11079
11080 11080
11081 // Test the case when we stored constant function into 11081 // Test the case when we stored constant function into
11082 // a stub, but it got invalidated later on 11082 // a stub, but it got invalidated later on
11083 THREADED_TEST(InterceptorCallICInvalidatedConstantFunction) { 11083 THREADED_TEST(InterceptorCallICInvalidatedConstantFunction) {
11084 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11084 v8::HandleScope scope(CcTest::isolate());
11085 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11085 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11086 templ->SetNamedPropertyHandler(NoBlockGetterX); 11086 templ->SetNamedPropertyHandler(NoBlockGetterX);
11087 LocalContext context; 11087 LocalContext context;
11088 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11088 context->Global()->Set(v8_str("o"), templ->NewInstance());
11089 v8::Handle<Value> value = CompileRun( 11089 v8::Handle<Value> value = CompileRun(
11090 "function inc(x) { return x + 1; };" 11090 "function inc(x) { return x + 1; };"
11091 "inc(1);" 11091 "inc(1);"
11092 "proto1 = new Object();" 11092 "proto1 = new Object();"
11093 "proto2 = new Object();" 11093 "proto2 = new Object();"
11094 "o.__proto__ = proto1;" 11094 "o.__proto__ = proto1;"
11095 "proto1.__proto__ = proto2;" 11095 "proto1.__proto__ = proto2;"
11096 "proto2.y = inc;" 11096 "proto2.y = inc;"
11097 // Invoke it many times to compile a stub 11097 // Invoke it many times to compile a stub
11098 "for (var i = 0; i < 7; i++) {" 11098 "for (var i = 0; i < 7; i++) {"
11099 " o.y(42);" 11099 " o.y(42);"
11100 "}" 11100 "}"
11101 "proto1.y = function(x) { return x - 1; };" 11101 "proto1.y = function(x) { return x - 1; };"
11102 "var result = 0;" 11102 "var result = 0;"
11103 "for (var i = 0; i < 7; i++) {" 11103 "for (var i = 0; i < 7; i++) {"
11104 " result += o.y(42);" 11104 " result += o.y(42);"
11105 "}"); 11105 "}");
11106 CHECK_EQ(41 * 7, value->Int32Value()); 11106 CHECK_EQ(41 * 7, value->Int32Value());
11107 } 11107 }
11108 11108
11109 11109
11110 // Test the case when we stored constant function into 11110 // Test the case when we stored constant function into
11111 // a stub, but it got invalidated later on due to override on 11111 // a stub, but it got invalidated later on due to override on
11112 // global object which is between interceptor and constant function' holders. 11112 // global object which is between interceptor and constant function' holders.
11113 THREADED_TEST(InterceptorCallICInvalidatedConstantFunctionViaGlobal) { 11113 THREADED_TEST(InterceptorCallICInvalidatedConstantFunctionViaGlobal) {
11114 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11114 v8::HandleScope scope(CcTest::isolate());
11115 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11115 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11116 templ->SetNamedPropertyHandler(NoBlockGetterX); 11116 templ->SetNamedPropertyHandler(NoBlockGetterX);
11117 LocalContext context; 11117 LocalContext context;
11118 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11118 context->Global()->Set(v8_str("o"), templ->NewInstance());
11119 v8::Handle<Value> value = CompileRun( 11119 v8::Handle<Value> value = CompileRun(
11120 "function inc(x) { return x + 1; };" 11120 "function inc(x) { return x + 1; };"
11121 "inc(1);" 11121 "inc(1);"
11122 "o.__proto__ = this;" 11122 "o.__proto__ = this;"
11123 "this.__proto__.y = inc;" 11123 "this.__proto__.y = inc;"
11124 // Invoke it many times to compile a stub 11124 // Invoke it many times to compile a stub
11125 "for (var i = 0; i < 7; i++) {" 11125 "for (var i = 0; i < 7; i++) {"
11126 " if (o.y(42) != 43) throw 'oops: ' + o.y(42);" 11126 " if (o.y(42) != 43) throw 'oops: ' + o.y(42);"
11127 "}" 11127 "}"
11128 "this.y = function(x) { return x - 1; };" 11128 "this.y = function(x) { return x - 1; };"
11129 "var result = 0;" 11129 "var result = 0;"
11130 "for (var i = 0; i < 7; i++) {" 11130 "for (var i = 0; i < 7; i++) {"
11131 " result += o.y(42);" 11131 " result += o.y(42);"
11132 "}"); 11132 "}");
11133 CHECK_EQ(41 * 7, value->Int32Value()); 11133 CHECK_EQ(41 * 7, value->Int32Value());
11134 } 11134 }
11135 11135
11136 11136
11137 // Test the case when actual function to call sits on global object. 11137 // Test the case when actual function to call sits on global object.
11138 THREADED_TEST(InterceptorCallICCachedFromGlobal) { 11138 THREADED_TEST(InterceptorCallICCachedFromGlobal) {
11139 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11139 v8::HandleScope scope(CcTest::isolate());
11140 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11140 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
11141 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 11141 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
11142 11142
11143 LocalContext context; 11143 LocalContext context;
11144 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 11144 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
11145 11145
11146 v8::Handle<Value> value = CompileRun( 11146 v8::Handle<Value> value = CompileRun(
11147 "try {" 11147 "try {"
11148 " o.__proto__ = this;" 11148 " o.__proto__ = this;"
11149 " for (var i = 0; i < 10; i++) {" 11149 " for (var i = 0; i < 10; i++) {"
(...skipping 22 matching lines...) Expand all
11172 ++(*call_count); 11172 ++(*call_count);
11173 if ((*call_count) % 20 == 0) { 11173 if ((*call_count) % 20 == 0) {
11174 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 11174 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
11175 } 11175 }
11176 } 11176 }
11177 11177
11178 static void FastApiCallback_TrivialSignature( 11178 static void FastApiCallback_TrivialSignature(
11179 const v8::FunctionCallbackInfo<v8::Value>& args) { 11179 const v8::FunctionCallbackInfo<v8::Value>& args) {
11180 ApiTestFuzzer::Fuzz(); 11180 ApiTestFuzzer::Fuzz();
11181 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_TrivialSignature)); 11181 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_TrivialSignature));
11182 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 11182 v8::Isolate* isolate = CcTest::isolate();
11183 CHECK_EQ(isolate, args.GetIsolate()); 11183 CHECK_EQ(isolate, args.GetIsolate());
11184 CHECK_EQ(args.This(), args.Holder()); 11184 CHECK_EQ(args.This(), args.Holder());
11185 CHECK(args.Data()->Equals(v8_str("method_data"))); 11185 CHECK(args.Data()->Equals(v8_str("method_data")));
11186 args.GetReturnValue().Set(args[0]->Int32Value() + 1); 11186 args.GetReturnValue().Set(args[0]->Int32Value() + 1);
11187 } 11187 }
11188 11188
11189 static void FastApiCallback_SimpleSignature( 11189 static void FastApiCallback_SimpleSignature(
11190 const v8::FunctionCallbackInfo<v8::Value>& args) { 11190 const v8::FunctionCallbackInfo<v8::Value>& args) {
11191 ApiTestFuzzer::Fuzz(); 11191 ApiTestFuzzer::Fuzz();
11192 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_SimpleSignature)); 11192 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_SimpleSignature));
11193 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 11193 v8::Isolate* isolate = CcTest::isolate();
11194 CHECK_EQ(isolate, args.GetIsolate()); 11194 CHECK_EQ(isolate, args.GetIsolate());
11195 CHECK_EQ(args.This()->GetPrototype(), args.Holder()); 11195 CHECK_EQ(args.This()->GetPrototype(), args.Holder());
11196 CHECK(args.Data()->Equals(v8_str("method_data"))); 11196 CHECK(args.Data()->Equals(v8_str("method_data")));
11197 // Note, we're using HasRealNamedProperty instead of Has to avoid 11197 // Note, we're using HasRealNamedProperty instead of Has to avoid
11198 // invoking the interceptor again. 11198 // invoking the interceptor again.
11199 CHECK(args.Holder()->HasRealNamedProperty(v8_str("foo"))); 11199 CHECK(args.Holder()->HasRealNamedProperty(v8_str("foo")));
11200 args.GetReturnValue().Set(args[0]->Int32Value() + 1); 11200 args.GetReturnValue().Set(args[0]->Int32Value() + 1);
11201 } 11201 }
11202 11202
11203 11203
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
11326 "for (var i = 0; i < 5; i++) {" 11326 "for (var i = 0; i < 5; i++) {"
11327 " try { o1.p1; } catch (e) { result += e; }" 11327 " try { o1.p1; } catch (e) { result += e; }"
11328 "}" 11328 "}"
11329 "result;"); 11329 "result;");
11330 CHECK_EQ(v8_str("ggggg"), result); 11330 CHECK_EQ(v8_str("ggggg"), result);
11331 } 11331 }
11332 11332
11333 11333
11334 THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) { 11334 THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) {
11335 int interceptor_call_count = 0; 11335 int interceptor_call_count = 0;
11336 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11336 v8::HandleScope scope(CcTest::isolate());
11337 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11337 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11338 v8::Handle<v8::FunctionTemplate> method_templ = 11338 v8::Handle<v8::FunctionTemplate> method_templ =
11339 v8::FunctionTemplate::New(FastApiCallback_TrivialSignature, 11339 v8::FunctionTemplate::New(FastApiCallback_TrivialSignature,
11340 v8_str("method_data"), 11340 v8_str("method_data"),
11341 v8::Handle<v8::Signature>()); 11341 v8::Handle<v8::Signature>());
11342 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11342 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11343 proto_templ->Set(v8_str("method"), method_templ); 11343 proto_templ->Set(v8_str("method"), method_templ);
11344 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 11344 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
11345 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 11345 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
11346 NULL, NULL, NULL, NULL, 11346 NULL, NULL, NULL, NULL,
11347 v8::External::New(&interceptor_call_count)); 11347 v8::External::New(&interceptor_call_count));
11348 LocalContext context; 11348 LocalContext context;
11349 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 11349 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
11350 GenerateSomeGarbage(); 11350 GenerateSomeGarbage();
11351 context->Global()->Set(v8_str("o"), fun->NewInstance()); 11351 context->Global()->Set(v8_str("o"), fun->NewInstance());
11352 CompileRun( 11352 CompileRun(
11353 "var result = 0;" 11353 "var result = 0;"
11354 "for (var i = 0; i < 100; i++) {" 11354 "for (var i = 0; i < 100; i++) {"
11355 " result = o.method(41);" 11355 " result = o.method(41);"
11356 "}"); 11356 "}");
11357 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 11357 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
11358 CHECK_EQ(100, interceptor_call_count); 11358 CHECK_EQ(100, interceptor_call_count);
11359 } 11359 }
11360 11360
11361 11361
11362 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature) { 11362 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature) {
11363 int interceptor_call_count = 0; 11363 int interceptor_call_count = 0;
11364 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11364 v8::HandleScope scope(CcTest::isolate());
11365 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11365 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11366 v8::Handle<v8::FunctionTemplate> method_templ = 11366 v8::Handle<v8::FunctionTemplate> method_templ =
11367 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11367 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11368 v8_str("method_data"), 11368 v8_str("method_data"),
11369 v8::Signature::New(fun_templ)); 11369 v8::Signature::New(fun_templ));
11370 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11370 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11371 proto_templ->Set(v8_str("method"), method_templ); 11371 proto_templ->Set(v8_str("method"), method_templ);
11372 fun_templ->SetHiddenPrototype(true); 11372 fun_templ->SetHiddenPrototype(true);
11373 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 11373 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
11374 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 11374 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
(...skipping 11 matching lines...) Expand all
11386 "for (var i = 0; i < 100; i++) {" 11386 "for (var i = 0; i < 100; i++) {"
11387 " result = receiver.method(41);" 11387 " result = receiver.method(41);"
11388 "}"); 11388 "}");
11389 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 11389 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
11390 CHECK_EQ(100, interceptor_call_count); 11390 CHECK_EQ(100, interceptor_call_count);
11391 } 11391 }
11392 11392
11393 11393
11394 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { 11394 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) {
11395 int interceptor_call_count = 0; 11395 int interceptor_call_count = 0;
11396 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11396 v8::HandleScope scope(CcTest::isolate());
11397 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11397 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11398 v8::Handle<v8::FunctionTemplate> method_templ = 11398 v8::Handle<v8::FunctionTemplate> method_templ =
11399 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11399 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11400 v8_str("method_data"), 11400 v8_str("method_data"),
11401 v8::Signature::New(fun_templ)); 11401 v8::Signature::New(fun_templ));
11402 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11402 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11403 proto_templ->Set(v8_str("method"), method_templ); 11403 proto_templ->Set(v8_str("method"), method_templ);
11404 fun_templ->SetHiddenPrototype(true); 11404 fun_templ->SetHiddenPrototype(true);
11405 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 11405 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
11406 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 11406 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
(...skipping 17 matching lines...) Expand all
11424 " }" 11424 " }"
11425 "}"); 11425 "}");
11426 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 11426 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value());
11427 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 11427 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
11428 CHECK_GE(interceptor_call_count, 50); 11428 CHECK_GE(interceptor_call_count, 50);
11429 } 11429 }
11430 11430
11431 11431
11432 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { 11432 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) {
11433 int interceptor_call_count = 0; 11433 int interceptor_call_count = 0;
11434 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11434 v8::HandleScope scope(CcTest::isolate());
11435 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11435 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11436 v8::Handle<v8::FunctionTemplate> method_templ = 11436 v8::Handle<v8::FunctionTemplate> method_templ =
11437 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11437 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11438 v8_str("method_data"), 11438 v8_str("method_data"),
11439 v8::Signature::New(fun_templ)); 11439 v8::Signature::New(fun_templ));
11440 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11440 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11441 proto_templ->Set(v8_str("method"), method_templ); 11441 proto_templ->Set(v8_str("method"), method_templ);
11442 fun_templ->SetHiddenPrototype(true); 11442 fun_templ->SetHiddenPrototype(true);
11443 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 11443 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
11444 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 11444 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
(...skipping 17 matching lines...) Expand all
11462 " }" 11462 " }"
11463 "}"); 11463 "}");
11464 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 11464 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value());
11465 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 11465 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
11466 CHECK_GE(interceptor_call_count, 50); 11466 CHECK_GE(interceptor_call_count, 50);
11467 } 11467 }
11468 11468
11469 11469
11470 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { 11470 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) {
11471 int interceptor_call_count = 0; 11471 int interceptor_call_count = 0;
11472 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11472 v8::HandleScope scope(CcTest::isolate());
11473 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11473 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11474 v8::Handle<v8::FunctionTemplate> method_templ = 11474 v8::Handle<v8::FunctionTemplate> method_templ =
11475 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11475 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11476 v8_str("method_data"), 11476 v8_str("method_data"),
11477 v8::Signature::New(fun_templ)); 11477 v8::Signature::New(fun_templ));
11478 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11478 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11479 proto_templ->Set(v8_str("method"), method_templ); 11479 proto_templ->Set(v8_str("method"), method_templ);
11480 fun_templ->SetHiddenPrototype(true); 11480 fun_templ->SetHiddenPrototype(true);
11481 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 11481 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
11482 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 11482 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
(...skipping 20 matching lines...) Expand all
11503 CHECK(try_catch.HasCaught()); 11503 CHECK(try_catch.HasCaught());
11504 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), 11504 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"),
11505 try_catch.Exception()->ToString()); 11505 try_catch.Exception()->ToString());
11506 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 11506 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
11507 CHECK_GE(interceptor_call_count, 50); 11507 CHECK_GE(interceptor_call_count, 50);
11508 } 11508 }
11509 11509
11510 11510
11511 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { 11511 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) {
11512 int interceptor_call_count = 0; 11512 int interceptor_call_count = 0;
11513 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11513 v8::HandleScope scope(CcTest::isolate());
11514 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11514 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11515 v8::Handle<v8::FunctionTemplate> method_templ = 11515 v8::Handle<v8::FunctionTemplate> method_templ =
11516 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11516 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11517 v8_str("method_data"), 11517 v8_str("method_data"),
11518 v8::Signature::New(fun_templ)); 11518 v8::Signature::New(fun_templ));
11519 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11519 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11520 proto_templ->Set(v8_str("method"), method_templ); 11520 proto_templ->Set(v8_str("method"), method_templ);
11521 fun_templ->SetHiddenPrototype(true); 11521 fun_templ->SetHiddenPrototype(true);
11522 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 11522 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
11523 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 11523 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
(...skipping 19 matching lines...) Expand all
11543 "}"); 11543 "}");
11544 CHECK(try_catch.HasCaught()); 11544 CHECK(try_catch.HasCaught());
11545 CHECK_EQ(v8_str("TypeError: Illegal invocation"), 11545 CHECK_EQ(v8_str("TypeError: Illegal invocation"),
11546 try_catch.Exception()->ToString()); 11546 try_catch.Exception()->ToString());
11547 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 11547 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
11548 CHECK_GE(interceptor_call_count, 50); 11548 CHECK_GE(interceptor_call_count, 50);
11549 } 11549 }
11550 11550
11551 11551
11552 THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) { 11552 THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) {
11553 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11553 v8::HandleScope scope(CcTest::isolate());
11554 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11554 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11555 v8::Handle<v8::FunctionTemplate> method_templ = 11555 v8::Handle<v8::FunctionTemplate> method_templ =
11556 v8::FunctionTemplate::New(FastApiCallback_TrivialSignature, 11556 v8::FunctionTemplate::New(FastApiCallback_TrivialSignature,
11557 v8_str("method_data"), 11557 v8_str("method_data"),
11558 v8::Handle<v8::Signature>()); 11558 v8::Handle<v8::Signature>());
11559 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11559 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11560 proto_templ->Set(v8_str("method"), method_templ); 11560 proto_templ->Set(v8_str("method"), method_templ);
11561 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 11561 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
11562 USE(templ); 11562 USE(templ);
11563 LocalContext context; 11563 LocalContext context;
11564 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 11564 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
11565 GenerateSomeGarbage(); 11565 GenerateSomeGarbage();
11566 context->Global()->Set(v8_str("o"), fun->NewInstance()); 11566 context->Global()->Set(v8_str("o"), fun->NewInstance());
11567 CompileRun( 11567 CompileRun(
11568 "var result = 0;" 11568 "var result = 0;"
11569 "for (var i = 0; i < 100; i++) {" 11569 "for (var i = 0; i < 100; i++) {"
11570 " result = o.method(41);" 11570 " result = o.method(41);"
11571 "}"); 11571 "}");
11572 11572
11573 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 11573 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
11574 } 11574 }
11575 11575
11576 11576
11577 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature) { 11577 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature) {
11578 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11578 v8::HandleScope scope(CcTest::isolate());
11579 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11579 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11580 v8::Handle<v8::FunctionTemplate> method_templ = 11580 v8::Handle<v8::FunctionTemplate> method_templ =
11581 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11581 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11582 v8_str("method_data"), 11582 v8_str("method_data"),
11583 v8::Signature::New(fun_templ)); 11583 v8::Signature::New(fun_templ));
11584 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11584 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11585 proto_templ->Set(v8_str("method"), method_templ); 11585 proto_templ->Set(v8_str("method"), method_templ);
11586 fun_templ->SetHiddenPrototype(true); 11586 fun_templ->SetHiddenPrototype(true);
11587 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 11587 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
11588 CHECK(!templ.IsEmpty()); 11588 CHECK(!templ.IsEmpty());
11589 LocalContext context; 11589 LocalContext context;
11590 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 11590 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
11591 GenerateSomeGarbage(); 11591 GenerateSomeGarbage();
11592 context->Global()->Set(v8_str("o"), fun->NewInstance()); 11592 context->Global()->Set(v8_str("o"), fun->NewInstance());
11593 CompileRun( 11593 CompileRun(
11594 "o.foo = 17;" 11594 "o.foo = 17;"
11595 "var receiver = {};" 11595 "var receiver = {};"
11596 "receiver.__proto__ = o;" 11596 "receiver.__proto__ = o;"
11597 "var result = 0;" 11597 "var result = 0;"
11598 "for (var i = 0; i < 100; i++) {" 11598 "for (var i = 0; i < 100; i++) {"
11599 " result = receiver.method(41);" 11599 " result = receiver.method(41);"
11600 "}"); 11600 "}");
11601 11601
11602 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 11602 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
11603 } 11603 }
11604 11604
11605 11605
11606 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss1) { 11606 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss1) {
11607 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11607 v8::HandleScope scope(CcTest::isolate());
11608 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11608 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11609 v8::Handle<v8::FunctionTemplate> method_templ = 11609 v8::Handle<v8::FunctionTemplate> method_templ =
11610 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11610 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11611 v8_str("method_data"), 11611 v8_str("method_data"),
11612 v8::Signature::New(fun_templ)); 11612 v8::Signature::New(fun_templ));
11613 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11613 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11614 proto_templ->Set(v8_str("method"), method_templ); 11614 proto_templ->Set(v8_str("method"), method_templ);
11615 fun_templ->SetHiddenPrototype(true); 11615 fun_templ->SetHiddenPrototype(true);
11616 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 11616 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
11617 CHECK(!templ.IsEmpty()); 11617 CHECK(!templ.IsEmpty());
(...skipping 13 matching lines...) Expand all
11631 " saved_result = result;" 11631 " saved_result = result;"
11632 " receiver = {method: function(x) { return x - 1 }};" 11632 " receiver = {method: function(x) { return x - 1 }};"
11633 " }" 11633 " }"
11634 "}"); 11634 "}");
11635 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 11635 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value());
11636 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 11636 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
11637 } 11637 }
11638 11638
11639 11639
11640 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss2) { 11640 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss2) {
11641 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11641 v8::HandleScope scope(CcTest::isolate());
11642 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11642 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11643 v8::Handle<v8::FunctionTemplate> method_templ = 11643 v8::Handle<v8::FunctionTemplate> method_templ =
11644 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11644 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11645 v8_str("method_data"), 11645 v8_str("method_data"),
11646 v8::Signature::New(fun_templ)); 11646 v8::Signature::New(fun_templ));
11647 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11647 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11648 proto_templ->Set(v8_str("method"), method_templ); 11648 proto_templ->Set(v8_str("method"), method_templ);
11649 fun_templ->SetHiddenPrototype(true); 11649 fun_templ->SetHiddenPrototype(true);
11650 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 11650 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
11651 CHECK(!templ.IsEmpty()); 11651 CHECK(!templ.IsEmpty());
(...skipping 16 matching lines...) Expand all
11668 " }" 11668 " }"
11669 "}"); 11669 "}");
11670 CHECK(try_catch.HasCaught()); 11670 CHECK(try_catch.HasCaught());
11671 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), 11671 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"),
11672 try_catch.Exception()->ToString()); 11672 try_catch.Exception()->ToString());
11673 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 11673 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
11674 } 11674 }
11675 11675
11676 11676
11677 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) { 11677 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) {
11678 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11678 v8::HandleScope scope(CcTest::isolate());
11679 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 11679 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
11680 v8::Handle<v8::FunctionTemplate> method_templ = 11680 v8::Handle<v8::FunctionTemplate> method_templ =
11681 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 11681 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
11682 v8_str("method_data"), 11682 v8_str("method_data"),
11683 v8::Signature::New(fun_templ)); 11683 v8::Signature::New(fun_templ));
11684 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11684 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
11685 proto_templ->Set(v8_str("method"), method_templ); 11685 proto_templ->Set(v8_str("method"), method_templ);
11686 fun_templ->SetHiddenPrototype(true); 11686 fun_templ->SetHiddenPrototype(true);
11687 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 11687 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
11688 CHECK(!templ.IsEmpty()); 11688 CHECK(!templ.IsEmpty());
(...skipping 30 matching lines...) Expand all
11719 ApiTestFuzzer::Fuzz(); 11719 ApiTestFuzzer::Fuzz();
11720 if (v8_str("x")->Equals(name)) { 11720 if (v8_str("x")->Equals(name)) {
11721 info.GetReturnValue().Set(keyed_call_ic_function); 11721 info.GetReturnValue().Set(keyed_call_ic_function);
11722 } 11722 }
11723 } 11723 }
11724 11724
11725 11725
11726 // Test the case when we stored cacheable lookup into 11726 // Test the case when we stored cacheable lookup into
11727 // a stub, but the function name changed (to another cacheable function). 11727 // a stub, but the function name changed (to another cacheable function).
11728 THREADED_TEST(InterceptorKeyedCallICKeyChange1) { 11728 THREADED_TEST(InterceptorKeyedCallICKeyChange1) {
11729 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11729 v8::HandleScope scope(CcTest::isolate());
11730 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11730 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11731 templ->SetNamedPropertyHandler(NoBlockGetterX); 11731 templ->SetNamedPropertyHandler(NoBlockGetterX);
11732 LocalContext context; 11732 LocalContext context;
11733 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11733 context->Global()->Set(v8_str("o"), templ->NewInstance());
11734 CompileRun( 11734 CompileRun(
11735 "proto = new Object();" 11735 "proto = new Object();"
11736 "proto.y = function(x) { return x + 1; };" 11736 "proto.y = function(x) { return x + 1; };"
11737 "proto.z = function(x) { return x - 1; };" 11737 "proto.z = function(x) { return x - 1; };"
11738 "o.__proto__ = proto;" 11738 "o.__proto__ = proto;"
11739 "var result = 0;" 11739 "var result = 0;"
11740 "var method = 'y';" 11740 "var method = 'y';"
11741 "for (var i = 0; i < 10; i++) {" 11741 "for (var i = 0; i < 10; i++) {"
11742 " if (i == 5) { method = 'z'; };" 11742 " if (i == 5) { method = 'z'; };"
11743 " result += o[method](41);" 11743 " result += o[method](41);"
11744 "}"); 11744 "}");
11745 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 11745 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
11746 } 11746 }
11747 11747
11748 11748
11749 // Test the case when we stored cacheable lookup into 11749 // Test the case when we stored cacheable lookup into
11750 // a stub, but the function name changed (and the new function is present 11750 // a stub, but the function name changed (and the new function is present
11751 // both before and after the interceptor in the prototype chain). 11751 // both before and after the interceptor in the prototype chain).
11752 THREADED_TEST(InterceptorKeyedCallICKeyChange2) { 11752 THREADED_TEST(InterceptorKeyedCallICKeyChange2) {
11753 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11753 v8::HandleScope scope(CcTest::isolate());
11754 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11754 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11755 templ->SetNamedPropertyHandler(InterceptorKeyedCallICGetter); 11755 templ->SetNamedPropertyHandler(InterceptorKeyedCallICGetter);
11756 LocalContext context; 11756 LocalContext context;
11757 context->Global()->Set(v8_str("proto1"), templ->NewInstance()); 11757 context->Global()->Set(v8_str("proto1"), templ->NewInstance());
11758 keyed_call_ic_function = 11758 keyed_call_ic_function =
11759 v8_compile("function f(x) { return x - 1; }; f")->Run(); 11759 v8_compile("function f(x) { return x - 1; }; f")->Run();
11760 CompileRun( 11760 CompileRun(
11761 "o = new Object();" 11761 "o = new Object();"
11762 "proto2 = new Object();" 11762 "proto2 = new Object();"
11763 "o.y = function(x) { return x + 1; };" 11763 "o.y = function(x) { return x + 1; };"
11764 "proto2.y = function(x) { return x + 2; };" 11764 "proto2.y = function(x) { return x + 2; };"
11765 "o.__proto__ = proto1;" 11765 "o.__proto__ = proto1;"
11766 "proto1.__proto__ = proto2;" 11766 "proto1.__proto__ = proto2;"
11767 "var result = 0;" 11767 "var result = 0;"
11768 "var method = 'x';" 11768 "var method = 'x';"
11769 "for (var i = 0; i < 10; i++) {" 11769 "for (var i = 0; i < 10; i++) {"
11770 " if (i == 5) { method = 'y'; };" 11770 " if (i == 5) { method = 'y'; };"
11771 " result += o[method](41);" 11771 " result += o[method](41);"
11772 "}"); 11772 "}");
11773 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 11773 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
11774 } 11774 }
11775 11775
11776 11776
11777 // Same as InterceptorKeyedCallICKeyChange1 only the cacheable function sit 11777 // Same as InterceptorKeyedCallICKeyChange1 only the cacheable function sit
11778 // on the global object. 11778 // on the global object.
11779 THREADED_TEST(InterceptorKeyedCallICKeyChangeOnGlobal) { 11779 THREADED_TEST(InterceptorKeyedCallICKeyChangeOnGlobal) {
11780 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11780 v8::HandleScope scope(CcTest::isolate());
11781 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11781 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11782 templ->SetNamedPropertyHandler(NoBlockGetterX); 11782 templ->SetNamedPropertyHandler(NoBlockGetterX);
11783 LocalContext context; 11783 LocalContext context;
11784 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11784 context->Global()->Set(v8_str("o"), templ->NewInstance());
11785 CompileRun( 11785 CompileRun(
11786 "function inc(x) { return x + 1; };" 11786 "function inc(x) { return x + 1; };"
11787 "inc(1);" 11787 "inc(1);"
11788 "function dec(x) { return x - 1; };" 11788 "function dec(x) { return x - 1; };"
11789 "dec(1);" 11789 "dec(1);"
11790 "o.__proto__ = this;" 11790 "o.__proto__ = this;"
11791 "this.__proto__.x = inc;" 11791 "this.__proto__.x = inc;"
11792 "this.__proto__.y = dec;" 11792 "this.__proto__.y = dec;"
11793 "var result = 0;" 11793 "var result = 0;"
11794 "var method = 'x';" 11794 "var method = 'x';"
11795 "for (var i = 0; i < 10; i++) {" 11795 "for (var i = 0; i < 10; i++) {"
11796 " if (i == 5) { method = 'y'; };" 11796 " if (i == 5) { method = 'y'; };"
11797 " result += o[method](41);" 11797 " result += o[method](41);"
11798 "}"); 11798 "}");
11799 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 11799 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
11800 } 11800 }
11801 11801
11802 11802
11803 // Test the case when actual function to call sits on global object. 11803 // Test the case when actual function to call sits on global object.
11804 THREADED_TEST(InterceptorKeyedCallICFromGlobal) { 11804 THREADED_TEST(InterceptorKeyedCallICFromGlobal) {
11805 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11805 v8::HandleScope scope(CcTest::isolate());
11806 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11806 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
11807 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 11807 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
11808 LocalContext context; 11808 LocalContext context;
11809 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 11809 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
11810 11810
11811 CompileRun( 11811 CompileRun(
11812 "function len(x) { return x.length; };" 11812 "function len(x) { return x.length; };"
11813 "o.__proto__ = this;" 11813 "o.__proto__ = this;"
11814 "var m = 'parseFloat';" 11814 "var m = 'parseFloat';"
11815 "var result = 0;" 11815 "var result = 0;"
11816 "for (var i = 0; i < 10; i++) {" 11816 "for (var i = 0; i < 10; i++) {"
11817 " if (i == 5) {" 11817 " if (i == 5) {"
11818 " m = 'len';" 11818 " m = 'len';"
11819 " saved_result = result;" 11819 " saved_result = result;"
11820 " };" 11820 " };"
11821 " result = o[m]('239');" 11821 " result = o[m]('239');"
11822 "}"); 11822 "}");
11823 CHECK_EQ(3, context->Global()->Get(v8_str("result"))->Int32Value()); 11823 CHECK_EQ(3, context->Global()->Get(v8_str("result"))->Int32Value());
11824 CHECK_EQ(239, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 11824 CHECK_EQ(239, context->Global()->Get(v8_str("saved_result"))->Int32Value());
11825 } 11825 }
11826 11826
11827 11827
11828 // Test the map transition before the interceptor. 11828 // Test the map transition before the interceptor.
11829 THREADED_TEST(InterceptorKeyedCallICMapChangeBefore) { 11829 THREADED_TEST(InterceptorKeyedCallICMapChangeBefore) {
11830 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11830 v8::HandleScope scope(CcTest::isolate());
11831 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11831 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
11832 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 11832 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
11833 LocalContext context; 11833 LocalContext context;
11834 context->Global()->Set(v8_str("proto"), templ_o->NewInstance()); 11834 context->Global()->Set(v8_str("proto"), templ_o->NewInstance());
11835 11835
11836 CompileRun( 11836 CompileRun(
11837 "var o = new Object();" 11837 "var o = new Object();"
11838 "o.__proto__ = proto;" 11838 "o.__proto__ = proto;"
11839 "o.method = function(x) { return x + 1; };" 11839 "o.method = function(x) { return x + 1; };"
11840 "var m = 'method';" 11840 "var m = 'method';"
11841 "var result = 0;" 11841 "var result = 0;"
11842 "for (var i = 0; i < 10; i++) {" 11842 "for (var i = 0; i < 10; i++) {"
11843 " if (i == 5) { o.method = function(x) { return x - 1; }; };" 11843 " if (i == 5) { o.method = function(x) { return x - 1; }; };"
11844 " result += o[m](41);" 11844 " result += o[m](41);"
11845 "}"); 11845 "}");
11846 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 11846 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
11847 } 11847 }
11848 11848
11849 11849
11850 // Test the map transition after the interceptor. 11850 // Test the map transition after the interceptor.
11851 THREADED_TEST(InterceptorKeyedCallICMapChangeAfter) { 11851 THREADED_TEST(InterceptorKeyedCallICMapChangeAfter) {
11852 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11852 v8::HandleScope scope(CcTest::isolate());
11853 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 11853 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
11854 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 11854 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
11855 LocalContext context; 11855 LocalContext context;
11856 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 11856 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
11857 11857
11858 CompileRun( 11858 CompileRun(
11859 "var proto = new Object();" 11859 "var proto = new Object();"
11860 "o.__proto__ = proto;" 11860 "o.__proto__ = proto;"
11861 "proto.method = function(x) { return x + 1; };" 11861 "proto.method = function(x) { return x + 1; };"
11862 "var m = 'method';" 11862 "var m = 'method';"
(...skipping 15 matching lines...) Expand all
11878 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) { 11878 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) {
11879 info.GetReturnValue().Set(call_ic_function2); 11879 info.GetReturnValue().Set(call_ic_function2);
11880 } 11880 }
11881 } 11881 }
11882 11882
11883 11883
11884 // This test should hit load and call ICs for the interceptor case. 11884 // This test should hit load and call ICs for the interceptor case.
11885 // Once in a while, the interceptor will reply that a property was not 11885 // Once in a while, the interceptor will reply that a property was not
11886 // found in which case we should get a reference error. 11886 // found in which case we should get a reference error.
11887 THREADED_TEST(InterceptorICReferenceErrors) { 11887 THREADED_TEST(InterceptorICReferenceErrors) {
11888 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11888 v8::HandleScope scope(CcTest::isolate());
11889 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11889 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11890 templ->SetNamedPropertyHandler(InterceptorICRefErrorGetter); 11890 templ->SetNamedPropertyHandler(InterceptorICRefErrorGetter);
11891 LocalContext context(0, templ, v8::Handle<Value>()); 11891 LocalContext context(0, templ, v8::Handle<Value>());
11892 call_ic_function2 = v8_compile("function h(x) { return x; }; h")->Run(); 11892 call_ic_function2 = v8_compile("function h(x) { return x; }; h")->Run();
11893 v8::Handle<Value> value = CompileRun( 11893 v8::Handle<Value> value = CompileRun(
11894 "function f() {" 11894 "function f() {"
11895 " for (var i = 0; i < 1000; i++) {" 11895 " for (var i = 0; i < 1000; i++) {"
11896 " try { x; } catch(e) { return true; }" 11896 " try { x; } catch(e) { return true; }"
11897 " }" 11897 " }"
11898 " return false;" 11898 " return false;"
(...skipping 26 matching lines...) Expand all
11925 v8::ThrowException(v8_num(42)); 11925 v8::ThrowException(v8_num(42));
11926 return; 11926 return;
11927 } 11927 }
11928 } 11928 }
11929 11929
11930 11930
11931 // Test interceptor load/call IC where the interceptor throws an 11931 // Test interceptor load/call IC where the interceptor throws an
11932 // exception once in a while. 11932 // exception once in a while.
11933 THREADED_TEST(InterceptorICGetterExceptions) { 11933 THREADED_TEST(InterceptorICGetterExceptions) {
11934 interceptor_ic_exception_get_count = 0; 11934 interceptor_ic_exception_get_count = 0;
11935 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11935 v8::HandleScope scope(CcTest::isolate());
11936 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11936 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11937 templ->SetNamedPropertyHandler(InterceptorICExceptionGetter); 11937 templ->SetNamedPropertyHandler(InterceptorICExceptionGetter);
11938 LocalContext context(0, templ, v8::Handle<Value>()); 11938 LocalContext context(0, templ, v8::Handle<Value>());
11939 call_ic_function3 = v8_compile("function h(x) { return x; }; h")->Run(); 11939 call_ic_function3 = v8_compile("function h(x) { return x; }; h")->Run();
11940 v8::Handle<Value> value = CompileRun( 11940 v8::Handle<Value> value = CompileRun(
11941 "function f() {" 11941 "function f() {"
11942 " for (var i = 0; i < 100; i++) {" 11942 " for (var i = 0; i < 100; i++) {"
11943 " try { x; } catch(e) { return true; }" 11943 " try { x; } catch(e) { return true; }"
11944 " }" 11944 " }"
11945 " return false;" 11945 " return false;"
(...skipping 23 matching lines...) Expand all
11969 if (++interceptor_ic_exception_set_count > 20) { 11969 if (++interceptor_ic_exception_set_count > 20) {
11970 v8::ThrowException(v8_num(42)); 11970 v8::ThrowException(v8_num(42));
11971 } 11971 }
11972 } 11972 }
11973 11973
11974 11974
11975 // Test interceptor store IC where the interceptor throws an exception 11975 // Test interceptor store IC where the interceptor throws an exception
11976 // once in a while. 11976 // once in a while.
11977 THREADED_TEST(InterceptorICSetterExceptions) { 11977 THREADED_TEST(InterceptorICSetterExceptions) {
11978 interceptor_ic_exception_set_count = 0; 11978 interceptor_ic_exception_set_count = 0;
11979 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11979 v8::HandleScope scope(CcTest::isolate());
11980 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11980 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11981 templ->SetNamedPropertyHandler(0, InterceptorICExceptionSetter); 11981 templ->SetNamedPropertyHandler(0, InterceptorICExceptionSetter);
11982 LocalContext context(0, templ, v8::Handle<Value>()); 11982 LocalContext context(0, templ, v8::Handle<Value>());
11983 v8::Handle<Value> value = CompileRun( 11983 v8::Handle<Value> value = CompileRun(
11984 "function f() {" 11984 "function f() {"
11985 " for (var i = 0; i < 100; i++) {" 11985 " for (var i = 0; i < 100; i++) {"
11986 " try { x = 42; } catch(e) { return true; }" 11986 " try { x = 42; } catch(e) { return true; }"
11987 " }" 11987 " }"
11988 " return false;" 11988 " return false;"
11989 "};" 11989 "};"
11990 "f();"); 11990 "f();");
11991 CHECK_EQ(true, value->BooleanValue()); 11991 CHECK_EQ(true, value->BooleanValue());
11992 } 11992 }
11993 11993
11994 11994
11995 // Test that we ignore null interceptors. 11995 // Test that we ignore null interceptors.
11996 THREADED_TEST(NullNamedInterceptor) { 11996 THREADED_TEST(NullNamedInterceptor) {
11997 v8::HandleScope scope(v8::Isolate::GetCurrent()); 11997 v8::HandleScope scope(CcTest::isolate());
11998 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 11998 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
11999 templ->SetNamedPropertyHandler( 11999 templ->SetNamedPropertyHandler(
12000 static_cast<v8::NamedPropertyGetterCallback>(0)); 12000 static_cast<v8::NamedPropertyGetterCallback>(0));
12001 LocalContext context; 12001 LocalContext context;
12002 templ->Set("x", v8_num(42)); 12002 templ->Set("x", v8_num(42));
12003 v8::Handle<v8::Object> obj = templ->NewInstance(); 12003 v8::Handle<v8::Object> obj = templ->NewInstance();
12004 context->Global()->Set(v8_str("obj"), obj); 12004 context->Global()->Set(v8_str("obj"), obj);
12005 v8::Handle<Value> value = CompileRun("obj.x"); 12005 v8::Handle<Value> value = CompileRun("obj.x");
12006 CHECK(value->IsInt32()); 12006 CHECK(value->IsInt32());
12007 CHECK_EQ(42, value->Int32Value()); 12007 CHECK_EQ(42, value->Int32Value());
12008 } 12008 }
12009 12009
12010 12010
12011 // Test that we ignore null interceptors. 12011 // Test that we ignore null interceptors.
12012 THREADED_TEST(NullIndexedInterceptor) { 12012 THREADED_TEST(NullIndexedInterceptor) {
12013 v8::HandleScope scope(v8::Isolate::GetCurrent()); 12013 v8::HandleScope scope(CcTest::isolate());
12014 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 12014 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
12015 templ->SetIndexedPropertyHandler( 12015 templ->SetIndexedPropertyHandler(
12016 static_cast<v8::IndexedPropertyGetterCallback>(0)); 12016 static_cast<v8::IndexedPropertyGetterCallback>(0));
12017 LocalContext context; 12017 LocalContext context;
12018 templ->Set("42", v8_num(42)); 12018 templ->Set("42", v8_num(42));
12019 v8::Handle<v8::Object> obj = templ->NewInstance(); 12019 v8::Handle<v8::Object> obj = templ->NewInstance();
12020 context->Global()->Set(v8_str("obj"), obj); 12020 context->Global()->Set(v8_str("obj"), obj);
12021 v8::Handle<Value> value = CompileRun("obj[42]"); 12021 v8::Handle<Value> value = CompileRun("obj[42]");
12022 CHECK(value->IsInt32()); 12022 CHECK(value->IsInt32());
12023 CHECK_EQ(42, value->Int32Value()); 12023 CHECK_EQ(42, value->Int32Value());
12024 } 12024 }
12025 12025
12026 12026
12027 THREADED_TEST(NamedPropertyHandlerGetterAttributes) { 12027 THREADED_TEST(NamedPropertyHandlerGetterAttributes) {
12028 v8::HandleScope scope(v8::Isolate::GetCurrent()); 12028 v8::HandleScope scope(CcTest::isolate());
12029 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); 12029 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New();
12030 templ->InstanceTemplate()->SetNamedPropertyHandler(InterceptorLoadXICGetter); 12030 templ->InstanceTemplate()->SetNamedPropertyHandler(InterceptorLoadXICGetter);
12031 LocalContext env; 12031 LocalContext env;
12032 env->Global()->Set(v8_str("obj"), 12032 env->Global()->Set(v8_str("obj"),
12033 templ->GetFunction()->NewInstance()); 12033 templ->GetFunction()->NewInstance());
12034 ExpectTrue("obj.x === 42"); 12034 ExpectTrue("obj.x === 42");
12035 ExpectTrue("!obj.propertyIsEnumerable('x')"); 12035 ExpectTrue("!obj.propertyIsEnumerable('x')");
12036 } 12036 }
12037 12037
12038 12038
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
12238 12238
12239 12239
12240 static void IsConstructHandler( 12240 static void IsConstructHandler(
12241 const v8::FunctionCallbackInfo<v8::Value>& args) { 12241 const v8::FunctionCallbackInfo<v8::Value>& args) {
12242 ApiTestFuzzer::Fuzz(); 12242 ApiTestFuzzer::Fuzz();
12243 args.GetReturnValue().Set(args.IsConstructCall()); 12243 args.GetReturnValue().Set(args.IsConstructCall());
12244 } 12244 }
12245 12245
12246 12246
12247 THREADED_TEST(IsConstructCall) { 12247 THREADED_TEST(IsConstructCall) {
12248 v8::HandleScope scope(v8::Isolate::GetCurrent()); 12248 v8::HandleScope scope(CcTest::isolate());
12249 12249
12250 // Function template with call handler. 12250 // Function template with call handler.
12251 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); 12251 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New();
12252 templ->SetCallHandler(IsConstructHandler); 12252 templ->SetCallHandler(IsConstructHandler);
12253 12253
12254 LocalContext context; 12254 LocalContext context;
12255 12255
12256 context->Global()->Set(v8_str("f"), templ->GetFunction()); 12256 context->Global()->Set(v8_str("f"), templ->GetFunction());
12257 Local<Value> value = v8_compile("f()")->Run(); 12257 Local<Value> value = v8_compile("f()")->Run();
12258 CHECK(!value->BooleanValue()); 12258 CHECK(!value->BooleanValue());
12259 value = v8_compile("new f()")->Run(); 12259 value = v8_compile("new f()")->Run();
12260 CHECK(value->BooleanValue()); 12260 CHECK(value->BooleanValue());
12261 } 12261 }
12262 12262
12263 12263
12264 THREADED_TEST(ObjectProtoToString) { 12264 THREADED_TEST(ObjectProtoToString) {
12265 v8::HandleScope scope(v8::Isolate::GetCurrent()); 12265 v8::HandleScope scope(CcTest::isolate());
12266 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); 12266 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New();
12267 templ->SetClassName(v8_str("MyClass")); 12267 templ->SetClassName(v8_str("MyClass"));
12268 12268
12269 LocalContext context; 12269 LocalContext context;
12270 12270
12271 Local<String> customized_tostring = v8_str("customized toString"); 12271 Local<String> customized_tostring = v8_str("customized toString");
12272 12272
12273 // Replace Object.prototype.toString 12273 // Replace Object.prototype.toString
12274 v8_compile("Object.prototype.toString = function() {" 12274 v8_compile("Object.prototype.toString = function() {"
12275 " return 'customized toString';" 12275 " return 'customized toString';"
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
12635 CHECK_EQ(expected, count); 12635 CHECK_EQ(expected, count);
12636 } 12636 }
12637 12637
12638 12638
12639 TEST(DontLeakGlobalObjects) { 12639 TEST(DontLeakGlobalObjects) {
12640 // Regression test for issues 1139850 and 1174891. 12640 // Regression test for issues 1139850 and 1174891.
12641 12641
12642 v8::V8::Initialize(); 12642 v8::V8::Initialize();
12643 12643
12644 for (int i = 0; i < 5; i++) { 12644 for (int i = 0; i < 5; i++) {
12645 { v8::HandleScope scope(v8::Isolate::GetCurrent()); 12645 { v8::HandleScope scope(CcTest::isolate());
12646 LocalContext context; 12646 LocalContext context;
12647 } 12647 }
12648 v8::V8::ContextDisposedNotification(); 12648 v8::V8::ContextDisposedNotification();
12649 CheckSurvivingGlobalObjectsCount(0); 12649 CheckSurvivingGlobalObjectsCount(0);
12650 12650
12651 { v8::HandleScope scope(v8::Isolate::GetCurrent()); 12651 { v8::HandleScope scope(CcTest::isolate());
12652 LocalContext context; 12652 LocalContext context;
12653 v8_compile("Date")->Run(); 12653 v8_compile("Date")->Run();
12654 } 12654 }
12655 v8::V8::ContextDisposedNotification(); 12655 v8::V8::ContextDisposedNotification();
12656 CheckSurvivingGlobalObjectsCount(0); 12656 CheckSurvivingGlobalObjectsCount(0);
12657 12657
12658 { v8::HandleScope scope(v8::Isolate::GetCurrent()); 12658 { v8::HandleScope scope(CcTest::isolate());
12659 LocalContext context; 12659 LocalContext context;
12660 v8_compile("/aaa/")->Run(); 12660 v8_compile("/aaa/")->Run();
12661 } 12661 }
12662 v8::V8::ContextDisposedNotification(); 12662 v8::V8::ContextDisposedNotification();
12663 CheckSurvivingGlobalObjectsCount(0); 12663 CheckSurvivingGlobalObjectsCount(0);
12664 12664
12665 { v8::HandleScope scope(v8::Isolate::GetCurrent()); 12665 { v8::HandleScope scope(CcTest::isolate());
12666 const char* extension_list[] = { "v8/gc" }; 12666 const char* extension_list[] = { "v8/gc" };
12667 v8::ExtensionConfiguration extensions(1, extension_list); 12667 v8::ExtensionConfiguration extensions(1, extension_list);
12668 LocalContext context(&extensions); 12668 LocalContext context(&extensions);
12669 v8_compile("gc();")->Run(); 12669 v8_compile("gc();")->Run();
12670 } 12670 }
12671 v8::V8::ContextDisposedNotification(); 12671 v8::V8::ContextDisposedNotification();
12672 CheckSurvivingGlobalObjectsCount(0); 12672 CheckSurvivingGlobalObjectsCount(0);
12673 } 12673 }
12674 } 12674 }
12675 12675
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
12838 v8::V8::Initialize(); 12838 v8::V8::Initialize();
12839 12839
12840 const int nof = 2; 12840 const int nof = 2;
12841 const char* sources[nof] = { 12841 const char* sources[nof] = {
12842 "try { [ 2, 3, 4 ].forEach(5); } catch(e) { e.toString(); }", 12842 "try { [ 2, 3, 4 ].forEach(5); } catch(e) { e.toString(); }",
12843 "Object()" 12843 "Object()"
12844 }; 12844 };
12845 12845
12846 for (int i = 0; i < nof; i++) { 12846 for (int i = 0; i < nof; i++) {
12847 const char* source = sources[i]; 12847 const char* source = sources[i];
12848 { v8::HandleScope scope(v8::Isolate::GetCurrent()); 12848 { v8::HandleScope scope(CcTest::isolate());
12849 LocalContext context; 12849 LocalContext context;
12850 CompileRun(source); 12850 CompileRun(source);
12851 } 12851 }
12852 { v8::HandleScope scope(v8::Isolate::GetCurrent()); 12852 { v8::HandleScope scope(CcTest::isolate());
12853 LocalContext context; 12853 LocalContext context;
12854 CompileRun(source); 12854 CompileRun(source);
12855 } 12855 }
12856 } 12856 }
12857 } 12857 }
12858 12858
12859 12859
12860 static v8::Handle<Value> NestedScope(v8::Local<Context> env) { 12860 static v8::Handle<Value> NestedScope(v8::Local<Context> env) {
12861 v8::HandleScope inner(env->GetIsolate()); 12861 v8::HandleScope inner(env->GetIsolate());
12862 env->Enter(); 12862 env->Enter();
12863 v8::Handle<Value> three = v8_num(3); 12863 v8::Handle<Value> three = v8_num(3);
12864 v8::Handle<Value> value = inner.Close(three); 12864 v8::Handle<Value> value = inner.Close(three);
12865 env->Exit(); 12865 env->Exit();
12866 return value; 12866 return value;
12867 } 12867 }
12868 12868
12869 12869
12870 THREADED_TEST(NestedHandleScopeAndContexts) { 12870 THREADED_TEST(NestedHandleScopeAndContexts) {
12871 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 12871 v8::Isolate* isolate = CcTest::isolate();
12872 v8::HandleScope outer(isolate); 12872 v8::HandleScope outer(isolate);
12873 v8::Local<Context> env = Context::New(isolate); 12873 v8::Local<Context> env = Context::New(isolate);
12874 env->Enter(); 12874 env->Enter();
12875 v8::Handle<Value> value = NestedScope(env); 12875 v8::Handle<Value> value = NestedScope(env);
12876 v8::Handle<String> str(value->ToString()); 12876 v8::Handle<String> str(value->ToString());
12877 CHECK(!str.IsEmpty()); 12877 CHECK(!str.IsEmpty());
12878 env->Exit(); 12878 env->Exit();
12879 } 12879 }
12880 12880
12881 12881
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
13460 13460
13461 isolate->Exit(); 13461 isolate->Exit();
13462 isolate->Dispose(); 13462 isolate->Dispose();
13463 } 13463 }
13464 13464
13465 13465
13466 static int64_t cast(intptr_t x) { return static_cast<int64_t>(x); } 13466 static int64_t cast(intptr_t x) { return static_cast<int64_t>(x); }
13467 13467
13468 13468
13469 THREADED_TEST(ExternalAllocatedMemory) { 13469 THREADED_TEST(ExternalAllocatedMemory) {
13470 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 13470 v8::Isolate* isolate = CcTest::isolate();
13471 v8::HandleScope outer(isolate); 13471 v8::HandleScope outer(isolate);
13472 v8::Local<Context> env(Context::New(isolate)); 13472 v8::Local<Context> env(Context::New(isolate));
13473 CHECK(!env.IsEmpty()); 13473 CHECK(!env.IsEmpty());
13474 const intptr_t kSize = 1024*1024; 13474 const intptr_t kSize = 1024*1024;
13475 int64_t baseline = cast(isolate->AdjustAmountOfExternalAllocatedMemory(0)); 13475 int64_t baseline = cast(isolate->AdjustAmountOfExternalAllocatedMemory(0));
13476 CHECK_EQ(baseline + cast(kSize), 13476 CHECK_EQ(baseline + cast(kSize),
13477 cast(isolate->AdjustAmountOfExternalAllocatedMemory(kSize))); 13477 cast(isolate->AdjustAmountOfExternalAllocatedMemory(kSize)));
13478 CHECK_EQ(baseline, 13478 CHECK_EQ(baseline,
13479 cast(isolate->AdjustAmountOfExternalAllocatedMemory(-kSize))); 13479 cast(isolate->AdjustAmountOfExternalAllocatedMemory(-kSize)));
13480 } 13480 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
13535 "" 13535 ""
13536 "f();")); 13536 "f();"));
13537 v8::Handle<v8::Value> result = script->Run(); 13537 v8::Handle<v8::Value> result = script->Run();
13538 CHECK(result.IsEmpty()); 13538 CHECK(result.IsEmpty());
13539 } 13539 }
13540 13540
13541 13541
13542 static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script, 13542 static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script,
13543 const char* resource_name, 13543 const char* resource_name,
13544 int line_offset) { 13544 int line_offset) {
13545 v8::HandleScope scope(v8::Isolate::GetCurrent()); 13545 v8::HandleScope scope(CcTest::isolate());
13546 v8::TryCatch try_catch; 13546 v8::TryCatch try_catch;
13547 v8::Handle<v8::Value> result = script->Run(); 13547 v8::Handle<v8::Value> result = script->Run();
13548 CHECK(result.IsEmpty()); 13548 CHECK(result.IsEmpty());
13549 CHECK(try_catch.HasCaught()); 13549 CHECK(try_catch.HasCaught());
13550 v8::Handle<v8::Message> message = try_catch.Message(); 13550 v8::Handle<v8::Message> message = try_catch.Message();
13551 CHECK(!message.IsEmpty()); 13551 CHECK(!message.IsEmpty());
13552 CHECK_EQ(10 + line_offset, message->GetLineNumber()); 13552 CHECK_EQ(10 + line_offset, message->GetLineNumber());
13553 CHECK_EQ(91, message->GetStartPosition()); 13553 CHECK_EQ(91, message->GetStartPosition());
13554 CHECK_EQ(92, message->GetEndPosition()); 13554 CHECK_EQ(92, message->GetEndPosition());
13555 CHECK_EQ(2, message->GetStartColumn()); 13555 CHECK_EQ(2, message->GetStartColumn());
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
13808 context->Global()->Set(v8_str("obj_2"), instance_2); 13808 context->Global()->Set(v8_str("obj_2"), instance_2);
13809 13809
13810 Local<Value> value_2 = CompileRun("obj_2.a"); 13810 Local<Value> value_2 = CompileRun("obj_2.a");
13811 CHECK(value_2->IsUndefined()); 13811 CHECK(value_2->IsUndefined());
13812 } 13812 }
13813 13813
13814 13814
13815 // This tests that access check information remains on the global 13815 // This tests that access check information remains on the global
13816 // object template when creating contexts. 13816 // object template when creating contexts.
13817 THREADED_TEST(AccessControlRepeatedContextCreation) { 13817 THREADED_TEST(AccessControlRepeatedContextCreation) {
13818 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 13818 v8::Isolate* isolate = CcTest::isolate();
13819 v8::HandleScope handle_scope(isolate); 13819 v8::HandleScope handle_scope(isolate);
13820 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 13820 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
13821 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker, 13821 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker,
13822 IndexedSetAccessBlocker); 13822 IndexedSetAccessBlocker);
13823 i::Handle<i::ObjectTemplateInfo> internal_template = 13823 i::Handle<i::ObjectTemplateInfo> internal_template =
13824 v8::Utils::OpenHandle(*global_template); 13824 v8::Utils::OpenHandle(*global_template);
13825 CHECK(!internal_template->constructor()->IsUndefined()); 13825 CHECK(!internal_template->constructor()->IsUndefined());
13826 i::Handle<i::FunctionTemplateInfo> constructor( 13826 i::Handle<i::FunctionTemplateInfo> constructor(
13827 i::FunctionTemplateInfo::cast(internal_template->constructor())); 13827 i::FunctionTemplateInfo::cast(internal_template->constructor()));
13828 CHECK(!constructor->access_check_info()->IsUndefined()); 13828 CHECK(!constructor->access_check_info()->IsUndefined());
13829 v8::Local<Context> context0(Context::New(isolate, NULL, global_template)); 13829 v8::Local<Context> context0(Context::New(isolate, NULL, global_template));
13830 CHECK(!context0.IsEmpty()); 13830 CHECK(!context0.IsEmpty());
13831 CHECK(!constructor->access_check_info()->IsUndefined()); 13831 CHECK(!constructor->access_check_info()->IsUndefined());
13832 } 13832 }
13833 13833
13834 13834
13835 THREADED_TEST(TurnOnAccessCheck) { 13835 THREADED_TEST(TurnOnAccessCheck) {
13836 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 13836 v8::Isolate* isolate = CcTest::isolate();
13837 v8::HandleScope handle_scope(isolate); 13837 v8::HandleScope handle_scope(isolate);
13838 13838
13839 // Create an environment with access check to the global object disabled by 13839 // Create an environment with access check to the global object disabled by
13840 // default. 13840 // default.
13841 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 13841 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
13842 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, 13842 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker,
13843 IndexedGetAccessBlocker, 13843 IndexedGetAccessBlocker,
13844 v8::Handle<v8::Value>(), 13844 v8::Handle<v8::Value>(),
13845 false); 13845 false);
13846 v8::Local<Context> context = Context::New(isolate, NULL, global_template); 13846 v8::Local<Context> context = Context::New(isolate, NULL, global_template);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
13907 Local<Value> data) { 13907 Local<Value> data) {
13908 if (!name->IsString()) return false; 13908 if (!name->IsString()) return false;
13909 i::Handle<i::String> name_handle = 13909 i::Handle<i::String> name_handle =
13910 v8::Utils::OpenHandle(String::Cast(*name)); 13910 v8::Utils::OpenHandle(String::Cast(*name));
13911 return !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyA)) 13911 return !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyA))
13912 && !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyH)); 13912 && !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyH));
13913 } 13913 }
13914 13914
13915 13915
13916 THREADED_TEST(TurnOnAccessCheckAndRecompile) { 13916 THREADED_TEST(TurnOnAccessCheckAndRecompile) {
13917 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 13917 v8::Isolate* isolate = CcTest::isolate();
13918 v8::HandleScope handle_scope(isolate); 13918 v8::HandleScope handle_scope(isolate);
13919 13919
13920 // Create an environment with access check to the global object disabled by 13920 // Create an environment with access check to the global object disabled by
13921 // default. When the registered access checker will block access to properties 13921 // default. When the registered access checker will block access to properties
13922 // a and h. 13922 // a and h.
13923 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 13923 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
13924 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH, 13924 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH,
13925 IndexedGetAccessBlocker, 13925 IndexedGetAccessBlocker,
13926 v8::Handle<v8::Value>(), 13926 v8::Handle<v8::Value>(),
13927 false); 13927 false);
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
14119 CHECK(!try_catch.HasCaught()); 14119 CHECK(!try_catch.HasCaught());
14120 14120
14121 delete sd; 14121 delete sd;
14122 } 14122 }
14123 14123
14124 14124
14125 // Verifies that the Handle<String> and const char* versions of the API produce 14125 // Verifies that the Handle<String> and const char* versions of the API produce
14126 // the same results (at least for one trivial case). 14126 // the same results (at least for one trivial case).
14127 TEST(PreCompileAPIVariationsAreSame) { 14127 TEST(PreCompileAPIVariationsAreSame) {
14128 v8::V8::Initialize(); 14128 v8::V8::Initialize();
14129 v8::HandleScope scope(v8::Isolate::GetCurrent()); 14129 v8::HandleScope scope(CcTest::isolate());
14130 14130
14131 const char* cstring = "function foo(a) { return a+1; }"; 14131 const char* cstring = "function foo(a) { return a+1; }";
14132 14132
14133 v8::ScriptData* sd_from_cstring = 14133 v8::ScriptData* sd_from_cstring =
14134 v8::ScriptData::PreCompile(cstring, i::StrLength(cstring)); 14134 v8::ScriptData::PreCompile(cstring, i::StrLength(cstring));
14135 14135
14136 TestAsciiResource* resource = new TestAsciiResource(cstring); 14136 TestAsciiResource* resource = new TestAsciiResource(cstring);
14137 v8::ScriptData* sd_from_external_string = v8::ScriptData::PreCompile( 14137 v8::ScriptData* sd_from_external_string = v8::ScriptData::PreCompile(
14138 v8::String::NewExternal(resource)); 14138 v8::String::NewExternal(resource));
14139 14139
(...skipping 16 matching lines...) Expand all
14156 delete sd_from_string; 14156 delete sd_from_string;
14157 } 14157 }
14158 14158
14159 14159
14160 // This tests that we do not allow dictionary load/call inline caches 14160 // This tests that we do not allow dictionary load/call inline caches
14161 // to use functions that have not yet been compiled. The potential 14161 // to use functions that have not yet been compiled. The potential
14162 // problem of loading a function that has not yet been compiled can 14162 // problem of loading a function that has not yet been compiled can
14163 // arise because we share code between contexts via the compilation 14163 // arise because we share code between contexts via the compilation
14164 // cache. 14164 // cache.
14165 THREADED_TEST(DictionaryICLoadedFunction) { 14165 THREADED_TEST(DictionaryICLoadedFunction) {
14166 v8::HandleScope scope(v8::Isolate::GetCurrent()); 14166 v8::HandleScope scope(CcTest::isolate());
14167 // Test LoadIC. 14167 // Test LoadIC.
14168 for (int i = 0; i < 2; i++) { 14168 for (int i = 0; i < 2; i++) {
14169 LocalContext context; 14169 LocalContext context;
14170 context->Global()->Set(v8_str("tmp"), v8::True()); 14170 context->Global()->Set(v8_str("tmp"), v8::True());
14171 context->Global()->Delete(v8_str("tmp")); 14171 context->Global()->Delete(v8_str("tmp"));
14172 CompileRun("for (var j = 0; j < 10; j++) new RegExp('');"); 14172 CompileRun("for (var j = 0; j < 10; j++) new RegExp('');");
14173 } 14173 }
14174 // Test CallIC. 14174 // Test CallIC.
14175 for (int i = 0; i < 2; i++) { 14175 for (int i = 0; i < 2; i++) {
14176 LocalContext context; 14176 LocalContext context;
14177 context->Global()->Set(v8_str("tmp"), v8::True()); 14177 context->Global()->Set(v8_str("tmp"), v8::True());
14178 context->Global()->Delete(v8_str("tmp")); 14178 context->Global()->Delete(v8_str("tmp"));
14179 CompileRun("for (var j = 0; j < 10; j++) RegExp('')"); 14179 CompileRun("for (var j = 0; j < 10; j++) RegExp('')");
14180 } 14180 }
14181 } 14181 }
14182 14182
14183 14183
14184 // Test that cross-context new calls use the context of the callee to 14184 // Test that cross-context new calls use the context of the callee to
14185 // create the new JavaScript object. 14185 // create the new JavaScript object.
14186 THREADED_TEST(CrossContextNew) { 14186 THREADED_TEST(CrossContextNew) {
14187 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 14187 v8::Isolate* isolate = CcTest::isolate();
14188 v8::HandleScope scope(isolate); 14188 v8::HandleScope scope(isolate);
14189 v8::Local<Context> context0 = Context::New(isolate); 14189 v8::Local<Context> context0 = Context::New(isolate);
14190 v8::Local<Context> context1 = Context::New(isolate); 14190 v8::Local<Context> context1 = Context::New(isolate);
14191 14191
14192 // Allow cross-domain access. 14192 // Allow cross-domain access.
14193 Local<String> token = v8_str("<security token>"); 14193 Local<String> token = v8_str("<security token>");
14194 context0->SetSecurityToken(token); 14194 context0->SetSecurityToken(token);
14195 context1->SetSecurityToken(token); 14195 context1->SetSecurityToken(token);
14196 14196
14197 // Set an 'x' property on the Object prototype and define a 14197 // Set an 'x' property on the Object prototype and define a
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
14700 } 14700 }
14701 morph_success_ = true; 14701 morph_success_ = true;
14702 } 14702 }
14703 14703
14704 void LongRunningRegExp() { 14704 void LongRunningRegExp() {
14705 block_.Signal(); // Enable morphing thread on next preemption. 14705 block_.Signal(); // Enable morphing thread on next preemption.
14706 while (morphs_during_regexp_ < kRequiredModifications && 14706 while (morphs_during_regexp_ < kRequiredModifications &&
14707 morphs_ < kMaxModifications) { 14707 morphs_ < kMaxModifications) {
14708 int morphs_before = morphs_; 14708 int morphs_before = morphs_;
14709 { 14709 {
14710 v8::HandleScope scope(v8::Isolate::GetCurrent()); 14710 v8::HandleScope scope(CcTest::isolate());
14711 // Match 15-30 "a"'s against 14 and a "b". 14711 // Match 15-30 "a"'s against 14 and a "b".
14712 const char* c_source = 14712 const char* c_source =
14713 "/a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaa/" 14713 "/a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaa/"
14714 ".exec(input) === null"; 14714 ".exec(input) === null";
14715 Local<String> source = String::New(c_source); 14715 Local<String> source = String::New(c_source);
14716 Local<Script> script = Script::Compile(source); 14716 Local<Script> script = Script::Compile(source);
14717 Local<Value> result = script->Run(); 14717 Local<Value> result = script->Run();
14718 CHECK(result->IsTrue()); 14718 CHECK(result->IsTrue());
14719 } 14719 }
14720 int morphs_after = morphs_; 14720 int morphs_after = morphs_;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
14755 RegExpStringModificationTest().RunTest(); 14755 RegExpStringModificationTest().RunTest();
14756 14756
14757 local_env->Exit(); 14757 local_env->Exit();
14758 } 14758 }
14759 14759
14760 14760
14761 // Test that we cannot set a property on the global object if there 14761 // Test that we cannot set a property on the global object if there
14762 // is a read-only property in the prototype chain. 14762 // is a read-only property in the prototype chain.
14763 TEST(ReadOnlyPropertyInGlobalProto) { 14763 TEST(ReadOnlyPropertyInGlobalProto) {
14764 i::FLAG_es5_readonly = true; 14764 i::FLAG_es5_readonly = true;
14765 v8::HandleScope scope(v8::Isolate::GetCurrent()); 14765 v8::HandleScope scope(CcTest::isolate());
14766 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14766 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14767 LocalContext context(0, templ); 14767 LocalContext context(0, templ);
14768 v8::Handle<v8::Object> global = context->Global(); 14768 v8::Handle<v8::Object> global = context->Global();
14769 v8::Handle<v8::Object> global_proto = 14769 v8::Handle<v8::Object> global_proto =
14770 v8::Handle<v8::Object>::Cast(global->Get(v8_str("__proto__"))); 14770 v8::Handle<v8::Object>::Cast(global->Get(v8_str("__proto__")));
14771 global_proto->Set(v8_str("x"), v8::Integer::New(0), v8::ReadOnly); 14771 global_proto->Set(v8_str("x"), v8::Integer::New(0), v8::ReadOnly);
14772 global_proto->Set(v8_str("y"), v8::Integer::New(0), v8::ReadOnly); 14772 global_proto->Set(v8_str("y"), v8::Integer::New(0), v8::ReadOnly);
14773 // Check without 'eval' or 'with'. 14773 // Check without 'eval' or 'with'.
14774 v8::Handle<v8::Value> res = 14774 v8::Handle<v8::Value> res =
14775 CompileRun("function f() { x = 42; return x; }; f()"); 14775 CompileRun("function f() { x = 42; return x; }; f()");
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
14808 force_set_set_count++; 14808 force_set_set_count++;
14809 info.GetReturnValue().SetUndefined(); 14809 info.GetReturnValue().SetUndefined();
14810 } 14810 }
14811 14811
14812 14812
14813 TEST(ForceSet) { 14813 TEST(ForceSet) {
14814 force_set_get_count = 0; 14814 force_set_get_count = 0;
14815 force_set_set_count = 0; 14815 force_set_set_count = 0;
14816 pass_on_get = false; 14816 pass_on_get = false;
14817 14817
14818 v8::HandleScope scope(v8::Isolate::GetCurrent()); 14818 v8::HandleScope scope(CcTest::isolate());
14819 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14819 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14820 v8::Handle<v8::String> access_property = v8::String::New("a"); 14820 v8::Handle<v8::String> access_property = v8::String::New("a");
14821 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter); 14821 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter);
14822 LocalContext context(NULL, templ); 14822 LocalContext context(NULL, templ);
14823 v8::Handle<v8::Object> global = context->Global(); 14823 v8::Handle<v8::Object> global = context->Global();
14824 14824
14825 // Ordinary properties 14825 // Ordinary properties
14826 v8::Handle<v8::String> simple_property = v8::String::New("p"); 14826 v8::Handle<v8::String> simple_property = v8::String::New("p");
14827 global->Set(simple_property, v8::Int32::New(4), v8::ReadOnly); 14827 global->Set(simple_property, v8::Int32::New(4), v8::ReadOnly);
14828 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 14828 CHECK_EQ(4, global->Get(simple_property)->Int32Value());
(...skipping 21 matching lines...) Expand all
14850 CHECK_EQ(1, force_set_set_count); 14850 CHECK_EQ(1, force_set_set_count);
14851 CHECK_EQ(2, force_set_get_count); 14851 CHECK_EQ(2, force_set_get_count);
14852 } 14852 }
14853 14853
14854 14854
14855 TEST(ForceSetWithInterceptor) { 14855 TEST(ForceSetWithInterceptor) {
14856 force_set_get_count = 0; 14856 force_set_get_count = 0;
14857 force_set_set_count = 0; 14857 force_set_set_count = 0;
14858 pass_on_get = false; 14858 pass_on_get = false;
14859 14859
14860 v8::HandleScope scope(v8::Isolate::GetCurrent()); 14860 v8::HandleScope scope(CcTest::isolate());
14861 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14861 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14862 templ->SetNamedPropertyHandler(ForceSetGetter, ForceSetInterceptSetter); 14862 templ->SetNamedPropertyHandler(ForceSetGetter, ForceSetInterceptSetter);
14863 LocalContext context(NULL, templ); 14863 LocalContext context(NULL, templ);
14864 v8::Handle<v8::Object> global = context->Global(); 14864 v8::Handle<v8::Object> global = context->Global();
14865 14865
14866 v8::Handle<v8::String> some_property = v8::String::New("a"); 14866 v8::Handle<v8::String> some_property = v8::String::New("a");
14867 CHECK_EQ(0, force_set_set_count); 14867 CHECK_EQ(0, force_set_set_count);
14868 CHECK_EQ(0, force_set_get_count); 14868 CHECK_EQ(0, force_set_get_count);
14869 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 14869 CHECK_EQ(3, global->Get(some_property)->Int32Value());
14870 // Setting the property shouldn't override it, just call the setter 14870 // Setting the property shouldn't override it, just call the setter
(...skipping 22 matching lines...) Expand all
14893 CHECK_EQ(1, force_set_set_count); 14893 CHECK_EQ(1, force_set_set_count);
14894 CHECK_EQ(5, force_set_get_count); 14894 CHECK_EQ(5, force_set_get_count);
14895 // The interceptor should also work for other properties 14895 // The interceptor should also work for other properties
14896 CHECK_EQ(3, global->Get(v8::String::New("b"))->Int32Value()); 14896 CHECK_EQ(3, global->Get(v8::String::New("b"))->Int32Value());
14897 CHECK_EQ(1, force_set_set_count); 14897 CHECK_EQ(1, force_set_set_count);
14898 CHECK_EQ(6, force_set_get_count); 14898 CHECK_EQ(6, force_set_get_count);
14899 } 14899 }
14900 14900
14901 14901
14902 THREADED_TEST(ForceDelete) { 14902 THREADED_TEST(ForceDelete) {
14903 v8::HandleScope scope(v8::Isolate::GetCurrent()); 14903 v8::HandleScope scope(CcTest::isolate());
14904 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14904 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14905 LocalContext context(NULL, templ); 14905 LocalContext context(NULL, templ);
14906 v8::Handle<v8::Object> global = context->Global(); 14906 v8::Handle<v8::Object> global = context->Global();
14907 14907
14908 // Ordinary properties 14908 // Ordinary properties
14909 v8::Handle<v8::String> simple_property = v8::String::New("p"); 14909 v8::Handle<v8::String> simple_property = v8::String::New("p");
14910 global->Set(simple_property, v8::Int32::New(4), v8::DontDelete); 14910 global->Set(simple_property, v8::Int32::New(4), v8::DontDelete);
14911 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 14911 CHECK_EQ(4, global->Get(simple_property)->Int32Value());
14912 // This should fail because the property is dont-delete. 14912 // This should fail because the property is dont-delete.
14913 CHECK(!global->Delete(simple_property)); 14913 CHECK(!global->Delete(simple_property));
(...skipping 14 matching lines...) Expand all
14928 force_delete_interceptor_count++; 14928 force_delete_interceptor_count++;
14929 if (pass_on_delete) return; 14929 if (pass_on_delete) return;
14930 info.GetReturnValue().Set(true); 14930 info.GetReturnValue().Set(true);
14931 } 14931 }
14932 14932
14933 14933
14934 THREADED_TEST(ForceDeleteWithInterceptor) { 14934 THREADED_TEST(ForceDeleteWithInterceptor) {
14935 force_delete_interceptor_count = 0; 14935 force_delete_interceptor_count = 0;
14936 pass_on_delete = false; 14936 pass_on_delete = false;
14937 14937
14938 v8::HandleScope scope(v8::Isolate::GetCurrent()); 14938 v8::HandleScope scope(CcTest::isolate());
14939 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14939 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14940 templ->SetNamedPropertyHandler(0, 0, 0, ForceDeleteDeleter); 14940 templ->SetNamedPropertyHandler(0, 0, 0, ForceDeleteDeleter);
14941 LocalContext context(NULL, templ); 14941 LocalContext context(NULL, templ);
14942 v8::Handle<v8::Object> global = context->Global(); 14942 v8::Handle<v8::Object> global = context->Global();
14943 14943
14944 v8::Handle<v8::String> some_property = v8::String::New("a"); 14944 v8::Handle<v8::String> some_property = v8::String::New("a");
14945 global->Set(some_property, v8::Integer::New(42), v8::DontDelete); 14945 global->Set(some_property, v8::Integer::New(42), v8::DontDelete);
14946 14946
14947 // Deleting a property should get intercepted and nothing should 14947 // Deleting a property should get intercepted and nothing should
14948 // happen. 14948 // happen.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
14981 CHECK(context->Global()->ForceDelete(v8_str("foo"))); 14981 CHECK(context->Global()->ForceDelete(v8_str("foo")));
14982 // Make sure the value for foo is read from the prototype, and that 14982 // Make sure the value for foo is read from the prototype, and that
14983 // we don't get in trouble with reading the deleted cell value 14983 // we don't get in trouble with reading the deleted cell value
14984 // sentinel. 14984 // sentinel.
14985 CHECK_EQ(5, CompileRun("f()")->Int32Value()); 14985 CHECK_EQ(5, CompileRun("f()")->Int32Value());
14986 } 14986 }
14987 14987
14988 14988
14989 TEST(InlinedFunctionAcrossContexts) { 14989 TEST(InlinedFunctionAcrossContexts) {
14990 i::FLAG_allow_natives_syntax = true; 14990 i::FLAG_allow_natives_syntax = true;
14991 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 14991 v8::Isolate* isolate = CcTest::isolate();
14992 v8::HandleScope outer_scope(isolate); 14992 v8::HandleScope outer_scope(isolate);
14993 v8::Local<v8::Context> ctx1 = v8::Context::New(isolate); 14993 v8::Local<v8::Context> ctx1 = v8::Context::New(isolate);
14994 v8::Local<v8::Context> ctx2 = v8::Context::New(isolate); 14994 v8::Local<v8::Context> ctx2 = v8::Context::New(isolate);
14995 ctx1->Enter(); 14995 ctx1->Enter();
14996 14996
14997 { 14997 {
14998 v8::HandleScope inner_scope(v8::Isolate::GetCurrent()); 14998 v8::HandleScope inner_scope(CcTest::isolate());
14999 CompileRun("var G = 42; function foo() { return G; }"); 14999 CompileRun("var G = 42; function foo() { return G; }");
15000 v8::Local<v8::Value> foo = ctx1->Global()->Get(v8_str("foo")); 15000 v8::Local<v8::Value> foo = ctx1->Global()->Get(v8_str("foo"));
15001 ctx2->Enter(); 15001 ctx2->Enter();
15002 ctx2->Global()->Set(v8_str("o"), foo); 15002 ctx2->Global()->Set(v8_str("o"), foo);
15003 v8::Local<v8::Value> res = CompileRun( 15003 v8::Local<v8::Value> res = CompileRun(
15004 "function f() { return o(); }" 15004 "function f() { return o(); }"
15005 "for (var i = 0; i < 10; ++i) f();" 15005 "for (var i = 0; i < 10; ++i) f();"
15006 "%OptimizeFunctionOnNextCall(f);" 15006 "%OptimizeFunctionOnNextCall(f);"
15007 "f();"); 15007 "f();");
15008 CHECK_EQ(42, res->Int32Value()); 15008 CHECK_EQ(42, res->Int32Value());
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
15050 CHECK(isolate->context() == NULL); 15050 CHECK(isolate->context() == NULL);
15051 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); 15051 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
15052 v8::HandleScope scope(v8_isolate); 15052 v8::HandleScope scope(v8_isolate);
15053 // The following should not crash, but return an empty handle. 15053 // The following should not crash, but return an empty handle.
15054 v8::Local<v8::Context> current = v8_isolate->GetCurrentContext(); 15054 v8::Local<v8::Context> current = v8_isolate->GetCurrentContext();
15055 CHECK(current.IsEmpty()); 15055 CHECK(current.IsEmpty());
15056 } 15056 }
15057 15057
15058 15058
15059 THREADED_TEST(GetCallingContext) { 15059 THREADED_TEST(GetCallingContext) {
15060 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 15060 v8::Isolate* isolate = CcTest::isolate();
15061 v8::HandleScope scope(isolate); 15061 v8::HandleScope scope(isolate);
15062 15062
15063 Local<Context> calling_context0(Context::New(isolate)); 15063 Local<Context> calling_context0(Context::New(isolate));
15064 Local<Context> calling_context1(Context::New(isolate)); 15064 Local<Context> calling_context1(Context::New(isolate));
15065 Local<Context> calling_context2(Context::New(isolate)); 15065 Local<Context> calling_context2(Context::New(isolate));
15066 ::calling_context0 = calling_context0; 15066 ::calling_context0 = calling_context0;
15067 ::calling_context1 = calling_context1; 15067 ::calling_context1 = calling_context1;
15068 ::calling_context2 = calling_context2; 15068 ::calling_context2 = calling_context2;
15069 15069
15070 // Allow cross-domain access. 15070 // Allow cross-domain access.
(...skipping 1391 matching lines...) Expand 10 before | Expand all | Expand 10 after
16462 v8::String::Utf8Value stack(try_catch.StackTrace()); 16462 v8::String::Utf8Value stack(try_catch.StackTrace());
16463 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL); 16463 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL);
16464 } 16464 }
16465 16465
16466 16466
16467 // Checks that a StackFrame has certain expected values. 16467 // Checks that a StackFrame has certain expected values.
16468 void checkStackFrame(const char* expected_script_name, 16468 void checkStackFrame(const char* expected_script_name,
16469 const char* expected_func_name, int expected_line_number, 16469 const char* expected_func_name, int expected_line_number,
16470 int expected_column, bool is_eval, bool is_constructor, 16470 int expected_column, bool is_eval, bool is_constructor,
16471 v8::Handle<v8::StackFrame> frame) { 16471 v8::Handle<v8::StackFrame> frame) {
16472 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16472 v8::HandleScope scope(CcTest::isolate());
16473 v8::String::Utf8Value func_name(frame->GetFunctionName()); 16473 v8::String::Utf8Value func_name(frame->GetFunctionName());
16474 v8::String::Utf8Value script_name(frame->GetScriptName()); 16474 v8::String::Utf8Value script_name(frame->GetScriptName());
16475 if (*script_name == NULL) { 16475 if (*script_name == NULL) {
16476 // The situation where there is no associated script, like for evals. 16476 // The situation where there is no associated script, like for evals.
16477 CHECK(expected_script_name == NULL); 16477 CHECK(expected_script_name == NULL);
16478 } else { 16478 } else {
16479 CHECK(strstr(*script_name, expected_script_name) != NULL); 16479 CHECK(strstr(*script_name, expected_script_name) != NULL);
16480 } 16480 }
16481 CHECK(strstr(*func_name, expected_func_name) != NULL); 16481 CHECK(strstr(*func_name, expected_func_name) != NULL);
16482 CHECK_EQ(expected_line_number, frame->GetLineNumber()); 16482 CHECK_EQ(expected_line_number, frame->GetLineNumber());
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
16534 16534
16535 CHECK(stackTrace->AsArray()->IsArray()); 16535 CHECK(stackTrace->AsArray()->IsArray());
16536 } 16536 }
16537 } 16537 }
16538 16538
16539 16539
16540 // Tests the C++ StackTrace API. 16540 // Tests the C++ StackTrace API.
16541 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. 16541 // TODO(3074796): Reenable this as a THREADED_TEST once it passes.
16542 // THREADED_TEST(CaptureStackTrace) { 16542 // THREADED_TEST(CaptureStackTrace) {
16543 TEST(CaptureStackTrace) { 16543 TEST(CaptureStackTrace) {
16544 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16544 v8::HandleScope scope(CcTest::isolate());
16545 v8::Handle<v8::String> origin = v8::String::New("capture-stack-trace-test"); 16545 v8::Handle<v8::String> origin = v8::String::New("capture-stack-trace-test");
16546 Local<ObjectTemplate> templ = ObjectTemplate::New(); 16546 Local<ObjectTemplate> templ = ObjectTemplate::New();
16547 templ->Set(v8_str("AnalyzeStackInNativeCode"), 16547 templ->Set(v8_str("AnalyzeStackInNativeCode"),
16548 v8::FunctionTemplate::New(AnalyzeStackInNativeCode)); 16548 v8::FunctionTemplate::New(AnalyzeStackInNativeCode));
16549 LocalContext context(0, templ); 16549 LocalContext context(0, templ);
16550 16550
16551 // Test getting OVERVIEW information. Should ignore information that is not 16551 // Test getting OVERVIEW information. Should ignore information that is not
16552 // script name, function name, line number, and column offset. 16552 // script name, function name, line number, and column offset.
16553 const char *overview_source = 16553 const char *overview_source =
16554 "function bar() {\n" 16554 "function bar() {\n"
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
16783 for (int i = 0; i < 3; i++) { 16783 for (int i = 0; i < 3; i++) {
16784 v8::Handle<v8::String> name = 16784 v8::Handle<v8::String> name =
16785 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 16785 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
16786 CHECK(!name.IsEmpty()); 16786 CHECK(!name.IsEmpty());
16787 CHECK_EQ(url, name); 16787 CHECK_EQ(url, name);
16788 } 16788 }
16789 } 16789 }
16790 16790
16791 16791
16792 TEST(SourceURLInStackTrace) { 16792 TEST(SourceURLInStackTrace) {
16793 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16793 v8::HandleScope scope(CcTest::isolate());
16794 Local<ObjectTemplate> templ = ObjectTemplate::New(); 16794 Local<ObjectTemplate> templ = ObjectTemplate::New();
16795 templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"), 16795 templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"),
16796 v8::FunctionTemplate::New(AnalyzeStackOfEvalWithSourceURL)); 16796 v8::FunctionTemplate::New(AnalyzeStackOfEvalWithSourceURL));
16797 LocalContext context(0, templ); 16797 LocalContext context(0, templ);
16798 16798
16799 const char *source = 16799 const char *source =
16800 "function outer() {\n" 16800 "function outer() {\n"
16801 "function bar() {\n" 16801 "function bar() {\n"
16802 " AnalyzeStackOfEvalWithSourceURL();\n" 16802 " AnalyzeStackOfEvalWithSourceURL();\n"
16803 "}\n" 16803 "}\n"
(...skipping 21 matching lines...) Expand all
16825 v8::Handle<v8::StackTrace> stackTrace = 16825 v8::Handle<v8::StackTrace> stackTrace =
16826 v8::StackTrace::CurrentStackTrace(10, v8::StackTrace::kScriptId); 16826 v8::StackTrace::CurrentStackTrace(10, v8::StackTrace::kScriptId);
16827 CHECK_EQ(2, stackTrace->GetFrameCount()); 16827 CHECK_EQ(2, stackTrace->GetFrameCount());
16828 for (int i = 0; i < 2; i++) { 16828 for (int i = 0; i < 2; i++) {
16829 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId(); 16829 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId();
16830 } 16830 }
16831 } 16831 }
16832 16832
16833 16833
16834 TEST(ScriptIdInStackTrace) { 16834 TEST(ScriptIdInStackTrace) {
16835 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16835 v8::HandleScope scope(CcTest::isolate());
16836 Local<ObjectTemplate> templ = ObjectTemplate::New(); 16836 Local<ObjectTemplate> templ = ObjectTemplate::New();
16837 templ->Set(v8_str("AnalyzeScriptIdInStack"), 16837 templ->Set(v8_str("AnalyzeScriptIdInStack"),
16838 v8::FunctionTemplate::New(AnalyzeScriptIdInStack)); 16838 v8::FunctionTemplate::New(AnalyzeScriptIdInStack));
16839 LocalContext context(0, templ); 16839 LocalContext context(0, templ);
16840 16840
16841 v8::Handle<v8::String> scriptSource = v8::String::New( 16841 v8::Handle<v8::String> scriptSource = v8::String::New(
16842 "function foo() {\n" 16842 "function foo() {\n"
16843 " AnalyzeScriptIdInStack();" 16843 " AnalyzeScriptIdInStack();"
16844 "}\n" 16844 "}\n"
16845 "foo();\n"); 16845 "foo();\n");
(...skipping 17 matching lines...) Expand all
16863 for (int i = 0; i < 3; i++) { 16863 for (int i = 0; i < 3; i++) {
16864 v8::Handle<v8::String> name = 16864 v8::Handle<v8::String> name =
16865 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 16865 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
16866 CHECK(!name.IsEmpty()); 16866 CHECK(!name.IsEmpty());
16867 CHECK_EQ(url, name); 16867 CHECK_EQ(url, name);
16868 } 16868 }
16869 } 16869 }
16870 16870
16871 16871
16872 TEST(InlineScriptWithSourceURLInStackTrace) { 16872 TEST(InlineScriptWithSourceURLInStackTrace) {
16873 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16873 v8::HandleScope scope(CcTest::isolate());
16874 Local<ObjectTemplate> templ = ObjectTemplate::New(); 16874 Local<ObjectTemplate> templ = ObjectTemplate::New();
16875 templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"), 16875 templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"),
16876 v8::FunctionTemplate::New( 16876 v8::FunctionTemplate::New(
16877 AnalyzeStackOfInlineScriptWithSourceURL)); 16877 AnalyzeStackOfInlineScriptWithSourceURL));
16878 LocalContext context(0, templ); 16878 LocalContext context(0, templ);
16879 16879
16880 const char *source = 16880 const char *source =
16881 "function outer() {\n" 16881 "function outer() {\n"
16882 "function bar() {\n" 16882 "function bar() {\n"
16883 " AnalyzeStackOfInlineScriptWithSourceURL();\n" 16883 " AnalyzeStackOfInlineScriptWithSourceURL();\n"
(...skipping 24 matching lines...) Expand all
16908 for (int i = 0; i < 3; i++) { 16908 for (int i = 0; i < 3; i++) {
16909 v8::Handle<v8::String> name = 16909 v8::Handle<v8::String> name =
16910 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 16910 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
16911 CHECK(!name.IsEmpty()); 16911 CHECK(!name.IsEmpty());
16912 CHECK_EQ(url, name); 16912 CHECK_EQ(url, name);
16913 } 16913 }
16914 } 16914 }
16915 16915
16916 16916
16917 TEST(DynamicWithSourceURLInStackTrace) { 16917 TEST(DynamicWithSourceURLInStackTrace) {
16918 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16918 v8::HandleScope scope(CcTest::isolate());
16919 Local<ObjectTemplate> templ = ObjectTemplate::New(); 16919 Local<ObjectTemplate> templ = ObjectTemplate::New();
16920 templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"), 16920 templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"),
16921 v8::FunctionTemplate::New( 16921 v8::FunctionTemplate::New(
16922 AnalyzeStackOfDynamicScriptWithSourceURL)); 16922 AnalyzeStackOfDynamicScriptWithSourceURL));
16923 LocalContext context(0, templ); 16923 LocalContext context(0, templ);
16924 16924
16925 const char *source = 16925 const char *source =
16926 "function outer() {\n" 16926 "function outer() {\n"
16927 "function bar() {\n" 16927 "function bar() {\n"
16928 " AnalyzeStackOfDynamicScriptWithSourceURL();\n" 16928 " AnalyzeStackOfDynamicScriptWithSourceURL();\n"
16929 "}\n" 16929 "}\n"
16930 "function foo() {\n" 16930 "function foo() {\n"
16931 "\n" 16931 "\n"
16932 " bar();\n" 16932 " bar();\n"
16933 "}\n" 16933 "}\n"
16934 "foo();\n" 16934 "foo();\n"
16935 "}\n" 16935 "}\n"
16936 "outer()\n%s"; 16936 "outer()\n%s";
16937 16937
16938 i::ScopedVector<char> code(1024); 16938 i::ScopedVector<char> code(1024);
16939 i::OS::SNPrintF(code, source, "//# sourceURL=source_url"); 16939 i::OS::SNPrintF(code, source, "//# sourceURL=source_url");
16940 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 0)->IsUndefined()); 16940 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 0)->IsUndefined());
16941 i::OS::SNPrintF(code, source, "//@ sourceURL=source_url"); 16941 i::OS::SNPrintF(code, source, "//@ sourceURL=source_url");
16942 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 0)->IsUndefined()); 16942 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 0)->IsUndefined());
16943 } 16943 }
16944 16944
16945 16945
16946 static void CreateGarbageInOldSpace() { 16946 static void CreateGarbageInOldSpace() {
16947 i::Factory* factory = i::Isolate::Current()->factory(); 16947 i::Factory* factory = i::Isolate::Current()->factory();
16948 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16948 v8::HandleScope scope(CcTest::isolate());
16949 i::AlwaysAllocateScope always_allocate; 16949 i::AlwaysAllocateScope always_allocate;
16950 for (int i = 0; i < 1000; i++) { 16950 for (int i = 0; i < 1000; i++) {
16951 factory->NewFixedArray(1000, i::TENURED); 16951 factory->NewFixedArray(1000, i::TENURED);
16952 } 16952 }
16953 } 16953 }
16954 16954
16955 16955
16956 // Test that idle notification can be handled and eventually returns true. 16956 // Test that idle notification can be handled and eventually returns true.
16957 TEST(IdleNotification) { 16957 TEST(IdleNotification) {
16958 const intptr_t MB = 1024 * 1024; 16958 const intptr_t MB = 1024 * 1024;
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
17329 v8::Handle<v8::String> str(args[0]->ToString()); 17329 v8::Handle<v8::String> str(args[0]->ToString());
17330 USE(str); 17330 USE(str);
17331 if (tc.HasCaught()) 17331 if (tc.HasCaught())
17332 tc.ReThrow(); 17332 tc.ReThrow();
17333 } 17333 }
17334 17334
17335 17335
17336 // Test that an exception can be propagated down through a spaghetti 17336 // Test that an exception can be propagated down through a spaghetti
17337 // stack using ReThrow. 17337 // stack using ReThrow.
17338 THREADED_TEST(SpaghettiStackReThrow) { 17338 THREADED_TEST(SpaghettiStackReThrow) {
17339 v8::HandleScope scope(v8::Isolate::GetCurrent()); 17339 v8::HandleScope scope(CcTest::isolate());
17340 LocalContext context; 17340 LocalContext context;
17341 context->Global()->Set( 17341 context->Global()->Set(
17342 v8::String::New("s"), 17342 v8::String::New("s"),
17343 v8::FunctionTemplate::New(SpaghettiIncident)->GetFunction()); 17343 v8::FunctionTemplate::New(SpaghettiIncident)->GetFunction());
17344 v8::TryCatch try_catch; 17344 v8::TryCatch try_catch;
17345 CompileRun( 17345 CompileRun(
17346 "var i = 0;" 17346 "var i = 0;"
17347 "var o = {" 17347 "var o = {"
17348 " toString: function () {" 17348 " toString: function () {"
17349 " if (i == 10) {" 17349 " if (i == 10) {"
17350 " throw 'Hey!';" 17350 " throw 'Hey!';"
17351 " } else {" 17351 " } else {"
17352 " i++;" 17352 " i++;"
17353 " return s(o);" 17353 " return s(o);"
17354 " }" 17354 " }"
17355 " }" 17355 " }"
17356 "};" 17356 "};"
17357 "s(o);"); 17357 "s(o);");
17358 CHECK(try_catch.HasCaught()); 17358 CHECK(try_catch.HasCaught());
17359 v8::String::Utf8Value value(try_catch.Exception()); 17359 v8::String::Utf8Value value(try_catch.Exception());
17360 CHECK_EQ(0, strcmp(*value, "Hey!")); 17360 CHECK_EQ(0, strcmp(*value, "Hey!"));
17361 } 17361 }
17362 17362
17363 17363
17364 TEST(Regress528) { 17364 TEST(Regress528) {
17365 v8::V8::Initialize(); 17365 v8::V8::Initialize();
17366 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 17366 v8::Isolate* isolate = CcTest::isolate();
17367 v8::HandleScope scope(isolate); 17367 v8::HandleScope scope(isolate);
17368 v8::Local<Context> other_context; 17368 v8::Local<Context> other_context;
17369 int gc_count; 17369 int gc_count;
17370 17370
17371 // Create a context used to keep the code from aging in the compilation 17371 // Create a context used to keep the code from aging in the compilation
17372 // cache. 17372 // cache.
17373 other_context = Context::New(isolate); 17373 other_context = Context::New(isolate);
17374 17374
17375 // Context-dependent context data creates reference from the compilation 17375 // Context-dependent context data creates reference from the compilation
17376 // cache to the global object. 17376 // cache to the global object.
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
17568 const v8::PropertyCallbackInfo<v8::Value>& info) { 17568 const v8::PropertyCallbackInfo<v8::Value>& info) {
17569 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 17569 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
17570 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 17570 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
17571 if (!name->Equals(v8_str("foo"))) return; 17571 if (!name->Equals(v8_str("foo"))) return;
17572 info.This()->Set(v8_str("y"), v8_num(23)); 17572 info.This()->Set(v8_str("y"), v8_num(23));
17573 info.GetReturnValue().Set(v8_num(23)); 17573 info.GetReturnValue().Set(v8_num(23));
17574 } 17574 }
17575 17575
17576 17576
17577 TEST(SetterOnConstructorPrototype) { 17577 TEST(SetterOnConstructorPrototype) {
17578 v8::HandleScope scope(v8::Isolate::GetCurrent()); 17578 v8::HandleScope scope(CcTest::isolate());
17579 Local<ObjectTemplate> templ = ObjectTemplate::New(); 17579 Local<ObjectTemplate> templ = ObjectTemplate::New();
17580 templ->SetAccessor(v8_str("x"), 17580 templ->SetAccessor(v8_str("x"),
17581 GetterWhichReturns42, 17581 GetterWhichReturns42,
17582 SetterWhichSetsYOnThisTo23); 17582 SetterWhichSetsYOnThisTo23);
17583 LocalContext context; 17583 LocalContext context;
17584 context->Global()->Set(v8_str("P"), templ->NewInstance()); 17584 context->Global()->Set(v8_str("P"), templ->NewInstance());
17585 CompileRun("function C1() {" 17585 CompileRun("function C1() {"
17586 " this.x = 23;" 17586 " this.x = 23;"
17587 "};" 17587 "};"
17588 "C1.prototype = P;" 17588 "C1.prototype = P;"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
17620 Local<String> name, 17620 Local<String> name,
17621 Local<Value> value, 17621 Local<Value> value,
17622 const v8::PropertyCallbackInfo<v8::Value>& info) { 17622 const v8::PropertyCallbackInfo<v8::Value>& info) {
17623 if (name->Equals(v8_str("x"))) { 17623 if (name->Equals(v8_str("x"))) {
17624 info.This()->Set(v8_str("y"), v8_num(23)); 17624 info.This()->Set(v8_str("y"), v8_num(23));
17625 } 17625 }
17626 } 17626 }
17627 17627
17628 17628
17629 THREADED_TEST(InterceptorOnConstructorPrototype) { 17629 THREADED_TEST(InterceptorOnConstructorPrototype) {
17630 v8::HandleScope scope(v8::Isolate::GetCurrent()); 17630 v8::HandleScope scope(CcTest::isolate());
17631 Local<ObjectTemplate> templ = ObjectTemplate::New(); 17631 Local<ObjectTemplate> templ = ObjectTemplate::New();
17632 templ->SetNamedPropertyHandler(NamedPropertyGetterWhichReturns42, 17632 templ->SetNamedPropertyHandler(NamedPropertyGetterWhichReturns42,
17633 NamedPropertySetterWhichSetsYOnThisTo23); 17633 NamedPropertySetterWhichSetsYOnThisTo23);
17634 LocalContext context; 17634 LocalContext context;
17635 context->Global()->Set(v8_str("P"), templ->NewInstance()); 17635 context->Global()->Set(v8_str("P"), templ->NewInstance());
17636 CompileRun("function C1() {" 17636 CompileRun("function C1() {"
17637 " this.x = 23;" 17637 " this.x = 23;"
17638 "};" 17638 "};"
17639 "C1.prototype = P;" 17639 "C1.prototype = P;"
17640 "function C2() {" 17640 "function C2() {"
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
17836 CHECK_EQ(2, prologue_call_count); 17836 CHECK_EQ(2, prologue_call_count);
17837 CHECK_EQ(2, epilogue_call_count); 17837 CHECK_EQ(2, epilogue_call_count);
17838 CHECK_EQ(2, prologue_call_count_second); 17838 CHECK_EQ(2, prologue_call_count_second);
17839 CHECK_EQ(2, epilogue_call_count_second); 17839 CHECK_EQ(2, epilogue_call_count_second);
17840 } 17840 }
17841 17841
17842 17842
17843 THREADED_TEST(AddToJSFunctionResultCache) { 17843 THREADED_TEST(AddToJSFunctionResultCache) {
17844 i::FLAG_stress_compaction = false; 17844 i::FLAG_stress_compaction = false;
17845 i::FLAG_allow_natives_syntax = true; 17845 i::FLAG_allow_natives_syntax = true;
17846 v8::HandleScope scope(v8::Isolate::GetCurrent()); 17846 v8::HandleScope scope(CcTest::isolate());
17847 17847
17848 LocalContext context; 17848 LocalContext context;
17849 17849
17850 const char* code = 17850 const char* code =
17851 "(function() {" 17851 "(function() {"
17852 " var key0 = 'a';" 17852 " var key0 = 'a';"
17853 " var key1 = 'b';" 17853 " var key1 = 'b';"
17854 " var r0 = %_GetFromCache(0, key0);" 17854 " var r0 = %_GetFromCache(0, key0);"
17855 " var r1 = %_GetFromCache(0, key1);" 17855 " var r1 = %_GetFromCache(0, key1);"
17856 " var r0_ = %_GetFromCache(0, key0);" 17856 " var r0_ = %_GetFromCache(0, key0);"
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
18039 18039
18040 ExpectObject("str2.lastIndexOf('dab');", lastindexof); 18040 ExpectObject("str2.lastIndexOf('dab');", lastindexof);
18041 18041
18042 reresult = CompileRun("str2.charCodeAt(2);"); 18042 reresult = CompileRun("str2.charCodeAt(2);");
18043 CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value()); 18043 CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value());
18044 } 18044 }
18045 18045
18046 18046
18047 TEST(ContainsOnlyOneByte) { 18047 TEST(ContainsOnlyOneByte) {
18048 v8::V8::Initialize(); 18048 v8::V8::Initialize();
18049 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 18049 v8::Isolate* isolate = CcTest::isolate();
18050 v8::HandleScope scope(isolate); 18050 v8::HandleScope scope(isolate);
18051 // Make a buffer long enough that it won't automatically be converted. 18051 // Make a buffer long enough that it won't automatically be converted.
18052 const int length = 512; 18052 const int length = 512;
18053 // Ensure word aligned assignment. 18053 // Ensure word aligned assignment.
18054 const int aligned_length = length*sizeof(uintptr_t)/sizeof(uint16_t); 18054 const int aligned_length = length*sizeof(uintptr_t)/sizeof(uint16_t);
18055 i::SmartArrayPointer<uintptr_t> 18055 i::SmartArrayPointer<uintptr_t>
18056 aligned_contents(new uintptr_t[aligned_length]); 18056 aligned_contents(new uintptr_t[aligned_length]);
18057 uint16_t* string_contents = reinterpret_cast<uint16_t*>(*aligned_contents); 18057 uint16_t* string_contents = reinterpret_cast<uint16_t*>(*aligned_contents);
18058 // Set to contain only one byte. 18058 // Set to contain only one byte.
18059 for (int i = 0; i < length-1; i++) { 18059 for (int i = 0; i < length-1; i++) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
18119 } 18119 }
18120 18120
18121 18121
18122 TEST(GCInFailedAccessCheckCallback) { 18122 TEST(GCInFailedAccessCheckCallback) {
18123 // Install a failed access check callback that performs a GC on each 18123 // Install a failed access check callback that performs a GC on each
18124 // invocation. Then force the callback to be called from va 18124 // invocation. Then force the callback to be called from va
18125 18125
18126 v8::V8::Initialize(); 18126 v8::V8::Initialize();
18127 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); 18127 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC);
18128 18128
18129 v8::HandleScope scope(v8::Isolate::GetCurrent()); 18129 v8::HandleScope scope(CcTest::isolate());
18130 18130
18131 // Create an ObjectTemplate for global objects and install access 18131 // Create an ObjectTemplate for global objects and install access
18132 // check callbacks that will block access. 18132 // check callbacks that will block access.
18133 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 18133 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
18134 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, 18134 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker,
18135 IndexedGetAccessBlocker, 18135 IndexedGetAccessBlocker,
18136 v8::Handle<v8::Value>(), 18136 v8::Handle<v8::Value>(),
18137 false); 18137 false);
18138 18138
18139 // Create a context and set an x property on it's global object. 18139 // Create a context and set an x property on it's global object.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
18191 CHECK_EQ(false, global0->HasRealNamedProperty(v8_str("x"))); 18191 CHECK_EQ(false, global0->HasRealNamedProperty(v8_str("x")));
18192 CHECK_EQ(false, global0->HasRealNamedCallbackProperty(v8_str("x"))); 18192 CHECK_EQ(false, global0->HasRealNamedCallbackProperty(v8_str("x")));
18193 18193
18194 // Reset the failed access check callback so it does not influence 18194 // Reset the failed access check callback so it does not influence
18195 // the other tests. 18195 // the other tests.
18196 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); 18196 v8::V8::SetFailedAccessCheckCallbackFunction(NULL);
18197 } 18197 }
18198 18198
18199 18199
18200 TEST(IsolateNewDispose) { 18200 TEST(IsolateNewDispose) {
18201 v8::Isolate* current_isolate = v8::Isolate::GetCurrent(); 18201 v8::Isolate* current_isolate = CcTest::isolate();
18202 v8::Isolate* isolate = v8::Isolate::New(); 18202 v8::Isolate* isolate = v8::Isolate::New();
18203 CHECK(isolate != NULL); 18203 CHECK(isolate != NULL);
18204 CHECK(!reinterpret_cast<i::Isolate*>(isolate)->IsDefaultIsolate()); 18204 CHECK(!reinterpret_cast<i::Isolate*>(isolate)->IsDefaultIsolate());
18205 CHECK(current_isolate != isolate); 18205 CHECK(current_isolate != isolate);
18206 CHECK(current_isolate == v8::Isolate::GetCurrent()); 18206 CHECK(current_isolate == CcTest::isolate());
18207 18207
18208 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 18208 v8::V8::SetFatalErrorHandler(StoringErrorCallback);
18209 last_location = last_message = NULL; 18209 last_location = last_message = NULL;
18210 isolate->Dispose(); 18210 isolate->Dispose();
18211 CHECK_EQ(last_location, NULL); 18211 CHECK_EQ(last_location, NULL);
18212 CHECK_EQ(last_message, NULL); 18212 CHECK_EQ(last_message, NULL);
18213 } 18213 }
18214 18214
18215 18215
18216 UNINITIALIZED_TEST(DisposeIsolateWhenInUse) { 18216 UNINITIALIZED_TEST(DisposeIsolateWhenInUse) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
18274 v8::Context::Scope context_scope(context); 18274 v8::Context::Scope context_scope(context);
18275 // Now again in isolate 1 18275 // Now again in isolate 1
18276 ExpectString("function f() { return foo; }; f()", "isolate 1"); 18276 ExpectString("function f() { return foo; }; f()", "isolate 1");
18277 } 18277 }
18278 18278
18279 isolate1->Exit(); 18279 isolate1->Exit();
18280 18280
18281 // Run some stuff in default isolate. 18281 // Run some stuff in default isolate.
18282 v8::Persistent<v8::Context> context_default; 18282 v8::Persistent<v8::Context> context_default;
18283 { 18283 {
18284 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 18284 v8::Isolate* isolate = CcTest::isolate();
18285 v8::Isolate::Scope iscope(isolate); 18285 v8::Isolate::Scope iscope(isolate);
18286 v8::HandleScope scope(isolate); 18286 v8::HandleScope scope(isolate);
18287 context_default.Reset(isolate, Context::New(isolate)); 18287 context_default.Reset(isolate, Context::New(isolate));
18288 } 18288 }
18289 18289
18290 { 18290 {
18291 v8::HandleScope scope(v8::Isolate::GetCurrent()); 18291 v8::HandleScope scope(CcTest::isolate());
18292 v8::Local<v8::Context> context = 18292 v8::Local<v8::Context> context =
18293 v8::Local<v8::Context>::New(v8::Isolate::GetCurrent(), context_default); 18293 v8::Local<v8::Context>::New(CcTest::isolate(), context_default);
18294 v8::Context::Scope context_scope(context); 18294 v8::Context::Scope context_scope(context);
18295 // Variables in other isolates should be not available, verify there 18295 // Variables in other isolates should be not available, verify there
18296 // is an exception. 18296 // is an exception.
18297 ExpectTrue("function f() {" 18297 ExpectTrue("function f() {"
18298 " try {" 18298 " try {"
18299 " foo;" 18299 " foo;"
18300 " return false;" 18300 " return false;"
18301 " } catch(e) {" 18301 " } catch(e) {"
18302 " return true;" 18302 " return true;"
18303 " }" 18303 " }"
18304 "};" 18304 "};"
18305 "var isDefaultIsolate = true;" 18305 "var isDefaultIsolate = true;"
18306 "f()"); 18306 "f()");
18307 } 18307 }
18308 18308
18309 isolate1->Enter(); 18309 isolate1->Enter();
18310 18310
18311 { 18311 {
18312 v8::Isolate::Scope iscope(isolate2); 18312 v8::Isolate::Scope iscope(isolate2);
18313 v8::HandleScope scope(v8::Isolate::GetCurrent()); 18313 v8::HandleScope scope(isolate2);
18314 v8::Local<v8::Context> context = 18314 v8::Local<v8::Context> context =
18315 v8::Local<v8::Context>::New(isolate2, context2); 18315 v8::Local<v8::Context>::New(isolate2, context2);
18316 v8::Context::Scope context_scope(context); 18316 v8::Context::Scope context_scope(context);
18317 ExpectString("function f() { return foo; }; f()", "isolate 2"); 18317 ExpectString("function f() { return foo; }; f()", "isolate 2");
18318 } 18318 }
18319 18319
18320 { 18320 {
18321 v8::HandleScope scope(v8::Isolate::GetCurrent()); 18321 v8::HandleScope scope(v8::Isolate::GetCurrent());
18322 v8::Local<v8::Context> context = 18322 v8::Local<v8::Context> context =
18323 v8::Local<v8::Context>::New(v8::Isolate::GetCurrent(), context1); 18323 v8::Local<v8::Context>::New(v8::Isolate::GetCurrent(), context1);
(...skipping 15 matching lines...) Expand all
18339 isolate1->Dispose(); 18339 isolate1->Dispose();
18340 CHECK_EQ(last_location, NULL); 18340 CHECK_EQ(last_location, NULL);
18341 CHECK_EQ(last_message, NULL); 18341 CHECK_EQ(last_message, NULL);
18342 18342
18343 isolate2->Dispose(); 18343 isolate2->Dispose();
18344 CHECK_EQ(last_location, NULL); 18344 CHECK_EQ(last_location, NULL);
18345 CHECK_EQ(last_message, NULL); 18345 CHECK_EQ(last_message, NULL);
18346 18346
18347 // Check that default isolate still runs. 18347 // Check that default isolate still runs.
18348 { 18348 {
18349 v8::HandleScope scope(v8::Isolate::GetCurrent()); 18349 v8::HandleScope scope(CcTest::isolate());
18350 v8::Local<v8::Context> context = 18350 v8::Local<v8::Context> context =
18351 v8::Local<v8::Context>::New(v8::Isolate::GetCurrent(), context_default); 18351 v8::Local<v8::Context>::New(CcTest::isolate(), context_default);
18352 v8::Context::Scope context_scope(context); 18352 v8::Context::Scope context_scope(context);
18353 ExpectTrue("function f() { return isDefaultIsolate; }; f()"); 18353 ExpectTrue("function f() { return isDefaultIsolate; }; f()");
18354 } 18354 }
18355 } 18355 }
18356 18356
18357 18357
18358 static int CalcFibonacci(v8::Isolate* isolate, int limit) { 18358 static int CalcFibonacci(v8::Isolate* isolate, int limit) {
18359 v8::Isolate::Scope isolate_scope(isolate); 18359 v8::Isolate::Scope isolate_scope(isolate);
18360 v8::HandleScope scope(isolate); 18360 v8::HandleScope scope(isolate);
18361 LocalContext context; 18361 LocalContext context;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
18395 v8::Isolate* isolate1 = v8::Isolate::New(); 18395 v8::Isolate* isolate1 = v8::Isolate::New();
18396 v8::Isolate* isolate2 = v8::Isolate::New(); 18396 v8::Isolate* isolate2 = v8::Isolate::New();
18397 18397
18398 IsolateThread thread1(isolate1, 21); 18398 IsolateThread thread1(isolate1, 21);
18399 IsolateThread thread2(isolate2, 12); 18399 IsolateThread thread2(isolate2, 12);
18400 18400
18401 // Compute some fibonacci numbers on 3 threads in 3 isolates. 18401 // Compute some fibonacci numbers on 3 threads in 3 isolates.
18402 thread1.Start(); 18402 thread1.Start();
18403 thread2.Start(); 18403 thread2.Start();
18404 18404
18405 int result1 = CalcFibonacci(v8::Isolate::GetCurrent(), 21); 18405 int result1 = CalcFibonacci(CcTest::isolate(), 21);
18406 int result2 = CalcFibonacci(v8::Isolate::GetCurrent(), 12); 18406 int result2 = CalcFibonacci(CcTest::isolate(), 12);
18407 18407
18408 thread1.Join(); 18408 thread1.Join();
18409 thread2.Join(); 18409 thread2.Join();
18410 18410
18411 // Compare results. The actual fibonacci numbers for 12 and 21 are taken 18411 // Compare results. The actual fibonacci numbers for 12 and 21 are taken
18412 // (I'm lazy!) from http://en.wikipedia.org/wiki/Fibonacci_number 18412 // (I'm lazy!) from http://en.wikipedia.org/wiki/Fibonacci_number
18413 CHECK_EQ(result1, 10946); 18413 CHECK_EQ(result1, 10946);
18414 CHECK_EQ(result2, 144); 18414 CHECK_EQ(result2, 144);
18415 CHECK_EQ(result1, thread1.result()); 18415 CHECK_EQ(result1, thread1.result());
18416 CHECK_EQ(result2, thread2.result()); 18416 CHECK_EQ(result2, thread2.result());
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
18710 18710
18711 class Visitor42 : public v8::PersistentHandleVisitor { 18711 class Visitor42 : public v8::PersistentHandleVisitor {
18712 public: 18712 public:
18713 explicit Visitor42(v8::Persistent<v8::Object>* object) 18713 explicit Visitor42(v8::Persistent<v8::Object>* object)
18714 : counter_(0), object_(object) { } 18714 : counter_(0), object_(object) { }
18715 18715
18716 virtual void VisitPersistentHandle(Persistent<Value>* value, 18716 virtual void VisitPersistentHandle(Persistent<Value>* value,
18717 uint16_t class_id) { 18717 uint16_t class_id) {
18718 if (class_id != 42) return; 18718 if (class_id != 42) return;
18719 CHECK_EQ(42, value->WrapperClassId()); 18719 CHECK_EQ(42, value->WrapperClassId());
18720 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 18720 v8::Isolate* isolate = CcTest::isolate();
18721 v8::HandleScope handle_scope(isolate); 18721 v8::HandleScope handle_scope(isolate);
18722 v8::Handle<v8::Value> handle = v8::Local<v8::Value>::New(isolate, *value); 18722 v8::Handle<v8::Value> handle = v8::Local<v8::Value>::New(isolate, *value);
18723 v8::Handle<v8::Value> object = 18723 v8::Handle<v8::Value> object =
18724 v8::Local<v8::Object>::New(isolate, *object_); 18724 v8::Local<v8::Object>::New(isolate, *object_);
18725 CHECK(handle->IsObject()); 18725 CHECK(handle->IsObject());
18726 CHECK_EQ(Handle<Object>::Cast(handle), object); 18726 CHECK_EQ(Handle<Object>::Cast(handle), object);
18727 ++counter_; 18727 ++counter_;
18728 } 18728 }
18729 18729
18730 int counter_; 18730 int counter_;
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
18925 Set(v8_str("context_id"), v8::Integer::New(id)); 18925 Set(v8_str("context_id"), v8::Integer::New(id));
18926 } 18926 }
18927 18927
18928 18928
18929 static void CheckContextId(v8::Handle<Object> object, int expected) { 18929 static void CheckContextId(v8::Handle<Object> object, int expected) {
18930 CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value()); 18930 CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value());
18931 } 18931 }
18932 18932
18933 18933
18934 THREADED_TEST(CreationContext) { 18934 THREADED_TEST(CreationContext) {
18935 HandleScope handle_scope(v8::Isolate::GetCurrent()); 18935 HandleScope handle_scope(CcTest::isolate());
18936 Handle<Context> context1 = Context::New(v8::Isolate::GetCurrent()); 18936 Handle<Context> context1 = Context::New(CcTest::isolate());
18937 InstallContextId(context1, 1); 18937 InstallContextId(context1, 1);
18938 Handle<Context> context2 = Context::New(v8::Isolate::GetCurrent()); 18938 Handle<Context> context2 = Context::New(CcTest::isolate());
18939 InstallContextId(context2, 2); 18939 InstallContextId(context2, 2);
18940 Handle<Context> context3 = Context::New(v8::Isolate::GetCurrent()); 18940 Handle<Context> context3 = Context::New(CcTest::isolate());
18941 InstallContextId(context3, 3); 18941 InstallContextId(context3, 3);
18942 18942
18943 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(); 18943 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New();
18944 18944
18945 Local<Object> object1; 18945 Local<Object> object1;
18946 Local<Function> func1; 18946 Local<Function> func1;
18947 { 18947 {
18948 Context::Scope scope(context1); 18948 Context::Scope scope(context1);
18949 object1 = Object::New(); 18949 object1 = Object::New();
18950 func1 = tmpl->GetFunction(); 18950 func1 = tmpl->GetFunction();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
19008 CheckContextId(object2, 2); 19008 CheckContextId(object2, 2);
19009 CHECK(func2->CreationContext() == context2); 19009 CHECK(func2->CreationContext() == context2);
19010 CheckContextId(func2, 2); 19010 CheckContextId(func2, 2);
19011 CHECK(instance2->CreationContext() == context2); 19011 CHECK(instance2->CreationContext() == context2);
19012 CheckContextId(instance2, 2); 19012 CheckContextId(instance2, 2);
19013 } 19013 }
19014 } 19014 }
19015 19015
19016 19016
19017 THREADED_TEST(CreationContextOfJsFunction) { 19017 THREADED_TEST(CreationContextOfJsFunction) {
19018 HandleScope handle_scope(v8::Isolate::GetCurrent()); 19018 HandleScope handle_scope(CcTest::isolate());
19019 Handle<Context> context = Context::New(v8::Isolate::GetCurrent()); 19019 Handle<Context> context = Context::New(CcTest::isolate());
19020 InstallContextId(context, 1); 19020 InstallContextId(context, 1);
19021 19021
19022 Local<Object> function; 19022 Local<Object> function;
19023 { 19023 {
19024 Context::Scope scope(context); 19024 Context::Scope scope(context);
19025 function = CompileRun("function foo() {}; foo").As<Object>(); 19025 function = CompileRun("function foo() {}; foo").As<Object>();
19026 } 19026 }
19027 19027
19028 CHECK(function->CreationContext() == context); 19028 CHECK(function->CreationContext() == context);
19029 CheckContextId(function, 1); 19029 CheckContextId(function, 1);
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
19138 0, 19138 0,
19139 HasOwnPropertyNamedPropertyQuery2); 19139 HasOwnPropertyNamedPropertyQuery2);
19140 Handle<Object> instance = templ->NewInstance(); 19140 Handle<Object> instance = templ->NewInstance();
19141 CHECK(!instance->HasOwnProperty(v8_str("foo"))); 19141 CHECK(!instance->HasOwnProperty(v8_str("foo")));
19142 CHECK(instance->HasOwnProperty(v8_str("bar"))); 19142 CHECK(instance->HasOwnProperty(v8_str("bar")));
19143 } 19143 }
19144 } 19144 }
19145 19145
19146 19146
19147 TEST(IndexedInterceptorWithStringProto) { 19147 TEST(IndexedInterceptorWithStringProto) {
19148 v8::HandleScope scope(v8::Isolate::GetCurrent()); 19148 v8::HandleScope scope(CcTest::isolate());
19149 Handle<ObjectTemplate> templ = ObjectTemplate::New(); 19149 Handle<ObjectTemplate> templ = ObjectTemplate::New();
19150 templ->SetIndexedPropertyHandler(NULL, 19150 templ->SetIndexedPropertyHandler(NULL,
19151 NULL, 19151 NULL,
19152 HasOwnPropertyIndexedPropertyQuery); 19152 HasOwnPropertyIndexedPropertyQuery);
19153 LocalContext context; 19153 LocalContext context;
19154 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 19154 context->Global()->Set(v8_str("obj"), templ->NewInstance());
19155 CompileRun("var s = new String('foobar'); obj.__proto__ = s;"); 19155 CompileRun("var s = new String('foobar'); obj.__proto__ = s;");
19156 // These should be intercepted. 19156 // These should be intercepted.
19157 CHECK(CompileRun("42 in obj")->BooleanValue()); 19157 CHECK(CompileRun("42 in obj")->BooleanValue());
19158 CHECK(CompileRun("'42' in obj")->BooleanValue()); 19158 CHECK(CompileRun("'42' in obj")->BooleanValue());
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
19264 Handle<FunctionTemplate> templ = v8::FunctionTemplate::New(NonObjectThis); 19264 Handle<FunctionTemplate> templ = v8::FunctionTemplate::New(NonObjectThis);
19265 Handle<Function> function = templ->GetFunction(); 19265 Handle<Function> function = templ->GetFunction();
19266 context->Global()->Set(v8_str("f"), function); 19266 context->Global()->Set(v8_str("f"), function);
19267 TryCatch try_catch; 19267 TryCatch try_catch;
19268 CompileRun("f.call(2)"); 19268 CompileRun("f.call(2)");
19269 } 19269 }
19270 19270
19271 19271
19272 // Regression test for issue 1470. 19272 // Regression test for issue 1470.
19273 THREADED_TEST(ReadOnlyIndexedProperties) { 19273 THREADED_TEST(ReadOnlyIndexedProperties) {
19274 v8::HandleScope scope(v8::Isolate::GetCurrent()); 19274 v8::HandleScope scope(CcTest::isolate());
19275 Local<ObjectTemplate> templ = ObjectTemplate::New(); 19275 Local<ObjectTemplate> templ = ObjectTemplate::New();
19276 19276
19277 LocalContext context; 19277 LocalContext context;
19278 Local<v8::Object> obj = templ->NewInstance(); 19278 Local<v8::Object> obj = templ->NewInstance();
19279 context->Global()->Set(v8_str("obj"), obj); 19279 context->Global()->Set(v8_str("obj"), obj);
19280 obj->Set(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly); 19280 obj->Set(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly);
19281 obj->Set(v8_str("1"), v8_str("foobar")); 19281 obj->Set(v8_str("1"), v8_str("foobar"));
19282 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("1"))); 19282 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("1")));
19283 obj->Set(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly); 19283 obj->Set(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly);
19284 obj->Set(v8_num(2), v8_str("foobar")); 19284 obj->Set(v8_num(2), v8_str("foobar"));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
19329 char buffer[10]; 19329 char buffer[10];
19330 CHECK_EQ(10, name->ToString()->WriteUtf8(buffer)); 19330 CHECK_EQ(10, name->ToString()->WriteUtf8(buffer));
19331 return strncmp(buffer, "__proto__", 9) != 0; 19331 return strncmp(buffer, "__proto__", 9) != 0;
19332 } 19332 }
19333 19333
19334 return true; 19334 return true;
19335 } 19335 }
19336 19336
19337 19337
19338 THREADED_TEST(Regress93759) { 19338 THREADED_TEST(Regress93759) {
19339 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 19339 v8::Isolate* isolate = CcTest::isolate();
19340 HandleScope scope(isolate); 19340 HandleScope scope(isolate);
19341 19341
19342 // Template for object with security check. 19342 // Template for object with security check.
19343 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(); 19343 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New();
19344 // We don't do indexing, so any callback can be used for that. 19344 // We don't do indexing, so any callback can be used for that.
19345 no_proto_template->SetAccessCheckCallbacks( 19345 no_proto_template->SetAccessCheckCallbacks(
19346 BlockProtoNamedSecurityTestCallback, 19346 BlockProtoNamedSecurityTestCallback,
19347 IndexedSecurityTestCallback); 19347 IndexedSecurityTestCallback);
19348 19348
19349 // Templates for objects with hidden prototypes and possibly security check. 19349 // Templates for objects with hidden prototypes and possibly security check.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
19419 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)"); 19419 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)");
19420 CHECK(result5->Equals( 19420 CHECK(result5->Equals(
19421 object_with_hidden->GetPrototype()->ToObject()->GetPrototype())); 19421 object_with_hidden->GetPrototype()->ToObject()->GetPrototype()));
19422 19422
19423 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)"); 19423 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)");
19424 CHECK(result6->Equals(Undefined())); 19424 CHECK(result6->Equals(Undefined()));
19425 } 19425 }
19426 19426
19427 19427
19428 THREADED_TEST(Regress125988) { 19428 THREADED_TEST(Regress125988) {
19429 v8::HandleScope scope(v8::Isolate::GetCurrent()); 19429 v8::HandleScope scope(CcTest::isolate());
19430 Handle<FunctionTemplate> intercept = FunctionTemplate::New(); 19430 Handle<FunctionTemplate> intercept = FunctionTemplate::New();
19431 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter); 19431 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter);
19432 LocalContext env; 19432 LocalContext env;
19433 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction()); 19433 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction());
19434 CompileRun("var a = new Object();" 19434 CompileRun("var a = new Object();"
19435 "var b = new Intercept();" 19435 "var b = new Intercept();"
19436 "var c = new Object();" 19436 "var c = new Object();"
19437 "c.__proto__ = b;" 19437 "c.__proto__ = b;"
19438 "b.__proto__ = a;" 19438 "b.__proto__ = a;"
19439 "a.x = 23;" 19439 "a.x = 23;"
(...skipping 13 matching lines...) Expand all
19453 Local<Value> expected_receiver, 19453 Local<Value> expected_receiver,
19454 const char* code) { 19454 const char* code) {
19455 Local<Value> result = CompileRun(code); 19455 Local<Value> result = CompileRun(code);
19456 CHECK(result->IsObject()); 19456 CHECK(result->IsObject());
19457 CHECK(expected_receiver->Equals(result->ToObject()->Get(1))); 19457 CHECK(expected_receiver->Equals(result->ToObject()->Get(1)));
19458 CHECK(expected_result->Equals(result->ToObject()->Get(0))); 19458 CHECK(expected_result->Equals(result->ToObject()->Get(0)));
19459 } 19459 }
19460 19460
19461 19461
19462 THREADED_TEST(ForeignFunctionReceiver) { 19462 THREADED_TEST(ForeignFunctionReceiver) {
19463 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 19463 v8::Isolate* isolate = CcTest::isolate();
19464 HandleScope scope(isolate); 19464 HandleScope scope(isolate);
19465 19465
19466 // Create two contexts with different "id" properties ('i' and 'o'). 19466 // Create two contexts with different "id" properties ('i' and 'o').
19467 // Call a function both from its own context and from a the foreign 19467 // Call a function both from its own context and from a the foreign
19468 // context, and see what "this" is bound to (returning both "this" 19468 // context, and see what "this" is bound to (returning both "this"
19469 // and "this.id" for comparison). 19469 // and "this.id" for comparison).
19470 19470
19471 Local<Context> foreign_context = v8::Context::New(isolate); 19471 Local<Context> foreign_context = v8::Context::New(isolate);
19472 foreign_context->Enter(); 19472 foreign_context->Enter();
19473 Local<Value> foreign_function = 19473 Local<Value> foreign_function =
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
19612 callback_fired = 0; 19612 callback_fired = 0;
19613 Local<Function> recursive_function = 19613 Local<Function> recursive_function =
19614 Local<Function>::Cast(env->Global()->Get(v8_str("recursion"))); 19614 Local<Function>::Cast(env->Global()->Get(v8_str("recursion")));
19615 v8::Handle<Value> args[] = { v8_num(0) }; 19615 v8::Handle<Value> args[] = { v8_num(0) };
19616 recursive_function->Call(env->Global(), 1, args); 19616 recursive_function->Call(env->Global(), 1, args);
19617 CHECK_EQ(2, callback_fired); 19617 CHECK_EQ(2, callback_fired);
19618 } 19618 }
19619 19619
19620 19620
19621 void CallCompletedCallbackNoException() { 19621 void CallCompletedCallbackNoException() {
19622 v8::HandleScope scope(v8::Isolate::GetCurrent()); 19622 v8::HandleScope scope(CcTest::isolate());
19623 CompileRun("1+1;"); 19623 CompileRun("1+1;");
19624 } 19624 }
19625 19625
19626 19626
19627 void CallCompletedCallbackException() { 19627 void CallCompletedCallbackException() {
19628 v8::HandleScope scope(v8::Isolate::GetCurrent()); 19628 v8::HandleScope scope(CcTest::isolate());
19629 CompileRun("throw 'second exception';"); 19629 CompileRun("throw 'second exception';");
19630 } 19630 }
19631 19631
19632 19632
19633 TEST(CallCompletedCallbackOneException) { 19633 TEST(CallCompletedCallbackOneException) {
19634 LocalContext env; 19634 LocalContext env;
19635 v8::HandleScope scope(env->GetIsolate()); 19635 v8::HandleScope scope(env->GetIsolate());
19636 v8::V8::AddCallCompletedCallback(CallCompletedCallbackNoException); 19636 v8::V8::AddCallCompletedCallback(CallCompletedCallbackNoException);
19637 CompileRun("throw 'exception';"); 19637 CompileRun("throw 'exception';");
19638 } 19638 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
19710 19710
19711 19711
19712 TEST(PrimaryStubCache) { 19712 TEST(PrimaryStubCache) {
19713 StubCacheHelper(false); 19713 StubCacheHelper(false);
19714 } 19714 }
19715 19715
19716 19716
19717 TEST(StaticGetters) { 19717 TEST(StaticGetters) {
19718 LocalContext context; 19718 LocalContext context;
19719 i::Factory* factory = i::Isolate::Current()->factory(); 19719 i::Factory* factory = i::Isolate::Current()->factory();
19720 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 19720 v8::Isolate* isolate = CcTest::isolate();
19721 v8::HandleScope scope(isolate); 19721 v8::HandleScope scope(isolate);
19722 i::Handle<i::Object> undefined_value = factory->undefined_value(); 19722 i::Handle<i::Object> undefined_value = factory->undefined_value();
19723 CHECK(*v8::Utils::OpenHandle(*v8::Undefined()) == *undefined_value); 19723 CHECK(*v8::Utils::OpenHandle(*v8::Undefined()) == *undefined_value);
19724 CHECK(*v8::Utils::OpenHandle(*v8::Undefined(isolate)) == *undefined_value); 19724 CHECK(*v8::Utils::OpenHandle(*v8::Undefined(isolate)) == *undefined_value);
19725 i::Handle<i::Object> null_value = factory->null_value(); 19725 i::Handle<i::Object> null_value = factory->null_value();
19726 CHECK(*v8::Utils::OpenHandle(*v8::Null()) == *null_value); 19726 CHECK(*v8::Utils::OpenHandle(*v8::Null()) == *null_value);
19727 CHECK(*v8::Utils::OpenHandle(*v8::Null(isolate)) == *null_value); 19727 CHECK(*v8::Utils::OpenHandle(*v8::Null(isolate)) == *null_value);
19728 i::Handle<i::Object> true_value = factory->true_value(); 19728 i::Handle<i::Object> true_value = factory->true_value();
19729 CHECK(*v8::Utils::OpenHandle(*v8::True()) == *true_value); 19729 CHECK(*v8::Utils::OpenHandle(*v8::True()) == *true_value);
19730 CHECK(*v8::Utils::OpenHandle(*v8::True(isolate)) == *true_value); 19730 CHECK(*v8::Utils::OpenHandle(*v8::True(isolate)) == *true_value);
19731 i::Handle<i::Object> false_value = factory->false_value(); 19731 i::Handle<i::Object> false_value = factory->false_value();
19732 CHECK(*v8::Utils::OpenHandle(*v8::False()) == *false_value); 19732 CHECK(*v8::Utils::OpenHandle(*v8::False()) == *false_value);
19733 CHECK(*v8::Utils::OpenHandle(*v8::False(isolate)) == *false_value); 19733 CHECK(*v8::Utils::OpenHandle(*v8::False(isolate)) == *false_value);
19734 } 19734 }
19735 19735
19736 19736
19737 UNINITIALIZED_TEST(IsolateEmbedderData) { 19737 UNINITIALIZED_TEST(IsolateEmbedderData) {
19738 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 19738 v8::Isolate* isolate = CcTest::isolate();
19739 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 19739 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
19740 CHECK_EQ(NULL, isolate->GetData()); 19740 CHECK_EQ(NULL, isolate->GetData());
19741 CHECK_EQ(NULL, i_isolate->GetData()); 19741 CHECK_EQ(NULL, i_isolate->GetData());
19742 static void* data1 = reinterpret_cast<void*>(0xacce55ed); 19742 static void* data1 = reinterpret_cast<void*>(0xacce55ed);
19743 isolate->SetData(data1); 19743 isolate->SetData(data1);
19744 CHECK_EQ(data1, isolate->GetData()); 19744 CHECK_EQ(data1, isolate->GetData());
19745 CHECK_EQ(data1, i_isolate->GetData()); 19745 CHECK_EQ(data1, i_isolate->GetData());
19746 static void* data2 = reinterpret_cast<void*>(0xdecea5ed); 19746 static void* data2 = reinterpret_cast<void*>(0xdecea5ed);
19747 i_isolate->SetData(data2); 19747 i_isolate->SetData(data2);
19748 CHECK_EQ(data2, isolate->GetData()); 19748 CHECK_EQ(data2, isolate->GetData());
19749 CHECK_EQ(data2, i_isolate->GetData()); 19749 CHECK_EQ(data2, i_isolate->GetData());
19750 i_isolate->TearDown(); 19750 i_isolate->TearDown();
19751 CHECK_EQ(data2, isolate->GetData()); 19751 CHECK_EQ(data2, isolate->GetData());
19752 CHECK_EQ(data2, i_isolate->GetData()); 19752 CHECK_EQ(data2, i_isolate->GetData());
19753 } 19753 }
19754 19754
19755 19755
19756 TEST(StringEmpty) { 19756 TEST(StringEmpty) {
19757 LocalContext context; 19757 LocalContext context;
19758 i::Factory* factory = i::Isolate::Current()->factory(); 19758 i::Factory* factory = i::Isolate::Current()->factory();
19759 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 19759 v8::Isolate* isolate = CcTest::isolate();
19760 v8::HandleScope scope(isolate); 19760 v8::HandleScope scope(isolate);
19761 i::Handle<i::Object> empty_string = factory->empty_string(); 19761 i::Handle<i::Object> empty_string = factory->empty_string();
19762 CHECK(*v8::Utils::OpenHandle(*v8::String::Empty()) == *empty_string); 19762 CHECK(*v8::Utils::OpenHandle(*v8::String::Empty()) == *empty_string);
19763 CHECK(*v8::Utils::OpenHandle(*v8::String::Empty(isolate)) == *empty_string); 19763 CHECK(*v8::Utils::OpenHandle(*v8::String::Empty(isolate)) == *empty_string);
19764 } 19764 }
19765 19765
19766 19766
19767 static int instance_checked_getter_count = 0; 19767 static int instance_checked_getter_count = 0;
19768 static void InstanceCheckedGetter( 19768 static void InstanceCheckedGetter(
19769 Local<String> name, 19769 Local<String> name,
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
20023 } else { 20023 } else {
20024 CHECK_EQ(do_store ? 23 : 42, 20024 CHECK_EQ(do_store ? 23 : 42,
20025 context->Global()->Get(v8_str("result"))->Int32Value()); 20025 context->Global()->Get(v8_str("result"))->Int32Value());
20026 } 20026 }
20027 } 20027 }
20028 20028
20029 20029
20030 THREADED_TEST(Regress137002a) { 20030 THREADED_TEST(Regress137002a) {
20031 i::FLAG_allow_natives_syntax = true; 20031 i::FLAG_allow_natives_syntax = true;
20032 i::FLAG_compilation_cache = false; 20032 i::FLAG_compilation_cache = false;
20033 v8::HandleScope scope(v8::Isolate::GetCurrent()); 20033 v8::HandleScope scope(CcTest::isolate());
20034 for (int i = 0; i < 16; i++) { 20034 for (int i = 0; i < 16; i++) {
20035 Helper137002(i & 8, i & 4, i & 2, i & 1); 20035 Helper137002(i & 8, i & 4, i & 2, i & 1);
20036 } 20036 }
20037 } 20037 }
20038 20038
20039 20039
20040 THREADED_TEST(Regress137002b) { 20040 THREADED_TEST(Regress137002b) {
20041 i::FLAG_allow_natives_syntax = true; 20041 i::FLAG_allow_natives_syntax = true;
20042 LocalContext context; 20042 LocalContext context;
20043 v8::HandleScope scope(context->GetIsolate()); 20043 v8::HandleScope scope(context->GetIsolate());
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
20291 } 20291 }
20292 20292
20293 20293
20294 void UnreachableCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 20294 void UnreachableCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
20295 CHECK(false); 20295 CHECK(false);
20296 } 20296 }
20297 20297
20298 20298
20299 TEST(JSONStringifyAccessCheck) { 20299 TEST(JSONStringifyAccessCheck) {
20300 v8::V8::Initialize(); 20300 v8::V8::Initialize();
20301 v8::HandleScope scope(v8::Isolate::GetCurrent()); 20301 v8::HandleScope scope(CcTest::isolate());
20302 20302
20303 // Create an ObjectTemplate for global objects and install access 20303 // Create an ObjectTemplate for global objects and install access
20304 // check callbacks that will block access. 20304 // check callbacks that will block access.
20305 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 20305 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
20306 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked, 20306 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked,
20307 IndexAccessAlwaysBlocked); 20307 IndexAccessAlwaysBlocked);
20308 20308
20309 // Create a context and set an x property on it's global object. 20309 // Create a context and set an x property on it's global object.
20310 LocalContext context0(NULL, global_template); 20310 LocalContext context0(NULL, global_template);
20311 v8::Handle<v8::Object> global0 = context0->Global(); 20311 v8::Handle<v8::Object> global0 = context0->Global();
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
20388 CompileRun("try { [1, 2, 3].sort(); } catch (e) { catcher(e) };"); 20388 CompileRun("try { [1, 2, 3].sort(); } catch (e) { catcher(e) };");
20389 CHECK(!access_check_fail_thrown); 20389 CHECK(!access_check_fail_thrown);
20390 CHECK(!catch_callback_called); 20390 CHECK(!catch_callback_called);
20391 } 20391 }
20392 20392
20393 20393
20394 TEST(AccessCheckThrows) { 20394 TEST(AccessCheckThrows) {
20395 i::FLAG_allow_natives_syntax = true; 20395 i::FLAG_allow_natives_syntax = true;
20396 v8::V8::Initialize(); 20396 v8::V8::Initialize();
20397 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows); 20397 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows);
20398 v8::HandleScope scope(v8::Isolate::GetCurrent()); 20398 v8::HandleScope scope(CcTest::isolate());
20399 20399
20400 // Create an ObjectTemplate for global objects and install access 20400 // Create an ObjectTemplate for global objects and install access
20401 // check callbacks that will block access. 20401 // check callbacks that will block access.
20402 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 20402 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
20403 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked, 20403 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked,
20404 IndexAccessAlwaysBlocked); 20404 IndexAccessAlwaysBlocked);
20405 20405
20406 // Create a context and set an x property on it's global object. 20406 // Create a context and set an x property on it's global object.
20407 LocalContext context0(NULL, global_template); 20407 LocalContext context0(NULL, global_template);
20408 context0->Global()->Set(v8_str("x"), v8_num(42)); 20408 context0->Global()->Set(v8_str("x"), v8_num(42));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
20464 "function f(o) { o.x = 10; };" 20464 "function f(o) { o.x = 10; };"
20465 "f(o); f(o); f(o);" 20465 "f(o); f(o); f(o);"
20466 "%OptimizeFunctionOnNextCall(f);" 20466 "%OptimizeFunctionOnNextCall(f);"
20467 "f(o);"); 20467 "f(o);");
20468 ExpectBoolean("%GetOptimizationStatus(f) != 2", true); 20468 ExpectBoolean("%GetOptimizationStatus(f) != 2", true);
20469 } 20469 }
20470 20470
20471 20471
20472 THREADED_TEST(CrankshaftInterceptorSetter) { 20472 THREADED_TEST(CrankshaftInterceptorSetter) {
20473 i::FLAG_allow_natives_syntax = true; 20473 i::FLAG_allow_natives_syntax = true;
20474 v8::HandleScope scope(v8::Isolate::GetCurrent()); 20474 v8::HandleScope scope(CcTest::isolate());
20475 Handle<FunctionTemplate> templ = FunctionTemplate::New(); 20475 Handle<FunctionTemplate> templ = FunctionTemplate::New();
20476 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); 20476 AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
20477 LocalContext env; 20477 LocalContext env;
20478 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); 20478 env->Global()->Set(v8_str("Obj"), templ->GetFunction());
20479 CompileRun("var obj = new Obj;" 20479 CompileRun("var obj = new Obj;"
20480 // Initialize fields to avoid transitions later. 20480 // Initialize fields to avoid transitions later.
20481 "obj.age = 0;" 20481 "obj.age = 0;"
20482 "obj.accessor_age = 42;" 20482 "obj.accessor_age = 42;"
20483 "function setter(i) { this.accessor_age = i; };" 20483 "function setter(i) { this.accessor_age = i; };"
20484 "function getter() { return this.accessor_age; };" 20484 "function getter() { return this.accessor_age; };"
20485 "function setAge(i) { obj.age = i; };" 20485 "function setAge(i) { obj.age = i; };"
20486 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" 20486 "Object.defineProperty(obj, 'age', { get:getter, set:setter });"
20487 "setAge(1);" 20487 "setAge(1);"
20488 "setAge(2);" 20488 "setAge(2);"
20489 "setAge(3);" 20489 "setAge(3);"
20490 "%OptimizeFunctionOnNextCall(setAge);" 20490 "%OptimizeFunctionOnNextCall(setAge);"
20491 "setAge(4);"); 20491 "setAge(4);");
20492 // All stores went through the interceptor. 20492 // All stores went through the interceptor.
20493 ExpectInt32("obj.interceptor_age", 4); 20493 ExpectInt32("obj.interceptor_age", 4);
20494 ExpectInt32("obj.accessor_age", 42); 20494 ExpectInt32("obj.accessor_age", 42);
20495 } 20495 }
20496 20496
20497 20497
20498 THREADED_TEST(CrankshaftInterceptorGetter) { 20498 THREADED_TEST(CrankshaftInterceptorGetter) {
20499 i::FLAG_allow_natives_syntax = true; 20499 i::FLAG_allow_natives_syntax = true;
20500 v8::HandleScope scope(v8::Isolate::GetCurrent()); 20500 v8::HandleScope scope(CcTest::isolate());
20501 Handle<FunctionTemplate> templ = FunctionTemplate::New(); 20501 Handle<FunctionTemplate> templ = FunctionTemplate::New();
20502 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); 20502 AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
20503 LocalContext env; 20503 LocalContext env;
20504 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); 20504 env->Global()->Set(v8_str("Obj"), templ->GetFunction());
20505 CompileRun("var obj = new Obj;" 20505 CompileRun("var obj = new Obj;"
20506 // Initialize fields to avoid transitions later. 20506 // Initialize fields to avoid transitions later.
20507 "obj.age = 1;" 20507 "obj.age = 1;"
20508 "obj.accessor_age = 42;" 20508 "obj.accessor_age = 42;"
20509 "function getter() { return this.accessor_age; };" 20509 "function getter() { return this.accessor_age; };"
20510 "function getAge() { return obj.interceptor_age; };" 20510 "function getAge() { return obj.interceptor_age; };"
20511 "Object.defineProperty(obj, 'interceptor_age', { get:getter });" 20511 "Object.defineProperty(obj, 'interceptor_age', { get:getter });"
20512 "getAge();" 20512 "getAge();"
20513 "getAge();" 20513 "getAge();"
20514 "getAge();" 20514 "getAge();"
20515 "%OptimizeFunctionOnNextCall(getAge);"); 20515 "%OptimizeFunctionOnNextCall(getAge);");
20516 // Access through interceptor. 20516 // Access through interceptor.
20517 ExpectInt32("getAge()", 1); 20517 ExpectInt32("getAge()", 1);
20518 } 20518 }
20519 20519
20520 20520
20521 THREADED_TEST(CrankshaftInterceptorFieldRead) { 20521 THREADED_TEST(CrankshaftInterceptorFieldRead) {
20522 i::FLAG_allow_natives_syntax = true; 20522 i::FLAG_allow_natives_syntax = true;
20523 v8::HandleScope scope(v8::Isolate::GetCurrent()); 20523 v8::HandleScope scope(CcTest::isolate());
20524 Handle<FunctionTemplate> templ = FunctionTemplate::New(); 20524 Handle<FunctionTemplate> templ = FunctionTemplate::New();
20525 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); 20525 AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
20526 LocalContext env; 20526 LocalContext env;
20527 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); 20527 env->Global()->Set(v8_str("Obj"), templ->GetFunction());
20528 CompileRun("var obj = new Obj;" 20528 CompileRun("var obj = new Obj;"
20529 "obj.__proto__.interceptor_age = 42;" 20529 "obj.__proto__.interceptor_age = 42;"
20530 "obj.age = 100;" 20530 "obj.age = 100;"
20531 "function getAge() { return obj.interceptor_age; };"); 20531 "function getAge() { return obj.interceptor_age; };");
20532 ExpectInt32("getAge();", 100); 20532 ExpectInt32("getAge();", 100);
20533 ExpectInt32("getAge();", 100); 20533 ExpectInt32("getAge();", 100);
20534 ExpectInt32("getAge();", 100); 20534 ExpectInt32("getAge();", 100);
20535 CompileRun("%OptimizeFunctionOnNextCall(getAge);"); 20535 CompileRun("%OptimizeFunctionOnNextCall(getAge);");
20536 // Access through interceptor. 20536 // Access through interceptor.
20537 ExpectInt32("getAge();", 100); 20537 ExpectInt32("getAge();", 100);
20538 } 20538 }
20539 20539
20540 20540
20541 THREADED_TEST(CrankshaftInterceptorFieldWrite) { 20541 THREADED_TEST(CrankshaftInterceptorFieldWrite) {
20542 i::FLAG_allow_natives_syntax = true; 20542 i::FLAG_allow_natives_syntax = true;
20543 v8::HandleScope scope(v8::Isolate::GetCurrent()); 20543 v8::HandleScope scope(CcTest::isolate());
20544 Handle<FunctionTemplate> templ = FunctionTemplate::New(); 20544 Handle<FunctionTemplate> templ = FunctionTemplate::New();
20545 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); 20545 AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
20546 LocalContext env; 20546 LocalContext env;
20547 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); 20547 env->Global()->Set(v8_str("Obj"), templ->GetFunction());
20548 CompileRun("var obj = new Obj;" 20548 CompileRun("var obj = new Obj;"
20549 "obj.age = 100000;" 20549 "obj.age = 100000;"
20550 "function setAge(i) { obj.age = i };" 20550 "function setAge(i) { obj.age = i };"
20551 "setAge(100);" 20551 "setAge(100);"
20552 "setAge(101);" 20552 "setAge(101);"
20553 "setAge(102);" 20553 "setAge(102);"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
20590 Local<Object> data2 = v8::Object::New(); 20590 Local<Object> data2 = v8::Object::New();
20591 function_new_expected_env = data2; 20591 function_new_expected_env = data2;
20592 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2); 20592 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2);
20593 CHECK(!func2->IsNull()); 20593 CHECK(!func2->IsNull());
20594 CHECK_NE(func, func2); 20594 CHECK_NE(func, func2);
20595 env->Global()->Set(v8_str("func2"), func2); 20595 env->Global()->Set(v8_str("func2"), func2);
20596 Local<Value> result2 = CompileRun("func2();"); 20596 Local<Value> result2 = CompileRun("func2();");
20597 CHECK_EQ(v8::Integer::New(17, isolate), result2); 20597 CHECK_EQ(v8::Integer::New(17, isolate), result2);
20598 } 20598 }
20599 20599
OLDNEW
« no previous file with comments | « test/cctest/test-alloc.cc ('k') | test/cctest/test-assembler-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698