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

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

Issue 83343002: Remove usage of deprecated APIs from cctests (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years 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-compiler.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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 static void Test##Name(); \ 81 static void Test##Name(); \
82 TEST(Name##WithProfiler) { \ 82 TEST(Name##WithProfiler) { \
83 RunWithProfiler(&Test##Name); \ 83 RunWithProfiler(&Test##Name); \
84 } \ 84 } \
85 THREADED_TEST(Name) 85 THREADED_TEST(Name)
86 86
87 87
88 void RunWithProfiler(void (*test)()) { 88 void RunWithProfiler(void (*test)()) {
89 LocalContext env; 89 LocalContext env;
90 v8::HandleScope scope(env->GetIsolate()); 90 v8::HandleScope scope(env->GetIsolate());
91 v8::Local<v8::String> profile_name = v8::String::New("my_profile1"); 91 v8::Local<v8::String> profile_name =
92 v8::String::NewFromUtf8(env->GetIsolate(), "my_profile1");
92 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); 93 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler();
93 94
94 cpu_profiler->StartCpuProfiling(profile_name); 95 cpu_profiler->StartCpuProfiling(profile_name);
95 (*test)(); 96 (*test)();
96 cpu_profiler->DeleteAllCpuProfiles(); 97 cpu_profiler->DeleteAllCpuProfiles();
97 } 98 }
98 99
99 100
100 static void ExpectString(const char* code, const char* expected) { 101 static void ExpectString(const char* code, const char* expected) {
101 Local<Value> result = CompileRun(code); 102 Local<Value> result = CompileRun(code);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 196
196 // Local context should still be live. 197 // Local context should still be live.
197 CHECK(!local_env.IsEmpty()); 198 CHECK(!local_env.IsEmpty());
198 local_env->Enter(); 199 local_env->Enter();
199 200
200 v8::Handle<v8::Primitive> undef = v8::Undefined(CcTest::isolate()); 201 v8::Handle<v8::Primitive> undef = v8::Undefined(CcTest::isolate());
201 CHECK(!undef.IsEmpty()); 202 CHECK(!undef.IsEmpty());
202 CHECK(undef->IsUndefined()); 203 CHECK(undef->IsUndefined());
203 204
204 const char* c_source = "1 + 2 + 3"; 205 const char* c_source = "1 + 2 + 3";
205 Local<String> source = String::New(c_source); 206 Local<String> source = String::NewFromUtf8(CcTest::isolate(), c_source);
206 Local<Script> script = Script::Compile(source); 207 Local<Script> script = Script::Compile(source);
207 CHECK_EQ(6, script->Run()->Int32Value()); 208 CHECK_EQ(6, script->Run()->Int32Value());
208 209
209 local_env->Exit(); 210 local_env->Exit();
210 } 211 }
211 212
212 213
213 THREADED_TEST(IsolateOfContext) { 214 THREADED_TEST(IsolateOfContext) {
214 v8::HandleScope scope(CcTest::isolate()); 215 v8::HandleScope scope(CcTest::isolate());
215 v8::Handle<Context> env = Context::New(CcTest::isolate()); 216 v8::Handle<Context> env = Context::New(CcTest::isolate());
216 217
217 CHECK(!env->InContext()); 218 CHECK(!env->GetIsolate()->InContext());
218 CHECK(env->GetIsolate() == CcTest::isolate()); 219 CHECK(env->GetIsolate() == CcTest::isolate());
219 env->Enter(); 220 env->Enter();
220 CHECK(env->InContext()); 221 CHECK(env->GetIsolate()->InContext());
221 CHECK(env->GetIsolate() == CcTest::isolate()); 222 CHECK(env->GetIsolate() == CcTest::isolate());
222 env->Exit(); 223 env->Exit();
223 CHECK(!env->InContext()); 224 CHECK(!env->GetIsolate()->InContext());
224 CHECK(env->GetIsolate() == CcTest::isolate()); 225 CHECK(env->GetIsolate() == CcTest::isolate());
225 } 226 }
226 227
227 228
228 static void TestSignature(const char* loop_js, Local<Value> receiver) { 229 static void TestSignature(const char* loop_js, Local<Value> receiver) {
229 i::ScopedVector<char> source(200); 230 i::ScopedVector<char> source(200);
230 i::OS::SNPrintF(source, 231 i::OS::SNPrintF(source,
231 "for (var i = 0; i < 10; i++) {" 232 "for (var i = 0; i < 10; i++) {"
232 " %s" 233 " %s"
233 "}", 234 "}",
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 Local<v8::Array> value = CompileRun("[\"a\", \"b\"]").As<v8::Array>(); 428 Local<v8::Array> value = CompileRun("[\"a\", \"b\"]").As<v8::Array>();
428 CHECK_EQ(v8_str("a"), value->Get(0)); 429 CHECK_EQ(v8_str("a"), value->Get(0));
429 CHECK_EQ(v8_str("b"), value->Get(1)); 430 CHECK_EQ(v8_str("b"), value->Get(1));
430 } 431 }
431 432
432 433
433 THREADED_TEST(Script) { 434 THREADED_TEST(Script) {
434 LocalContext env; 435 LocalContext env;
435 v8::HandleScope scope(env->GetIsolate()); 436 v8::HandleScope scope(env->GetIsolate());
436 const char* c_source = "1 + 2 + 3"; 437 const char* c_source = "1 + 2 + 3";
437 Local<String> source = String::New(c_source); 438 Local<String> source = String::NewFromUtf8(env->GetIsolate(), c_source);
438 Local<Script> script = Script::Compile(source); 439 Local<Script> script = Script::Compile(source);
439 CHECK_EQ(6, script->Run()->Int32Value()); 440 CHECK_EQ(6, script->Run()->Int32Value());
440 } 441 }
441 442
442 443
443 static uint16_t* AsciiToTwoByteString(const char* source) { 444 static uint16_t* AsciiToTwoByteString(const char* source) {
444 int array_length = i::StrLength(source) + 1; 445 int array_length = i::StrLength(source) + 1;
445 uint16_t* converted = i::NewArray<uint16_t>(array_length); 446 uint16_t* converted = i::NewArray<uint16_t>(array_length);
446 for (int i = 0; i < array_length; i++) converted[i] = source[i]; 447 for (int i = 0; i < array_length; i++) converted[i] = source[i];
447 return converted; 448 return converted;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 CHECK_EQ(1, dispose_count); 556 CHECK_EQ(1, dispose_count);
556 } 557 }
557 558
558 559
559 THREADED_TEST(ScriptMakingExternalString) { 560 THREADED_TEST(ScriptMakingExternalString) {
560 int dispose_count = 0; 561 int dispose_count = 0;
561 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); 562 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3");
562 { 563 {
563 LocalContext env; 564 LocalContext env;
564 v8::HandleScope scope(env->GetIsolate()); 565 v8::HandleScope scope(env->GetIsolate());
565 Local<String> source = String::New(two_byte_source); 566 Local<String> source =
567 String::NewFromTwoByte(env->GetIsolate(), two_byte_source);
566 // Trigger GCs so that the newly allocated string moves to old gen. 568 // Trigger GCs so that the newly allocated string moves to old gen.
567 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 569 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
568 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 570 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
569 CHECK_EQ(source->IsExternal(), false); 571 CHECK_EQ(source->IsExternal(), false);
570 CHECK_EQ(source->IsExternalAscii(), false); 572 CHECK_EQ(source->IsExternalAscii(), false);
571 String::Encoding encoding = String::UNKNOWN_ENCODING; 573 String::Encoding encoding = String::UNKNOWN_ENCODING;
572 CHECK_EQ(NULL, source->GetExternalStringResourceBase(&encoding)); 574 CHECK_EQ(NULL, source->GetExternalStringResourceBase(&encoding));
573 CHECK_EQ(String::ASCII_ENCODING, encoding); 575 CHECK_EQ(String::ASCII_ENCODING, encoding);
574 bool success = source->MakeExternal(new TestResource(two_byte_source, 576 bool success = source->MakeExternal(new TestResource(two_byte_source,
575 &dispose_count)); 577 &dispose_count));
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 617
616 TEST(MakingExternalStringConditions) { 618 TEST(MakingExternalStringConditions) {
617 LocalContext env; 619 LocalContext env;
618 v8::HandleScope scope(env->GetIsolate()); 620 v8::HandleScope scope(env->GetIsolate());
619 621
620 // Free some space in the new space so that we can check freshness. 622 // Free some space in the new space so that we can check freshness.
621 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 623 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
622 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 624 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
623 625
624 uint16_t* two_byte_string = AsciiToTwoByteString("s1"); 626 uint16_t* two_byte_string = AsciiToTwoByteString("s1");
625 Local<String> small_string = String::New(two_byte_string); 627 Local<String> small_string =
628 String::NewFromTwoByte(env->GetIsolate(), two_byte_string);
626 i::DeleteArray(two_byte_string); 629 i::DeleteArray(two_byte_string);
627 630
628 // We should refuse to externalize newly created small string. 631 // We should refuse to externalize newly created small string.
629 CHECK(!small_string->CanMakeExternal()); 632 CHECK(!small_string->CanMakeExternal());
630 // Trigger GCs so that the newly allocated string moves to old gen. 633 // Trigger GCs so that the newly allocated string moves to old gen.
631 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 634 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
632 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 635 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
633 // Old space strings should be accepted. 636 // Old space strings should be accepted.
634 CHECK(small_string->CanMakeExternal()); 637 CHECK(small_string->CanMakeExternal());
635 638
636 two_byte_string = AsciiToTwoByteString("small string 2"); 639 two_byte_string = AsciiToTwoByteString("small string 2");
637 small_string = String::New(two_byte_string); 640 small_string = String::NewFromTwoByte(env->GetIsolate(), two_byte_string);
638 i::DeleteArray(two_byte_string); 641 i::DeleteArray(two_byte_string);
639 642
640 // We should refuse externalizing newly created small string. 643 // We should refuse externalizing newly created small string.
641 CHECK(!small_string->CanMakeExternal()); 644 CHECK(!small_string->CanMakeExternal());
642 for (int i = 0; i < 100; i++) { 645 for (int i = 0; i < 100; i++) {
643 String::Value value(small_string); 646 String::Value value(small_string);
644 } 647 }
645 // Frequently used strings should be accepted. 648 // Frequently used strings should be accepted.
646 CHECK(small_string->CanMakeExternal()); 649 CHECK(small_string->CanMakeExternal());
647 650
648 const int buf_size = 10 * 1024; 651 const int buf_size = 10 * 1024;
649 char* buf = i::NewArray<char>(buf_size); 652 char* buf = i::NewArray<char>(buf_size);
650 memset(buf, 'a', buf_size); 653 memset(buf, 'a', buf_size);
651 buf[buf_size - 1] = '\0'; 654 buf[buf_size - 1] = '\0';
652 655
653 two_byte_string = AsciiToTwoByteString(buf); 656 two_byte_string = AsciiToTwoByteString(buf);
654 Local<String> large_string = String::New(two_byte_string); 657 Local<String> large_string =
658 String::NewFromTwoByte(env->GetIsolate(), two_byte_string);
655 i::DeleteArray(buf); 659 i::DeleteArray(buf);
656 i::DeleteArray(two_byte_string); 660 i::DeleteArray(two_byte_string);
657 // Large strings should be immediately accepted. 661 // Large strings should be immediately accepted.
658 CHECK(large_string->CanMakeExternal()); 662 CHECK(large_string->CanMakeExternal());
659 } 663 }
660 664
661 665
662 TEST(MakingExternalAsciiStringConditions) { 666 TEST(MakingExternalAsciiStringConditions) {
663 LocalContext env; 667 LocalContext env;
664 v8::HandleScope scope(env->GetIsolate()); 668 v8::HandleScope scope(env->GetIsolate());
665 669
666 // Free some space in the new space so that we can check freshness. 670 // Free some space in the new space so that we can check freshness.
667 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 671 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
668 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 672 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
669 673
670 Local<String> small_string = String::New("s1"); 674 Local<String> small_string = String::NewFromUtf8(env->GetIsolate(), "s1");
671 // We should refuse to externalize newly created small string. 675 // We should refuse to externalize newly created small string.
672 CHECK(!small_string->CanMakeExternal()); 676 CHECK(!small_string->CanMakeExternal());
673 // Trigger GCs so that the newly allocated string moves to old gen. 677 // Trigger GCs so that the newly allocated string moves to old gen.
674 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 678 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
675 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 679 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
676 // Old space strings should be accepted. 680 // Old space strings should be accepted.
677 CHECK(small_string->CanMakeExternal()); 681 CHECK(small_string->CanMakeExternal());
678 682
679 small_string = String::New("small string 2"); 683 small_string = String::NewFromUtf8(env->GetIsolate(), "small string 2");
680 // We should refuse externalizing newly created small string. 684 // We should refuse externalizing newly created small string.
681 CHECK(!small_string->CanMakeExternal()); 685 CHECK(!small_string->CanMakeExternal());
682 for (int i = 0; i < 100; i++) { 686 for (int i = 0; i < 100; i++) {
683 String::Value value(small_string); 687 String::Value value(small_string);
684 } 688 }
685 // Frequently used strings should be accepted. 689 // Frequently used strings should be accepted.
686 CHECK(small_string->CanMakeExternal()); 690 CHECK(small_string->CanMakeExternal());
687 691
688 const int buf_size = 10 * 1024; 692 const int buf_size = 10 * 1024;
689 char* buf = i::NewArray<char>(buf_size); 693 char* buf = i::NewArray<char>(buf_size);
690 memset(buf, 'a', buf_size); 694 memset(buf, 'a', buf_size);
691 buf[buf_size - 1] = '\0'; 695 buf[buf_size - 1] = '\0';
692 Local<String> large_string = String::New(buf); 696 Local<String> large_string = String::NewFromUtf8(env->GetIsolate(), buf);
693 i::DeleteArray(buf); 697 i::DeleteArray(buf);
694 // Large strings should be immediately accepted. 698 // Large strings should be immediately accepted.
695 CHECK(large_string->CanMakeExternal()); 699 CHECK(large_string->CanMakeExternal());
696 } 700 }
697 701
698 702
699 TEST(MakingExternalUnalignedAsciiString) { 703 TEST(MakingExternalUnalignedAsciiString) {
700 LocalContext env; 704 LocalContext env;
701 v8::HandleScope scope(env->GetIsolate()); 705 v8::HandleScope scope(env->GetIsolate());
702 706
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 const char* one_byte_string_1 = "function a_times_t"; 896 const char* one_byte_string_1 = "function a_times_t";
893 const char* two_byte_string_1 = "wo_plus_b(a, b) {return "; 897 const char* two_byte_string_1 = "wo_plus_b(a, b) {return ";
894 const char* one_byte_extern_1 = "a * 2 + b;} a_times_two_plus_b(4, 8) + "; 898 const char* one_byte_extern_1 = "a * 2 + b;} a_times_two_plus_b(4, 8) + ";
895 const char* two_byte_extern_1 = "a_times_two_plus_b(4, 8) + "; 899 const char* two_byte_extern_1 = "a_times_two_plus_b(4, 8) + ";
896 const char* one_byte_string_2 = "a_times_two_plus_b(4, 8) + "; 900 const char* one_byte_string_2 = "a_times_two_plus_b(4, 8) + ";
897 const char* two_byte_string_2 = "a_times_two_plus_b(4, 8) + "; 901 const char* two_byte_string_2 = "a_times_two_plus_b(4, 8) + ";
898 const char* two_byte_extern_2 = "a_times_two_plus_b(1, 2);"; 902 const char* two_byte_extern_2 = "a_times_two_plus_b(1, 2);";
899 Local<String> left = v8_str(one_byte_string_1); 903 Local<String> left = v8_str(one_byte_string_1);
900 904
901 uint16_t* two_byte_source = AsciiToTwoByteString(two_byte_string_1); 905 uint16_t* two_byte_source = AsciiToTwoByteString(two_byte_string_1);
902 Local<String> right = String::New(two_byte_source); 906 Local<String> right =
907 String::NewFromTwoByte(env->GetIsolate(), two_byte_source);
903 i::DeleteArray(two_byte_source); 908 i::DeleteArray(two_byte_source);
904 909
905 Local<String> source = String::Concat(left, right); 910 Local<String> source = String::Concat(left, right);
906 right = String::NewExternal( 911 right = String::NewExternal(
907 new TestAsciiResource(i::StrDup(one_byte_extern_1))); 912 new TestAsciiResource(i::StrDup(one_byte_extern_1)));
908 source = String::Concat(source, right); 913 source = String::Concat(source, right);
909 right = String::NewExternal( 914 right = String::NewExternal(
910 new TestResource(AsciiToTwoByteString(two_byte_extern_1))); 915 new TestResource(AsciiToTwoByteString(two_byte_extern_1)));
911 source = String::Concat(source, right); 916 source = String::Concat(source, right);
912 right = v8_str(one_byte_string_2); 917 right = v8_str(one_byte_string_2);
913 source = String::Concat(source, right); 918 source = String::Concat(source, right);
914 919
915 two_byte_source = AsciiToTwoByteString(two_byte_string_2); 920 two_byte_source = AsciiToTwoByteString(two_byte_string_2);
916 right = String::New(two_byte_source); 921 right = String::NewFromTwoByte(env->GetIsolate(), two_byte_source);
917 i::DeleteArray(two_byte_source); 922 i::DeleteArray(two_byte_source);
918 923
919 source = String::Concat(source, right); 924 source = String::Concat(source, right);
920 right = String::NewExternal( 925 right = String::NewExternal(
921 new TestResource(AsciiToTwoByteString(two_byte_extern_2))); 926 new TestResource(AsciiToTwoByteString(two_byte_extern_2)));
922 source = String::Concat(source, right); 927 source = String::Concat(source, right);
923 Local<Script> script = Script::Compile(source); 928 Local<Script> script = Script::Compile(source);
924 Local<Value> value = script->Run(); 929 Local<Value> value = script->Run();
925 CHECK(value->IsNumber()); 930 CHECK(value->IsNumber());
926 CHECK_EQ(68, value->Int32Value()); 931 CHECK_EQ(68, value->Int32Value());
(...skipping 1588 matching lines...) Expand 10 before | Expand all | Expand 10 after
2515 global->SetInternalField(0, v8_num(17)); 2520 global->SetInternalField(0, v8_num(17));
2516 CHECK_EQ(17, global->GetInternalField(0)->Int32Value()); 2521 CHECK_EQ(17, global->GetInternalField(0)->Int32Value());
2517 } 2522 }
2518 2523
2519 2524
2520 THREADED_TEST(GlobalObjectHasRealIndexedProperty) { 2525 THREADED_TEST(GlobalObjectHasRealIndexedProperty) {
2521 LocalContext env; 2526 LocalContext env;
2522 v8::HandleScope scope(CcTest::isolate()); 2527 v8::HandleScope scope(CcTest::isolate());
2523 2528
2524 v8::Local<v8::Object> global = env->Global(); 2529 v8::Local<v8::Object> global = env->Global();
2525 global->Set(0, v8::String::New("value")); 2530 global->Set(0, v8::String::NewFromUtf8(CcTest::isolate(), "value"));
2526 CHECK(global->HasRealIndexedProperty(0)); 2531 CHECK(global->HasRealIndexedProperty(0));
2527 } 2532 }
2528 2533
2529 2534
2530 static void CheckAlignedPointerInInternalField(Handle<v8::Object> obj, 2535 static void CheckAlignedPointerInInternalField(Handle<v8::Object> obj,
2531 void* value) { 2536 void* value) {
2532 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); 2537 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1));
2533 obj->SetAlignedPointerInInternalField(0, value); 2538 obj->SetAlignedPointerInInternalField(0, value);
2534 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 2539 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
2535 CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0)); 2540 CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0));
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2607 v8::Handle<Value> data) { 2612 v8::Handle<Value> data) {
2608 (*env)->SetEmbedderData(index, data); 2613 (*env)->SetEmbedderData(index, data);
2609 CHECK((*env)->GetEmbedderData(index)->StrictEquals(data)); 2614 CHECK((*env)->GetEmbedderData(index)->StrictEquals(data));
2610 } 2615 }
2611 2616
2612 2617
2613 THREADED_TEST(EmbedderData) { 2618 THREADED_TEST(EmbedderData) {
2614 LocalContext env; 2619 LocalContext env;
2615 v8::HandleScope scope(env->GetIsolate()); 2620 v8::HandleScope scope(env->GetIsolate());
2616 2621
2617 CheckEmbedderData(&env, 3, v8::String::New("The quick brown fox jumps")); 2622 CheckEmbedderData(
2618 CheckEmbedderData(&env, 2, v8::String::New("over the lazy dog.")); 2623 &env, 3,
2624 v8::String::NewFromUtf8(env->GetIsolate(), "The quick brown fox jumps"));
2625 CheckEmbedderData(&env, 2, v8::String::NewFromUtf8(env->GetIsolate(),
2626 "over the lazy dog."));
2619 CheckEmbedderData(&env, 1, v8::Number::New(1.2345)); 2627 CheckEmbedderData(&env, 1, v8::Number::New(1.2345));
2620 CheckEmbedderData(&env, 0, v8::Boolean::New(true)); 2628 CheckEmbedderData(&env, 0, v8::Boolean::New(true));
2621 } 2629 }
2622 2630
2623 2631
2624 THREADED_TEST(IdentityHash) { 2632 THREADED_TEST(IdentityHash) {
2625 LocalContext env; 2633 LocalContext env;
2626 v8::HandleScope scope(env->GetIsolate()); 2634 v8::HandleScope scope(env->GetIsolate());
2627 2635
2628 // Ensure that the test starts with an fresh heap to test whether the hash 2636 // Ensure that the test starts with an fresh heap to test whether the hash
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2685 2693
2686 CHECK(sym1->Equals(sym1)); 2694 CHECK(sym1->Equals(sym1));
2687 CHECK(sym2->Equals(sym2)); 2695 CHECK(sym2->Equals(sym2));
2688 CHECK(!sym1->Equals(sym2)); 2696 CHECK(!sym1->Equals(sym2));
2689 CHECK(!sym2->Equals(sym1)); 2697 CHECK(!sym2->Equals(sym1));
2690 CHECK(sym1->StrictEquals(sym1)); 2698 CHECK(sym1->StrictEquals(sym1));
2691 CHECK(sym2->StrictEquals(sym2)); 2699 CHECK(sym2->StrictEquals(sym2));
2692 CHECK(!sym1->StrictEquals(sym2)); 2700 CHECK(!sym1->StrictEquals(sym2));
2693 CHECK(!sym2->StrictEquals(sym1)); 2701 CHECK(!sym2->StrictEquals(sym1));
2694 2702
2695 CHECK(sym2->Name()->Equals(v8::String::New("my-symbol"))); 2703 CHECK(sym2->Name()->Equals(v8::String::NewFromUtf8(isolate, "my-symbol")));
2696 2704
2697 v8::Local<v8::Value> sym_val = sym2; 2705 v8::Local<v8::Value> sym_val = sym2;
2698 CHECK(sym_val->IsSymbol()); 2706 CHECK(sym_val->IsSymbol());
2699 CHECK(sym_val->Equals(sym2)); 2707 CHECK(sym_val->Equals(sym2));
2700 CHECK(sym_val->StrictEquals(sym2)); 2708 CHECK(sym_val->StrictEquals(sym2));
2701 CHECK(v8::Symbol::Cast(*sym_val)->Equals(sym2)); 2709 CHECK(v8::Symbol::Cast(*sym_val)->Equals(sym2));
2702 2710
2703 v8::Local<v8::Value> sym_obj = v8::SymbolObject::New(isolate, sym2); 2711 v8::Local<v8::Value> sym_obj = v8::SymbolObject::New(isolate, sym2);
2704 CHECK(sym_obj->IsSymbolObject()); 2712 CHECK(sym_obj->IsSymbolObject());
2705 CHECK(!sym2->IsSymbolObject()); 2713 CHECK(!sym2->IsSymbolObject());
(...skipping 10 matching lines...) Expand all
2716 CHECK(obj->Set(sym1, v8::Integer::New(1503))); 2724 CHECK(obj->Set(sym1, v8::Integer::New(1503)));
2717 CHECK(obj->Has(sym1)); 2725 CHECK(obj->Has(sym1));
2718 CHECK_EQ(1503, obj->Get(sym1)->Int32Value()); 2726 CHECK_EQ(1503, obj->Get(sym1)->Int32Value());
2719 CHECK(obj->Set(sym1, v8::Integer::New(2002))); 2727 CHECK(obj->Set(sym1, v8::Integer::New(2002)));
2720 CHECK(obj->Has(sym1)); 2728 CHECK(obj->Has(sym1));
2721 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); 2729 CHECK_EQ(2002, obj->Get(sym1)->Int32Value());
2722 CHECK_EQ(v8::None, obj->GetPropertyAttributes(sym1)); 2730 CHECK_EQ(v8::None, obj->GetPropertyAttributes(sym1));
2723 2731
2724 CHECK_EQ(0, obj->GetOwnPropertyNames()->Length()); 2732 CHECK_EQ(0, obj->GetOwnPropertyNames()->Length());
2725 int num_props = obj->GetPropertyNames()->Length(); 2733 int num_props = obj->GetPropertyNames()->Length();
2726 CHECK(obj->Set(v8::String::New("bla"), v8::Integer::New(20))); 2734 CHECK(
2735 obj->Set(v8::String::NewFromUtf8(isolate, "bla"), v8::Integer::New(20)));
2727 CHECK_EQ(1, obj->GetOwnPropertyNames()->Length()); 2736 CHECK_EQ(1, obj->GetOwnPropertyNames()->Length());
2728 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length()); 2737 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length());
2729 2738
2730 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 2739 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
2731 2740
2732 // Add another property and delete it afterwards to force the object in 2741 // Add another property and delete it afterwards to force the object in
2733 // slow case. 2742 // slow case.
2734 CHECK(obj->Set(sym2, v8::Integer::New(2008))); 2743 CHECK(obj->Set(sym2, v8::Integer::New(2008)));
2735 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); 2744 CHECK_EQ(2002, obj->Get(sym1)->Int32Value());
2736 CHECK_EQ(2008, obj->Get(sym2)->Int32Value()); 2745 CHECK_EQ(2008, obj->Get(sym2)->Int32Value());
(...skipping 21 matching lines...) Expand all
2758 LocalContext env; 2767 LocalContext env;
2759 v8::Isolate* isolate = env->GetIsolate(); 2768 v8::Isolate* isolate = env->GetIsolate();
2760 v8::HandleScope scope(isolate); 2769 v8::HandleScope scope(isolate);
2761 2770
2762 v8::Local<v8::Object> obj = v8::Object::New(); 2771 v8::Local<v8::Object> obj = v8::Object::New();
2763 v8::Local<v8::Private> priv1 = v8::Private::New(isolate); 2772 v8::Local<v8::Private> priv1 = v8::Private::New(isolate);
2764 v8::Local<v8::Private> priv2 = v8::Private::New(isolate, "my-private"); 2773 v8::Local<v8::Private> priv2 = v8::Private::New(isolate, "my-private");
2765 2774
2766 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 2775 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
2767 2776
2768 CHECK(priv2->Name()->Equals(v8::String::New("my-private"))); 2777 CHECK(priv2->Name()->Equals(v8::String::NewFromUtf8(isolate, "my-private")));
2769 2778
2770 // Make sure delete of a non-existent private symbol property works. 2779 // Make sure delete of a non-existent private symbol property works.
2771 CHECK(obj->DeletePrivate(priv1)); 2780 CHECK(obj->DeletePrivate(priv1));
2772 CHECK(!obj->HasPrivate(priv1)); 2781 CHECK(!obj->HasPrivate(priv1));
2773 2782
2774 CHECK(obj->SetPrivate(priv1, v8::Integer::New(1503))); 2783 CHECK(obj->SetPrivate(priv1, v8::Integer::New(1503)));
2775 CHECK(obj->HasPrivate(priv1)); 2784 CHECK(obj->HasPrivate(priv1));
2776 CHECK_EQ(1503, obj->GetPrivate(priv1)->Int32Value()); 2785 CHECK_EQ(1503, obj->GetPrivate(priv1)->Int32Value());
2777 CHECK(obj->SetPrivate(priv1, v8::Integer::New(2002))); 2786 CHECK(obj->SetPrivate(priv1, v8::Integer::New(2002)));
2778 CHECK(obj->HasPrivate(priv1)); 2787 CHECK(obj->HasPrivate(priv1));
2779 CHECK_EQ(2002, obj->GetPrivate(priv1)->Int32Value()); 2788 CHECK_EQ(2002, obj->GetPrivate(priv1)->Int32Value());
2780 2789
2781 CHECK_EQ(0, obj->GetOwnPropertyNames()->Length()); 2790 CHECK_EQ(0, obj->GetOwnPropertyNames()->Length());
2782 int num_props = obj->GetPropertyNames()->Length(); 2791 int num_props = obj->GetPropertyNames()->Length();
2783 CHECK(obj->Set(v8::String::New("bla"), v8::Integer::New(20))); 2792 CHECK(
2793 obj->Set(v8::String::NewFromUtf8(isolate, "bla"), v8::Integer::New(20)));
2784 CHECK_EQ(1, obj->GetOwnPropertyNames()->Length()); 2794 CHECK_EQ(1, obj->GetOwnPropertyNames()->Length());
2785 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length()); 2795 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length());
2786 2796
2787 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 2797 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
2788 2798
2789 // Add another property and delete it afterwards to force the object in 2799 // Add another property and delete it afterwards to force the object in
2790 // slow case. 2800 // slow case.
2791 CHECK(obj->SetPrivate(priv2, v8::Integer::New(2008))); 2801 CHECK(obj->SetPrivate(priv2, v8::Integer::New(2008)));
2792 CHECK_EQ(2002, obj->GetPrivate(priv1)->Int32Value()); 2802 CHECK_EQ(2002, obj->GetPrivate(priv1)->Int32Value());
2793 CHECK_EQ(2008, obj->GetPrivate(priv2)->Int32Value()); 2803 CHECK_EQ(2008, obj->GetPrivate(priv2)->Int32Value());
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
3217 v8::Isolate* isolate = CcTest::isolate(); 3227 v8::Isolate* isolate = CcTest::isolate();
3218 v8::Persistent<String> global; 3228 v8::Persistent<String> global;
3219 { 3229 {
3220 v8::HandleScope scope(isolate); 3230 v8::HandleScope scope(isolate);
3221 global.Reset(isolate, v8_str("str")); 3231 global.Reset(isolate, v8_str("str"));
3222 } 3232 }
3223 { 3233 {
3224 v8::HandleScope scope(isolate); 3234 v8::HandleScope scope(isolate);
3225 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3); 3235 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3);
3226 } 3236 }
3227 global.Dispose(); 3237 global.Reset();
3228 global.Clear();
3229 { 3238 {
3230 v8::HandleScope scope(isolate); 3239 v8::HandleScope scope(isolate);
3231 global.Reset(isolate, v8_str("str")); 3240 global.Reset(isolate, v8_str("str"));
3232 } 3241 }
3233 { 3242 {
3234 v8::HandleScope scope(isolate); 3243 v8::HandleScope scope(isolate);
3235 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3); 3244 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3);
3236 } 3245 }
3237 global.Dispose(); 3246 global.Reset();
3238 } 3247 }
3239 3248
3240 3249
3241 THREADED_TEST(ResettingGlobalHandle) { 3250 THREADED_TEST(ResettingGlobalHandle) {
3242 v8::Isolate* isolate = CcTest::isolate(); 3251 v8::Isolate* isolate = CcTest::isolate();
3243 v8::Persistent<String> global; 3252 v8::Persistent<String> global;
3244 { 3253 {
3245 v8::HandleScope scope(isolate); 3254 v8::HandleScope scope(isolate);
3246 global.Reset(isolate, v8_str("str")); 3255 global.Reset(isolate, v8_str("str"));
3247 } 3256 }
3248 v8::internal::GlobalHandles* global_handles = 3257 v8::internal::GlobalHandles* global_handles =
3249 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles(); 3258 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
3250 int initial_handle_count = global_handles->global_handles_count(); 3259 int initial_handle_count = global_handles->global_handles_count();
3251 { 3260 {
3252 v8::HandleScope scope(isolate); 3261 v8::HandleScope scope(isolate);
3253 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3); 3262 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3);
3254 } 3263 }
3255 { 3264 {
3256 v8::HandleScope scope(isolate); 3265 v8::HandleScope scope(isolate);
3257 global.Reset(isolate, v8_str("longer")); 3266 global.Reset(isolate, v8_str("longer"));
3258 } 3267 }
3259 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count); 3268 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count);
3260 { 3269 {
3261 v8::HandleScope scope(isolate); 3270 v8::HandleScope scope(isolate);
3262 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 6); 3271 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 6);
3263 } 3272 }
3264 global.Dispose(); 3273 global.Reset();
3265 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count - 1); 3274 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count - 1);
3266 } 3275 }
3267 3276
3268 3277
3269 THREADED_TEST(ResettingGlobalHandleToEmpty) { 3278 THREADED_TEST(ResettingGlobalHandleToEmpty) {
3270 v8::Isolate* isolate = CcTest::isolate(); 3279 v8::Isolate* isolate = CcTest::isolate();
3271 v8::Persistent<String> global; 3280 v8::Persistent<String> global;
3272 { 3281 {
3273 v8::HandleScope scope(isolate); 3282 v8::HandleScope scope(isolate);
3274 global.Reset(isolate, v8_str("str")); 3283 global.Reset(isolate, v8_str("str"));
3275 } 3284 }
3276 v8::internal::GlobalHandles* global_handles = 3285 v8::internal::GlobalHandles* global_handles =
3277 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles(); 3286 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
3278 int initial_handle_count = global_handles->global_handles_count(); 3287 int initial_handle_count = global_handles->global_handles_count();
3279 { 3288 {
3280 v8::HandleScope scope(isolate); 3289 v8::HandleScope scope(isolate);
3281 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3); 3290 CHECK_EQ(v8::Local<String>::New(isolate, global)->Length(), 3);
3282 } 3291 }
3283 { 3292 {
3284 v8::HandleScope scope(isolate); 3293 v8::HandleScope scope(isolate);
3285 Local<String> empty; 3294 Local<String> empty;
3286 global.Reset(isolate, empty); 3295 global.Reset(isolate, empty);
3287 } 3296 }
3288 CHECK(global.IsEmpty()); 3297 CHECK(global.IsEmpty());
3289 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count - 1); 3298 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count - 1);
3290 } 3299 }
3291 3300
3292 3301
3293 THREADED_TEST(ClearAndLeakGlobal) {
3294 v8::Isolate* isolate = CcTest::isolate();
3295 v8::internal::GlobalHandles* global_handles = NULL;
3296 int initial_handle_count = 0;
3297 v8::Persistent<String> global;
3298 {
3299 v8::HandleScope scope(isolate);
3300 Local<String> str = v8_str("str");
3301 global_handles =
3302 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
3303 initial_handle_count = global_handles->global_handles_count();
3304 global.Reset(isolate, str);
3305 }
3306 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count + 1);
3307 String* str = global.ClearAndLeak();
3308 CHECK(global.IsEmpty());
3309 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count + 1);
3310 global_handles->Destroy(reinterpret_cast<i::Object**>(str));
3311 CHECK_EQ(global_handles->global_handles_count(), initial_handle_count);
3312 }
3313
3314
3315 THREADED_TEST(GlobalHandleUpcast) { 3302 THREADED_TEST(GlobalHandleUpcast) {
3316 v8::Isolate* isolate = CcTest::isolate(); 3303 v8::Isolate* isolate = CcTest::isolate();
3317 v8::HandleScope scope(isolate); 3304 v8::HandleScope scope(isolate);
3318 v8::Local<String> local = v8::Local<String>::New(isolate, v8_str("str")); 3305 v8::Local<String> local = v8::Local<String>::New(isolate, v8_str("str"));
3319 v8::Persistent<String> global_string(isolate, local); 3306 v8::Persistent<String> global_string(isolate, local);
3320 v8::Persistent<Value>& global_value = 3307 v8::Persistent<Value>& global_value =
3321 v8::Persistent<Value>::Cast(global_string); 3308 v8::Persistent<Value>::Cast(global_string);
3322 CHECK(v8::Local<v8::Value>::New(isolate, global_value)->IsString()); 3309 CHECK(v8::Local<v8::Value>::New(isolate, global_value)->IsString());
3323 CHECK(global_string == v8::Persistent<String>::Cast(global_value)); 3310 CHECK(global_string == v8::Persistent<String>::Cast(global_value));
3324 global_string.Dispose(); 3311 global_string.Reset();
3325 } 3312 }
3326 3313
3327 3314
3328 THREADED_TEST(HandleEquality) { 3315 THREADED_TEST(HandleEquality) {
3329 v8::Isolate* isolate = CcTest::isolate(); 3316 v8::Isolate* isolate = CcTest::isolate();
3330 v8::Persistent<String> global1; 3317 v8::Persistent<String> global1;
3331 v8::Persistent<String> global2; 3318 v8::Persistent<String> global2;
3332 { 3319 {
3333 v8::HandleScope scope(isolate); 3320 v8::HandleScope scope(isolate);
3334 global1.Reset(isolate, v8_str("str")); 3321 global1.Reset(isolate, v8_str("str"));
(...skipping 16 matching lines...) Expand all
3351 CHECK_EQ(local2 == global1, false); 3338 CHECK_EQ(local2 == global1, false);
3352 CHECK_EQ(local2 != global1, true); 3339 CHECK_EQ(local2 != global1, true);
3353 3340
3354 CHECK_EQ(local1 == local2, false); 3341 CHECK_EQ(local1 == local2, false);
3355 CHECK_EQ(local1 != local2, true); 3342 CHECK_EQ(local1 != local2, true);
3356 3343
3357 Local<String> anotherLocal1 = Local<String>::New(isolate, global1); 3344 Local<String> anotherLocal1 = Local<String>::New(isolate, global1);
3358 CHECK_EQ(local1 == anotherLocal1, true); 3345 CHECK_EQ(local1 == anotherLocal1, true);
3359 CHECK_EQ(local1 != anotherLocal1, false); 3346 CHECK_EQ(local1 != anotherLocal1, false);
3360 } 3347 }
3361 global1.Dispose(); 3348 global1.Reset();
3362 global2.Dispose(); 3349 global2.Reset();
3363 } 3350 }
3364 3351
3365 3352
3366 THREADED_TEST(LocalHandle) { 3353 THREADED_TEST(LocalHandle) {
3367 v8::HandleScope scope(CcTest::isolate()); 3354 v8::HandleScope scope(CcTest::isolate());
3368 v8::Local<String> local = 3355 v8::Local<String> local =
3369 v8::Local<String>::New(CcTest::isolate(), v8_str("str")); 3356 v8::Local<String>::New(CcTest::isolate(), v8_str("str"));
3370 CHECK_EQ(local->Length(), 3); 3357 CHECK_EQ(local->Length(), 3);
3371 } 3358 }
3372 3359
3373 3360
3374 class WeakCallCounter { 3361 class WeakCallCounter {
3375 public: 3362 public:
3376 explicit WeakCallCounter(int id) : id_(id), number_of_weak_calls_(0) { } 3363 explicit WeakCallCounter(int id) : id_(id), number_of_weak_calls_(0) { }
3377 int id() { return id_; } 3364 int id() { return id_; }
3378 void increment() { number_of_weak_calls_++; } 3365 void increment() { number_of_weak_calls_++; }
3379 int NumberOfWeakCalls() { return number_of_weak_calls_; } 3366 int NumberOfWeakCalls() { return number_of_weak_calls_; }
3380 private: 3367 private:
3381 int id_; 3368 int id_;
3382 int number_of_weak_calls_; 3369 int number_of_weak_calls_;
3383 }; 3370 };
3384 3371
3385 3372
3386 template<typename T> 3373 template<typename T>
3387 static void WeakPointerCallback(v8::Isolate* isolate, 3374 static void WeakPointerCallback(v8::Isolate* isolate,
3388 Persistent<T>* handle, 3375 Persistent<T>* handle,
3389 WeakCallCounter* counter) { 3376 WeakCallCounter* counter) {
3390 CHECK_EQ(1234, counter->id()); 3377 CHECK_EQ(1234, counter->id());
3391 counter->increment(); 3378 counter->increment();
3392 handle->Dispose(); 3379 handle->Reset();
3393 } 3380 }
3394 3381
3395 3382
3396 template<typename T> 3383 template<typename T>
3397 static UniqueId MakeUniqueId(const Persistent<T>& p) { 3384 static UniqueId MakeUniqueId(const Persistent<T>& p) {
3398 return UniqueId(reinterpret_cast<uintptr_t>(*v8::Utils::OpenPersistent(p))); 3385 return UniqueId(reinterpret_cast<uintptr_t>(*v8::Utils::OpenPersistent(p)));
3399 } 3386 }
3400 3387
3401 3388
3402 THREADED_TEST(ApiObjectGroups) { 3389 THREADED_TEST(ApiObjectGroups) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
3502 Persistent<String> g1c1; 3489 Persistent<String> g1c1;
3503 Persistent<Object> g2s1; 3490 Persistent<Object> g2s1;
3504 Persistent<String> g2s2; 3491 Persistent<String> g2s2;
3505 Persistent<String> g2c1; 3492 Persistent<String> g2c1;
3506 3493
3507 WeakCallCounter counter(1234); 3494 WeakCallCounter counter(1234);
3508 3495
3509 { 3496 {
3510 HandleScope scope(iso); 3497 HandleScope scope(iso);
3511 g1s1.Reset(iso, Object::New()); 3498 g1s1.Reset(iso, Object::New());
3512 g1s2.Reset(iso, String::New("foo1")); 3499 g1s2.Reset(iso, String::NewFromUtf8(iso, "foo1"));
3513 g1c1.Reset(iso, String::New("foo2")); 3500 g1c1.Reset(iso, String::NewFromUtf8(iso, "foo2"));
3514 g1s1.MakeWeak(&counter, &WeakPointerCallback); 3501 g1s1.MakeWeak(&counter, &WeakPointerCallback);
3515 g1s2.MakeWeak(&counter, &WeakPointerCallback); 3502 g1s2.MakeWeak(&counter, &WeakPointerCallback);
3516 g1c1.MakeWeak(&counter, &WeakPointerCallback); 3503 g1c1.MakeWeak(&counter, &WeakPointerCallback);
3517 3504
3518 g2s1.Reset(iso, Object::New()); 3505 g2s1.Reset(iso, Object::New());
3519 g2s2.Reset(iso, String::New("foo3")); 3506 g2s2.Reset(iso, String::NewFromUtf8(iso, "foo3"));
3520 g2c1.Reset(iso, String::New("foo4")); 3507 g2c1.Reset(iso, String::NewFromUtf8(iso, "foo4"));
3521 g2s1.MakeWeak(&counter, &WeakPointerCallback); 3508 g2s1.MakeWeak(&counter, &WeakPointerCallback);
3522 g2s2.MakeWeak(&counter, &WeakPointerCallback); 3509 g2s2.MakeWeak(&counter, &WeakPointerCallback);
3523 g2c1.MakeWeak(&counter, &WeakPointerCallback); 3510 g2c1.MakeWeak(&counter, &WeakPointerCallback);
3524 } 3511 }
3525 3512
3526 Persistent<Value> root(iso, g1s1); // make a root. 3513 Persistent<Value> root(iso, g1s1); // make a root.
3527 3514
3528 // Connect group 1 and 2, make a cycle. 3515 // Connect group 1 and 2, make a cycle.
3529 { 3516 {
3530 HandleScope scope(iso); 3517 HandleScope scope(iso);
(...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after
4262 static const int K = 1024; 4249 static const int K = 1024;
4263 v8::ResourceConstraints constraints; 4250 v8::ResourceConstraints constraints;
4264 constraints.set_max_young_space_size(256 * K); 4251 constraints.set_max_young_space_size(256 * K);
4265 constraints.set_max_old_space_size(5 * K * K); 4252 constraints.set_max_old_space_size(5 * K * K);
4266 v8::SetResourceConstraints(CcTest::isolate(), &constraints); 4253 v8::SetResourceConstraints(CcTest::isolate(), &constraints);
4267 4254
4268 // Execute a script that causes out of memory. 4255 // Execute a script that causes out of memory.
4269 LocalContext context; 4256 LocalContext context;
4270 v8::HandleScope scope(context->GetIsolate()); 4257 v8::HandleScope scope(context->GetIsolate());
4271 v8::V8::IgnoreOutOfMemoryException(); 4258 v8::V8::IgnoreOutOfMemoryException();
4272 Local<Script> script = 4259 Local<Script> script = Script::Compile(String::NewFromUtf8(
4273 Script::Compile(String::New(js_code_causing_out_of_memory)); 4260 context->GetIsolate(), js_code_causing_out_of_memory));
4274 Local<Value> result = script->Run(); 4261 Local<Value> result = script->Run();
4275 4262
4276 // Check for out of memory state. 4263 // Check for out of memory state.
4277 CHECK(result.IsEmpty()); 4264 CHECK(result.IsEmpty());
4278 CHECK(context->HasOutOfMemoryException()); 4265 CHECK(context->HasOutOfMemoryException());
4279 } 4266 }
4280 4267
4281 4268
4282 void ProvokeOutOfMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { 4269 void ProvokeOutOfMemory(const v8::FunctionCallbackInfo<v8::Value>& args) {
4283 ApiTestFuzzer::Fuzz(); 4270 ApiTestFuzzer::Fuzz();
4284 4271
4285 LocalContext context; 4272 LocalContext context;
4286 v8::HandleScope scope(context->GetIsolate()); 4273 v8::HandleScope scope(context->GetIsolate());
4287 Local<Script> script = 4274 Local<Script> script = Script::Compile(String::NewFromUtf8(
4288 Script::Compile(String::New(js_code_causing_out_of_memory)); 4275 context->GetIsolate(), js_code_causing_out_of_memory));
4289 Local<Value> result = script->Run(); 4276 Local<Value> result = script->Run();
4290 4277
4291 // Check for out of memory state. 4278 // Check for out of memory state.
4292 CHECK(result.IsEmpty()); 4279 CHECK(result.IsEmpty());
4293 CHECK(context->HasOutOfMemoryException()); 4280 CHECK(context->HasOutOfMemoryException());
4294 4281
4295 args.GetReturnValue().Set(result); 4282 args.GetReturnValue().Set(result);
4296 } 4283 }
4297 4284
4298 4285
(...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after
5168 CHECK(!v8_num(1)->StrictEquals(v8_num(2))); 5155 CHECK(!v8_num(1)->StrictEquals(v8_num(2)));
5169 CHECK(v8_num(0.0)->StrictEquals(v8_num(-0.0))); 5156 CHECK(v8_num(0.0)->StrictEquals(v8_num(-0.0)));
5170 Local<Value> not_a_number = v8_num(i::OS::nan_value()); 5157 Local<Value> not_a_number = v8_num(i::OS::nan_value());
5171 CHECK(!not_a_number->StrictEquals(not_a_number)); 5158 CHECK(!not_a_number->StrictEquals(not_a_number));
5172 CHECK(v8::False(isolate)->StrictEquals(v8::False(isolate))); 5159 CHECK(v8::False(isolate)->StrictEquals(v8::False(isolate)));
5173 CHECK(!v8::False(isolate)->StrictEquals(v8::Undefined(isolate))); 5160 CHECK(!v8::False(isolate)->StrictEquals(v8::Undefined(isolate)));
5174 5161
5175 v8::Handle<v8::Object> obj = v8::Object::New(); 5162 v8::Handle<v8::Object> obj = v8::Object::New();
5176 v8::Persistent<v8::Object> alias(isolate, obj); 5163 v8::Persistent<v8::Object> alias(isolate, obj);
5177 CHECK(v8::Local<v8::Object>::New(isolate, alias)->StrictEquals(obj)); 5164 CHECK(v8::Local<v8::Object>::New(isolate, alias)->StrictEquals(obj));
5178 alias.Dispose(); 5165 alias.Reset();
5179 5166
5180 CHECK(v8_str("a")->SameValue(v8_str("a"))); 5167 CHECK(v8_str("a")->SameValue(v8_str("a")));
5181 CHECK(!v8_str("a")->SameValue(v8_str("b"))); 5168 CHECK(!v8_str("a")->SameValue(v8_str("b")));
5182 CHECK(!v8_str("5")->SameValue(v8_num(5))); 5169 CHECK(!v8_str("5")->SameValue(v8_num(5)));
5183 CHECK(v8_num(1)->SameValue(v8_num(1))); 5170 CHECK(v8_num(1)->SameValue(v8_num(1)));
5184 CHECK(!v8_num(1)->SameValue(v8_num(2))); 5171 CHECK(!v8_num(1)->SameValue(v8_num(2)));
5185 CHECK(!v8_num(0.0)->SameValue(v8_num(-0.0))); 5172 CHECK(!v8_num(0.0)->SameValue(v8_num(-0.0)));
5186 CHECK(not_a_number->SameValue(not_a_number)); 5173 CHECK(not_a_number->SameValue(not_a_number));
5187 CHECK(v8::False(isolate)->SameValue(v8::False(isolate))); 5174 CHECK(v8::False(isolate)->SameValue(v8::False(isolate)));
5188 CHECK(!v8::False(isolate)->SameValue(v8::Undefined(isolate))); 5175 CHECK(!v8::False(isolate)->SameValue(v8::Undefined(isolate)));
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
5493 v8::HandleScope scope(CcTest::isolate()); 5480 v8::HandleScope scope(CcTest::isolate());
5494 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5481 Local<ObjectTemplate> templ = ObjectTemplate::New();
5495 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); 5482 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut"));
5496 LocalContext context; 5483 LocalContext context;
5497 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5484 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5498 Local<Script> script = Script::Compile(v8_str("obj.x = 4")); 5485 Local<Script> script = Script::Compile(v8_str("obj.x = 4"));
5499 for (int i = 0; i < 10; i++) { 5486 for (int i = 0; i < 10; i++) {
5500 CHECK(xValue.IsEmpty()); 5487 CHECK(xValue.IsEmpty());
5501 script->Run(); 5488 script->Run();
5502 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue)); 5489 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue));
5503 xValue.Dispose(); 5490 xValue.Reset();
5504 xValue.Clear();
5505 } 5491 }
5506 } 5492 }
5507 5493
5508 5494
5509 THREADED_TEST(SetterOnly) { 5495 THREADED_TEST(SetterOnly) {
5510 v8::HandleScope scope(CcTest::isolate()); 5496 v8::HandleScope scope(CcTest::isolate());
5511 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5497 Local<ObjectTemplate> templ = ObjectTemplate::New();
5512 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); 5498 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut"));
5513 LocalContext context; 5499 LocalContext context;
5514 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 5500 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5515 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); 5501 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x"));
5516 for (int i = 0; i < 10; i++) { 5502 for (int i = 0; i < 10; i++) {
5517 CHECK(xValue.IsEmpty()); 5503 CHECK(xValue.IsEmpty());
5518 script->Run(); 5504 script->Run();
5519 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue)); 5505 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue));
5520 xValue.Dispose(); 5506 xValue.Reset();
5521 xValue.Clear();
5522 } 5507 }
5523 } 5508 }
5524 5509
5525 5510
5526 THREADED_TEST(NoAccessors) { 5511 THREADED_TEST(NoAccessors) {
5527 v8::HandleScope scope(CcTest::isolate()); 5512 v8::HandleScope scope(CcTest::isolate());
5528 Local<ObjectTemplate> templ = ObjectTemplate::New(); 5513 Local<ObjectTemplate> templ = ObjectTemplate::New();
5529 templ->SetAccessor(v8_str("x"), 5514 templ->SetAccessor(v8_str("x"),
5530 static_cast<v8::AccessorGetterCallback>(NULL), 5515 static_cast<v8::AccessorGetterCallback>(NULL),
5531 NULL, 5516 NULL,
(...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after
6301 script->Run(); 6286 script->Run();
6302 ExpectBoolean("undetectable.y == undefined", true); 6287 ExpectBoolean("undetectable.y == undefined", true);
6303 } 6288 }
6304 6289
6305 6290
6306 6291
6307 THREADED_TEST(UndetectableString) { 6292 THREADED_TEST(UndetectableString) {
6308 LocalContext env; 6293 LocalContext env;
6309 v8::HandleScope scope(env->GetIsolate()); 6294 v8::HandleScope scope(env->GetIsolate());
6310 6295
6311 Local<String> obj = String::NewUndetectable("foo"); 6296 Local<String> obj = String::NewFromUtf8(env->GetIsolate(), "foo",
6297 String::kUndetectableString);
6312 env->Global()->Set(v8_str("undetectable"), obj); 6298 env->Global()->Set(v8_str("undetectable"), obj);
6313 6299
6314 ExpectString("undetectable", "foo"); 6300 ExpectString("undetectable", "foo");
6315 ExpectString("typeof undetectable", "undefined"); 6301 ExpectString("typeof undetectable", "undefined");
6316 ExpectString("typeof(undetectable)", "undefined"); 6302 ExpectString("typeof(undetectable)", "undefined");
6317 ExpectBoolean("typeof undetectable == 'undefined'", true); 6303 ExpectBoolean("typeof undetectable == 'undefined'", true);
6318 ExpectBoolean("typeof undetectable == 'string'", false); 6304 ExpectBoolean("typeof undetectable == 'string'", false);
6319 ExpectBoolean("if (undetectable) { true; } else { false; }", false); 6305 ExpectBoolean("if (undetectable) { true; } else { false; }", false);
6320 ExpectBoolean("!undetectable", true); 6306 ExpectBoolean("!undetectable", true);
6321 6307
(...skipping 20 matching lines...) Expand all
6342 ExpectBoolean("undefined===undetectable", false); 6328 ExpectBoolean("undefined===undetectable", false);
6343 ExpectBoolean("undetectable===undetectable", true); 6329 ExpectBoolean("undetectable===undetectable", true);
6344 } 6330 }
6345 6331
6346 6332
6347 TEST(UndetectableOptimized) { 6333 TEST(UndetectableOptimized) {
6348 i::FLAG_allow_natives_syntax = true; 6334 i::FLAG_allow_natives_syntax = true;
6349 LocalContext env; 6335 LocalContext env;
6350 v8::HandleScope scope(env->GetIsolate()); 6336 v8::HandleScope scope(env->GetIsolate());
6351 6337
6352 Local<String> obj = String::NewUndetectable("foo"); 6338 Local<String> obj = String::NewFromUtf8(env->GetIsolate(), "foo",
6339 String::kUndetectableString);
6353 env->Global()->Set(v8_str("undetectable"), obj); 6340 env->Global()->Set(v8_str("undetectable"), obj);
6354 env->Global()->Set(v8_str("detectable"), v8_str("bar")); 6341 env->Global()->Set(v8_str("detectable"), v8_str("bar"));
6355 6342
6356 ExpectString( 6343 ExpectString(
6357 "function testBranch() {" 6344 "function testBranch() {"
6358 " if (!%_IsUndetectableObject(undetectable)) throw 1;" 6345 " if (!%_IsUndetectableObject(undetectable)) throw 1;"
6359 " if (%_IsUndetectableObject(detectable)) throw 2;" 6346 " if (%_IsUndetectableObject(detectable)) throw 2;"
6360 "}\n" 6347 "}\n"
6361 "function testBool() {" 6348 "function testBool() {"
6362 " var b1 = !%_IsUndetectableObject(undetectable);" 6349 " var b1 = !%_IsUndetectableObject(undetectable);"
(...skipping 14 matching lines...) Expand all
6377 6364
6378 6365
6379 template <typename T> static void USE(T) { } 6366 template <typename T> static void USE(T) { }
6380 6367
6381 6368
6382 // This test is not intended to be run, just type checked. 6369 // This test is not intended to be run, just type checked.
6383 static inline void PersistentHandles(v8::Isolate* isolate) { 6370 static inline void PersistentHandles(v8::Isolate* isolate) {
6384 USE(PersistentHandles); 6371 USE(PersistentHandles);
6385 Local<String> str = v8_str("foo"); 6372 Local<String> str = v8_str("foo");
6386 v8::Persistent<String> p_str(isolate, str); 6373 v8::Persistent<String> p_str(isolate, str);
6387 p_str.Dispose(); 6374 p_str.Reset();
6388 Local<Script> scr = Script::Compile(v8_str("")); 6375 Local<Script> scr = Script::Compile(v8_str(""));
6389 v8::Persistent<Script> p_scr(isolate, scr); 6376 v8::Persistent<Script> p_scr(isolate, scr);
6390 p_scr.Dispose(); 6377 p_scr.Reset();
6391 Local<ObjectTemplate> templ = ObjectTemplate::New(); 6378 Local<ObjectTemplate> templ = ObjectTemplate::New();
6392 v8::Persistent<ObjectTemplate> p_templ(isolate, templ); 6379 v8::Persistent<ObjectTemplate> p_templ(isolate, templ);
6393 p_templ.Dispose(); 6380 p_templ.Reset();
6394 } 6381 }
6395 6382
6396 6383
6397 static void HandleLogDelegator( 6384 static void HandleLogDelegator(
6398 const v8::FunctionCallbackInfo<v8::Value>& args) { 6385 const v8::FunctionCallbackInfo<v8::Value>& args) {
6399 ApiTestFuzzer::Fuzz(); 6386 ApiTestFuzzer::Fuzz();
6400 } 6387 }
6401 6388
6402 6389
6403 THREADED_TEST(GlobalObjectTemplate) { 6390 THREADED_TEST(GlobalObjectTemplate) {
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
6690 v8::Handle<Context> context = 6677 v8::Handle<Context> context =
6691 Context::New(CcTest::isolate(), &extensions); 6678 Context::New(CcTest::isolate(), &extensions);
6692 CHECK(context.IsEmpty()); 6679 CHECK(context.IsEmpty());
6693 } 6680 }
6694 6681
6695 6682
6696 static void CheckDependencies(const char* name, const char* expected) { 6683 static void CheckDependencies(const char* name, const char* expected) {
6697 v8::HandleScope handle_scope(CcTest::isolate()); 6684 v8::HandleScope handle_scope(CcTest::isolate());
6698 v8::ExtensionConfiguration config(1, &name); 6685 v8::ExtensionConfiguration config(1, &name);
6699 LocalContext context(&config); 6686 LocalContext context(&config);
6700 CHECK_EQ(String::New(expected), context->Global()->Get(v8_str("loaded"))); 6687 CHECK_EQ(String::NewFromUtf8(CcTest::isolate(), expected),
6688 context->Global()->Get(v8_str("loaded")));
6701 } 6689 }
6702 6690
6703 6691
6704 /* 6692 /*
6705 * Configuration: 6693 * Configuration:
6706 * 6694 *
6707 * /-- B <--\ 6695 * /-- B <--\
6708 * A <- -- D <-- E 6696 * A <- -- D <-- E
6709 * \-- C <--/ 6697 * \-- C <--/
6710 */ 6698 */
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
6847 void OOMCallback(const char* location, const char* message) { 6835 void OOMCallback(const char* location, const char* message) {
6848 exit(0); 6836 exit(0);
6849 } 6837 }
6850 6838
6851 6839
6852 TEST(RegexpOutOfMemory) { 6840 TEST(RegexpOutOfMemory) {
6853 // Execute a script that causes out of memory when flattening a string. 6841 // Execute a script that causes out of memory when flattening a string.
6854 v8::HandleScope scope(CcTest::isolate()); 6842 v8::HandleScope scope(CcTest::isolate());
6855 v8::V8::SetFatalErrorHandler(OOMCallback); 6843 v8::V8::SetFatalErrorHandler(OOMCallback);
6856 LocalContext context; 6844 LocalContext context;
6857 Local<Script> script = 6845 Local<Script> script = Script::Compile(String::NewFromUtf8(
6858 Script::Compile(String::New(js_code_causing_huge_string_flattening)); 6846 CcTest::isolate(), js_code_causing_huge_string_flattening));
6859 last_location = NULL; 6847 last_location = NULL;
6860 script->Run(); 6848 script->Run();
6861 6849
6862 CHECK(false); // Should not return. 6850 CHECK(false); // Should not return.
6863 } 6851 }
6864 6852
6865 6853
6866 static void MissingScriptInfoMessageListener(v8::Handle<v8::Message> message, 6854 static void MissingScriptInfoMessageListener(v8::Handle<v8::Message> message,
6867 v8::Handle<Value> data) { 6855 v8::Handle<Value> data) {
6868 CHECK(message->GetScriptResourceName()->IsUndefined()); 6856 CHECK(message->GetScriptResourceName()->IsUndefined());
(...skipping 16 matching lines...) Expand all
6885 6873
6886 class Snorkel { 6874 class Snorkel {
6887 public: 6875 public:
6888 Snorkel() { index_ = global_index++; } 6876 Snorkel() { index_ = global_index++; }
6889 int index_; 6877 int index_;
6890 }; 6878 };
6891 6879
6892 class Whammy { 6880 class Whammy {
6893 public: 6881 public:
6894 explicit Whammy(v8::Isolate* isolate) : cursor_(0), isolate_(isolate) { } 6882 explicit Whammy(v8::Isolate* isolate) : cursor_(0), isolate_(isolate) { }
6895 ~Whammy() { script_.Dispose(); } 6883 ~Whammy() { script_.Reset(); }
6896 v8::Handle<Script> getScript() { 6884 v8::Handle<Script> getScript() {
6897 if (script_.IsEmpty()) script_.Reset(isolate_, v8_compile("({}).blammo")); 6885 if (script_.IsEmpty()) script_.Reset(isolate_, v8_compile("({}).blammo"));
6898 return Local<Script>::New(isolate_, script_); 6886 return Local<Script>::New(isolate_, script_);
6899 } 6887 }
6900 6888
6901 public: 6889 public:
6902 static const int kObjectCount = 256; 6890 static const int kObjectCount = 256;
6903 int cursor_; 6891 int cursor_;
6904 v8::Isolate* isolate_; 6892 v8::Isolate* isolate_;
6905 v8::Persistent<v8::Object> objects_[kObjectCount]; 6893 v8::Persistent<v8::Object> objects_[kObjectCount];
(...skipping 12 matching lines...) Expand all
6918 Whammy* whammy = 6906 Whammy* whammy =
6919 static_cast<Whammy*>(v8::Handle<v8::External>::Cast(info.Data())->Value()); 6907 static_cast<Whammy*>(v8::Handle<v8::External>::Cast(info.Data())->Value());
6920 6908
6921 v8::Persistent<v8::Object>& prev = whammy->objects_[whammy->cursor_]; 6909 v8::Persistent<v8::Object>& prev = whammy->objects_[whammy->cursor_];
6922 6910
6923 v8::Handle<v8::Object> obj = v8::Object::New(); 6911 v8::Handle<v8::Object> obj = v8::Object::New();
6924 if (!prev.IsEmpty()) { 6912 if (!prev.IsEmpty()) {
6925 v8::Local<v8::Object>::New(info.GetIsolate(), prev) 6913 v8::Local<v8::Object>::New(info.GetIsolate(), prev)
6926 ->Set(v8_str("next"), obj); 6914 ->Set(v8_str("next"), obj);
6927 prev.MakeWeak<Value, Snorkel>(new Snorkel(), &HandleWeakReference); 6915 prev.MakeWeak<Value, Snorkel>(new Snorkel(), &HandleWeakReference);
6928 whammy->objects_[whammy->cursor_].Clear();
6929 } 6916 }
6930 whammy->objects_[whammy->cursor_].Reset(info.GetIsolate(), obj); 6917 whammy->objects_[whammy->cursor_].Reset(info.GetIsolate(), obj);
6931 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount; 6918 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount;
6932 info.GetReturnValue().Set(whammy->getScript()->Run()); 6919 info.GetReturnValue().Set(whammy->getScript()->Run());
6933 } 6920 }
6934 6921
6935 6922
6936 THREADED_TEST(WeakReference) { 6923 THREADED_TEST(WeakReference) {
6937 v8::HandleScope handle_scope(CcTest::isolate()); 6924 v8::HandleScope handle_scope(CcTest::isolate());
6938 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(); 6925 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New();
(...skipping 20 matching lines...) Expand all
6959 "4"; 6946 "4";
6960 v8::Handle<Value> result = CompileRun(code); 6947 v8::Handle<Value> result = CompileRun(code);
6961 CHECK_EQ(4.0, result->NumberValue()); 6948 CHECK_EQ(4.0, result->NumberValue());
6962 delete whammy; 6949 delete whammy;
6963 } 6950 }
6964 6951
6965 6952
6966 static void DisposeAndSetFlag(v8::Isolate* isolate, 6953 static void DisposeAndSetFlag(v8::Isolate* isolate,
6967 v8::Persistent<v8::Object>* obj, 6954 v8::Persistent<v8::Object>* obj,
6968 bool* data) { 6955 bool* data) {
6969 obj->Dispose(); 6956 obj->Reset();
6970 *(data) = true; 6957 *(data) = true;
6971 } 6958 }
6972 6959
6973 6960
6974 THREADED_TEST(IndependentWeakHandle) { 6961 THREADED_TEST(IndependentWeakHandle) {
6975 v8::Isolate* iso = CcTest::isolate(); 6962 v8::Isolate* iso = CcTest::isolate();
6976 v8::HandleScope scope(iso); 6963 v8::HandleScope scope(iso);
6977 v8::Handle<Context> context = Context::New(iso); 6964 v8::Handle<Context> context = Context::New(iso);
6978 Context::Scope context_scope(context); 6965 Context::Scope context_scope(context);
6979 6966
(...skipping 25 matching lines...) Expand all
7005 6992
7006 6993
7007 static void InvokeMarkSweep() { 6994 static void InvokeMarkSweep() {
7008 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 6995 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
7009 } 6996 }
7010 6997
7011 6998
7012 static void ForceScavenge(v8::Isolate* isolate, 6999 static void ForceScavenge(v8::Isolate* isolate,
7013 v8::Persistent<v8::Object>* obj, 7000 v8::Persistent<v8::Object>* obj,
7014 bool* data) { 7001 bool* data) {
7015 obj->Dispose(); 7002 obj->Reset();
7016 *(data) = true; 7003 *(data) = true;
7017 InvokeScavenge(); 7004 InvokeScavenge();
7018 } 7005 }
7019 7006
7020 7007
7021 static void ForceMarkSweep(v8::Isolate* isolate, 7008 static void ForceMarkSweep(v8::Isolate* isolate,
7022 v8::Persistent<v8::Object>* obj, 7009 v8::Persistent<v8::Object>* obj,
7023 bool* data) { 7010 bool* data) {
7024 obj->Dispose(); 7011 obj->Reset();
7025 *(data) = true; 7012 *(data) = true;
7026 InvokeMarkSweep(); 7013 InvokeMarkSweep();
7027 } 7014 }
7028 7015
7029 7016
7030 THREADED_TEST(GCFromWeakCallbacks) { 7017 THREADED_TEST(GCFromWeakCallbacks) {
7031 v8::Isolate* isolate = CcTest::isolate(); 7018 v8::Isolate* isolate = CcTest::isolate();
7032 v8::HandleScope scope(isolate); 7019 v8::HandleScope scope(isolate);
7033 v8::Handle<Context> context = Context::New(isolate); 7020 v8::Handle<Context> context = Context::New(isolate);
7034 Context::Scope context_scope(context); 7021 Context::Scope context_scope(context);
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
7407 return len; 7394 return len;
7408 } 7395 }
7409 7396
7410 7397
7411 THREADED_TEST(StringWrite) { 7398 THREADED_TEST(StringWrite) {
7412 LocalContext context; 7399 LocalContext context;
7413 v8::HandleScope scope(context->GetIsolate()); 7400 v8::HandleScope scope(context->GetIsolate());
7414 v8::Handle<String> str = v8_str("abcde"); 7401 v8::Handle<String> str = v8_str("abcde");
7415 // abc<Icelandic eth><Unicode snowman>. 7402 // abc<Icelandic eth><Unicode snowman>.
7416 v8::Handle<String> str2 = v8_str("abc\303\260\342\230\203"); 7403 v8::Handle<String> str2 = v8_str("abc\303\260\342\230\203");
7417 v8::Handle<String> str3 = v8::String::New("abc\0def", 7); 7404 v8::Handle<String> str3 = v8::String::NewFromUtf8(
7405 context->GetIsolate(), "abc\0def", v8::String::kNormalString, 7);
7418 const int kStride = 4; // Must match stride in for loops in JS below. 7406 const int kStride = 4; // Must match stride in for loops in JS below.
7419 CompileRun( 7407 CompileRun(
7420 "var left = '';" 7408 "var left = '';"
7421 "for (var i = 0; i < 0xd800; i += 4) {" 7409 "for (var i = 0; i < 0xd800; i += 4) {"
7422 " left = left + String.fromCharCode(i);" 7410 " left = left + String.fromCharCode(i);"
7423 "}"); 7411 "}");
7424 CompileRun( 7412 CompileRun(
7425 "var right = '';" 7413 "var right = '';"
7426 "for (var i = 0; i < 0xd800; i += 4) {" 7414 "for (var i = 0; i < 0xd800; i += 4) {"
7427 " right = String.fromCharCode(i) + right;" 7415 " right = String.fromCharCode(i) + right;"
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
7801 WriteUtf8Helper(context, "c2", "a2lens", 81); 7789 WriteUtf8Helper(context, "c2", "a2lens", 81);
7802 } 7790 }
7803 7791
7804 7792
7805 static bool SameSymbol(Handle<String> s1, Handle<String> s2) { 7793 static bool SameSymbol(Handle<String> s1, Handle<String> s2) {
7806 i::Handle<i::String> is1(v8::Utils::OpenHandle(*s1)); 7794 i::Handle<i::String> is1(v8::Utils::OpenHandle(*s1));
7807 i::Handle<i::String> is2(v8::Utils::OpenHandle(*s2)); 7795 i::Handle<i::String> is2(v8::Utils::OpenHandle(*s2));
7808 return *is1 == *is2; 7796 return *is1 == *is2;
7809 } 7797 }
7810 7798
7811 7799 static void SameSymbolHelper(v8::Isolate* isolate, const char* a,
7812 static void SameSymbolHelper(const char* a, const char* b) { 7800 const char* b) {
7813 Handle<String> symbol1 = v8::String::NewSymbol(a); 7801 Handle<String> symbol1 =
7814 Handle<String> symbol2 = v8::String::NewSymbol(b); 7802 v8::String::NewFromUtf8(isolate, a, v8::String::kInternalizedString);
7803 Handle<String> symbol2 =
7804 v8::String::NewFromUtf8(isolate, b, v8::String::kInternalizedString);
7815 CHECK(SameSymbol(symbol1, symbol2)); 7805 CHECK(SameSymbol(symbol1, symbol2));
7816 } 7806 }
7817 7807
7818 7808
7819 THREADED_TEST(Utf16Symbol) { 7809 THREADED_TEST(Utf16Symbol) {
7820 LocalContext context; 7810 LocalContext context;
7821 v8::HandleScope scope(context->GetIsolate()); 7811 v8::HandleScope scope(context->GetIsolate());
7822 7812
7823 Handle<String> symbol1 = v8::String::NewSymbol("abc"); 7813 Handle<String> symbol1 = v8::String::NewFromUtf8(
7824 Handle<String> symbol2 = v8::String::NewSymbol("abc"); 7814 context->GetIsolate(), "abc", v8::String::kInternalizedString);
7815 Handle<String> symbol2 = v8::String::NewFromUtf8(
7816 context->GetIsolate(), "abc", v8::String::kInternalizedString);
7825 CHECK(SameSymbol(symbol1, symbol2)); 7817 CHECK(SameSymbol(symbol1, symbol2));
7826 7818
7827 SameSymbolHelper("\360\220\220\205", // 4 byte encoding. 7819 SameSymbolHelper(context->GetIsolate(),
7820 "\360\220\220\205", // 4 byte encoding.
7828 "\355\240\201\355\260\205"); // 2 3-byte surrogates. 7821 "\355\240\201\355\260\205"); // 2 3-byte surrogates.
7829 SameSymbolHelper("\355\240\201\355\260\206", // 2 3-byte surrogates. 7822 SameSymbolHelper(context->GetIsolate(),
7823 "\355\240\201\355\260\206", // 2 3-byte surrogates.
7830 "\360\220\220\206"); // 4 byte encoding. 7824 "\360\220\220\206"); // 4 byte encoding.
7831 SameSymbolHelper("x\360\220\220\205", // 4 byte encoding. 7825 SameSymbolHelper(context->GetIsolate(),
7826 "x\360\220\220\205", // 4 byte encoding.
7832 "x\355\240\201\355\260\205"); // 2 3-byte surrogates. 7827 "x\355\240\201\355\260\205"); // 2 3-byte surrogates.
7833 SameSymbolHelper("x\355\240\201\355\260\206", // 2 3-byte surrogates. 7828 SameSymbolHelper(context->GetIsolate(),
7829 "x\355\240\201\355\260\206", // 2 3-byte surrogates.
7834 "x\360\220\220\206"); // 4 byte encoding. 7830 "x\360\220\220\206"); // 4 byte encoding.
7835 CompileRun( 7831 CompileRun(
7836 "var sym0 = 'benedictus';" 7832 "var sym0 = 'benedictus';"
7837 "var sym0b = 'S\303\270ren';" 7833 "var sym0b = 'S\303\270ren';"
7838 "var sym1 = '\355\240\201\355\260\207';" 7834 "var sym1 = '\355\240\201\355\260\207';"
7839 "var sym2 = '\360\220\220\210';" 7835 "var sym2 = '\360\220\220\210';"
7840 "var sym3 = 'x\355\240\201\355\260\207';" 7836 "var sym3 = 'x\355\240\201\355\260\207';"
7841 "var sym4 = 'x\360\220\220\210';" 7837 "var sym4 = 'x\360\220\220\210';"
7842 "if (sym1.length != 2) throw sym1;" 7838 "if (sym1.length != 2) throw sym1;"
7843 "if (sym1.charCodeAt(1) != 0xdc07) throw sym1.charCodeAt(1);" 7839 "if (sym1.charCodeAt(1) != 0xdc07) throw sym1.charCodeAt(1);"
7844 "if (sym2.length != 2) throw sym2;" 7840 "if (sym2.length != 2) throw sym2;"
7845 "if (sym2.charCodeAt(1) != 0xdc08) throw sym2.charCodeAt(2);" 7841 "if (sym2.charCodeAt(1) != 0xdc08) throw sym2.charCodeAt(2);"
7846 "if (sym3.length != 3) throw sym3;" 7842 "if (sym3.length != 3) throw sym3;"
7847 "if (sym3.charCodeAt(2) != 0xdc07) throw sym1.charCodeAt(2);" 7843 "if (sym3.charCodeAt(2) != 0xdc07) throw sym1.charCodeAt(2);"
7848 "if (sym4.length != 3) throw sym4;" 7844 "if (sym4.length != 3) throw sym4;"
7849 "if (sym4.charCodeAt(2) != 0xdc08) throw sym2.charCodeAt(2);"); 7845 "if (sym4.charCodeAt(2) != 0xdc08) throw sym2.charCodeAt(2);");
7850 Handle<String> sym0 = v8::String::NewSymbol("benedictus"); 7846 Handle<String> sym0 = v8::String::NewFromUtf8(
7851 Handle<String> sym0b = v8::String::NewSymbol("S\303\270ren"); 7847 context->GetIsolate(), "benedictus", v8::String::kInternalizedString);
7852 Handle<String> sym1 = v8::String::NewSymbol("\355\240\201\355\260\207"); 7848 Handle<String> sym0b = v8::String::NewFromUtf8(
7853 Handle<String> sym2 = v8::String::NewSymbol("\360\220\220\210"); 7849 context->GetIsolate(), "S\303\270ren", v8::String::kInternalizedString);
7854 Handle<String> sym3 = v8::String::NewSymbol("x\355\240\201\355\260\207"); 7850 Handle<String> sym1 =
7855 Handle<String> sym4 = v8::String::NewSymbol("x\360\220\220\210"); 7851 v8::String::NewFromUtf8(context->GetIsolate(), "\355\240\201\355\260\207",
7852 v8::String::kInternalizedString);
7853 Handle<String> sym2 =
7854 v8::String::NewFromUtf8(context->GetIsolate(), "\360\220\220\210",
7855 v8::String::kInternalizedString);
7856 Handle<String> sym3 = v8::String::NewFromUtf8(
7857 context->GetIsolate(), "x\355\240\201\355\260\207",
7858 v8::String::kInternalizedString);
7859 Handle<String> sym4 =
7860 v8::String::NewFromUtf8(context->GetIsolate(), "x\360\220\220\210",
7861 v8::String::kInternalizedString);
7856 v8::Local<v8::Object> global = context->Global(); 7862 v8::Local<v8::Object> global = context->Global();
7857 Local<Value> s0 = global->Get(v8_str("sym0")); 7863 Local<Value> s0 = global->Get(v8_str("sym0"));
7858 Local<Value> s0b = global->Get(v8_str("sym0b")); 7864 Local<Value> s0b = global->Get(v8_str("sym0b"));
7859 Local<Value> s1 = global->Get(v8_str("sym1")); 7865 Local<Value> s1 = global->Get(v8_str("sym1"));
7860 Local<Value> s2 = global->Get(v8_str("sym2")); 7866 Local<Value> s2 = global->Get(v8_str("sym2"));
7861 Local<Value> s3 = global->Get(v8_str("sym3")); 7867 Local<Value> s3 = global->Get(v8_str("sym3"));
7862 Local<Value> s4 = global->Get(v8_str("sym4")); 7868 Local<Value> s4 = global->Get(v8_str("sym4"));
7863 CHECK(SameSymbol(sym0, Handle<String>::Cast(s0))); 7869 CHECK(SameSymbol(sym0, Handle<String>::Cast(s0)));
7864 CHECK(SameSymbol(sym0b, Handle<String>::Cast(s0b))); 7870 CHECK(SameSymbol(sym0b, Handle<String>::Cast(s0b)));
7865 CHECK(SameSymbol(sym1, Handle<String>::Cast(s1))); 7871 CHECK(SameSymbol(sym1, Handle<String>::Cast(s1)));
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
8076 8082
8077 TEST(ExceptionInNativeScript) { 8083 TEST(ExceptionInNativeScript) {
8078 LocalContext env; 8084 LocalContext env;
8079 v8::HandleScope scope(env->GetIsolate()); 8085 v8::HandleScope scope(env->GetIsolate());
8080 v8::V8::AddMessageListener(ExceptionInNativeScriptTestListener); 8086 v8::V8::AddMessageListener(ExceptionInNativeScriptTestListener);
8081 8087
8082 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(TroubleCallback); 8088 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(TroubleCallback);
8083 v8::Local<v8::Object> global = env->Global(); 8089 v8::Local<v8::Object> global = env->Global();
8084 global->Set(v8_str("trouble"), fun->GetFunction()); 8090 global->Set(v8_str("trouble"), fun->GetFunction());
8085 8091
8086 Script::Compile(v8_str("function trouble() {\n" 8092 Script::Compile(
8087 " var o = {};\n" 8093 v8_str(
8088 " new o.foo();\n" 8094 "function trouble() {\n"
8089 "};"), v8::String::New(script_resource_name))->Run(); 8095 " var o = {};\n"
8096 " new o.foo();\n"
8097 "};"),
8098 v8::String::NewFromUtf8(env->GetIsolate(), script_resource_name))->Run();
8090 Local<Value> trouble = global->Get(v8_str("trouble")); 8099 Local<Value> trouble = global->Get(v8_str("trouble"));
8091 CHECK(trouble->IsFunction()); 8100 CHECK(trouble->IsFunction());
8092 Function::Cast(*trouble)->Call(global, 0, NULL); 8101 Function::Cast(*trouble)->Call(global, 0, NULL);
8093 v8::V8::RemoveMessageListeners(ExceptionInNativeScriptTestListener); 8102 v8::V8::RemoveMessageListeners(ExceptionInNativeScriptTestListener);
8094 } 8103 }
8095 8104
8096 8105
8097 TEST(CompilationErrorUsingTryCatchHandler) { 8106 TEST(CompilationErrorUsingTryCatchHandler) {
8098 LocalContext env; 8107 LocalContext env;
8099 v8::HandleScope scope(env->GetIsolate()); 8108 v8::HandleScope scope(env->GetIsolate());
(...skipping 4928 matching lines...) Expand 10 before | Expand all | Expand 10 after
13028 13037
13029 13038
13030 v8::Persistent<v8::Object> some_object; 13039 v8::Persistent<v8::Object> some_object;
13031 v8::Persistent<v8::Object> bad_handle; 13040 v8::Persistent<v8::Object> bad_handle;
13032 13041
13033 void NewPersistentHandleCallback(v8::Isolate* isolate, 13042 void NewPersistentHandleCallback(v8::Isolate* isolate,
13034 v8::Persistent<v8::Value>* handle, 13043 v8::Persistent<v8::Value>* handle,
13035 void*) { 13044 void*) {
13036 v8::HandleScope scope(isolate); 13045 v8::HandleScope scope(isolate);
13037 bad_handle.Reset(isolate, some_object); 13046 bad_handle.Reset(isolate, some_object);
13038 handle->Dispose(); 13047 handle->Reset();
13039 } 13048 }
13040 13049
13041 13050
13042 THREADED_TEST(NewPersistentHandleFromWeakCallback) { 13051 THREADED_TEST(NewPersistentHandleFromWeakCallback) {
13043 LocalContext context; 13052 LocalContext context;
13044 v8::Isolate* isolate = context->GetIsolate(); 13053 v8::Isolate* isolate = context->GetIsolate();
13045 13054
13046 v8::Persistent<v8::Object> handle1, handle2; 13055 v8::Persistent<v8::Object> handle1, handle2;
13047 { 13056 {
13048 v8::HandleScope scope(isolate); 13057 v8::HandleScope scope(isolate);
13049 some_object.Reset(isolate, v8::Object::New()); 13058 some_object.Reset(isolate, v8::Object::New());
13050 handle1.Reset(isolate, v8::Object::New()); 13059 handle1.Reset(isolate, v8::Object::New());
13051 handle2.Reset(isolate, v8::Object::New()); 13060 handle2.Reset(isolate, v8::Object::New());
13052 } 13061 }
13053 // Note: order is implementation dependent alas: currently 13062 // Note: order is implementation dependent alas: currently
13054 // global handle nodes are processed by PostGarbageCollectionProcessing 13063 // global handle nodes are processed by PostGarbageCollectionProcessing
13055 // in reverse allocation order, so if second allocated handle is deleted, 13064 // in reverse allocation order, so if second allocated handle is deleted,
13056 // weak callback of the first handle would be able to 'reallocate' it. 13065 // weak callback of the first handle would be able to 'reallocate' it.
13057 handle1.MakeWeak<v8::Value, void>(NULL, NewPersistentHandleCallback); 13066 handle1.MakeWeak<v8::Value, void>(NULL, NewPersistentHandleCallback);
13058 handle2.Dispose(); 13067 handle2.Reset();
13059 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 13068 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
13060 } 13069 }
13061 13070
13062 13071
13063 v8::Persistent<v8::Object> to_be_disposed; 13072 v8::Persistent<v8::Object> to_be_disposed;
13064 13073
13065 void DisposeAndForceGcCallback(v8::Isolate* isolate, 13074 void DisposeAndForceGcCallback(v8::Isolate* isolate,
13066 v8::Persistent<v8::Value>* handle, 13075 v8::Persistent<v8::Value>* handle,
13067 void*) { 13076 void*) {
13068 to_be_disposed.Dispose(); 13077 to_be_disposed.Reset();
13069 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 13078 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
13070 handle->Dispose(); 13079 handle->Reset();
13071 } 13080 }
13072 13081
13073 13082
13074 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { 13083 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) {
13075 LocalContext context; 13084 LocalContext context;
13076 v8::Isolate* isolate = context->GetIsolate(); 13085 v8::Isolate* isolate = context->GetIsolate();
13077 13086
13078 v8::Persistent<v8::Object> handle1, handle2; 13087 v8::Persistent<v8::Object> handle1, handle2;
13079 { 13088 {
13080 v8::HandleScope scope(isolate); 13089 v8::HandleScope scope(isolate);
13081 handle1.Reset(isolate, v8::Object::New()); 13090 handle1.Reset(isolate, v8::Object::New());
13082 handle2.Reset(isolate, v8::Object::New()); 13091 handle2.Reset(isolate, v8::Object::New());
13083 } 13092 }
13084 handle1.MakeWeak<v8::Value, void>(NULL, DisposeAndForceGcCallback); 13093 handle1.MakeWeak<v8::Value, void>(NULL, DisposeAndForceGcCallback);
13085 to_be_disposed.Reset(isolate, handle2); 13094 to_be_disposed.Reset(isolate, handle2);
13086 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 13095 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
13087 } 13096 }
13088 13097
13089 void DisposingCallback(v8::Isolate* isolate, 13098 void DisposingCallback(v8::Isolate* isolate,
13090 v8::Persistent<v8::Value>* handle, 13099 v8::Persistent<v8::Value>* handle,
13091 void*) { 13100 void*) {
13092 handle->Dispose(); 13101 handle->Reset();
13093 } 13102 }
13094 13103
13095 void HandleCreatingCallback(v8::Isolate* isolate, 13104 void HandleCreatingCallback(v8::Isolate* isolate,
13096 v8::Persistent<v8::Value>* handle, 13105 v8::Persistent<v8::Value>* handle,
13097 void*) { 13106 void*) {
13098 v8::HandleScope scope(isolate); 13107 v8::HandleScope scope(isolate);
13099 v8::Persistent<v8::Object>(isolate, v8::Object::New()); 13108 v8::Persistent<v8::Object>(isolate, v8::Object::New());
13100 handle->Dispose(); 13109 handle->Reset();
13101 } 13110 }
13102 13111
13103 13112
13104 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { 13113 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) {
13105 LocalContext context; 13114 LocalContext context;
13106 v8::Isolate* isolate = context->GetIsolate(); 13115 v8::Isolate* isolate = context->GetIsolate();
13107 13116
13108 v8::Persistent<v8::Object> handle1, handle2, handle3; 13117 v8::Persistent<v8::Object> handle1, handle2, handle3;
13109 { 13118 {
13110 v8::HandleScope scope(isolate); 13119 v8::HandleScope scope(isolate);
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
13781 CHECK_EQ(1, result->InternalFieldCount()); 13790 CHECK_EQ(1, result->InternalFieldCount());
13782 } 13791 }
13783 13792
13784 13793
13785 // If part of the threaded tests, this test makes ThreadingTest fail 13794 // If part of the threaded tests, this test makes ThreadingTest fail
13786 // on mac. 13795 // on mac.
13787 TEST(CatchStackOverflow) { 13796 TEST(CatchStackOverflow) {
13788 LocalContext context; 13797 LocalContext context;
13789 v8::HandleScope scope(context->GetIsolate()); 13798 v8::HandleScope scope(context->GetIsolate());
13790 v8::TryCatch try_catch; 13799 v8::TryCatch try_catch;
13791 v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New( 13800 v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::NewFromUtf8(
13801 context->GetIsolate(),
13792 "function f() {" 13802 "function f() {"
13793 " return f();" 13803 " return f();"
13794 "}" 13804 "}"
13795 "" 13805 ""
13796 "f();")); 13806 "f();"));
13797 v8::Handle<v8::Value> result = script->Run(); 13807 v8::Handle<v8::Value> result = script->Run();
13798 CHECK(result.IsEmpty()); 13808 CHECK(result.IsEmpty());
13799 } 13809 }
13800 13810
13801 13811
(...skipping 15 matching lines...) Expand all
13817 v8::String::Utf8Value line(message->GetSourceLine()); 13827 v8::String::Utf8Value line(message->GetSourceLine());
13818 CHECK_EQ(" throw 'nirk';", *line); 13828 CHECK_EQ(" throw 'nirk';", *line);
13819 v8::String::Utf8Value name(message->GetScriptResourceName()); 13829 v8::String::Utf8Value name(message->GetScriptResourceName());
13820 CHECK_EQ(resource_name, *name); 13830 CHECK_EQ(resource_name, *name);
13821 } 13831 }
13822 13832
13823 13833
13824 THREADED_TEST(TryCatchSourceInfo) { 13834 THREADED_TEST(TryCatchSourceInfo) {
13825 LocalContext context; 13835 LocalContext context;
13826 v8::HandleScope scope(context->GetIsolate()); 13836 v8::HandleScope scope(context->GetIsolate());
13827 v8::Handle<v8::String> source = v8::String::New( 13837 v8::Handle<v8::String> source = v8::String::NewFromUtf8(
13838 context->GetIsolate(),
13828 "function Foo() {\n" 13839 "function Foo() {\n"
13829 " return Bar();\n" 13840 " return Bar();\n"
13830 "}\n" 13841 "}\n"
13831 "\n" 13842 "\n"
13832 "function Bar() {\n" 13843 "function Bar() {\n"
13833 " return Baz();\n" 13844 " return Baz();\n"
13834 "}\n" 13845 "}\n"
13835 "\n" 13846 "\n"
13836 "function Baz() {\n" 13847 "function Baz() {\n"
13837 " throw 'nirk';\n" 13848 " throw 'nirk';\n"
13838 "}\n" 13849 "}\n"
13839 "\n" 13850 "\n"
13840 "Foo();\n"); 13851 "Foo();\n");
13841 13852
13842 const char* resource_name; 13853 const char* resource_name;
13843 v8::Handle<v8::Script> script; 13854 v8::Handle<v8::Script> script;
13844 resource_name = "test.js"; 13855 resource_name = "test.js";
13845 script = v8::Script::Compile(source, v8::String::New(resource_name)); 13856 script = v8::Script::Compile(
13857 source, v8::String::NewFromUtf8(context->GetIsolate(), resource_name));
13846 CheckTryCatchSourceInfo(script, resource_name, 0); 13858 CheckTryCatchSourceInfo(script, resource_name, 0);
13847 13859
13848 resource_name = "test1.js"; 13860 resource_name = "test1.js";
13849 v8::ScriptOrigin origin1(v8::String::New(resource_name)); 13861 v8::ScriptOrigin origin1(
13862 v8::String::NewFromUtf8(context->GetIsolate(), resource_name));
13850 script = v8::Script::Compile(source, &origin1); 13863 script = v8::Script::Compile(source, &origin1);
13851 CheckTryCatchSourceInfo(script, resource_name, 0); 13864 CheckTryCatchSourceInfo(script, resource_name, 0);
13852 13865
13853 resource_name = "test2.js"; 13866 resource_name = "test2.js";
13854 v8::ScriptOrigin origin2(v8::String::New(resource_name), v8::Integer::New(7)); 13867 v8::ScriptOrigin origin2(
13868 v8::String::NewFromUtf8(context->GetIsolate(), resource_name),
13869 v8::Integer::New(7));
13855 script = v8::Script::Compile(source, &origin2); 13870 script = v8::Script::Compile(source, &origin2);
13856 CheckTryCatchSourceInfo(script, resource_name, 7); 13871 CheckTryCatchSourceInfo(script, resource_name, 7);
13857 } 13872 }
13858 13873
13859 13874
13860 THREADED_TEST(CompilationCache) { 13875 THREADED_TEST(CompilationCache) {
13861 LocalContext context; 13876 LocalContext context;
13862 v8::HandleScope scope(context->GetIsolate()); 13877 v8::HandleScope scope(context->GetIsolate());
13863 v8::Handle<v8::String> source0 = v8::String::New("1234"); 13878 v8::Handle<v8::String> source0 =
13864 v8::Handle<v8::String> source1 = v8::String::New("1234"); 13879 v8::String::NewFromUtf8(context->GetIsolate(), "1234");
13865 v8::Handle<v8::Script> script0 = 13880 v8::Handle<v8::String> source1 =
13866 v8::Script::Compile(source0, v8::String::New("test.js")); 13881 v8::String::NewFromUtf8(context->GetIsolate(), "1234");
13867 v8::Handle<v8::Script> script1 = 13882 v8::Handle<v8::Script> script0 = v8::Script::Compile(
13868 v8::Script::Compile(source1, v8::String::New("test.js")); 13883 source0, v8::String::NewFromUtf8(context->GetIsolate(), "test.js"));
13884 v8::Handle<v8::Script> script1 = v8::Script::Compile(
13885 source1, v8::String::NewFromUtf8(context->GetIsolate(), "test.js"));
13869 v8::Handle<v8::Script> script2 = 13886 v8::Handle<v8::Script> script2 =
13870 v8::Script::Compile(source0); // different origin 13887 v8::Script::Compile(source0); // different origin
13871 CHECK_EQ(1234, script0->Run()->Int32Value()); 13888 CHECK_EQ(1234, script0->Run()->Int32Value());
13872 CHECK_EQ(1234, script1->Run()->Int32Value()); 13889 CHECK_EQ(1234, script1->Run()->Int32Value());
13873 CHECK_EQ(1234, script2->Run()->Int32Value()); 13890 CHECK_EQ(1234, script2->Run()->Int32Value());
13874 } 13891 }
13875 13892
13876 13893
13877 static void FunctionNameCallback( 13894 static void FunctionNameCallback(
13878 const v8::FunctionCallbackInfo<v8::Value>& args) { 13895 const v8::FunctionCallbackInfo<v8::Value>& args) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
13923 for (int i = 0; i < elmc; i++) { 13940 for (int i = 0; i < elmc; i++) {
13924 v8::String::Utf8Value elm(props->Get(v8::Integer::New(i))); 13941 v8::String::Utf8Value elm(props->Get(v8::Integer::New(i)));
13925 CHECK_EQ(elmv[i], *elm); 13942 CHECK_EQ(elmv[i], *elm);
13926 } 13943 }
13927 } 13944 }
13928 13945
13929 13946
13930 THREADED_TEST(PropertyEnumeration) { 13947 THREADED_TEST(PropertyEnumeration) {
13931 LocalContext context; 13948 LocalContext context;
13932 v8::HandleScope scope(context->GetIsolate()); 13949 v8::HandleScope scope(context->GetIsolate());
13933 v8::Handle<v8::Value> obj = v8::Script::Compile(v8::String::New( 13950 v8::Handle<v8::Value> obj = v8::Script::Compile(v8::String::NewFromUtf8(
13951 context->GetIsolate(),
13934 "var result = [];" 13952 "var result = [];"
13935 "result[0] = {};" 13953 "result[0] = {};"
13936 "result[1] = {a: 1, b: 2};" 13954 "result[1] = {a: 1, b: 2};"
13937 "result[2] = [1, 2, 3];" 13955 "result[2] = [1, 2, 3];"
13938 "var proto = {x: 1, y: 2, z: 3};" 13956 "var proto = {x: 1, y: 2, z: 3};"
13939 "var x = { __proto__: proto, w: 0, z: 1 };" 13957 "var x = { __proto__: proto, w: 0, z: 1 };"
13940 "result[3] = x;" 13958 "result[3] = x;"
13941 "result;"))->Run(); 13959 "result;"))->Run();
13942 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); 13960 v8::Handle<v8::Array> elms = obj.As<v8::Array>();
13943 CHECK_EQ(4, elms->Length()); 13961 CHECK_EQ(4, elms->Length());
(...skipping 14 matching lines...) Expand all
13958 CheckProperties(elms->Get(v8::Integer::New(3)), elmc3, elmv3); 13976 CheckProperties(elms->Get(v8::Integer::New(3)), elmc3, elmv3);
13959 int elmc4 = 2; 13977 int elmc4 = 2;
13960 const char* elmv4[] = {"w", "z"}; 13978 const char* elmv4[] = {"w", "z"};
13961 CheckOwnProperties(elms->Get(v8::Integer::New(3)), elmc4, elmv4); 13979 CheckOwnProperties(elms->Get(v8::Integer::New(3)), elmc4, elmv4);
13962 } 13980 }
13963 13981
13964 13982
13965 THREADED_TEST(PropertyEnumeration2) { 13983 THREADED_TEST(PropertyEnumeration2) {
13966 LocalContext context; 13984 LocalContext context;
13967 v8::HandleScope scope(context->GetIsolate()); 13985 v8::HandleScope scope(context->GetIsolate());
13968 v8::Handle<v8::Value> obj = v8::Script::Compile(v8::String::New( 13986 v8::Handle<v8::Value> obj = v8::Script::Compile(v8::String::NewFromUtf8(
13987 context->GetIsolate(),
13969 "var result = [];" 13988 "var result = [];"
13970 "result[0] = {};" 13989 "result[0] = {};"
13971 "result[1] = {a: 1, b: 2};" 13990 "result[1] = {a: 1, b: 2};"
13972 "result[2] = [1, 2, 3];" 13991 "result[2] = [1, 2, 3];"
13973 "var proto = {x: 1, y: 2, z: 3};" 13992 "var proto = {x: 1, y: 2, z: 3};"
13974 "var x = { __proto__: proto, w: 0, z: 1 };" 13993 "var x = { __proto__: proto, w: 0, z: 1 };"
13975 "result[3] = x;" 13994 "result[3] = x;"
13976 "result;"))->Run(); 13995 "result;"))->Run();
13977 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); 13996 v8::Handle<v8::Array> elms = obj.As<v8::Array>();
13978 CHECK_EQ(4, elms->Length()); 13997 CHECK_EQ(4, elms->Length());
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
14358 const int kFunctionEntrySize = i::FunctionEntry::kSize; 14377 const int kFunctionEntrySize = i::FunctionEntry::kSize;
14359 const int kFunctionEntryStartOffset = 0; 14378 const int kFunctionEntryStartOffset = 0;
14360 const int kFunctionEntryEndOffset = 1; 14379 const int kFunctionEntryEndOffset = 1;
14361 unsigned* sd_data = 14380 unsigned* sd_data =
14362 reinterpret_cast<unsigned*>(const_cast<char*>(sd->Data())); 14381 reinterpret_cast<unsigned*>(const_cast<char*>(sd->Data()));
14363 14382
14364 // Overwrite function bar's end position with 0. 14383 // Overwrite function bar's end position with 0.
14365 sd_data[kHeaderSize + 1 * kFunctionEntrySize + kFunctionEntryEndOffset] = 0; 14384 sd_data[kHeaderSize + 1 * kFunctionEntrySize + kFunctionEntryEndOffset] = 0;
14366 v8::TryCatch try_catch; 14385 v8::TryCatch try_catch;
14367 14386
14368 Local<String> source = String::New(script); 14387 Local<String> source = String::NewFromUtf8(isolate, script);
14369 Local<Script> compiled_script = Script::New(source, NULL, sd); 14388 Local<Script> compiled_script = Script::New(source, NULL, sd);
14370 CHECK(try_catch.HasCaught()); 14389 CHECK(try_catch.HasCaught());
14371 String::Utf8Value exception_value(try_catch.Message()->Get()); 14390 String::Utf8Value exception_value(try_catch.Message()->Get());
14372 CHECK_EQ("Uncaught SyntaxError: Invalid preparser data for function bar", 14391 CHECK_EQ("Uncaught SyntaxError: Invalid preparser data for function bar",
14373 *exception_value); 14392 *exception_value);
14374 14393
14375 try_catch.Reset(); 14394 try_catch.Reset();
14376 14395
14377 // Overwrite function bar's start position with 200. The function entry 14396 // Overwrite function bar's start position with 200. The function entry
14378 // will not be found when searching for it by position and we should fall 14397 // will not be found when searching for it by position and we should fall
(...skipping 19 matching lines...) Expand all
14398 const char* cstring = "function foo(a) { return a+1; }"; 14417 const char* cstring = "function foo(a) { return a+1; }";
14399 14418
14400 v8::ScriptData* sd_from_cstring = 14419 v8::ScriptData* sd_from_cstring =
14401 v8::ScriptData::PreCompile(isolate, cstring, i::StrLength(cstring)); 14420 v8::ScriptData::PreCompile(isolate, cstring, i::StrLength(cstring));
14402 14421
14403 TestAsciiResource* resource = new TestAsciiResource(cstring); 14422 TestAsciiResource* resource = new TestAsciiResource(cstring);
14404 v8::ScriptData* sd_from_external_string = v8::ScriptData::PreCompile( 14423 v8::ScriptData* sd_from_external_string = v8::ScriptData::PreCompile(
14405 v8::String::NewExternal(resource)); 14424 v8::String::NewExternal(resource));
14406 14425
14407 v8::ScriptData* sd_from_string = v8::ScriptData::PreCompile( 14426 v8::ScriptData* sd_from_string = v8::ScriptData::PreCompile(
14408 v8::String::New(cstring)); 14427 v8::String::NewFromUtf8(isolate, cstring));
14409 14428
14410 CHECK_EQ(sd_from_cstring->Length(), sd_from_external_string->Length()); 14429 CHECK_EQ(sd_from_cstring->Length(), sd_from_external_string->Length());
14411 CHECK_EQ(0, memcmp(sd_from_cstring->Data(), 14430 CHECK_EQ(0, memcmp(sd_from_cstring->Data(),
14412 sd_from_external_string->Data(), 14431 sd_from_external_string->Data(),
14413 sd_from_cstring->Length())); 14432 sd_from_cstring->Length()));
14414 14433
14415 CHECK_EQ(sd_from_cstring->Length(), sd_from_string->Length()); 14434 CHECK_EQ(sd_from_cstring->Length(), sd_from_string->Length());
14416 CHECK_EQ(0, memcmp(sd_from_cstring->Data(), 14435 CHECK_EQ(0, memcmp(sd_from_cstring->Data(),
14417 sd_from_string->Data(), 14436 sd_from_string->Data(),
14418 sd_from_cstring->Length())); 14437 sd_from_cstring->Length()));
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
14613 "/[^a-z]/.test(slice);" 14632 "/[^a-z]/.test(slice);"
14614 "/[^a-z]/.test(slice_on_cons);"); 14633 "/[^a-z]/.test(slice_on_cons);");
14615 const char* expected_cons = 14634 const char* expected_cons =
14616 "Now is the time for all good men to come to the aid of the party" 14635 "Now is the time for all good men to come to the aid of the party"
14617 "Now is the time for all good men to come to the aid of the party"; 14636 "Now is the time for all good men to come to the aid of the party";
14618 const char* expected_slice = 14637 const char* expected_slice =
14619 "ow is the time for all good men to come to the aid of the part"; 14638 "ow is the time for all good men to come to the aid of the part";
14620 const char* expected_slice_on_cons = 14639 const char* expected_slice_on_cons =
14621 "ow is the time for all good men to come to the aid of the party" 14640 "ow is the time for all good men to come to the aid of the party"
14622 "Now is the time for all good men to come to the aid of the part"; 14641 "Now is the time for all good men to come to the aid of the part";
14623 CHECK_EQ(String::New(expected_cons), 14642 CHECK_EQ(String::NewFromUtf8(env->GetIsolate(), expected_cons),
14624 env->Global()->Get(v8_str("cons"))); 14643 env->Global()->Get(v8_str("cons")));
14625 CHECK_EQ(String::New(expected_slice), 14644 CHECK_EQ(String::NewFromUtf8(env->GetIsolate(), expected_slice),
14626 env->Global()->Get(v8_str("slice"))); 14645 env->Global()->Get(v8_str("slice")));
14627 CHECK_EQ(String::New(expected_slice_on_cons), 14646 CHECK_EQ(String::NewFromUtf8(env->GetIsolate(), expected_slice_on_cons),
14628 env->Global()->Get(v8_str("slice_on_cons"))); 14647 env->Global()->Get(v8_str("slice_on_cons")));
14629 } 14648 }
14630 i::DeleteArray(two_byte_string); 14649 i::DeleteArray(two_byte_string);
14631 } 14650 }
14632 14651
14633 14652
14634 TEST(CompileExternalTwoByteSource) { 14653 TEST(CompileExternalTwoByteSource) {
14635 LocalContext context; 14654 LocalContext context;
14636 v8::HandleScope scope(context->GetIsolate()); 14655 v8::HandleScope scope(context->GetIsolate());
14637 14656
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
14718 14737
14719 v8::TryCatch try_catch; 14738 v8::TryCatch try_catch;
14720 timeout_thread.Start(); 14739 timeout_thread.Start();
14721 14740
14722 CompileRun("/((a*)*)*b/.exec(a)"); 14741 CompileRun("/((a*)*)*b/.exec(a)");
14723 CHECK(try_catch.HasTerminated()); 14742 CHECK(try_catch.HasTerminated());
14724 14743
14725 timeout_thread.Join(); 14744 timeout_thread.Join();
14726 14745
14727 delete regexp_interruption_data.string_resource; 14746 delete regexp_interruption_data.string_resource;
14728 regexp_interruption_data.string.Dispose(); 14747 regexp_interruption_data.string.Reset();
14729 } 14748 }
14730 14749
14731 #endif // V8_INTERPRETED_REGEXP 14750 #endif // V8_INTERPRETED_REGEXP
14732 14751
14733 14752
14734 // Test that we cannot set a property on the global object if there 14753 // Test that we cannot set a property on the global object if there
14735 // is a read-only property in the prototype chain. 14754 // is a read-only property in the prototype chain.
14736 TEST(ReadOnlyPropertyInGlobalProto) { 14755 TEST(ReadOnlyPropertyInGlobalProto) {
14737 i::FLAG_es5_readonly = true; 14756 i::FLAG_es5_readonly = true;
14738 v8::HandleScope scope(CcTest::isolate()); 14757 v8::HandleScope scope(CcTest::isolate());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
14783 } 14802 }
14784 14803
14785 14804
14786 TEST(ForceSet) { 14805 TEST(ForceSet) {
14787 force_set_get_count = 0; 14806 force_set_get_count = 0;
14788 force_set_set_count = 0; 14807 force_set_set_count = 0;
14789 pass_on_get = false; 14808 pass_on_get = false;
14790 14809
14791 v8::HandleScope scope(CcTest::isolate()); 14810 v8::HandleScope scope(CcTest::isolate());
14792 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14811 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14793 v8::Handle<v8::String> access_property = v8::String::New("a"); 14812 v8::Handle<v8::String> access_property =
14813 v8::String::NewFromUtf8(CcTest::isolate(), "a");
14794 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter); 14814 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter);
14795 LocalContext context(NULL, templ); 14815 LocalContext context(NULL, templ);
14796 v8::Handle<v8::Object> global = context->Global(); 14816 v8::Handle<v8::Object> global = context->Global();
14797 14817
14798 // Ordinary properties 14818 // Ordinary properties
14799 v8::Handle<v8::String> simple_property = v8::String::New("p"); 14819 v8::Handle<v8::String> simple_property =
14820 v8::String::NewFromUtf8(CcTest::isolate(), "p");
14800 global->Set(simple_property, v8::Int32::New(4), v8::ReadOnly); 14821 global->Set(simple_property, v8::Int32::New(4), v8::ReadOnly);
14801 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 14822 CHECK_EQ(4, global->Get(simple_property)->Int32Value());
14802 // This should fail because the property is read-only 14823 // This should fail because the property is read-only
14803 global->Set(simple_property, v8::Int32::New(5)); 14824 global->Set(simple_property, v8::Int32::New(5));
14804 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 14825 CHECK_EQ(4, global->Get(simple_property)->Int32Value());
14805 // This should succeed even though the property is read-only 14826 // This should succeed even though the property is read-only
14806 global->ForceSet(simple_property, v8::Int32::New(6)); 14827 global->ForceSet(simple_property, v8::Int32::New(6));
14807 CHECK_EQ(6, global->Get(simple_property)->Int32Value()); 14828 CHECK_EQ(6, global->Get(simple_property)->Int32Value());
14808 14829
14809 // Accessors 14830 // Accessors
(...skipping 19 matching lines...) Expand all
14829 force_set_get_count = 0; 14850 force_set_get_count = 0;
14830 force_set_set_count = 0; 14851 force_set_set_count = 0;
14831 pass_on_get = false; 14852 pass_on_get = false;
14832 14853
14833 v8::HandleScope scope(CcTest::isolate()); 14854 v8::HandleScope scope(CcTest::isolate());
14834 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14855 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14835 templ->SetNamedPropertyHandler(ForceSetGetter, ForceSetInterceptSetter); 14856 templ->SetNamedPropertyHandler(ForceSetGetter, ForceSetInterceptSetter);
14836 LocalContext context(NULL, templ); 14857 LocalContext context(NULL, templ);
14837 v8::Handle<v8::Object> global = context->Global(); 14858 v8::Handle<v8::Object> global = context->Global();
14838 14859
14839 v8::Handle<v8::String> some_property = v8::String::New("a"); 14860 v8::Handle<v8::String> some_property =
14861 v8::String::NewFromUtf8(CcTest::isolate(), "a");
14840 CHECK_EQ(0, force_set_set_count); 14862 CHECK_EQ(0, force_set_set_count);
14841 CHECK_EQ(0, force_set_get_count); 14863 CHECK_EQ(0, force_set_get_count);
14842 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 14864 CHECK_EQ(3, global->Get(some_property)->Int32Value());
14843 // Setting the property shouldn't override it, just call the setter 14865 // Setting the property shouldn't override it, just call the setter
14844 // which in this case does nothing. 14866 // which in this case does nothing.
14845 global->Set(some_property, v8::Int32::New(7)); 14867 global->Set(some_property, v8::Int32::New(7));
14846 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 14868 CHECK_EQ(3, global->Get(some_property)->Int32Value());
14847 CHECK_EQ(1, force_set_set_count); 14869 CHECK_EQ(1, force_set_set_count);
14848 CHECK_EQ(2, force_set_get_count); 14870 CHECK_EQ(2, force_set_get_count);
14849 // Getting the property when the interceptor returns an empty handle 14871 // Getting the property when the interceptor returns an empty handle
14850 // should yield undefined, since the property isn't present on the 14872 // should yield undefined, since the property isn't present on the
14851 // object itself yet. 14873 // object itself yet.
14852 pass_on_get = true; 14874 pass_on_get = true;
14853 CHECK(global->Get(some_property)->IsUndefined()); 14875 CHECK(global->Get(some_property)->IsUndefined());
14854 CHECK_EQ(1, force_set_set_count); 14876 CHECK_EQ(1, force_set_set_count);
14855 CHECK_EQ(3, force_set_get_count); 14877 CHECK_EQ(3, force_set_get_count);
14856 // Forcing the property to be set should cause the value to be 14878 // Forcing the property to be set should cause the value to be
14857 // set locally without calling the interceptor. 14879 // set locally without calling the interceptor.
14858 global->ForceSet(some_property, v8::Int32::New(8)); 14880 global->ForceSet(some_property, v8::Int32::New(8));
14859 CHECK_EQ(8, global->Get(some_property)->Int32Value()); 14881 CHECK_EQ(8, global->Get(some_property)->Int32Value());
14860 CHECK_EQ(1, force_set_set_count); 14882 CHECK_EQ(1, force_set_set_count);
14861 CHECK_EQ(4, force_set_get_count); 14883 CHECK_EQ(4, force_set_get_count);
14862 // Reenabling the interceptor should cause it to take precedence over 14884 // Reenabling the interceptor should cause it to take precedence over
14863 // the property 14885 // the property
14864 pass_on_get = false; 14886 pass_on_get = false;
14865 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 14887 CHECK_EQ(3, global->Get(some_property)->Int32Value());
14866 CHECK_EQ(1, force_set_set_count); 14888 CHECK_EQ(1, force_set_set_count);
14867 CHECK_EQ(5, force_set_get_count); 14889 CHECK_EQ(5, force_set_get_count);
14868 // The interceptor should also work for other properties 14890 // The interceptor should also work for other properties
14869 CHECK_EQ(3, global->Get(v8::String::New("b"))->Int32Value()); 14891 CHECK_EQ(3, global->Get(v8::String::NewFromUtf8(CcTest::isolate(), "b"))
14892 ->Int32Value());
14870 CHECK_EQ(1, force_set_set_count); 14893 CHECK_EQ(1, force_set_set_count);
14871 CHECK_EQ(6, force_set_get_count); 14894 CHECK_EQ(6, force_set_get_count);
14872 } 14895 }
14873 14896
14874 14897
14875 THREADED_TEST(ForceDelete) { 14898 THREADED_TEST(ForceDelete) {
14876 v8::HandleScope scope(CcTest::isolate()); 14899 v8::HandleScope scope(CcTest::isolate());
14877 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14900 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14878 LocalContext context(NULL, templ); 14901 LocalContext context(NULL, templ);
14879 v8::Handle<v8::Object> global = context->Global(); 14902 v8::Handle<v8::Object> global = context->Global();
14880 14903
14881 // Ordinary properties 14904 // Ordinary properties
14882 v8::Handle<v8::String> simple_property = v8::String::New("p"); 14905 v8::Handle<v8::String> simple_property =
14906 v8::String::NewFromUtf8(CcTest::isolate(), "p");
14883 global->Set(simple_property, v8::Int32::New(4), v8::DontDelete); 14907 global->Set(simple_property, v8::Int32::New(4), v8::DontDelete);
14884 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 14908 CHECK_EQ(4, global->Get(simple_property)->Int32Value());
14885 // This should fail because the property is dont-delete. 14909 // This should fail because the property is dont-delete.
14886 CHECK(!global->Delete(simple_property)); 14910 CHECK(!global->Delete(simple_property));
14887 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 14911 CHECK_EQ(4, global->Get(simple_property)->Int32Value());
14888 // This should succeed even though the property is dont-delete. 14912 // This should succeed even though the property is dont-delete.
14889 CHECK(global->ForceDelete(simple_property)); 14913 CHECK(global->ForceDelete(simple_property));
14890 CHECK(global->Get(simple_property)->IsUndefined()); 14914 CHECK(global->Get(simple_property)->IsUndefined());
14891 } 14915 }
14892 14916
(...skipping 14 matching lines...) Expand all
14907 THREADED_TEST(ForceDeleteWithInterceptor) { 14931 THREADED_TEST(ForceDeleteWithInterceptor) {
14908 force_delete_interceptor_count = 0; 14932 force_delete_interceptor_count = 0;
14909 pass_on_delete = false; 14933 pass_on_delete = false;
14910 14934
14911 v8::HandleScope scope(CcTest::isolate()); 14935 v8::HandleScope scope(CcTest::isolate());
14912 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); 14936 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
14913 templ->SetNamedPropertyHandler(0, 0, 0, ForceDeleteDeleter); 14937 templ->SetNamedPropertyHandler(0, 0, 0, ForceDeleteDeleter);
14914 LocalContext context(NULL, templ); 14938 LocalContext context(NULL, templ);
14915 v8::Handle<v8::Object> global = context->Global(); 14939 v8::Handle<v8::Object> global = context->Global();
14916 14940
14917 v8::Handle<v8::String> some_property = v8::String::New("a"); 14941 v8::Handle<v8::String> some_property =
14942 v8::String::NewFromUtf8(CcTest::isolate(), "a");
14918 global->Set(some_property, v8::Integer::New(42), v8::DontDelete); 14943 global->Set(some_property, v8::Integer::New(42), v8::DontDelete);
14919 14944
14920 // Deleting a property should get intercepted and nothing should 14945 // Deleting a property should get intercepted and nothing should
14921 // happen. 14946 // happen.
14922 CHECK_EQ(0, force_delete_interceptor_count); 14947 CHECK_EQ(0, force_delete_interceptor_count);
14923 CHECK(global->Delete(some_property)); 14948 CHECK(global->Delete(some_property));
14924 CHECK_EQ(1, force_delete_interceptor_count); 14949 CHECK_EQ(1, force_delete_interceptor_count);
14925 CHECK_EQ(42, global->Get(some_property)->Int32Value()); 14950 CHECK_EQ(42, global->Get(some_property)->Int32Value());
14926 // Deleting the property when the interceptor returns an empty 14951 // Deleting the property when the interceptor returns an empty
14927 // handle should not delete the property since it is DontDelete. 14952 // handle should not delete the property since it is DontDelete.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
14973 v8::Local<v8::Value> foo = ctx1->Global()->Get(v8_str("foo")); 14998 v8::Local<v8::Value> foo = ctx1->Global()->Get(v8_str("foo"));
14974 ctx2->Enter(); 14999 ctx2->Enter();
14975 ctx2->Global()->Set(v8_str("o"), foo); 15000 ctx2->Global()->Set(v8_str("o"), foo);
14976 v8::Local<v8::Value> res = CompileRun( 15001 v8::Local<v8::Value> res = CompileRun(
14977 "function f() { return o(); }" 15002 "function f() { return o(); }"
14978 "for (var i = 0; i < 10; ++i) f();" 15003 "for (var i = 0; i < 10; ++i) f();"
14979 "%OptimizeFunctionOnNextCall(f);" 15004 "%OptimizeFunctionOnNextCall(f);"
14980 "f();"); 15005 "f();");
14981 CHECK_EQ(42, res->Int32Value()); 15006 CHECK_EQ(42, res->Int32Value());
14982 ctx2->Exit(); 15007 ctx2->Exit();
14983 v8::Handle<v8::String> G_property = v8::String::New("G"); 15008 v8::Handle<v8::String> G_property =
15009 v8::String::NewFromUtf8(CcTest::isolate(), "G");
14984 CHECK(ctx1->Global()->ForceDelete(G_property)); 15010 CHECK(ctx1->Global()->ForceDelete(G_property));
14985 ctx2->Enter(); 15011 ctx2->Enter();
14986 ExpectString( 15012 ExpectString(
14987 "(function() {" 15013 "(function() {"
14988 " try {" 15014 " try {"
14989 " return f();" 15015 " return f();"
14990 " } catch(e) {" 15016 " } catch(e) {"
14991 " return e.toString();" 15017 " return e.toString();"
14992 " }" 15018 " }"
14993 " })()", 15019 " })()",
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
15091 // Regression test for issue 398. 15117 // Regression test for issue 398.
15092 // If a function is added to an object, creating a constant function 15118 // If a function is added to an object, creating a constant function
15093 // field, and the result is cloned, replacing the constant function on the 15119 // field, and the result is cloned, replacing the constant function on the
15094 // original should not affect the clone. 15120 // original should not affect the clone.
15095 // See http://code.google.com/p/v8/issues/detail?id=398 15121 // See http://code.google.com/p/v8/issues/detail?id=398
15096 THREADED_TEST(ReplaceConstantFunction) { 15122 THREADED_TEST(ReplaceConstantFunction) {
15097 LocalContext context; 15123 LocalContext context;
15098 v8::HandleScope scope(context->GetIsolate()); 15124 v8::HandleScope scope(context->GetIsolate());
15099 v8::Handle<v8::Object> obj = v8::Object::New(); 15125 v8::Handle<v8::Object> obj = v8::Object::New();
15100 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New(); 15126 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New();
15101 v8::Handle<v8::String> foo_string = v8::String::New("foo"); 15127 v8::Handle<v8::String> foo_string =
15128 v8::String::NewFromUtf8(context->GetIsolate(), "foo");
15102 obj->Set(foo_string, func_templ->GetFunction()); 15129 obj->Set(foo_string, func_templ->GetFunction());
15103 v8::Handle<v8::Object> obj_clone = obj->Clone(); 15130 v8::Handle<v8::Object> obj_clone = obj->Clone();
15104 obj_clone->Set(foo_string, v8::String::New("Hello")); 15131 obj_clone->Set(foo_string,
15132 v8::String::NewFromUtf8(context->GetIsolate(), "Hello"));
15105 CHECK(!obj->Get(foo_string)->IsUndefined()); 15133 CHECK(!obj->Get(foo_string)->IsUndefined());
15106 } 15134 }
15107 15135
15108 15136
15109 // Regression test for http://crbug.com/16276. 15137 // Regression test for http://crbug.com/16276.
15110 THREADED_TEST(Regress16276) { 15138 THREADED_TEST(Regress16276) {
15111 LocalContext context; 15139 LocalContext context;
15112 v8::HandleScope scope(context->GetIsolate()); 15140 v8::HandleScope scope(context->GetIsolate());
15113 // Force the IC in f to be a dictionary load IC. 15141 // Force the IC in f to be a dictionary load IC.
15114 CompileRun("function f(obj) { return obj.x; }\n" 15142 CompileRun("function f(obj) { return obj.x; }\n"
(...skipping 1288 matching lines...) Expand 10 before | Expand all | Expand 10 after
16403 IS_ARRAY_BUFFER_VIEW_TEST(DataView) 16431 IS_ARRAY_BUFFER_VIEW_TEST(DataView)
16404 16432
16405 #undef IS_ARRAY_BUFFER_VIEW_TEST 16433 #undef IS_ARRAY_BUFFER_VIEW_TEST
16406 16434
16407 16435
16408 16436
16409 THREADED_TEST(ScriptContextDependence) { 16437 THREADED_TEST(ScriptContextDependence) {
16410 LocalContext c1; 16438 LocalContext c1;
16411 v8::HandleScope scope(c1->GetIsolate()); 16439 v8::HandleScope scope(c1->GetIsolate());
16412 const char *source = "foo"; 16440 const char *source = "foo";
16413 v8::Handle<v8::Script> dep = v8::Script::Compile(v8::String::New(source)); 16441 v8::Handle<v8::Script> dep =
16414 v8::Handle<v8::Script> indep = v8::Script::New(v8::String::New(source)); 16442 v8::Script::Compile(v8::String::NewFromUtf8(c1->GetIsolate(), source));
16415 c1->Global()->Set(v8::String::New("foo"), v8::Integer::New(100)); 16443 v8::Handle<v8::Script> indep =
16444 v8::Script::New(v8::String::NewFromUtf8(c1->GetIsolate(), source));
16445 c1->Global()->Set(v8::String::NewFromUtf8(c1->GetIsolate(), "foo"),
16446 v8::Integer::New(100));
16416 CHECK_EQ(dep->Run()->Int32Value(), 100); 16447 CHECK_EQ(dep->Run()->Int32Value(), 100);
16417 CHECK_EQ(indep->Run()->Int32Value(), 100); 16448 CHECK_EQ(indep->Run()->Int32Value(), 100);
16418 LocalContext c2; 16449 LocalContext c2;
16419 c2->Global()->Set(v8::String::New("foo"), v8::Integer::New(101)); 16450 c2->Global()->Set(v8::String::NewFromUtf8(c2->GetIsolate(), "foo"),
16451 v8::Integer::New(101));
16420 CHECK_EQ(dep->Run()->Int32Value(), 100); 16452 CHECK_EQ(dep->Run()->Int32Value(), 100);
16421 CHECK_EQ(indep->Run()->Int32Value(), 101); 16453 CHECK_EQ(indep->Run()->Int32Value(), 101);
16422 } 16454 }
16423 16455
16424 16456
16425 THREADED_TEST(StackTrace) { 16457 THREADED_TEST(StackTrace) {
16426 LocalContext context; 16458 LocalContext context;
16427 v8::HandleScope scope(context->GetIsolate()); 16459 v8::HandleScope scope(context->GetIsolate());
16428 v8::TryCatch try_catch; 16460 v8::TryCatch try_catch;
16429 const char *source = "function foo() { FAIL.FAIL; }; foo();"; 16461 const char *source = "function foo() { FAIL.FAIL; }; foo();";
16430 v8::Handle<v8::String> src = v8::String::New(source); 16462 v8::Handle<v8::String> src =
16431 v8::Handle<v8::String> origin = v8::String::New("stack-trace-test"); 16463 v8::String::NewFromUtf8(context->GetIsolate(), source);
16464 v8::Handle<v8::String> origin =
16465 v8::String::NewFromUtf8(context->GetIsolate(), "stack-trace-test");
16432 v8::Script::New(src, origin)->Run(); 16466 v8::Script::New(src, origin)->Run();
16433 CHECK(try_catch.HasCaught()); 16467 CHECK(try_catch.HasCaught());
16434 v8::String::Utf8Value stack(try_catch.StackTrace()); 16468 v8::String::Utf8Value stack(try_catch.StackTrace());
16435 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL); 16469 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL);
16436 } 16470 }
16437 16471
16438 16472
16439 // Checks that a StackFrame has certain expected values. 16473 // Checks that a StackFrame has certain expected values.
16440 void checkStackFrame(const char* expected_script_name, 16474 void checkStackFrame(const char* expected_script_name,
16441 const char* expected_func_name, int expected_line_number, 16475 const char* expected_func_name, int expected_line_number,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
16507 CHECK(stackTrace->AsArray()->IsArray()); 16541 CHECK(stackTrace->AsArray()->IsArray());
16508 } 16542 }
16509 } 16543 }
16510 16544
16511 16545
16512 // Tests the C++ StackTrace API. 16546 // Tests the C++ StackTrace API.
16513 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. 16547 // TODO(3074796): Reenable this as a THREADED_TEST once it passes.
16514 // THREADED_TEST(CaptureStackTrace) { 16548 // THREADED_TEST(CaptureStackTrace) {
16515 TEST(CaptureStackTrace) { 16549 TEST(CaptureStackTrace) {
16516 v8::HandleScope scope(CcTest::isolate()); 16550 v8::HandleScope scope(CcTest::isolate());
16517 v8::Handle<v8::String> origin = v8::String::New("capture-stack-trace-test"); 16551 v8::Handle<v8::String> origin =
16552 v8::String::NewFromUtf8(CcTest::isolate(), "capture-stack-trace-test");
16518 Local<ObjectTemplate> templ = ObjectTemplate::New(); 16553 Local<ObjectTemplate> templ = ObjectTemplate::New();
16519 templ->Set(v8_str("AnalyzeStackInNativeCode"), 16554 templ->Set(v8_str("AnalyzeStackInNativeCode"),
16520 v8::FunctionTemplate::New(AnalyzeStackInNativeCode)); 16555 v8::FunctionTemplate::New(AnalyzeStackInNativeCode));
16521 LocalContext context(0, templ); 16556 LocalContext context(0, templ);
16522 16557
16523 // Test getting OVERVIEW information. Should ignore information that is not 16558 // Test getting OVERVIEW information. Should ignore information that is not
16524 // script name, function name, line number, and column offset. 16559 // script name, function name, line number, and column offset.
16525 const char *overview_source = 16560 const char *overview_source =
16526 "function bar() {\n" 16561 "function bar() {\n"
16527 " var y; AnalyzeStackInNativeCode(1);\n" 16562 " var y; AnalyzeStackInNativeCode(1);\n"
16528 "}\n" 16563 "}\n"
16529 "function foo() {\n" 16564 "function foo() {\n"
16530 "\n" 16565 "\n"
16531 " bar();\n" 16566 " bar();\n"
16532 "}\n" 16567 "}\n"
16533 "var x;eval('new foo();');"; 16568 "var x;eval('new foo();');";
16534 v8::Handle<v8::String> overview_src = v8::String::New(overview_source); 16569 v8::Handle<v8::String> overview_src =
16570 v8::String::NewFromUtf8(CcTest::isolate(), overview_source);
16535 v8::Handle<Value> overview_result( 16571 v8::Handle<Value> overview_result(
16536 v8::Script::New(overview_src, origin)->Run()); 16572 v8::Script::New(overview_src, origin)->Run());
16537 CHECK(!overview_result.IsEmpty()); 16573 CHECK(!overview_result.IsEmpty());
16538 CHECK(overview_result->IsObject()); 16574 CHECK(overview_result->IsObject());
16539 16575
16540 // Test getting DETAILED information. 16576 // Test getting DETAILED information.
16541 const char *detailed_source = 16577 const char *detailed_source =
16542 "function bat() {AnalyzeStackInNativeCode(2);\n" 16578 "function bat() {AnalyzeStackInNativeCode(2);\n"
16543 "}\n" 16579 "}\n"
16544 "\n" 16580 "\n"
16545 "function baz() {\n" 16581 "function baz() {\n"
16546 " bat();\n" 16582 " bat();\n"
16547 "}\n" 16583 "}\n"
16548 "eval('new baz();');"; 16584 "eval('new baz();');";
16549 v8::Handle<v8::String> detailed_src = v8::String::New(detailed_source); 16585 v8::Handle<v8::String> detailed_src =
16586 v8::String::NewFromUtf8(CcTest::isolate(), detailed_source);
16550 // Make the script using a non-zero line and column offset. 16587 // Make the script using a non-zero line and column offset.
16551 v8::Handle<v8::Integer> line_offset = v8::Integer::New(3); 16588 v8::Handle<v8::Integer> line_offset = v8::Integer::New(3);
16552 v8::Handle<v8::Integer> column_offset = v8::Integer::New(5); 16589 v8::Handle<v8::Integer> column_offset = v8::Integer::New(5);
16553 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); 16590 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset);
16554 v8::Handle<v8::Script> detailed_script( 16591 v8::Handle<v8::Script> detailed_script(
16555 v8::Script::New(detailed_src, &detailed_origin)); 16592 v8::Script::New(detailed_src, &detailed_origin));
16556 v8::Handle<Value> detailed_result(detailed_script->Run()); 16593 v8::Handle<Value> detailed_result(detailed_script->Run());
16557 CHECK(!detailed_result.IsEmpty()); 16594 CHECK(!detailed_result.IsEmpty());
16558 CHECK(detailed_result->IsObject()); 16595 CHECK(detailed_result->IsObject());
16559 } 16596 }
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
16803 } 16840 }
16804 16841
16805 16842
16806 TEST(ScriptIdInStackTrace) { 16843 TEST(ScriptIdInStackTrace) {
16807 v8::HandleScope scope(CcTest::isolate()); 16844 v8::HandleScope scope(CcTest::isolate());
16808 Local<ObjectTemplate> templ = ObjectTemplate::New(); 16845 Local<ObjectTemplate> templ = ObjectTemplate::New();
16809 templ->Set(v8_str("AnalyzeScriptIdInStack"), 16846 templ->Set(v8_str("AnalyzeScriptIdInStack"),
16810 v8::FunctionTemplate::New(AnalyzeScriptIdInStack)); 16847 v8::FunctionTemplate::New(AnalyzeScriptIdInStack));
16811 LocalContext context(0, templ); 16848 LocalContext context(0, templ);
16812 16849
16813 v8::Handle<v8::String> scriptSource = v8::String::New( 16850 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8(
16851 CcTest::isolate(),
16814 "function foo() {\n" 16852 "function foo() {\n"
16815 " AnalyzeScriptIdInStack();" 16853 " AnalyzeScriptIdInStack();"
16816 "}\n" 16854 "}\n"
16817 "foo();\n"); 16855 "foo();\n");
16818 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); 16856 v8::ScriptOrigin origin =
16857 v8::ScriptOrigin(v8::String::NewFromUtf8(CcTest::isolate(), "test"));
16819 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); 16858 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin));
16820 script->Run(); 16859 script->Run();
16821 for (int i = 0; i < 2; i++) { 16860 for (int i = 0; i < 2; i++) {
16822 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); 16861 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo);
16823 CHECK_EQ(scriptIdInStack[i], script->GetId()); 16862 CHECK_EQ(scriptIdInStack[i], script->GetId());
16824 } 16863 }
16825 } 16864 }
16826 16865
16827 16866
16828 void AnalyzeStackOfInlineScriptWithSourceURL( 16867 void AnalyzeStackOfInlineScriptWithSourceURL(
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
17157 const char* string = "Some string"; 17196 const char* string = "Some string";
17158 uint16_t* two_byte_string = AsciiToTwoByteString(string); 17197 uint16_t* two_byte_string = AsciiToTwoByteString(string);
17159 TestResource* resource[4]; 17198 TestResource* resource[4];
17160 resource[0] = new TestResource(two_byte_string); 17199 resource[0] = new TestResource(two_byte_string);
17161 v8::Local<v8::String> string0 = v8::String::NewExternal(resource[0]); 17200 v8::Local<v8::String> string0 = v8::String::NewExternal(resource[0]);
17162 resource[1] = new TestResource(two_byte_string); 17201 resource[1] = new TestResource(two_byte_string);
17163 v8::Local<v8::String> string1 = v8::String::NewExternal(resource[1]); 17202 v8::Local<v8::String> string1 = v8::String::NewExternal(resource[1]);
17164 17203
17165 // Externalized symbol. 17204 // Externalized symbol.
17166 resource[2] = new TestResource(two_byte_string); 17205 resource[2] = new TestResource(two_byte_string);
17167 v8::Local<v8::String> string2 = v8::String::NewSymbol(string); 17206 v8::Local<v8::String> string2 = v8::String::NewFromUtf8(
17207 env->GetIsolate(), string, v8::String::kInternalizedString);
17168 CHECK(string2->MakeExternal(resource[2])); 17208 CHECK(string2->MakeExternal(resource[2]));
17169 17209
17170 // Symbolized External. 17210 // Symbolized External.
17171 resource[3] = new TestResource(AsciiToTwoByteString("Some other string")); 17211 resource[3] = new TestResource(AsciiToTwoByteString("Some other string"));
17172 v8::Local<v8::String> string3 = v8::String::NewExternal(resource[3]); 17212 v8::Local<v8::String> string3 = v8::String::NewExternal(resource[3]);
17173 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string. 17213 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string.
17174 // Turn into a symbol. 17214 // Turn into a symbol.
17175 i::Handle<i::String> string3_i = v8::Utils::OpenHandle(*string3); 17215 i::Handle<i::String> string3_i = v8::Utils::OpenHandle(*string3);
17176 CHECK(!CcTest::heap()->InternalizeString(*string3_i)->IsFailure()); 17216 CHECK(!CcTest::heap()->InternalizeString(*string3_i)->IsFailure());
17177 CHECK(string3_i->IsInternalizedString()); 17217 CHECK(string3_i->IsInternalizedString());
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
17332 tc.ReThrow(); 17372 tc.ReThrow();
17333 } 17373 }
17334 17374
17335 17375
17336 // Test that an exception can be propagated down through a spaghetti 17376 // Test that an exception can be propagated down through a spaghetti
17337 // stack using ReThrow. 17377 // stack using ReThrow.
17338 THREADED_TEST(SpaghettiStackReThrow) { 17378 THREADED_TEST(SpaghettiStackReThrow) {
17339 v8::HandleScope scope(CcTest::isolate()); 17379 v8::HandleScope scope(CcTest::isolate());
17340 LocalContext context; 17380 LocalContext context;
17341 context->Global()->Set( 17381 context->Global()->Set(
17342 v8::String::New("s"), 17382 v8::String::NewFromUtf8(CcTest::isolate(), "s"),
17343 v8::FunctionTemplate::New(SpaghettiIncident)->GetFunction()); 17383 v8::FunctionTemplate::New(SpaghettiIncident)->GetFunction());
17344 v8::TryCatch try_catch; 17384 v8::TryCatch try_catch;
17345 CompileRun( 17385 CompileRun(
17346 "var i = 0;" 17386 "var i = 0;"
17347 "var o = {" 17387 "var o = {"
17348 " toString: function () {" 17388 " toString: function () {"
17349 " if (i == 10) {" 17389 " if (i == 10) {"
17350 " throw 'Hey!';" 17390 " throw 'Hey!';"
17351 " } else {" 17391 " } else {"
17352 " i++;" 17392 " i++;"
(...skipping 20 matching lines...) Expand all
17373 other_context = Context::New(isolate); 17413 other_context = Context::New(isolate);
17374 17414
17375 // Context-dependent context data creates reference from the compilation 17415 // Context-dependent context data creates reference from the compilation
17376 // cache to the global object. 17416 // cache to the global object.
17377 const char* source_simple = "1"; 17417 const char* source_simple = "1";
17378 { 17418 {
17379 v8::HandleScope scope(isolate); 17419 v8::HandleScope scope(isolate);
17380 v8::Local<Context> context = Context::New(isolate); 17420 v8::Local<Context> context = Context::New(isolate);
17381 17421
17382 context->Enter(); 17422 context->Enter();
17383 Local<v8::String> obj = v8::String::New(""); 17423 Local<v8::String> obj = v8::String::NewFromUtf8(isolate, "");
17384 context->SetEmbedderData(0, obj); 17424 context->SetEmbedderData(0, obj);
17385 CompileRun(source_simple); 17425 CompileRun(source_simple);
17386 context->Exit(); 17426 context->Exit();
17387 } 17427 }
17388 v8::V8::ContextDisposedNotification(); 17428 v8::V8::ContextDisposedNotification();
17389 for (gc_count = 1; gc_count < 10; gc_count++) { 17429 for (gc_count = 1; gc_count < 10; gc_count++) {
17390 other_context->Enter(); 17430 other_context->Enter();
17391 CompileRun(source_simple); 17431 CompileRun(source_simple);
17392 other_context->Exit(); 17432 other_context->Exit();
17393 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 17433 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
17445 CHECK_GE(2, gc_count); 17485 CHECK_GE(2, gc_count);
17446 CHECK_EQ(1, GetGlobalObjectsCount()); 17486 CHECK_EQ(1, GetGlobalObjectsCount());
17447 17487
17448 v8::V8::ContextDisposedNotification(); 17488 v8::V8::ContextDisposedNotification();
17449 } 17489 }
17450 17490
17451 17491
17452 THREADED_TEST(ScriptOrigin) { 17492 THREADED_TEST(ScriptOrigin) {
17453 LocalContext env; 17493 LocalContext env;
17454 v8::HandleScope scope(env->GetIsolate()); 17494 v8::HandleScope scope(env->GetIsolate());
17455 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); 17495 v8::ScriptOrigin origin =
17456 v8::Handle<v8::String> script = v8::String::New( 17496 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
17457 "function f() {}\n\nfunction g() {}"); 17497 v8::Handle<v8::String> script = v8::String::NewFromUtf8(
17498 env->GetIsolate(), "function f() {}\n\nfunction g() {}");
17458 v8::Script::Compile(script, &origin)->Run(); 17499 v8::Script::Compile(script, &origin)->Run();
17459 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17500 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17460 env->Global()->Get(v8::String::New("f"))); 17501 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
17461 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 17502 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
17462 env->Global()->Get(v8::String::New("g"))); 17503 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g")));
17463 17504
17464 v8::ScriptOrigin script_origin_f = f->GetScriptOrigin(); 17505 v8::ScriptOrigin script_origin_f = f->GetScriptOrigin();
17465 CHECK_EQ("test", *v8::String::Utf8Value(script_origin_f.ResourceName())); 17506 CHECK_EQ("test", *v8::String::Utf8Value(script_origin_f.ResourceName()));
17466 CHECK_EQ(0, script_origin_f.ResourceLineOffset()->Int32Value()); 17507 CHECK_EQ(0, script_origin_f.ResourceLineOffset()->Int32Value());
17467 17508
17468 v8::ScriptOrigin script_origin_g = g->GetScriptOrigin(); 17509 v8::ScriptOrigin script_origin_g = g->GetScriptOrigin();
17469 CHECK_EQ("test", *v8::String::Utf8Value(script_origin_g.ResourceName())); 17510 CHECK_EQ("test", *v8::String::Utf8Value(script_origin_g.ResourceName()));
17470 CHECK_EQ(0, script_origin_g.ResourceLineOffset()->Int32Value()); 17511 CHECK_EQ(0, script_origin_g.ResourceLineOffset()->Int32Value());
17471 } 17512 }
17472 17513
17473 17514
17474 THREADED_TEST(FunctionGetInferredName) { 17515 THREADED_TEST(FunctionGetInferredName) {
17475 LocalContext env; 17516 LocalContext env;
17476 v8::HandleScope scope(env->GetIsolate()); 17517 v8::HandleScope scope(env->GetIsolate());
17477 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); 17518 v8::ScriptOrigin origin =
17478 v8::Handle<v8::String> script = v8::String::New( 17519 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
17520 v8::Handle<v8::String> script = v8::String::NewFromUtf8(
17521 env->GetIsolate(),
17479 "var foo = { bar : { baz : function() {}}}; var f = foo.bar.baz;"); 17522 "var foo = { bar : { baz : function() {}}}; var f = foo.bar.baz;");
17480 v8::Script::Compile(script, &origin)->Run(); 17523 v8::Script::Compile(script, &origin)->Run();
17481 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17524 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17482 env->Global()->Get(v8::String::New("f"))); 17525 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
17483 CHECK_EQ("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName())); 17526 CHECK_EQ("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName()));
17484 } 17527 }
17485 17528
17486 17529
17487 THREADED_TEST(FunctionGetDisplayName) { 17530 THREADED_TEST(FunctionGetDisplayName) {
17488 LocalContext env; 17531 LocalContext env;
17489 v8::HandleScope scope(env->GetIsolate()); 17532 v8::HandleScope scope(env->GetIsolate());
17490 const char* code = "var error = false;" 17533 const char* code = "var error = false;"
17491 "function a() { this.x = 1; };" 17534 "function a() { this.x = 1; };"
17492 "a.displayName = 'display_a';" 17535 "a.displayName = 'display_a';"
(...skipping 20 matching lines...) Expand all
17513 "});" 17556 "});"
17514 "function f() {};" 17557 "function f() {};"
17515 "f.displayName = { 'foo': 6, toString: function() {" 17558 "f.displayName = { 'foo': 6, toString: function() {"
17516 " error = true;" 17559 " error = true;"
17517 " return 'wrong_display_name';" 17560 " return 'wrong_display_name';"
17518 "}};" 17561 "}};"
17519 "var g = function() {" 17562 "var g = function() {"
17520 " arguments.callee.displayName = 'set_in_runtime';" 17563 " arguments.callee.displayName = 'set_in_runtime';"
17521 "}; g();" 17564 "}; g();"
17522 ; 17565 ;
17523 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); 17566 v8::ScriptOrigin origin =
17524 v8::Script::Compile(v8::String::New(code), &origin)->Run(); 17567 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
17525 v8::Local<v8::Value> error = env->Global()->Get(v8::String::New("error")); 17568 v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), code), &origin)
17569 ->Run();
17570 v8::Local<v8::Value> error =
17571 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "error"));
17526 v8::Local<v8::Function> a = v8::Local<v8::Function>::Cast( 17572 v8::Local<v8::Function> a = v8::Local<v8::Function>::Cast(
17527 env->Global()->Get(v8::String::New("a"))); 17573 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "a")));
17528 v8::Local<v8::Function> b = v8::Local<v8::Function>::Cast( 17574 v8::Local<v8::Function> b = v8::Local<v8::Function>::Cast(
17529 env->Global()->Get(v8::String::New("b"))); 17575 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "b")));
17530 v8::Local<v8::Function> c = v8::Local<v8::Function>::Cast( 17576 v8::Local<v8::Function> c = v8::Local<v8::Function>::Cast(
17531 env->Global()->Get(v8::String::New("c"))); 17577 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "c")));
17532 v8::Local<v8::Function> d = v8::Local<v8::Function>::Cast( 17578 v8::Local<v8::Function> d = v8::Local<v8::Function>::Cast(
17533 env->Global()->Get(v8::String::New("d"))); 17579 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "d")));
17534 v8::Local<v8::Function> e = v8::Local<v8::Function>::Cast( 17580 v8::Local<v8::Function> e = v8::Local<v8::Function>::Cast(
17535 env->Global()->Get(v8::String::New("e"))); 17581 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "e")));
17536 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17582 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17537 env->Global()->Get(v8::String::New("f"))); 17583 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
17538 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 17584 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
17539 env->Global()->Get(v8::String::New("g"))); 17585 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g")));
17540 CHECK_EQ(false, error->BooleanValue()); 17586 CHECK_EQ(false, error->BooleanValue());
17541 CHECK_EQ("display_a", *v8::String::Utf8Value(a->GetDisplayName())); 17587 CHECK_EQ("display_a", *v8::String::Utf8Value(a->GetDisplayName()));
17542 CHECK_EQ("display_b", *v8::String::Utf8Value(b->GetDisplayName())); 17588 CHECK_EQ("display_b", *v8::String::Utf8Value(b->GetDisplayName()));
17543 CHECK(c->GetDisplayName()->IsUndefined()); 17589 CHECK(c->GetDisplayName()->IsUndefined());
17544 CHECK(d->GetDisplayName()->IsUndefined()); 17590 CHECK(d->GetDisplayName()->IsUndefined());
17545 CHECK(e->GetDisplayName()->IsUndefined()); 17591 CHECK(e->GetDisplayName()->IsUndefined());
17546 CHECK(f->GetDisplayName()->IsUndefined()); 17592 CHECK(f->GetDisplayName()->IsUndefined());
17547 CHECK_EQ("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName())); 17593 CHECK_EQ("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName()));
17548 } 17594 }
17549 17595
17550 17596
17551 THREADED_TEST(ScriptLineNumber) { 17597 THREADED_TEST(ScriptLineNumber) {
17552 LocalContext env; 17598 LocalContext env;
17553 v8::HandleScope scope(env->GetIsolate()); 17599 v8::HandleScope scope(env->GetIsolate());
17554 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); 17600 v8::ScriptOrigin origin =
17555 v8::Handle<v8::String> script = v8::String::New( 17601 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
17556 "function f() {}\n\nfunction g() {}"); 17602 v8::Handle<v8::String> script = v8::String::NewFromUtf8(
17603 env->GetIsolate(), "function f() {}\n\nfunction g() {}");
17557 v8::Script::Compile(script, &origin)->Run(); 17604 v8::Script::Compile(script, &origin)->Run();
17558 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17605 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17559 env->Global()->Get(v8::String::New("f"))); 17606 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
17560 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 17607 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
17561 env->Global()->Get(v8::String::New("g"))); 17608 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g")));
17562 CHECK_EQ(0, f->GetScriptLineNumber()); 17609 CHECK_EQ(0, f->GetScriptLineNumber());
17563 CHECK_EQ(2, g->GetScriptLineNumber()); 17610 CHECK_EQ(2, g->GetScriptLineNumber());
17564 } 17611 }
17565 17612
17566 17613
17567 THREADED_TEST(ScriptColumnNumber) { 17614 THREADED_TEST(ScriptColumnNumber) {
17568 LocalContext env; 17615 LocalContext env;
17569 v8::HandleScope scope(env->GetIsolate()); 17616 v8::HandleScope scope(env->GetIsolate());
17570 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test"), 17617 v8::ScriptOrigin origin =
17571 v8::Integer::New(3), v8::Integer::New(2)); 17618 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"),
17572 v8::Handle<v8::String> script = v8::String::New( 17619 v8::Integer::New(3), v8::Integer::New(2));
17573 "function foo() {}\n\n function bar() {}"); 17620 v8::Handle<v8::String> script = v8::String::NewFromUtf8(
17621 env->GetIsolate(), "function foo() {}\n\n function bar() {}");
17574 v8::Script::Compile(script, &origin)->Run(); 17622 v8::Script::Compile(script, &origin)->Run();
17575 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 17623 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
17576 env->Global()->Get(v8::String::New("foo"))); 17624 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
17577 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( 17625 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast(
17578 env->Global()->Get(v8::String::New("bar"))); 17626 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "bar")));
17579 CHECK_EQ(14, foo->GetScriptColumnNumber()); 17627 CHECK_EQ(14, foo->GetScriptColumnNumber());
17580 CHECK_EQ(17, bar->GetScriptColumnNumber()); 17628 CHECK_EQ(17, bar->GetScriptColumnNumber());
17581 } 17629 }
17582 17630
17583 17631
17584 THREADED_TEST(FunctionIsBuiltin) { 17632 THREADED_TEST(FunctionIsBuiltin) {
17585 LocalContext env; 17633 LocalContext env;
17586 v8::HandleScope scope(env->GetIsolate()); 17634 v8::HandleScope scope(env->GetIsolate());
17587 v8::Local<v8::Function> f; 17635 v8::Local<v8::Function> f;
17588 f = v8::Local<v8::Function>::Cast(CompileRun("Math.floor")); 17636 f = v8::Local<v8::Function>::Cast(CompileRun("Math.floor"));
17589 CHECK(f->IsBuiltin()); 17637 CHECK(f->IsBuiltin());
17590 f = v8::Local<v8::Function>::Cast(CompileRun("Object")); 17638 f = v8::Local<v8::Function>::Cast(CompileRun("Object"));
17591 CHECK(f->IsBuiltin()); 17639 CHECK(f->IsBuiltin());
17592 f = v8::Local<v8::Function>::Cast(CompileRun("Object.__defineSetter__")); 17640 f = v8::Local<v8::Function>::Cast(CompileRun("Object.__defineSetter__"));
17593 CHECK(f->IsBuiltin()); 17641 CHECK(f->IsBuiltin());
17594 f = v8::Local<v8::Function>::Cast(CompileRun("Array.prototype.toString")); 17642 f = v8::Local<v8::Function>::Cast(CompileRun("Array.prototype.toString"));
17595 CHECK(f->IsBuiltin()); 17643 CHECK(f->IsBuiltin());
17596 f = v8::Local<v8::Function>::Cast(CompileRun("function a() {}; a;")); 17644 f = v8::Local<v8::Function>::Cast(CompileRun("function a() {}; a;"));
17597 CHECK(!f->IsBuiltin()); 17645 CHECK(!f->IsBuiltin());
17598 } 17646 }
17599 17647
17600 17648
17601 THREADED_TEST(FunctionGetScriptId) { 17649 THREADED_TEST(FunctionGetScriptId) {
17602 LocalContext env; 17650 LocalContext env;
17603 v8::HandleScope scope(env->GetIsolate()); 17651 v8::HandleScope scope(env->GetIsolate());
17604 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test"), 17652 v8::ScriptOrigin origin =
17605 v8::Integer::New(3), v8::Integer::New(2)); 17653 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"),
17606 v8::Handle<v8::String> scriptSource = v8::String::New( 17654 v8::Integer::New(3), v8::Integer::New(2));
17607 "function foo() {}\n\n function bar() {}"); 17655 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8(
17656 env->GetIsolate(), "function foo() {}\n\n function bar() {}");
17608 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); 17657 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin));
17609 script->Run(); 17658 script->Run();
17610 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 17659 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
17611 env->Global()->Get(v8::String::New("foo"))); 17660 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
17612 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( 17661 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast(
17613 env->Global()->Get(v8::String::New("bar"))); 17662 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "bar")));
17614 CHECK_EQ(script->Id(), foo->GetScriptId()); 17663 CHECK_EQ(script->GetId(), foo->ScriptId());
17615 CHECK_EQ(script->Id(), bar->GetScriptId()); 17664 CHECK_EQ(script->GetId(), bar->ScriptId());
17616 } 17665 }
17617 17666
17618 17667
17619 static void GetterWhichReturns42( 17668 static void GetterWhichReturns42(
17620 Local<String> name, 17669 Local<String> name,
17621 const v8::PropertyCallbackInfo<v8::Value>& info) { 17670 const v8::PropertyCallbackInfo<v8::Value>& info) {
17622 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 17671 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
17623 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 17672 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
17624 info.GetReturnValue().Set(v8_num(42)); 17673 info.GetReturnValue().Set(v8_num(42));
17625 } 17674 }
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
18401 { 18450 {
18402 v8::HandleScope scope(v8::Isolate::GetCurrent()); 18451 v8::HandleScope scope(v8::Isolate::GetCurrent());
18403 v8::Local<v8::Context> context = 18452 v8::Local<v8::Context> context =
18404 v8::Local<v8::Context>::New(v8::Isolate::GetCurrent(), context1); 18453 v8::Local<v8::Context>::New(v8::Isolate::GetCurrent(), context1);
18405 v8::Context::Scope context_scope(context); 18454 v8::Context::Scope context_scope(context);
18406 ExpectString("function f() { return foo; }; f()", "isolate 1"); 18455 ExpectString("function f() { return foo; }; f()", "isolate 1");
18407 } 18456 }
18408 18457
18409 { 18458 {
18410 v8::Isolate::Scope iscope(isolate2); 18459 v8::Isolate::Scope iscope(isolate2);
18411 context2.Dispose(); 18460 context2.Reset();
18412 } 18461 }
18413 18462
18414 context1.Dispose(); 18463 context1.Reset();
18415 isolate1->Exit(); 18464 isolate1->Exit();
18416 18465
18417 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 18466 v8::V8::SetFatalErrorHandler(StoringErrorCallback);
18418 last_location = last_message = NULL; 18467 last_location = last_message = NULL;
18419 18468
18420 isolate1->Dispose(); 18469 isolate1->Dispose();
18421 CHECK_EQ(last_location, NULL); 18470 CHECK_EQ(last_location, NULL);
18422 CHECK_EQ(last_message, NULL); 18471 CHECK_EQ(last_message, NULL);
18423 18472
18424 isolate2->Dispose(); 18473 isolate2->Dispose();
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
18819 v8::HandleScope scope(isolate); 18868 v8::HandleScope scope(isolate);
18820 v8::Persistent<v8::Object> object(isolate, v8::Object::New()); 18869 v8::Persistent<v8::Object> object(isolate, v8::Object::New());
18821 CHECK_EQ(0, object.WrapperClassId()); 18870 CHECK_EQ(0, object.WrapperClassId());
18822 object.SetWrapperClassId(42); 18871 object.SetWrapperClassId(42);
18823 CHECK_EQ(42, object.WrapperClassId()); 18872 CHECK_EQ(42, object.WrapperClassId());
18824 18873
18825 Visitor42 visitor(&object); 18874 Visitor42 visitor(&object);
18826 v8::V8::VisitHandlesWithClassIds(&visitor); 18875 v8::V8::VisitHandlesWithClassIds(&visitor);
18827 CHECK_EQ(1, visitor.counter_); 18876 CHECK_EQ(1, visitor.counter_);
18828 18877
18829 object.Dispose(); 18878 object.Reset();
18830 } 18879 }
18831 18880
18832 18881
18833 TEST(WrapperClassId) { 18882 TEST(WrapperClassId) {
18834 LocalContext context; 18883 LocalContext context;
18835 v8::Isolate* isolate = context->GetIsolate(); 18884 v8::Isolate* isolate = context->GetIsolate();
18836 v8::HandleScope scope(isolate); 18885 v8::HandleScope scope(isolate);
18837 v8::Persistent<v8::Object> object(isolate, v8::Object::New()); 18886 v8::Persistent<v8::Object> object(isolate, v8::Object::New());
18838 CHECK_EQ(0, object.WrapperClassId()); 18887 CHECK_EQ(0, object.WrapperClassId());
18839 object.SetWrapperClassId(65535); 18888 object.SetWrapperClassId(65535);
18840 CHECK_EQ(65535, object.WrapperClassId()); 18889 CHECK_EQ(65535, object.WrapperClassId());
18841 object.Dispose(); 18890 object.Reset();
18842 } 18891 }
18843 18892
18844 18893
18845 TEST(PersistentHandleInNewSpaceVisitor) { 18894 TEST(PersistentHandleInNewSpaceVisitor) {
18846 LocalContext context; 18895 LocalContext context;
18847 v8::Isolate* isolate = context->GetIsolate(); 18896 v8::Isolate* isolate = context->GetIsolate();
18848 v8::HandleScope scope(isolate); 18897 v8::HandleScope scope(isolate);
18849 v8::Persistent<v8::Object> object1(isolate, v8::Object::New()); 18898 v8::Persistent<v8::Object> object1(isolate, v8::Object::New());
18850 CHECK_EQ(0, object1.WrapperClassId()); 18899 CHECK_EQ(0, object1.WrapperClassId());
18851 object1.SetWrapperClassId(42); 18900 object1.SetWrapperClassId(42);
18852 CHECK_EQ(42, object1.WrapperClassId()); 18901 CHECK_EQ(42, object1.WrapperClassId());
18853 18902
18854 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 18903 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
18855 18904
18856 v8::Persistent<v8::Object> object2(isolate, v8::Object::New()); 18905 v8::Persistent<v8::Object> object2(isolate, v8::Object::New());
18857 CHECK_EQ(0, object2.WrapperClassId()); 18906 CHECK_EQ(0, object2.WrapperClassId());
18858 object2.SetWrapperClassId(42); 18907 object2.SetWrapperClassId(42);
18859 CHECK_EQ(42, object2.WrapperClassId()); 18908 CHECK_EQ(42, object2.WrapperClassId());
18860 18909
18861 Visitor42 visitor(&object2); 18910 Visitor42 visitor(&object2);
18862 v8::V8::VisitHandlesForPartialDependence(isolate, &visitor); 18911 v8::V8::VisitHandlesForPartialDependence(isolate, &visitor);
18863 CHECK_EQ(1, visitor.counter_); 18912 CHECK_EQ(1, visitor.counter_);
18864 18913
18865 object1.Dispose(); 18914 object1.Reset();
18866 object2.Dispose(); 18915 object2.Reset();
18867 } 18916 }
18868 18917
18869 18918
18870 TEST(RegExp) { 18919 TEST(RegExp) {
18871 LocalContext context; 18920 LocalContext context;
18872 v8::HandleScope scope(context->GetIsolate()); 18921 v8::HandleScope scope(context->GetIsolate());
18873 18922
18874 v8::Handle<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone); 18923 v8::Handle<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone);
18875 CHECK(re->IsRegExp()); 18924 CHECK(re->IsRegExp());
18876 CHECK(re->GetSource()->Equals(v8_str("foo"))); 18925 CHECK(re->GetSource()->Equals(v8_str("foo")));
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
19671 v8::HandleScope scope(env->GetIsolate()); 19720 v8::HandleScope scope(env->GetIsolate());
19672 v8::Handle<v8::FunctionTemplate> recursive_runtime = 19721 v8::Handle<v8::FunctionTemplate> recursive_runtime =
19673 v8::FunctionTemplate::New(RecursiveCall); 19722 v8::FunctionTemplate::New(RecursiveCall);
19674 env->Global()->Set(v8_str("recursion"), 19723 env->Global()->Set(v8_str("recursion"),
19675 recursive_runtime->GetFunction()); 19724 recursive_runtime->GetFunction());
19676 // Adding the same callback a second time has no effect. 19725 // Adding the same callback a second time has no effect.
19677 v8::V8::AddCallCompletedCallback(CallCompletedCallback1); 19726 v8::V8::AddCallCompletedCallback(CallCompletedCallback1);
19678 v8::V8::AddCallCompletedCallback(CallCompletedCallback1); 19727 v8::V8::AddCallCompletedCallback(CallCompletedCallback1);
19679 v8::V8::AddCallCompletedCallback(CallCompletedCallback2); 19728 v8::V8::AddCallCompletedCallback(CallCompletedCallback2);
19680 i::OS::Print("--- Script (1) ---\n"); 19729 i::OS::Print("--- Script (1) ---\n");
19681 Local<Script> script = 19730 Local<Script> script = v8::Script::Compile(
19682 v8::Script::Compile(v8::String::New("recursion(0)")); 19731 v8::String::NewFromUtf8(env->GetIsolate(), "recursion(0)"));
19683 script->Run(); 19732 script->Run();
19684 CHECK_EQ(3, callback_fired); 19733 CHECK_EQ(3, callback_fired);
19685 19734
19686 i::OS::Print("\n--- Script (2) ---\n"); 19735 i::OS::Print("\n--- Script (2) ---\n");
19687 callback_fired = 0; 19736 callback_fired = 0;
19688 v8::V8::RemoveCallCompletedCallback(CallCompletedCallback1); 19737 v8::V8::RemoveCallCompletedCallback(CallCompletedCallback1);
19689 script->Run(); 19738 script->Run();
19690 CHECK_EQ(2, callback_fired); 19739 CHECK_EQ(2, callback_fired);
19691 19740
19692 i::OS::Print("\n--- Function ---\n"); 19741 i::OS::Print("\n--- Function ---\n");
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after
20285 Local<Object> map_object(Local<Object>::Cast(map_value)); 20334 Local<Object> map_object(Local<Object>::Cast(map_value));
20286 CHECK_EQ(0, map_object->InternalFieldCount()); 20335 CHECK_EQ(0, map_object->InternalFieldCount());
20287 } 20336 }
20288 20337
20289 20338
20290 THREADED_TEST(Regress2746) { 20339 THREADED_TEST(Regress2746) {
20291 LocalContext context; 20340 LocalContext context;
20292 v8::Isolate* isolate = context->GetIsolate(); 20341 v8::Isolate* isolate = context->GetIsolate();
20293 v8::HandleScope scope(isolate); 20342 v8::HandleScope scope(isolate);
20294 Local<Object> obj = Object::New(); 20343 Local<Object> obj = Object::New();
20295 Local<String> key = String::New("key"); 20344 Local<String> key = String::NewFromUtf8(context->GetIsolate(), "key");
20296 obj->SetHiddenValue(key, v8::Undefined(isolate)); 20345 obj->SetHiddenValue(key, v8::Undefined(isolate));
20297 Local<Value> value = obj->GetHiddenValue(key); 20346 Local<Value> value = obj->GetHiddenValue(key);
20298 CHECK(!value.IsEmpty()); 20347 CHECK(!value.IsEmpty());
20299 CHECK(value->IsUndefined()); 20348 CHECK(value->IsUndefined());
20300 } 20349 }
20301 20350
20302 20351
20303 THREADED_TEST(Regress260106) { 20352 THREADED_TEST(Regress260106) {
20304 LocalContext context; 20353 LocalContext context;
20305 v8::HandleScope scope(context->GetIsolate()); 20354 v8::HandleScope scope(context->GetIsolate());
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
20731 } 20780 }
20732 for (int i = 0; i < runs; i++) { 20781 for (int i = 0; i < runs; i++) {
20733 Local<String> expected; 20782 Local<String> expected;
20734 if (i != 0) { 20783 if (i != 0) {
20735 CHECK_EQ(v8_str("escape value"), values[i]); 20784 CHECK_EQ(v8_str("escape value"), values[i]);
20736 } else { 20785 } else {
20737 CHECK(values[i].IsEmpty()); 20786 CHECK(values[i].IsEmpty());
20738 } 20787 }
20739 } 20788 }
20740 } 20789 }
OLDNEW
« no previous file with comments | « test/cctest/test-alloc.cc ('k') | test/cctest/test-compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698