OLD | NEW |
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 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 .FromJust(); | 745 .FromJust(); |
746 CHECK(CompileRun("Object.getNotifier(obj)")->IsObject()); | 746 CHECK(CompileRun("Object.getNotifier(obj)")->IsObject()); |
747 } | 747 } |
748 } | 748 } |
749 | 749 |
750 | 750 |
751 static int GetGlobalObjectsCount() { | 751 static int GetGlobalObjectsCount() { |
752 int count = 0; | 752 int count = 0; |
753 i::HeapIterator it(CcTest::heap()); | 753 i::HeapIterator it(CcTest::heap()); |
754 for (i::HeapObject* object = it.next(); object != NULL; object = it.next()) | 754 for (i::HeapObject* object = it.next(); object != NULL; object = it.next()) |
755 if (object->IsJSGlobalObject()) count++; | 755 if (object->IsJSGlobalObject()) { |
756 return count; | 756 i::JSGlobalObject* g = i::JSGlobalObject::cast(object); |
| 757 // Skip dummy global object. |
| 758 if (i::GlobalDictionary::cast(g->properties())->NumberOfElements() != 0) { |
| 759 count++; |
| 760 } |
| 761 } |
| 762 // Subtract one to compensate for the code stub context that is always present |
| 763 return count - 1; |
757 } | 764 } |
758 | 765 |
759 | 766 |
760 static void CheckSurvivingGlobalObjectsCount(int expected) { | 767 static void CheckSurvivingGlobalObjectsCount(int expected) { |
761 // We need to collect all garbage twice to be sure that everything | 768 // We need to collect all garbage twice to be sure that everything |
762 // has been collected. This is because inline caches are cleared in | 769 // has been collected. This is because inline caches are cleared in |
763 // the first garbage collection but some of the maps have already | 770 // the first garbage collection but some of the maps have already |
764 // been marked at that point. Therefore some of the maps are not | 771 // been marked at that point. Therefore some of the maps are not |
765 // collected until the second garbage collection. | 772 // collected until the second garbage collection. |
766 CcTest::heap()->CollectAllGarbage(); | 773 CcTest::heap()->CollectAllGarbage(); |
(...skipping 20 matching lines...) Expand all Loading... |
787 context2->Global() | 794 context2->Global() |
788 ->Set(v8::Isolate::GetCurrent()->GetCurrentContext(), v8_str("obj"), | 795 ->Set(v8::Isolate::GetCurrent()->GetCurrentContext(), v8_str("obj"), |
789 object) | 796 object) |
790 .FromJust(); | 797 .FromJust(); |
791 CompileRun("function observer() {};" | 798 CompileRun("function observer() {};" |
792 "Object.observe(obj, observer, ['foo', 'bar', 'baz']);" | 799 "Object.observe(obj, observer, ['foo', 'bar', 'baz']);" |
793 "Object.unobserve(obj, observer);"); | 800 "Object.unobserve(obj, observer);"); |
794 } | 801 } |
795 | 802 |
796 CcTest::isolate()->ContextDisposedNotification(); | 803 CcTest::isolate()->ContextDisposedNotification(); |
797 CheckSurvivingGlobalObjectsCount(2); | 804 CheckSurvivingGlobalObjectsCount(1); |
798 } | 805 } |
799 | 806 |
800 | 807 |
801 TEST(DontLeakContextOnGetNotifier) { | 808 TEST(DontLeakContextOnGetNotifier) { |
802 HandleScope scope(CcTest::isolate()); | 809 HandleScope scope(CcTest::isolate()); |
803 Local<Value> foo = v8_str("foo"); | 810 Local<Value> foo = v8_str("foo"); |
804 LocalContext context(CcTest::isolate()); | 811 LocalContext context(CcTest::isolate()); |
805 context->SetSecurityToken(foo); | 812 context->SetSecurityToken(foo); |
806 CompileRun("var obj = {};"); | 813 CompileRun("var obj = {};"); |
807 Local<Value> object = CompileRun("obj"); | 814 Local<Value> object = CompileRun("obj"); |
808 { | 815 { |
809 HandleScope scope(CcTest::isolate()); | 816 HandleScope scope(CcTest::isolate()); |
810 LocalContext context2(CcTest::isolate()); | 817 LocalContext context2(CcTest::isolate()); |
811 context2->SetSecurityToken(foo); | 818 context2->SetSecurityToken(foo); |
812 context2->Global() | 819 context2->Global() |
813 ->Set(v8::Isolate::GetCurrent()->GetCurrentContext(), v8_str("obj"), | 820 ->Set(v8::Isolate::GetCurrent()->GetCurrentContext(), v8_str("obj"), |
814 object) | 821 object) |
815 .FromJust(); | 822 .FromJust(); |
816 CompileRun("Object.getNotifier(obj);"); | 823 CompileRun("Object.getNotifier(obj);"); |
817 } | 824 } |
818 | 825 |
819 CcTest::isolate()->ContextDisposedNotification(); | 826 CcTest::isolate()->ContextDisposedNotification(); |
820 CheckSurvivingGlobalObjectsCount(2); | 827 CheckSurvivingGlobalObjectsCount(1); |
821 } | 828 } |
822 | 829 |
823 | 830 |
824 TEST(DontLeakContextOnNotifierPerformChange) { | 831 TEST(DontLeakContextOnNotifierPerformChange) { |
825 HandleScope scope(CcTest::isolate()); | 832 HandleScope scope(CcTest::isolate()); |
826 Local<Value> foo = v8_str("foo"); | 833 Local<Value> foo = v8_str("foo"); |
827 LocalContext context(CcTest::isolate()); | 834 LocalContext context(CcTest::isolate()); |
828 context->SetSecurityToken(foo); | 835 context->SetSecurityToken(foo); |
829 CompileRun("var obj = {};"); | 836 CompileRun("var obj = {};"); |
830 Local<Value> object = CompileRun("obj"); | 837 Local<Value> object = CompileRun("obj"); |
(...skipping 10 matching lines...) Expand all Loading... |
841 ->Set(v8::Isolate::GetCurrent()->GetCurrentContext(), | 848 ->Set(v8::Isolate::GetCurrent()->GetCurrentContext(), |
842 v8_str("notifier"), notifier) | 849 v8_str("notifier"), notifier) |
843 .FromJust(); | 850 .FromJust(); |
844 CompileRun("var obj2 = {};" | 851 CompileRun("var obj2 = {};" |
845 "var notifier2 = Object.getNotifier(obj2);" | 852 "var notifier2 = Object.getNotifier(obj2);" |
846 "notifier2.performChange.call(" | 853 "notifier2.performChange.call(" |
847 "notifier, 'foo', function(){})"); | 854 "notifier, 'foo', function(){})"); |
848 } | 855 } |
849 | 856 |
850 CcTest::isolate()->ContextDisposedNotification(); | 857 CcTest::isolate()->ContextDisposedNotification(); |
851 CheckSurvivingGlobalObjectsCount(2); | 858 CheckSurvivingGlobalObjectsCount(1); |
852 } | 859 } |
853 | 860 |
854 | 861 |
855 static void ObserverCallback(const FunctionCallbackInfo<Value>& args) { | 862 static void ObserverCallback(const FunctionCallbackInfo<Value>& args) { |
856 *static_cast<int*>(Local<External>::Cast(args.Data())->Value()) = | 863 *static_cast<int*>(Local<External>::Cast(args.Data())->Value()) = |
857 Local<Array>::Cast(args[0])->Length(); | 864 Local<Array>::Cast(args[0])->Length(); |
858 } | 865 } |
859 | 866 |
860 | 867 |
861 TEST(ObjectObserveCallsCppFunction) { | 868 TEST(ObjectObserveCallsCppFunction) { |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 v8::Isolate::GetCurrent()->GetCurrentContext()) | 1034 v8::Isolate::GetCurrent()->GetCurrentContext()) |
1028 .ToLocalChecked(); | 1035 .ToLocalChecked(); |
1029 env->Global() | 1036 env->Global() |
1030 ->Set(v8::Isolate::GetCurrent()->GetCurrentContext(), v8_str("obj"), | 1037 ->Set(v8::Isolate::GetCurrent()->GetCurrentContext(), v8_str("obj"), |
1031 new_instance) | 1038 new_instance) |
1032 .FromJust(); | 1039 .FromJust(); |
1033 v8::TryCatch try_catch(isolate); | 1040 v8::TryCatch try_catch(isolate); |
1034 CompileRun("Object.getNotifier(obj)"); | 1041 CompileRun("Object.getNotifier(obj)"); |
1035 CHECK(try_catch.HasCaught()); | 1042 CHECK(try_catch.HasCaught()); |
1036 } | 1043 } |
OLD | NEW |