| 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 25 matching lines...) Expand all Loading... |
| 36 #include "global-handles.h" | 36 #include "global-handles.h" |
| 37 #include "stub-cache.h" | 37 #include "stub-cache.h" |
| 38 #include "cctest.h" | 38 #include "cctest.h" |
| 39 | 39 |
| 40 using namespace v8::internal; | 40 using namespace v8::internal; |
| 41 | 41 |
| 42 static v8::Persistent<v8::Context> env; | 42 static v8::Persistent<v8::Context> env; |
| 43 | 43 |
| 44 static void InitializeVM() { | 44 static void InitializeVM() { |
| 45 if (env.IsEmpty()) env = v8::Context::New(); | 45 if (env.IsEmpty()) env = v8::Context::New(); |
| 46 v8::HandleScope scope; | |
| 47 env->Enter(); | 46 env->Enter(); |
| 48 } | 47 } |
| 49 | 48 |
| 50 | 49 |
| 51 // Go through all incremental marking steps in one swoop. | 50 // Go through all incremental marking steps in one swoop. |
| 52 static void SimulateIncrementalMarking() { | 51 static void SimulateIncrementalMarking() { |
| 53 MarkCompactCollector* collector = HEAP->mark_compact_collector(); | 52 MarkCompactCollector* collector = HEAP->mark_compact_collector(); |
| 54 IncrementalMarking* marking = HEAP->incremental_marking(); | 53 IncrementalMarking* marking = HEAP->incremental_marking(); |
| 55 if (collector->IsConcurrentSweepingInProgress()) { | 54 if (collector->IsConcurrentSweepingInProgress()) { |
| 56 collector->WaitUntilSweepingCompleted(); | 55 collector->WaitUntilSweepingCompleted(); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 obj_copy->Size() / 2); | 148 obj_copy->Size() / 2); |
| 150 CHECK(not_right != code); | 149 CHECK(not_right != code); |
| 151 } | 150 } |
| 152 | 151 |
| 153 | 152 |
| 154 TEST(HeapObjects) { | 153 TEST(HeapObjects) { |
| 155 InitializeVM(); | 154 InitializeVM(); |
| 156 Isolate* isolate = Isolate::Current(); | 155 Isolate* isolate = Isolate::Current(); |
| 157 Heap* heap = isolate->heap(); | 156 Heap* heap = isolate->heap(); |
| 158 | 157 |
| 159 v8::HandleScope sc; | 158 HandleScope sc(isolate); |
| 160 Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked(); | 159 Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked(); |
| 161 CHECK(value->IsHeapNumber()); | 160 CHECK(value->IsHeapNumber()); |
| 162 CHECK(value->IsNumber()); | 161 CHECK(value->IsNumber()); |
| 163 CHECK_EQ(1.000123, value->Number()); | 162 CHECK_EQ(1.000123, value->Number()); |
| 164 | 163 |
| 165 value = heap->NumberFromDouble(1.0)->ToObjectChecked(); | 164 value = heap->NumberFromDouble(1.0)->ToObjectChecked(); |
| 166 CHECK(value->IsSmi()); | 165 CHECK(value->IsSmi()); |
| 167 CHECK(value->IsNumber()); | 166 CHECK(value->IsNumber()); |
| 168 CHECK_EQ(1.0, value->Number()); | 167 CHECK_EQ(1.0, value->Number()); |
| 169 | 168 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); | 250 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); |
| 252 } | 251 } |
| 253 | 252 |
| 254 | 253 |
| 255 TEST(GarbageCollection) { | 254 TEST(GarbageCollection) { |
| 256 InitializeVM(); | 255 InitializeVM(); |
| 257 Isolate* isolate = Isolate::Current(); | 256 Isolate* isolate = Isolate::Current(); |
| 258 Heap* heap = isolate->heap(); | 257 Heap* heap = isolate->heap(); |
| 259 Factory* factory = isolate->factory(); | 258 Factory* factory = isolate->factory(); |
| 260 | 259 |
| 261 v8::HandleScope sc; | 260 HandleScope sc(isolate); |
| 262 // Check GC. | 261 // Check GC. |
| 263 heap->CollectGarbage(NEW_SPACE); | 262 heap->CollectGarbage(NEW_SPACE); |
| 264 | 263 |
| 265 Handle<String> name = factory->InternalizeUtf8String("theFunction"); | 264 Handle<String> name = factory->InternalizeUtf8String("theFunction"); |
| 266 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); | 265 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); |
| 267 Handle<String> prop_namex = factory->InternalizeUtf8String("theSlotx"); | 266 Handle<String> prop_namex = factory->InternalizeUtf8String("theSlotx"); |
| 268 Handle<String> obj_name = factory->InternalizeUtf8String("theObject"); | 267 Handle<String> obj_name = factory->InternalizeUtf8String("theObject"); |
| 269 | 268 |
| 270 { | 269 { |
| 271 HandleScope inner_scope(isolate); | 270 HandleScope inner_scope(isolate); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 HasLocalProperty(*obj_name)); | 315 HasLocalProperty(*obj_name)); |
| 317 CHECK(Isolate::Current()->context()->global_object()-> | 316 CHECK(Isolate::Current()->context()->global_object()-> |
| 318 GetProperty(*obj_name)->ToObjectChecked()->IsJSObject()); | 317 GetProperty(*obj_name)->ToObjectChecked()->IsJSObject()); |
| 319 Object* obj = Isolate::Current()->context()->global_object()-> | 318 Object* obj = Isolate::Current()->context()->global_object()-> |
| 320 GetProperty(*obj_name)->ToObjectChecked(); | 319 GetProperty(*obj_name)->ToObjectChecked(); |
| 321 JSObject* js_obj = JSObject::cast(obj); | 320 JSObject* js_obj = JSObject::cast(obj); |
| 322 CHECK_EQ(Smi::FromInt(23), js_obj->GetProperty(*prop_name)); | 321 CHECK_EQ(Smi::FromInt(23), js_obj->GetProperty(*prop_name)); |
| 323 } | 322 } |
| 324 | 323 |
| 325 | 324 |
| 326 static void VerifyStringAllocation(const char* string) { | 325 static void VerifyStringAllocation(Isolate* isolate, const char* string) { |
| 327 v8::HandleScope scope; | 326 HandleScope scope(isolate); |
| 328 Handle<String> s = FACTORY->NewStringFromUtf8(CStrVector(string)); | 327 Handle<String> s = isolate->factory()->NewStringFromUtf8(CStrVector(string)); |
| 329 CHECK_EQ(StrLength(string), s->length()); | 328 CHECK_EQ(StrLength(string), s->length()); |
| 330 for (int index = 0; index < s->length(); index++) { | 329 for (int index = 0; index < s->length(); index++) { |
| 331 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index)); | 330 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index)); |
| 332 } | 331 } |
| 333 } | 332 } |
| 334 | 333 |
| 335 | 334 |
| 336 TEST(String) { | 335 TEST(String) { |
| 337 InitializeVM(); | 336 InitializeVM(); |
| 337 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 338 | 338 |
| 339 VerifyStringAllocation("a"); | 339 VerifyStringAllocation(isolate, "a"); |
| 340 VerifyStringAllocation("ab"); | 340 VerifyStringAllocation(isolate, "ab"); |
| 341 VerifyStringAllocation("abc"); | 341 VerifyStringAllocation(isolate, "abc"); |
| 342 VerifyStringAllocation("abcd"); | 342 VerifyStringAllocation(isolate, "abcd"); |
| 343 VerifyStringAllocation("fiskerdrengen er paa havet"); | 343 VerifyStringAllocation(isolate, "fiskerdrengen er paa havet"); |
| 344 } | 344 } |
| 345 | 345 |
| 346 | 346 |
| 347 TEST(LocalHandles) { | 347 TEST(LocalHandles) { |
| 348 InitializeVM(); | 348 InitializeVM(); |
| 349 | 349 |
| 350 v8::HandleScope scope; | 350 v8::HandleScope scope(env->GetIsolate()); |
| 351 const char* name = "Kasper the spunky"; | 351 const char* name = "Kasper the spunky"; |
| 352 Handle<String> string = FACTORY->NewStringFromAscii(CStrVector(name)); | 352 Handle<String> string = FACTORY->NewStringFromAscii(CStrVector(name)); |
| 353 CHECK_EQ(StrLength(name), string->length()); | 353 CHECK_EQ(StrLength(name), string->length()); |
| 354 } | 354 } |
| 355 | 355 |
| 356 | 356 |
| 357 TEST(GlobalHandles) { | 357 TEST(GlobalHandles) { |
| 358 InitializeVM(); | 358 InitializeVM(); |
| 359 Isolate* isolate = Isolate::Current(); | 359 Isolate* isolate = Isolate::Current(); |
| 360 Heap* heap = isolate->heap(); | 360 Heap* heap = isolate->heap(); |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 InitializeVM(); | 613 InitializeVM(); |
| 614 | 614 |
| 615 CheckInternalizedStrings(not_so_random_string_table); | 615 CheckInternalizedStrings(not_so_random_string_table); |
| 616 CheckInternalizedStrings(not_so_random_string_table); | 616 CheckInternalizedStrings(not_so_random_string_table); |
| 617 } | 617 } |
| 618 | 618 |
| 619 | 619 |
| 620 TEST(FunctionAllocation) { | 620 TEST(FunctionAllocation) { |
| 621 InitializeVM(); | 621 InitializeVM(); |
| 622 | 622 |
| 623 v8::HandleScope sc; | 623 v8::HandleScope sc(env->GetIsolate()); |
| 624 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction"); | 624 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction"); |
| 625 Handle<JSFunction> function = | 625 Handle<JSFunction> function = |
| 626 FACTORY->NewFunction(name, FACTORY->undefined_value()); | 626 FACTORY->NewFunction(name, FACTORY->undefined_value()); |
| 627 Handle<Map> initial_map = | 627 Handle<Map> initial_map = |
| 628 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 628 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 629 function->set_initial_map(*initial_map); | 629 function->set_initial_map(*initial_map); |
| 630 | 630 |
| 631 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot"); | 631 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot"); |
| 632 Handle<JSObject> obj = FACTORY->NewJSObject(function); | 632 Handle<JSObject> obj = FACTORY->NewJSObject(function); |
| 633 obj->SetProperty( | 633 obj->SetProperty( |
| 634 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); | 634 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); |
| 635 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 635 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 636 // Check that we can add properties to function objects. | 636 // Check that we can add properties to function objects. |
| 637 function->SetProperty( | 637 function->SetProperty( |
| 638 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); | 638 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); |
| 639 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); | 639 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); |
| 640 } | 640 } |
| 641 | 641 |
| 642 | 642 |
| 643 TEST(ObjectProperties) { | 643 TEST(ObjectProperties) { |
| 644 InitializeVM(); | 644 InitializeVM(); |
| 645 | 645 |
| 646 v8::HandleScope sc; | 646 v8::HandleScope sc(env->GetIsolate()); |
| 647 String* object_string = String::cast(HEAP->Object_string()); | 647 String* object_string = String::cast(HEAP->Object_string()); |
| 648 Object* raw_object = Isolate::Current()->context()->global_object()-> | 648 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 649 GetProperty(object_string)->ToObjectChecked(); | 649 GetProperty(object_string)->ToObjectChecked(); |
| 650 JSFunction* object_function = JSFunction::cast(raw_object); | 650 JSFunction* object_function = JSFunction::cast(raw_object); |
| 651 Handle<JSFunction> constructor(object_function); | 651 Handle<JSFunction> constructor(object_function); |
| 652 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); | 652 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); |
| 653 Handle<String> first = FACTORY->InternalizeUtf8String("first"); | 653 Handle<String> first = FACTORY->InternalizeUtf8String("first"); |
| 654 Handle<String> second = FACTORY->InternalizeUtf8String("second"); | 654 Handle<String> second = FACTORY->InternalizeUtf8String("second"); |
| 655 | 655 |
| 656 // check for empty | 656 // check for empty |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 obj->SetProperty( | 709 obj->SetProperty( |
| 710 *s2_string, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); | 710 *s2_string, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); |
| 711 Handle<String> s2 = FACTORY->NewStringFromAscii(CStrVector(string2)); | 711 Handle<String> s2 = FACTORY->NewStringFromAscii(CStrVector(string2)); |
| 712 CHECK(obj->HasLocalProperty(*s2)); | 712 CHECK(obj->HasLocalProperty(*s2)); |
| 713 } | 713 } |
| 714 | 714 |
| 715 | 715 |
| 716 TEST(JSObjectMaps) { | 716 TEST(JSObjectMaps) { |
| 717 InitializeVM(); | 717 InitializeVM(); |
| 718 | 718 |
| 719 v8::HandleScope sc; | 719 v8::HandleScope sc(env->GetIsolate()); |
| 720 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction"); | 720 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction"); |
| 721 Handle<JSFunction> function = | 721 Handle<JSFunction> function = |
| 722 FACTORY->NewFunction(name, FACTORY->undefined_value()); | 722 FACTORY->NewFunction(name, FACTORY->undefined_value()); |
| 723 Handle<Map> initial_map = | 723 Handle<Map> initial_map = |
| 724 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 724 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 725 function->set_initial_map(*initial_map); | 725 function->set_initial_map(*initial_map); |
| 726 | 726 |
| 727 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot"); | 727 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot"); |
| 728 Handle<JSObject> obj = FACTORY->NewJSObject(function); | 728 Handle<JSObject> obj = FACTORY->NewJSObject(function); |
| 729 | 729 |
| 730 // Set a propery | 730 // Set a propery |
| 731 obj->SetProperty( | 731 obj->SetProperty( |
| 732 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); | 732 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); |
| 733 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 733 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 734 | 734 |
| 735 // Check the map has changed | 735 // Check the map has changed |
| 736 CHECK(*initial_map != obj->map()); | 736 CHECK(*initial_map != obj->map()); |
| 737 } | 737 } |
| 738 | 738 |
| 739 | 739 |
| 740 TEST(JSArray) { | 740 TEST(JSArray) { |
| 741 InitializeVM(); | 741 InitializeVM(); |
| 742 | 742 |
| 743 v8::HandleScope sc; | 743 v8::HandleScope sc(env->GetIsolate()); |
| 744 Handle<String> name = FACTORY->InternalizeUtf8String("Array"); | 744 Handle<String> name = FACTORY->InternalizeUtf8String("Array"); |
| 745 Object* raw_object = Isolate::Current()->context()->global_object()-> | 745 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 746 GetProperty(*name)->ToObjectChecked(); | 746 GetProperty(*name)->ToObjectChecked(); |
| 747 Handle<JSFunction> function = Handle<JSFunction>( | 747 Handle<JSFunction> function = Handle<JSFunction>( |
| 748 JSFunction::cast(raw_object)); | 748 JSFunction::cast(raw_object)); |
| 749 | 749 |
| 750 // Allocate the object. | 750 // Allocate the object. |
| 751 Handle<JSObject> object = FACTORY->NewJSObject(function); | 751 Handle<JSObject> object = FACTORY->NewJSObject(function); |
| 752 Handle<JSArray> array = Handle<JSArray>::cast(object); | 752 Handle<JSArray> array = Handle<JSArray>::cast(object); |
| 753 // We just initialized the VM, no heap allocation failure yet. | 753 // We just initialized the VM, no heap allocation failure yet. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 780 CHECK(array->length()->ToArrayIndex(&new_int_length)); | 780 CHECK(array->length()->ToArrayIndex(&new_int_length)); |
| 781 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1); | 781 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1); |
| 782 CHECK_EQ(array->GetElement(int_length), *name); | 782 CHECK_EQ(array->GetElement(int_length), *name); |
| 783 CHECK_EQ(array->GetElement(0), *name); | 783 CHECK_EQ(array->GetElement(0), *name); |
| 784 } | 784 } |
| 785 | 785 |
| 786 | 786 |
| 787 TEST(JSObjectCopy) { | 787 TEST(JSObjectCopy) { |
| 788 InitializeVM(); | 788 InitializeVM(); |
| 789 | 789 |
| 790 v8::HandleScope sc; | 790 v8::HandleScope sc(env->GetIsolate()); |
| 791 String* object_string = String::cast(HEAP->Object_string()); | 791 String* object_string = String::cast(HEAP->Object_string()); |
| 792 Object* raw_object = Isolate::Current()->context()->global_object()-> | 792 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 793 GetProperty(object_string)->ToObjectChecked(); | 793 GetProperty(object_string)->ToObjectChecked(); |
| 794 JSFunction* object_function = JSFunction::cast(raw_object); | 794 JSFunction* object_function = JSFunction::cast(raw_object); |
| 795 Handle<JSFunction> constructor(object_function); | 795 Handle<JSFunction> constructor(object_function); |
| 796 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); | 796 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); |
| 797 Handle<String> first = FACTORY->InternalizeUtf8String("first"); | 797 Handle<String> first = FACTORY->InternalizeUtf8String("first"); |
| 798 Handle<String> second = FACTORY->InternalizeUtf8String("second"); | 798 Handle<String> second = FACTORY->InternalizeUtf8String("second"); |
| 799 | 799 |
| 800 obj->SetProperty( | 800 obj->SetProperty( |
| (...skipping 27 matching lines...) Expand all Loading... |
| 828 CHECK_EQ(obj->GetElement(0), clone->GetElement(1)); | 828 CHECK_EQ(obj->GetElement(0), clone->GetElement(1)); |
| 829 | 829 |
| 830 CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first)); | 830 CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first)); |
| 831 CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second)); | 831 CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second)); |
| 832 } | 832 } |
| 833 | 833 |
| 834 | 834 |
| 835 TEST(StringAllocation) { | 835 TEST(StringAllocation) { |
| 836 InitializeVM(); | 836 InitializeVM(); |
| 837 | 837 |
| 838 | |
| 839 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; | 838 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; |
| 840 for (int length = 0; length < 100; length++) { | 839 for (int length = 0; length < 100; length++) { |
| 841 v8::HandleScope scope; | 840 v8::HandleScope scope(env->GetIsolate()); |
| 842 char* non_ascii = NewArray<char>(3 * length + 1); | 841 char* non_ascii = NewArray<char>(3 * length + 1); |
| 843 char* ascii = NewArray<char>(length + 1); | 842 char* ascii = NewArray<char>(length + 1); |
| 844 non_ascii[3 * length] = 0; | 843 non_ascii[3 * length] = 0; |
| 845 ascii[length] = 0; | 844 ascii[length] = 0; |
| 846 for (int i = 0; i < length; i++) { | 845 for (int i = 0; i < length; i++) { |
| 847 ascii[i] = 'a'; | 846 ascii[i] = 'a'; |
| 848 non_ascii[3 * i] = chars[0]; | 847 non_ascii[3 * i] = chars[0]; |
| 849 non_ascii[3 * i + 1] = chars[1]; | 848 non_ascii[3 * i + 1] = chars[1]; |
| 850 non_ascii[3 * i + 2] = chars[2]; | 849 non_ascii[3 * i + 2] = chars[2]; |
| 851 } | 850 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 880 found_count++; | 879 found_count++; |
| 881 } | 880 } |
| 882 } | 881 } |
| 883 } | 882 } |
| 884 return found_count; | 883 return found_count; |
| 885 } | 884 } |
| 886 | 885 |
| 887 | 886 |
| 888 TEST(Iteration) { | 887 TEST(Iteration) { |
| 889 InitializeVM(); | 888 InitializeVM(); |
| 890 v8::HandleScope scope; | 889 v8::HandleScope scope(env->GetIsolate()); |
| 891 | 890 |
| 892 // Array of objects to scan haep for. | 891 // Array of objects to scan haep for. |
| 893 const int objs_count = 6; | 892 const int objs_count = 6; |
| 894 Handle<Object> objs[objs_count]; | 893 Handle<Object> objs[objs_count]; |
| 895 int next_objs_index = 0; | 894 int next_objs_index = 0; |
| 896 | 895 |
| 897 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE | 896 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE |
| 898 objs[next_objs_index++] = FACTORY->NewJSArray(10); | 897 objs[next_objs_index++] = FACTORY->NewJSArray(10); |
| 899 objs[next_objs_index++] = FACTORY->NewJSArray(10, | 898 objs[next_objs_index++] = FACTORY->NewJSArray(10, |
| 900 FAST_HOLEY_ELEMENTS, | 899 FAST_HOLEY_ELEMENTS, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 919 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); | 918 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); |
| 920 | 919 |
| 921 CHECK_EQ(objs_count, next_objs_index); | 920 CHECK_EQ(objs_count, next_objs_index); |
| 922 CHECK_EQ(objs_count, ObjectsFoundInHeap(HEAP, objs, objs_count)); | 921 CHECK_EQ(objs_count, ObjectsFoundInHeap(HEAP, objs, objs_count)); |
| 923 } | 922 } |
| 924 | 923 |
| 925 | 924 |
| 926 TEST(EmptyHandleEscapeFrom) { | 925 TEST(EmptyHandleEscapeFrom) { |
| 927 InitializeVM(); | 926 InitializeVM(); |
| 928 | 927 |
| 929 v8::HandleScope scope; | 928 v8::HandleScope scope(env->GetIsolate()); |
| 930 Handle<JSObject> runaway; | 929 Handle<JSObject> runaway; |
| 931 | 930 |
| 932 { | 931 { |
| 933 v8::HandleScope nested; | 932 v8::HandleScope nested(env->GetIsolate()); |
| 934 Handle<JSObject> empty; | 933 Handle<JSObject> empty; |
| 935 runaway = empty.EscapeFrom(&nested); | 934 runaway = empty.EscapeFrom(&nested); |
| 936 } | 935 } |
| 937 | 936 |
| 938 CHECK(runaway.is_null()); | 937 CHECK(runaway.is_null()); |
| 939 } | 938 } |
| 940 | 939 |
| 941 | 940 |
| 942 static int LenFromSize(int size) { | 941 static int LenFromSize(int size) { |
| 943 return (size - FixedArray::kHeaderSize) / kPointerSize; | 942 return (size - FixedArray::kHeaderSize) / kPointerSize; |
| 944 } | 943 } |
| 945 | 944 |
| 946 | 945 |
| 947 TEST(Regression39128) { | 946 TEST(Regression39128) { |
| 948 // Test case for crbug.com/39128. | 947 // Test case for crbug.com/39128. |
| 949 InitializeVM(); | 948 InitializeVM(); |
| 950 | 949 |
| 951 // Increase the chance of 'bump-the-pointer' allocation in old space. | 950 // Increase the chance of 'bump-the-pointer' allocation in old space. |
| 952 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 951 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 953 | 952 |
| 954 v8::HandleScope scope; | 953 v8::HandleScope scope(env->GetIsolate()); |
| 955 | 954 |
| 956 // The plan: create JSObject which references objects in new space. | 955 // The plan: create JSObject which references objects in new space. |
| 957 // Then clone this object (forcing it to go into old space) and check | 956 // Then clone this object (forcing it to go into old space) and check |
| 958 // that region dirty marks are updated correctly. | 957 // that region dirty marks are updated correctly. |
| 959 | 958 |
| 960 // Step 1: prepare a map for the object. We add 1 inobject property to it. | 959 // Step 1: prepare a map for the object. We add 1 inobject property to it. |
| 961 Handle<JSFunction> object_ctor( | 960 Handle<JSFunction> object_ctor( |
| 962 Isolate::Current()->native_context()->object_function()); | 961 Isolate::Current()->native_context()->object_function()); |
| 963 CHECK(object_ctor->has_initial_map()); | 962 CHECK(object_ctor->has_initial_map()); |
| 964 Handle<Map> object_map(object_ctor->initial_map()); | 963 Handle<Map> object_map(object_ctor->initial_map()); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1017 } | 1016 } |
| 1018 CHECK(HEAP->old_pointer_space()->Contains(clone->address())); | 1017 CHECK(HEAP->old_pointer_space()->Contains(clone->address())); |
| 1019 } | 1018 } |
| 1020 | 1019 |
| 1021 | 1020 |
| 1022 TEST(TestCodeFlushing) { | 1021 TEST(TestCodeFlushing) { |
| 1023 // If we do not flush code this test is invalid. | 1022 // If we do not flush code this test is invalid. |
| 1024 if (!FLAG_flush_code) return; | 1023 if (!FLAG_flush_code) return; |
| 1025 i::FLAG_allow_natives_syntax = true; | 1024 i::FLAG_allow_natives_syntax = true; |
| 1026 InitializeVM(); | 1025 InitializeVM(); |
| 1027 v8::HandleScope scope; | 1026 v8::HandleScope scope(env->GetIsolate()); |
| 1028 const char* source = "function foo() {" | 1027 const char* source = "function foo() {" |
| 1029 " var x = 42;" | 1028 " var x = 42;" |
| 1030 " var y = 42;" | 1029 " var y = 42;" |
| 1031 " var z = x + y;" | 1030 " var z = x + y;" |
| 1032 "};" | 1031 "};" |
| 1033 "foo()"; | 1032 "foo()"; |
| 1034 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); | 1033 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); |
| 1035 | 1034 |
| 1036 // This compile will add the code to the compilation cache. | 1035 // This compile will add the code to the compilation cache. |
| 1037 { v8::HandleScope scope; | 1036 { v8::HandleScope scope(env->GetIsolate()); |
| 1038 CompileRun(source); | 1037 CompileRun(source); |
| 1039 } | 1038 } |
| 1040 | 1039 |
| 1041 // Check function is compiled. | 1040 // Check function is compiled. |
| 1042 Object* func_value = Isolate::Current()->context()->global_object()-> | 1041 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1043 GetProperty(*foo_name)->ToObjectChecked(); | 1042 GetProperty(*foo_name)->ToObjectChecked(); |
| 1044 CHECK(func_value->IsJSFunction()); | 1043 CHECK(func_value->IsJSFunction()); |
| 1045 Handle<JSFunction> function(JSFunction::cast(func_value)); | 1044 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 1046 CHECK(function->shared()->is_compiled()); | 1045 CHECK(function->shared()->is_compiled()); |
| 1047 | 1046 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1064 CHECK(function->shared()->is_compiled()); | 1063 CHECK(function->shared()->is_compiled()); |
| 1065 CHECK(function->is_compiled()); | 1064 CHECK(function->is_compiled()); |
| 1066 } | 1065 } |
| 1067 | 1066 |
| 1068 | 1067 |
| 1069 TEST(TestCodeFlushingIncremental) { | 1068 TEST(TestCodeFlushingIncremental) { |
| 1070 // If we do not flush code this test is invalid. | 1069 // If we do not flush code this test is invalid. |
| 1071 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1070 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1072 i::FLAG_allow_natives_syntax = true; | 1071 i::FLAG_allow_natives_syntax = true; |
| 1073 InitializeVM(); | 1072 InitializeVM(); |
| 1074 v8::HandleScope scope; | 1073 v8::HandleScope scope(env->GetIsolate()); |
| 1075 const char* source = "function foo() {" | 1074 const char* source = "function foo() {" |
| 1076 " var x = 42;" | 1075 " var x = 42;" |
| 1077 " var y = 42;" | 1076 " var y = 42;" |
| 1078 " var z = x + y;" | 1077 " var z = x + y;" |
| 1079 "};" | 1078 "};" |
| 1080 "foo()"; | 1079 "foo()"; |
| 1081 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); | 1080 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); |
| 1082 | 1081 |
| 1083 // This compile will add the code to the compilation cache. | 1082 // This compile will add the code to the compilation cache. |
| 1084 { v8::HandleScope scope; | 1083 { v8::HandleScope scope(env->GetIsolate()); |
| 1085 CompileRun(source); | 1084 CompileRun(source); |
| 1086 } | 1085 } |
| 1087 | 1086 |
| 1088 // Check function is compiled. | 1087 // Check function is compiled. |
| 1089 Object* func_value = Isolate::Current()->context()->global_object()-> | 1088 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1090 GetProperty(*foo_name)->ToObjectChecked(); | 1089 GetProperty(*foo_name)->ToObjectChecked(); |
| 1091 CHECK(func_value->IsJSFunction()); | 1090 CHECK(func_value->IsJSFunction()); |
| 1092 Handle<JSFunction> function(JSFunction::cast(func_value)); | 1091 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 1093 CHECK(function->shared()->is_compiled()); | 1092 CHECK(function->shared()->is_compiled()); |
| 1094 | 1093 |
| 1095 // The code will survive at least two GCs. | 1094 // The code will survive at least two GCs. |
| 1096 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 1095 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1097 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 1096 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1098 CHECK(function->shared()->is_compiled()); | 1097 CHECK(function->shared()->is_compiled()); |
| 1099 | 1098 |
| 1100 // Simulate several GCs that use incremental marking. | 1099 // Simulate several GCs that use incremental marking. |
| 1101 const int kAgingThreshold = 6; | 1100 const int kAgingThreshold = 6; |
| 1102 for (int i = 0; i < kAgingThreshold; i++) { | 1101 for (int i = 0; i < kAgingThreshold; i++) { |
| 1103 SimulateIncrementalMarking(); | 1102 SimulateIncrementalMarking(); |
| 1104 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1103 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 1105 } | 1104 } |
| 1106 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); | 1105 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); |
| 1107 CHECK(!function->is_compiled() || function->IsOptimized()); | 1106 CHECK(!function->is_compiled() || function->IsOptimized()); |
| 1108 | 1107 |
| 1109 // This compile will compile the function again. | 1108 // This compile will compile the function again. |
| 1110 { v8::HandleScope scope; | 1109 { v8::HandleScope scope(env->GetIsolate()); |
| 1111 CompileRun("foo();"); | 1110 CompileRun("foo();"); |
| 1112 } | 1111 } |
| 1113 | 1112 |
| 1114 // Simulate several GCs that use incremental marking but make sure | 1113 // Simulate several GCs that use incremental marking but make sure |
| 1115 // the loop breaks once the function is enqueued as a candidate. | 1114 // the loop breaks once the function is enqueued as a candidate. |
| 1116 for (int i = 0; i < kAgingThreshold; i++) { | 1115 for (int i = 0; i < kAgingThreshold; i++) { |
| 1117 SimulateIncrementalMarking(); | 1116 SimulateIncrementalMarking(); |
| 1118 if (!function->next_function_link()->IsUndefined()) break; | 1117 if (!function->next_function_link()->IsUndefined()) break; |
| 1119 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1118 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 1120 } | 1119 } |
| 1121 | 1120 |
| 1122 // Force optimization while incremental marking is active and while | 1121 // Force optimization while incremental marking is active and while |
| 1123 // the function is enqueued as a candidate. | 1122 // the function is enqueued as a candidate. |
| 1124 { v8::HandleScope scope; | 1123 { v8::HandleScope scope(env->GetIsolate()); |
| 1125 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); | 1124 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); |
| 1126 } | 1125 } |
| 1127 | 1126 |
| 1128 // Simulate one final GC to make sure the candidate queue is sane. | 1127 // Simulate one final GC to make sure the candidate queue is sane. |
| 1129 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1128 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 1130 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); | 1129 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); |
| 1131 CHECK(function->is_compiled() || !function->IsOptimized()); | 1130 CHECK(function->is_compiled() || !function->IsOptimized()); |
| 1132 } | 1131 } |
| 1133 | 1132 |
| 1134 | 1133 |
| 1135 TEST(TestCodeFlushingIncrementalScavenge) { | 1134 TEST(TestCodeFlushingIncrementalScavenge) { |
| 1136 // If we do not flush code this test is invalid. | 1135 // If we do not flush code this test is invalid. |
| 1137 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1136 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1138 i::FLAG_allow_natives_syntax = true; | 1137 i::FLAG_allow_natives_syntax = true; |
| 1139 InitializeVM(); | 1138 InitializeVM(); |
| 1140 v8::HandleScope scope; | 1139 v8::HandleScope scope(env->GetIsolate()); |
| 1141 const char* source = "var foo = function() {" | 1140 const char* source = "var foo = function() {" |
| 1142 " var x = 42;" | 1141 " var x = 42;" |
| 1143 " var y = 42;" | 1142 " var y = 42;" |
| 1144 " var z = x + y;" | 1143 " var z = x + y;" |
| 1145 "};" | 1144 "};" |
| 1146 "foo();" | 1145 "foo();" |
| 1147 "var bar = function() {" | 1146 "var bar = function() {" |
| 1148 " var x = 23;" | 1147 " var x = 23;" |
| 1149 "};" | 1148 "};" |
| 1150 "bar();"; | 1149 "bar();"; |
| 1151 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); | 1150 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); |
| 1152 Handle<String> bar_name = FACTORY->InternalizeUtf8String("bar"); | 1151 Handle<String> bar_name = FACTORY->InternalizeUtf8String("bar"); |
| 1153 | 1152 |
| 1154 // Perfrom one initial GC to enable code flushing. | 1153 // Perfrom one initial GC to enable code flushing. |
| 1155 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 1154 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1156 | 1155 |
| 1157 // This compile will add the code to the compilation cache. | 1156 // This compile will add the code to the compilation cache. |
| 1158 { v8::HandleScope scope; | 1157 { v8::HandleScope scope(env->GetIsolate()); |
| 1159 CompileRun(source); | 1158 CompileRun(source); |
| 1160 } | 1159 } |
| 1161 | 1160 |
| 1162 // Check functions are compiled. | 1161 // Check functions are compiled. |
| 1163 Object* func_value = Isolate::Current()->context()->global_object()-> | 1162 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1164 GetProperty(*foo_name)->ToObjectChecked(); | 1163 GetProperty(*foo_name)->ToObjectChecked(); |
| 1165 CHECK(func_value->IsJSFunction()); | 1164 CHECK(func_value->IsJSFunction()); |
| 1166 Handle<JSFunction> function(JSFunction::cast(func_value)); | 1165 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 1167 CHECK(function->shared()->is_compiled()); | 1166 CHECK(function->shared()->is_compiled()); |
| 1168 Object* func_value2 = Isolate::Current()->context()->global_object()-> | 1167 Object* func_value2 = Isolate::Current()->context()->global_object()-> |
| 1169 GetProperty(*bar_name)->ToObjectChecked(); | 1168 GetProperty(*bar_name)->ToObjectChecked(); |
| 1170 CHECK(func_value2->IsJSFunction()); | 1169 CHECK(func_value2->IsJSFunction()); |
| 1171 Handle<JSFunction> function2(JSFunction::cast(func_value2)); | 1170 Handle<JSFunction> function2(JSFunction::cast(func_value2)); |
| 1172 CHECK(function2->shared()->is_compiled()); | 1171 CHECK(function2->shared()->is_compiled()); |
| 1173 | 1172 |
| 1174 // Clear references to functions so that one of them can die. | 1173 // Clear references to functions so that one of them can die. |
| 1175 { v8::HandleScope scope; | 1174 { v8::HandleScope scope(env->GetIsolate()); |
| 1176 CompileRun("foo = 0; bar = 0;"); | 1175 CompileRun("foo = 0; bar = 0;"); |
| 1177 } | 1176 } |
| 1178 | 1177 |
| 1179 // Bump the code age so that flushing is triggered while the function | 1178 // Bump the code age so that flushing is triggered while the function |
| 1180 // object is still located in new-space. | 1179 // object is still located in new-space. |
| 1181 const int kAgingThreshold = 6; | 1180 const int kAgingThreshold = 6; |
| 1182 for (int i = 0; i < kAgingThreshold; i++) { | 1181 for (int i = 0; i < kAgingThreshold; i++) { |
| 1183 function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); | 1182 function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); |
| 1184 function2->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); | 1183 function2->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); |
| 1185 } | 1184 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1198 } | 1197 } |
| 1199 | 1198 |
| 1200 | 1199 |
| 1201 TEST(TestCodeFlushingIncrementalAbort) { | 1200 TEST(TestCodeFlushingIncrementalAbort) { |
| 1202 // If we do not flush code this test is invalid. | 1201 // If we do not flush code this test is invalid. |
| 1203 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1202 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1204 i::FLAG_allow_natives_syntax = true; | 1203 i::FLAG_allow_natives_syntax = true; |
| 1205 InitializeVM(); | 1204 InitializeVM(); |
| 1206 Isolate* isolate = Isolate::Current(); | 1205 Isolate* isolate = Isolate::Current(); |
| 1207 Heap* heap = isolate->heap(); | 1206 Heap* heap = isolate->heap(); |
| 1208 v8::HandleScope scope; | 1207 v8::HandleScope scope(env->GetIsolate()); |
| 1209 const char* source = "function foo() {" | 1208 const char* source = "function foo() {" |
| 1210 " var x = 42;" | 1209 " var x = 42;" |
| 1211 " var y = 42;" | 1210 " var y = 42;" |
| 1212 " var z = x + y;" | 1211 " var z = x + y;" |
| 1213 "};" | 1212 "};" |
| 1214 "foo()"; | 1213 "foo()"; |
| 1215 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); | 1214 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); |
| 1216 | 1215 |
| 1217 // This compile will add the code to the compilation cache. | 1216 // This compile will add the code to the compilation cache. |
| 1218 { v8::HandleScope scope; | 1217 { v8::HandleScope scope(env->GetIsolate()); |
| 1219 CompileRun(source); | 1218 CompileRun(source); |
| 1220 } | 1219 } |
| 1221 | 1220 |
| 1222 // Check function is compiled. | 1221 // Check function is compiled. |
| 1223 Object* func_value = Isolate::Current()->context()->global_object()-> | 1222 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1224 GetProperty(*foo_name)->ToObjectChecked(); | 1223 GetProperty(*foo_name)->ToObjectChecked(); |
| 1225 CHECK(func_value->IsJSFunction()); | 1224 CHECK(func_value->IsJSFunction()); |
| 1226 Handle<JSFunction> function(JSFunction::cast(func_value)); | 1225 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 1227 CHECK(function->shared()->is_compiled()); | 1226 CHECK(function->shared()->is_compiled()); |
| 1228 | 1227 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1243 | 1242 |
| 1244 // Enable the debugger and add a breakpoint while incremental marking | 1243 // Enable the debugger and add a breakpoint while incremental marking |
| 1245 // is running so that incremental marking aborts and code flushing is | 1244 // is running so that incremental marking aborts and code flushing is |
| 1246 // disabled. | 1245 // disabled. |
| 1247 int position = 0; | 1246 int position = 0; |
| 1248 Handle<Object> breakpoint_object(Smi::FromInt(0), isolate); | 1247 Handle<Object> breakpoint_object(Smi::FromInt(0), isolate); |
| 1249 isolate->debug()->SetBreakPoint(function, breakpoint_object, &position); | 1248 isolate->debug()->SetBreakPoint(function, breakpoint_object, &position); |
| 1250 isolate->debug()->ClearAllBreakPoints(); | 1249 isolate->debug()->ClearAllBreakPoints(); |
| 1251 | 1250 |
| 1252 // Force optimization now that code flushing is disabled. | 1251 // Force optimization now that code flushing is disabled. |
| 1253 { v8::HandleScope scope; | 1252 { v8::HandleScope scope(env->GetIsolate()); |
| 1254 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); | 1253 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); |
| 1255 } | 1254 } |
| 1256 | 1255 |
| 1257 // Simulate one final GC to make sure the candidate queue is sane. | 1256 // Simulate one final GC to make sure the candidate queue is sane. |
| 1258 heap->CollectAllGarbage(Heap::kNoGCFlags); | 1257 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 1259 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); | 1258 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); |
| 1260 CHECK(function->is_compiled() || !function->IsOptimized()); | 1259 CHECK(function->is_compiled() || !function->IsOptimized()); |
| 1261 } | 1260 } |
| 1262 | 1261 |
| 1263 | 1262 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1291 v8::V8::Initialize(); | 1290 v8::V8::Initialize(); |
| 1292 | 1291 |
| 1293 // Some flags turn Scavenge collections into Mark-sweep collections | 1292 // Some flags turn Scavenge collections into Mark-sweep collections |
| 1294 // and hence are incompatible with this test case. | 1293 // and hence are incompatible with this test case. |
| 1295 if (FLAG_gc_global || FLAG_stress_compaction) return; | 1294 if (FLAG_gc_global || FLAG_stress_compaction) return; |
| 1296 | 1295 |
| 1297 static const int kNumTestContexts = 10; | 1296 static const int kNumTestContexts = 10; |
| 1298 | 1297 |
| 1299 Isolate* isolate = Isolate::Current(); | 1298 Isolate* isolate = Isolate::Current(); |
| 1300 Heap* heap = isolate->heap(); | 1299 Heap* heap = isolate->heap(); |
| 1301 v8::HandleScope scope; | 1300 HandleScope scope(isolate); |
| 1302 v8::Persistent<v8::Context> ctx[kNumTestContexts]; | 1301 v8::Persistent<v8::Context> ctx[kNumTestContexts]; |
| 1303 | 1302 |
| 1304 CHECK_EQ(0, CountNativeContexts()); | 1303 CHECK_EQ(0, CountNativeContexts()); |
| 1305 | 1304 |
| 1306 // Create a number of global contests which gets linked together. | 1305 // Create a number of global contests which gets linked together. |
| 1307 for (int i = 0; i < kNumTestContexts; i++) { | 1306 for (int i = 0; i < kNumTestContexts; i++) { |
| 1308 ctx[i] = v8::Context::New(); | 1307 ctx[i] = v8::Context::New(); |
| 1309 | 1308 |
| 1310 bool opt = (FLAG_always_opt && i::V8::UseCrankshaft()); | 1309 bool opt = (FLAG_always_opt && i::V8::UseCrankshaft()); |
| 1311 | 1310 |
| 1312 CHECK_EQ(i + 1, CountNativeContexts()); | 1311 CHECK_EQ(i + 1, CountNativeContexts()); |
| 1313 | 1312 |
| 1314 ctx[i]->Enter(); | 1313 ctx[i]->Enter(); |
| 1315 | 1314 |
| 1316 // Create a handle scope so no function objects get stuch in the outer | 1315 // Create a handle scope so no function objects get stuch in the outer |
| 1317 // handle scope | 1316 // handle scope |
| 1318 v8::HandleScope scope; | 1317 HandleScope scope(isolate); |
| 1319 const char* source = "function f1() { };" | 1318 const char* source = "function f1() { };" |
| 1320 "function f2() { };" | 1319 "function f2() { };" |
| 1321 "function f3() { };" | 1320 "function f3() { };" |
| 1322 "function f4() { };" | 1321 "function f4() { };" |
| 1323 "function f5() { };"; | 1322 "function f5() { };"; |
| 1324 CompileRun(source); | 1323 CompileRun(source); |
| 1325 CHECK_EQ(0, CountOptimizedUserFunctions(ctx[i])); | 1324 CHECK_EQ(0, CountOptimizedUserFunctions(ctx[i])); |
| 1326 CompileRun("f1()"); | 1325 CompileRun("f1()"); |
| 1327 CHECK_EQ(opt ? 1 : 0, CountOptimizedUserFunctions(ctx[i])); | 1326 CHECK_EQ(opt ? 1 : 0, CountOptimizedUserFunctions(ctx[i])); |
| 1328 CompileRun("f2()"); | 1327 CompileRun("f2()"); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1428 return count; | 1427 return count; |
| 1429 } | 1428 } |
| 1430 | 1429 |
| 1431 | 1430 |
| 1432 TEST(TestInternalWeakListsTraverseWithGC) { | 1431 TEST(TestInternalWeakListsTraverseWithGC) { |
| 1433 v8::V8::Initialize(); | 1432 v8::V8::Initialize(); |
| 1434 Isolate* isolate = Isolate::Current(); | 1433 Isolate* isolate = Isolate::Current(); |
| 1435 | 1434 |
| 1436 static const int kNumTestContexts = 10; | 1435 static const int kNumTestContexts = 10; |
| 1437 | 1436 |
| 1438 v8::HandleScope scope; | 1437 HandleScope scope(isolate); |
| 1439 v8::Persistent<v8::Context> ctx[kNumTestContexts]; | 1438 v8::Persistent<v8::Context> ctx[kNumTestContexts]; |
| 1440 | 1439 |
| 1441 CHECK_EQ(0, CountNativeContexts()); | 1440 CHECK_EQ(0, CountNativeContexts()); |
| 1442 | 1441 |
| 1443 // Create an number of contexts and check the length of the weak list both | 1442 // Create an number of contexts and check the length of the weak list both |
| 1444 // with and without GCs while iterating the list. | 1443 // with and without GCs while iterating the list. |
| 1445 for (int i = 0; i < kNumTestContexts; i++) { | 1444 for (int i = 0; i < kNumTestContexts; i++) { |
| 1446 ctx[i] = v8::Context::New(); | 1445 ctx[i] = v8::Context::New(); |
| 1447 CHECK_EQ(i + 1, CountNativeContexts()); | 1446 CHECK_EQ(i + 1, CountNativeContexts()); |
| 1448 CHECK_EQ(i + 1, CountNativeContextsWithGC(isolate, i / 2 + 1)); | 1447 CHECK_EQ(i + 1, CountNativeContextsWithGC(isolate, i / 2 + 1)); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1552 "delta: %" V8_PTR_PREFIX "d\n", | 1551 "delta: %" V8_PTR_PREFIX "d\n", |
| 1553 size_of_objects_1, size_of_objects_2, delta); | 1552 size_of_objects_1, size_of_objects_2, delta); |
| 1554 CHECK_GT(size_of_objects_2 / 20, delta); | 1553 CHECK_GT(size_of_objects_2 / 20, delta); |
| 1555 } | 1554 } |
| 1556 } | 1555 } |
| 1557 | 1556 |
| 1558 | 1557 |
| 1559 static void FillUpNewSpace(NewSpace* new_space) { | 1558 static void FillUpNewSpace(NewSpace* new_space) { |
| 1560 // Fill up new space to the point that it is completely full. Make sure | 1559 // Fill up new space to the point that it is completely full. Make sure |
| 1561 // that the scavenger does not undo the filling. | 1560 // that the scavenger does not undo the filling. |
| 1562 v8::HandleScope scope; | 1561 Heap* heap = new_space->heap(); |
| 1562 Isolate* isolate = heap->isolate(); |
| 1563 Factory* factory = isolate->factory(); |
| 1564 HandleScope scope(isolate); |
| 1563 AlwaysAllocateScope always_allocate; | 1565 AlwaysAllocateScope always_allocate; |
| 1564 intptr_t available = new_space->EffectiveCapacity() - new_space->Size(); | 1566 intptr_t available = new_space->EffectiveCapacity() - new_space->Size(); |
| 1565 intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1; | 1567 intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1; |
| 1566 for (intptr_t i = 0; i < number_of_fillers; i++) { | 1568 for (intptr_t i = 0; i < number_of_fillers; i++) { |
| 1567 CHECK(HEAP->InNewSpace(*FACTORY->NewFixedArray(32, NOT_TENURED))); | 1569 CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED))); |
| 1568 } | 1570 } |
| 1569 } | 1571 } |
| 1570 | 1572 |
| 1571 | 1573 |
| 1572 TEST(GrowAndShrinkNewSpace) { | 1574 TEST(GrowAndShrinkNewSpace) { |
| 1573 InitializeVM(); | 1575 InitializeVM(); |
| 1574 NewSpace* new_space = HEAP->new_space(); | 1576 NewSpace* new_space = HEAP->new_space(); |
| 1575 | 1577 |
| 1576 if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() || | 1578 if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() || |
| 1577 HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) { | 1579 HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1623 InitializeVM(); | 1625 InitializeVM(); |
| 1624 | 1626 |
| 1625 if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() || | 1627 if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() || |
| 1626 HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) { | 1628 HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) { |
| 1627 // The max size cannot exceed the reserved size, since semispaces must be | 1629 // The max size cannot exceed the reserved size, since semispaces must be |
| 1628 // always within the reserved space. We can't test new space growing and | 1630 // always within the reserved space. We can't test new space growing and |
| 1629 // shrinking if the reserved size is the same as the minimum (initial) size. | 1631 // shrinking if the reserved size is the same as the minimum (initial) size. |
| 1630 return; | 1632 return; |
| 1631 } | 1633 } |
| 1632 | 1634 |
| 1633 v8::HandleScope scope; | 1635 v8::HandleScope scope(env->GetIsolate()); |
| 1634 NewSpace* new_space = HEAP->new_space(); | 1636 NewSpace* new_space = HEAP->new_space(); |
| 1635 intptr_t old_capacity, new_capacity; | 1637 intptr_t old_capacity, new_capacity; |
| 1636 old_capacity = new_space->Capacity(); | 1638 old_capacity = new_space->Capacity(); |
| 1637 new_space->Grow(); | 1639 new_space->Grow(); |
| 1638 new_capacity = new_space->Capacity(); | 1640 new_capacity = new_space->Capacity(); |
| 1639 CHECK(2 * old_capacity == new_capacity); | 1641 CHECK(2 * old_capacity == new_capacity); |
| 1640 FillUpNewSpace(new_space); | 1642 FillUpNewSpace(new_space); |
| 1641 HEAP->CollectAllAvailableGarbage(); | 1643 HEAP->CollectAllAvailableGarbage(); |
| 1642 new_capacity = new_space->Capacity(); | 1644 new_capacity = new_space->Capacity(); |
| 1643 CHECK(old_capacity == new_capacity); | 1645 CHECK(old_capacity == new_capacity); |
| 1644 } | 1646 } |
| 1645 | 1647 |
| 1646 | 1648 |
| 1647 static int NumberOfGlobalObjects() { | 1649 static int NumberOfGlobalObjects() { |
| 1648 int count = 0; | 1650 int count = 0; |
| 1649 HeapIterator iterator(HEAP); | 1651 HeapIterator iterator(HEAP); |
| 1650 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 1652 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { |
| 1651 if (obj->IsGlobalObject()) count++; | 1653 if (obj->IsGlobalObject()) count++; |
| 1652 } | 1654 } |
| 1653 return count; | 1655 return count; |
| 1654 } | 1656 } |
| 1655 | 1657 |
| 1656 | 1658 |
| 1657 // Test that we don't embed maps from foreign contexts into | 1659 // Test that we don't embed maps from foreign contexts into |
| 1658 // optimized code. | 1660 // optimized code. |
| 1659 TEST(LeakNativeContextViaMap) { | 1661 TEST(LeakNativeContextViaMap) { |
| 1660 i::FLAG_allow_natives_syntax = true; | 1662 i::FLAG_allow_natives_syntax = true; |
| 1661 v8::HandleScope outer_scope; | 1663 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); |
| 1662 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); | 1664 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); |
| 1663 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); | 1665 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); |
| 1664 ctx1->Enter(); | 1666 ctx1->Enter(); |
| 1665 | 1667 |
| 1666 HEAP->CollectAllAvailableGarbage(); | 1668 HEAP->CollectAllAvailableGarbage(); |
| 1667 CHECK_EQ(4, NumberOfGlobalObjects()); | 1669 CHECK_EQ(4, NumberOfGlobalObjects()); |
| 1668 | 1670 |
| 1669 { | 1671 { |
| 1670 v8::HandleScope inner_scope; | 1672 v8::HandleScope inner_scope(v8::Isolate::GetCurrent()); |
| 1671 CompileRun("var v = {x: 42}"); | 1673 CompileRun("var v = {x: 42}"); |
| 1672 v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v")); | 1674 v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v")); |
| 1673 ctx2->Enter(); | 1675 ctx2->Enter(); |
| 1674 ctx2->Global()->Set(v8_str("o"), v); | 1676 ctx2->Global()->Set(v8_str("o"), v); |
| 1675 v8::Local<v8::Value> res = CompileRun( | 1677 v8::Local<v8::Value> res = CompileRun( |
| 1676 "function f() { return o.x; }" | 1678 "function f() { return o.x; }" |
| 1677 "for (var i = 0; i < 10; ++i) f();" | 1679 "for (var i = 0; i < 10; ++i) f();" |
| 1678 "%OptimizeFunctionOnNextCall(f);" | 1680 "%OptimizeFunctionOnNextCall(f);" |
| 1679 "f();"); | 1681 "f();"); |
| 1680 CHECK_EQ(42, res->Int32Value()); | 1682 CHECK_EQ(42, res->Int32Value()); |
| 1681 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); | 1683 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); |
| 1682 ctx2->Exit(); | 1684 ctx2->Exit(); |
| 1683 ctx1->Exit(); | 1685 ctx1->Exit(); |
| 1684 ctx1.Dispose(ctx1->GetIsolate()); | 1686 ctx1.Dispose(ctx1->GetIsolate()); |
| 1685 v8::V8::ContextDisposedNotification(); | 1687 v8::V8::ContextDisposedNotification(); |
| 1686 } | 1688 } |
| 1687 HEAP->CollectAllAvailableGarbage(); | 1689 HEAP->CollectAllAvailableGarbage(); |
| 1688 CHECK_EQ(2, NumberOfGlobalObjects()); | 1690 CHECK_EQ(2, NumberOfGlobalObjects()); |
| 1689 ctx2.Dispose(ctx2->GetIsolate()); | 1691 ctx2.Dispose(ctx2->GetIsolate()); |
| 1690 HEAP->CollectAllAvailableGarbage(); | 1692 HEAP->CollectAllAvailableGarbage(); |
| 1691 CHECK_EQ(0, NumberOfGlobalObjects()); | 1693 CHECK_EQ(0, NumberOfGlobalObjects()); |
| 1692 } | 1694 } |
| 1693 | 1695 |
| 1694 | 1696 |
| 1695 // Test that we don't embed functions from foreign contexts into | 1697 // Test that we don't embed functions from foreign contexts into |
| 1696 // optimized code. | 1698 // optimized code. |
| 1697 TEST(LeakNativeContextViaFunction) { | 1699 TEST(LeakNativeContextViaFunction) { |
| 1698 i::FLAG_allow_natives_syntax = true; | 1700 i::FLAG_allow_natives_syntax = true; |
| 1699 v8::HandleScope outer_scope; | 1701 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); |
| 1700 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); | 1702 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); |
| 1701 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); | 1703 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); |
| 1702 ctx1->Enter(); | 1704 ctx1->Enter(); |
| 1703 | 1705 |
| 1704 HEAP->CollectAllAvailableGarbage(); | 1706 HEAP->CollectAllAvailableGarbage(); |
| 1705 CHECK_EQ(4, NumberOfGlobalObjects()); | 1707 CHECK_EQ(4, NumberOfGlobalObjects()); |
| 1706 | 1708 |
| 1707 { | 1709 { |
| 1708 v8::HandleScope inner_scope; | 1710 v8::HandleScope inner_scope(v8::Isolate::GetCurrent()); |
| 1709 CompileRun("var v = function() { return 42; }"); | 1711 CompileRun("var v = function() { return 42; }"); |
| 1710 v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v")); | 1712 v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v")); |
| 1711 ctx2->Enter(); | 1713 ctx2->Enter(); |
| 1712 ctx2->Global()->Set(v8_str("o"), v); | 1714 ctx2->Global()->Set(v8_str("o"), v); |
| 1713 v8::Local<v8::Value> res = CompileRun( | 1715 v8::Local<v8::Value> res = CompileRun( |
| 1714 "function f(x) { return x(); }" | 1716 "function f(x) { return x(); }" |
| 1715 "for (var i = 0; i < 10; ++i) f(o);" | 1717 "for (var i = 0; i < 10; ++i) f(o);" |
| 1716 "%OptimizeFunctionOnNextCall(f);" | 1718 "%OptimizeFunctionOnNextCall(f);" |
| 1717 "f(o);"); | 1719 "f(o);"); |
| 1718 CHECK_EQ(42, res->Int32Value()); | 1720 CHECK_EQ(42, res->Int32Value()); |
| 1719 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); | 1721 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); |
| 1720 ctx2->Exit(); | 1722 ctx2->Exit(); |
| 1721 ctx1->Exit(); | 1723 ctx1->Exit(); |
| 1722 ctx1.Dispose(ctx1->GetIsolate()); | 1724 ctx1.Dispose(ctx1->GetIsolate()); |
| 1723 v8::V8::ContextDisposedNotification(); | 1725 v8::V8::ContextDisposedNotification(); |
| 1724 } | 1726 } |
| 1725 HEAP->CollectAllAvailableGarbage(); | 1727 HEAP->CollectAllAvailableGarbage(); |
| 1726 CHECK_EQ(2, NumberOfGlobalObjects()); | 1728 CHECK_EQ(2, NumberOfGlobalObjects()); |
| 1727 ctx2.Dispose(ctx2->GetIsolate()); | 1729 ctx2.Dispose(ctx2->GetIsolate()); |
| 1728 HEAP->CollectAllAvailableGarbage(); | 1730 HEAP->CollectAllAvailableGarbage(); |
| 1729 CHECK_EQ(0, NumberOfGlobalObjects()); | 1731 CHECK_EQ(0, NumberOfGlobalObjects()); |
| 1730 } | 1732 } |
| 1731 | 1733 |
| 1732 | 1734 |
| 1733 TEST(LeakNativeContextViaMapKeyed) { | 1735 TEST(LeakNativeContextViaMapKeyed) { |
| 1734 i::FLAG_allow_natives_syntax = true; | 1736 i::FLAG_allow_natives_syntax = true; |
| 1735 v8::HandleScope outer_scope; | 1737 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); |
| 1736 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); | 1738 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); |
| 1737 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); | 1739 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); |
| 1738 ctx1->Enter(); | 1740 ctx1->Enter(); |
| 1739 | 1741 |
| 1740 HEAP->CollectAllAvailableGarbage(); | 1742 HEAP->CollectAllAvailableGarbage(); |
| 1741 CHECK_EQ(4, NumberOfGlobalObjects()); | 1743 CHECK_EQ(4, NumberOfGlobalObjects()); |
| 1742 | 1744 |
| 1743 { | 1745 { |
| 1744 v8::HandleScope inner_scope; | 1746 v8::HandleScope inner_scope(v8::Isolate::GetCurrent()); |
| 1745 CompileRun("var v = [42, 43]"); | 1747 CompileRun("var v = [42, 43]"); |
| 1746 v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v")); | 1748 v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v")); |
| 1747 ctx2->Enter(); | 1749 ctx2->Enter(); |
| 1748 ctx2->Global()->Set(v8_str("o"), v); | 1750 ctx2->Global()->Set(v8_str("o"), v); |
| 1749 v8::Local<v8::Value> res = CompileRun( | 1751 v8::Local<v8::Value> res = CompileRun( |
| 1750 "function f() { return o[0]; }" | 1752 "function f() { return o[0]; }" |
| 1751 "for (var i = 0; i < 10; ++i) f();" | 1753 "for (var i = 0; i < 10; ++i) f();" |
| 1752 "%OptimizeFunctionOnNextCall(f);" | 1754 "%OptimizeFunctionOnNextCall(f);" |
| 1753 "f();"); | 1755 "f();"); |
| 1754 CHECK_EQ(42, res->Int32Value()); | 1756 CHECK_EQ(42, res->Int32Value()); |
| 1755 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); | 1757 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); |
| 1756 ctx2->Exit(); | 1758 ctx2->Exit(); |
| 1757 ctx1->Exit(); | 1759 ctx1->Exit(); |
| 1758 ctx1.Dispose(ctx1->GetIsolate()); | 1760 ctx1.Dispose(ctx1->GetIsolate()); |
| 1759 v8::V8::ContextDisposedNotification(); | 1761 v8::V8::ContextDisposedNotification(); |
| 1760 } | 1762 } |
| 1761 HEAP->CollectAllAvailableGarbage(); | 1763 HEAP->CollectAllAvailableGarbage(); |
| 1762 CHECK_EQ(2, NumberOfGlobalObjects()); | 1764 CHECK_EQ(2, NumberOfGlobalObjects()); |
| 1763 ctx2.Dispose(ctx2->GetIsolate()); | 1765 ctx2.Dispose(ctx2->GetIsolate()); |
| 1764 HEAP->CollectAllAvailableGarbage(); | 1766 HEAP->CollectAllAvailableGarbage(); |
| 1765 CHECK_EQ(0, NumberOfGlobalObjects()); | 1767 CHECK_EQ(0, NumberOfGlobalObjects()); |
| 1766 } | 1768 } |
| 1767 | 1769 |
| 1768 | 1770 |
| 1769 TEST(LeakNativeContextViaMapProto) { | 1771 TEST(LeakNativeContextViaMapProto) { |
| 1770 i::FLAG_allow_natives_syntax = true; | 1772 i::FLAG_allow_natives_syntax = true; |
| 1771 v8::HandleScope outer_scope; | 1773 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); |
| 1772 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); | 1774 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); |
| 1773 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); | 1775 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); |
| 1774 ctx1->Enter(); | 1776 ctx1->Enter(); |
| 1775 | 1777 |
| 1776 HEAP->CollectAllAvailableGarbage(); | 1778 HEAP->CollectAllAvailableGarbage(); |
| 1777 CHECK_EQ(4, NumberOfGlobalObjects()); | 1779 CHECK_EQ(4, NumberOfGlobalObjects()); |
| 1778 | 1780 |
| 1779 { | 1781 { |
| 1780 v8::HandleScope inner_scope; | 1782 v8::HandleScope inner_scope(v8::Isolate::GetCurrent()); |
| 1781 CompileRun("var v = { y: 42}"); | 1783 CompileRun("var v = { y: 42}"); |
| 1782 v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v")); | 1784 v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v")); |
| 1783 ctx2->Enter(); | 1785 ctx2->Enter(); |
| 1784 ctx2->Global()->Set(v8_str("o"), v); | 1786 ctx2->Global()->Set(v8_str("o"), v); |
| 1785 v8::Local<v8::Value> res = CompileRun( | 1787 v8::Local<v8::Value> res = CompileRun( |
| 1786 "function f() {" | 1788 "function f() {" |
| 1787 " var p = {x: 42};" | 1789 " var p = {x: 42};" |
| 1788 " p.__proto__ = o;" | 1790 " p.__proto__ = o;" |
| 1789 " return p.x;" | 1791 " return p.x;" |
| 1790 "}" | 1792 "}" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1808 | 1810 |
| 1809 TEST(InstanceOfStubWriteBarrier) { | 1811 TEST(InstanceOfStubWriteBarrier) { |
| 1810 i::FLAG_allow_natives_syntax = true; | 1812 i::FLAG_allow_natives_syntax = true; |
| 1811 #ifdef VERIFY_HEAP | 1813 #ifdef VERIFY_HEAP |
| 1812 i::FLAG_verify_heap = true; | 1814 i::FLAG_verify_heap = true; |
| 1813 #endif | 1815 #endif |
| 1814 | 1816 |
| 1815 InitializeVM(); | 1817 InitializeVM(); |
| 1816 if (!i::V8::UseCrankshaft()) return; | 1818 if (!i::V8::UseCrankshaft()) return; |
| 1817 if (i::FLAG_force_marking_deque_overflows) return; | 1819 if (i::FLAG_force_marking_deque_overflows) return; |
| 1818 v8::HandleScope outer_scope; | 1820 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); |
| 1819 | 1821 |
| 1820 { | 1822 { |
| 1821 v8::HandleScope scope; | 1823 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 1822 CompileRun( | 1824 CompileRun( |
| 1823 "function foo () { }" | 1825 "function foo () { }" |
| 1824 "function mkbar () { return new (new Function(\"\")) (); }" | 1826 "function mkbar () { return new (new Function(\"\")) (); }" |
| 1825 "function f (x) { return (x instanceof foo); }" | 1827 "function f (x) { return (x instanceof foo); }" |
| 1826 "function g () { f(mkbar()); }" | 1828 "function g () { f(mkbar()); }" |
| 1827 "f(new foo()); f(new foo());" | 1829 "f(new foo()); f(new foo());" |
| 1828 "%OptimizeFunctionOnNextCall(f);" | 1830 "%OptimizeFunctionOnNextCall(f);" |
| 1829 "f(new foo()); g();"); | 1831 "f(new foo()); g();"); |
| 1830 } | 1832 } |
| 1831 | 1833 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1843 while (!Marking::IsBlack(Marking::MarkBitFrom(f->code())) && | 1845 while (!Marking::IsBlack(Marking::MarkBitFrom(f->code())) && |
| 1844 !marking->IsStopped()) { | 1846 !marking->IsStopped()) { |
| 1845 // Discard any pending GC requests otherwise we will get GC when we enter | 1847 // Discard any pending GC requests otherwise we will get GC when we enter |
| 1846 // code below. | 1848 // code below. |
| 1847 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 1849 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
| 1848 } | 1850 } |
| 1849 | 1851 |
| 1850 CHECK(marking->IsMarking()); | 1852 CHECK(marking->IsMarking()); |
| 1851 | 1853 |
| 1852 { | 1854 { |
| 1853 v8::HandleScope scope; | 1855 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 1854 v8::Handle<v8::Object> global = v8::Context::GetCurrent()->Global(); | 1856 v8::Handle<v8::Object> global = v8::Context::GetCurrent()->Global(); |
| 1855 v8::Handle<v8::Function> g = | 1857 v8::Handle<v8::Function> g = |
| 1856 v8::Handle<v8::Function>::Cast(global->Get(v8_str("g"))); | 1858 v8::Handle<v8::Function>::Cast(global->Get(v8_str("g"))); |
| 1857 g->Call(global, 0, NULL); | 1859 g->Call(global, 0, NULL); |
| 1858 } | 1860 } |
| 1859 | 1861 |
| 1860 HEAP->incremental_marking()->set_should_hurry(true); | 1862 HEAP->incremental_marking()->set_should_hurry(true); |
| 1861 HEAP->CollectGarbage(OLD_POINTER_SPACE); | 1863 HEAP->CollectGarbage(OLD_POINTER_SPACE); |
| 1862 } | 1864 } |
| 1863 | 1865 |
| 1864 | 1866 |
| 1865 TEST(PrototypeTransitionClearing) { | 1867 TEST(PrototypeTransitionClearing) { |
| 1866 InitializeVM(); | 1868 InitializeVM(); |
| 1867 v8::HandleScope scope; | 1869 v8::HandleScope scope(env->GetIsolate()); |
| 1868 | 1870 |
| 1869 CompileRun( | 1871 CompileRun( |
| 1870 "var base = {};" | 1872 "var base = {};" |
| 1871 "var live = [];" | 1873 "var live = [];" |
| 1872 "for (var i = 0; i < 10; i++) {" | 1874 "for (var i = 0; i < 10; i++) {" |
| 1873 " var object = {};" | 1875 " var object = {};" |
| 1874 " var prototype = {};" | 1876 " var prototype = {};" |
| 1875 " object.__proto__ = prototype;" | 1877 " object.__proto__ = prototype;" |
| 1876 " if (i >= 3) live.push(object, prototype);" | 1878 " if (i >= 3) live.push(object, prototype);" |
| 1877 "}"); | 1879 "}"); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1921 | 1923 |
| 1922 | 1924 |
| 1923 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { | 1925 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { |
| 1924 i::FLAG_allow_natives_syntax = true; | 1926 i::FLAG_allow_natives_syntax = true; |
| 1925 #ifdef VERIFY_HEAP | 1927 #ifdef VERIFY_HEAP |
| 1926 i::FLAG_verify_heap = true; | 1928 i::FLAG_verify_heap = true; |
| 1927 #endif | 1929 #endif |
| 1928 | 1930 |
| 1929 InitializeVM(); | 1931 InitializeVM(); |
| 1930 if (!i::V8::UseCrankshaft()) return; | 1932 if (!i::V8::UseCrankshaft()) return; |
| 1931 v8::HandleScope outer_scope; | 1933 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); |
| 1932 | 1934 |
| 1933 { | 1935 { |
| 1934 v8::HandleScope scope; | 1936 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 1935 CompileRun( | 1937 CompileRun( |
| 1936 "function f () {" | 1938 "function f () {" |
| 1937 " var s = 0;" | 1939 " var s = 0;" |
| 1938 " for (var i = 0; i < 100; i++) s += i;" | 1940 " for (var i = 0; i < 100; i++) s += i;" |
| 1939 " return s;" | 1941 " return s;" |
| 1940 "}" | 1942 "}" |
| 1941 "f(); f();" | 1943 "f(); f();" |
| 1942 "%OptimizeFunctionOnNextCall(f);" | 1944 "%OptimizeFunctionOnNextCall(f);" |
| 1943 "f();"); | 1945 "f();"); |
| 1944 } | 1946 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1977 | 1979 |
| 1978 | 1980 |
| 1979 TEST(ResetSharedFunctionInfoCountersDuringMarkSweep) { | 1981 TEST(ResetSharedFunctionInfoCountersDuringMarkSweep) { |
| 1980 i::FLAG_allow_natives_syntax = true; | 1982 i::FLAG_allow_natives_syntax = true; |
| 1981 #ifdef VERIFY_HEAP | 1983 #ifdef VERIFY_HEAP |
| 1982 i::FLAG_verify_heap = true; | 1984 i::FLAG_verify_heap = true; |
| 1983 #endif | 1985 #endif |
| 1984 | 1986 |
| 1985 InitializeVM(); | 1987 InitializeVM(); |
| 1986 if (!i::V8::UseCrankshaft()) return; | 1988 if (!i::V8::UseCrankshaft()) return; |
| 1987 v8::HandleScope outer_scope; | 1989 v8::HandleScope outer_scope(env->GetIsolate()); |
| 1988 | 1990 |
| 1989 { | 1991 { |
| 1990 v8::HandleScope scope; | 1992 v8::HandleScope scope(env->GetIsolate()); |
| 1991 CompileRun( | 1993 CompileRun( |
| 1992 "function f () {" | 1994 "function f () {" |
| 1993 " var s = 0;" | 1995 " var s = 0;" |
| 1994 " for (var i = 0; i < 100; i++) s += i;" | 1996 " for (var i = 0; i < 100; i++) s += i;" |
| 1995 " return s;" | 1997 " return s;" |
| 1996 "}" | 1998 "}" |
| 1997 "f(); f();" | 1999 "f(); f();" |
| 1998 "%OptimizeFunctionOnNextCall(f);" | 2000 "%OptimizeFunctionOnNextCall(f);" |
| 1999 "f();"); | 2001 "f();"); |
| 2000 } | 2002 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2017 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); | 2019 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); |
| 2018 } | 2020 } |
| 2019 | 2021 |
| 2020 | 2022 |
| 2021 // Test that HAllocateObject will always return an object in new-space. | 2023 // Test that HAllocateObject will always return an object in new-space. |
| 2022 TEST(OptimizedAllocationAlwaysInNewSpace) { | 2024 TEST(OptimizedAllocationAlwaysInNewSpace) { |
| 2023 i::FLAG_allow_natives_syntax = true; | 2025 i::FLAG_allow_natives_syntax = true; |
| 2024 InitializeVM(); | 2026 InitializeVM(); |
| 2025 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; | 2027 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; |
| 2026 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2028 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2027 v8::HandleScope scope; | 2029 v8::HandleScope scope(env->GetIsolate()); |
| 2028 | 2030 |
| 2029 SimulateFullSpace(HEAP->new_space()); | 2031 SimulateFullSpace(HEAP->new_space()); |
| 2030 AlwaysAllocateScope always_allocate; | 2032 AlwaysAllocateScope always_allocate; |
| 2031 v8::Local<v8::Value> res = CompileRun( | 2033 v8::Local<v8::Value> res = CompileRun( |
| 2032 "function c(x) {" | 2034 "function c(x) {" |
| 2033 " this.x = x;" | 2035 " this.x = x;" |
| 2034 " for (var i = 0; i < 32; i++) {" | 2036 " for (var i = 0; i < 32; i++) {" |
| 2035 " this['x' + i] = x;" | 2037 " this['x' + i] = x;" |
| 2036 " }" | 2038 " }" |
| 2037 "}" | 2039 "}" |
| 2038 "function f(x) { return new c(x); };" | 2040 "function f(x) { return new c(x); };" |
| 2039 "f(1); f(2); f(3);" | 2041 "f(1); f(2); f(3);" |
| 2040 "%OptimizeFunctionOnNextCall(f);" | 2042 "%OptimizeFunctionOnNextCall(f);" |
| 2041 "f(4);"); | 2043 "f(4);"); |
| 2042 CHECK_EQ(4, res->ToObject()->GetRealNamedProperty(v8_str("x"))->Int32Value()); | 2044 CHECK_EQ(4, res->ToObject()->GetRealNamedProperty(v8_str("x"))->Int32Value()); |
| 2043 | 2045 |
| 2044 Handle<JSObject> o = | 2046 Handle<JSObject> o = |
| 2045 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); | 2047 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| 2046 | 2048 |
| 2047 CHECK(HEAP->InNewSpace(*o)); | 2049 CHECK(HEAP->InNewSpace(*o)); |
| 2048 } | 2050 } |
| 2049 | 2051 |
| 2050 | 2052 |
| 2051 // Test pretenuring of array literals allocated with HAllocate. | 2053 // Test pretenuring of array literals allocated with HAllocate. |
| 2052 TEST(OptimizedPretenuringArrayLiterals) { | 2054 TEST(OptimizedPretenuringArrayLiterals) { |
| 2053 i::FLAG_allow_natives_syntax = true; | 2055 i::FLAG_allow_natives_syntax = true; |
| 2054 InitializeVM(); | 2056 InitializeVM(); |
| 2055 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; | 2057 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; |
| 2056 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2058 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2057 v8::HandleScope scope; | 2059 v8::HandleScope scope(env->GetIsolate()); |
| 2058 | 2060 |
| 2059 AlwaysAllocateScope always_allocate; | 2061 AlwaysAllocateScope always_allocate; |
| 2060 v8::Local<v8::Value> res = CompileRun( | 2062 v8::Local<v8::Value> res = CompileRun( |
| 2061 "function f() {" | 2063 "function f() {" |
| 2062 " var numbers = new Array(1, 2, 3);" | 2064 " var numbers = new Array(1, 2, 3);" |
| 2063 " numbers[0] = 3.14;" | 2065 " numbers[0] = 3.14;" |
| 2064 " return numbers;" | 2066 " return numbers;" |
| 2065 "};" | 2067 "};" |
| 2066 "f(); f(); f();" | 2068 "f(); f(); f();" |
| 2067 "%OptimizeFunctionOnNextCall(f);" | 2069 "%OptimizeFunctionOnNextCall(f);" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2078 CHECK(HEAP->InNewSpace(*o)); | 2080 CHECK(HEAP->InNewSpace(*o)); |
| 2079 } | 2081 } |
| 2080 | 2082 |
| 2081 | 2083 |
| 2082 // Test regular array literals allocation. | 2084 // Test regular array literals allocation. |
| 2083 TEST(OptimizedAllocationArrayLiterals) { | 2085 TEST(OptimizedAllocationArrayLiterals) { |
| 2084 i::FLAG_allow_natives_syntax = true; | 2086 i::FLAG_allow_natives_syntax = true; |
| 2085 InitializeVM(); | 2087 InitializeVM(); |
| 2086 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; | 2088 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; |
| 2087 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2089 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2088 v8::HandleScope scope; | 2090 v8::HandleScope scope(env->GetIsolate()); |
| 2089 | 2091 |
| 2090 AlwaysAllocateScope always_allocate; | 2092 AlwaysAllocateScope always_allocate; |
| 2091 v8::Local<v8::Value> res = CompileRun( | 2093 v8::Local<v8::Value> res = CompileRun( |
| 2092 "function f() {" | 2094 "function f() {" |
| 2093 " var numbers = new Array(1, 2, 3);" | 2095 " var numbers = new Array(1, 2, 3);" |
| 2094 " numbers[0] = 3.14;" | 2096 " numbers[0] = 3.14;" |
| 2095 " return numbers;" | 2097 " return numbers;" |
| 2096 "};" | 2098 "};" |
| 2097 "f(); f(); f();" | 2099 "f(); f(); f();" |
| 2098 "%OptimizeFunctionOnNextCall(f);" | 2100 "%OptimizeFunctionOnNextCall(f);" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2111 return map->transitions()->number_of_transitions(); | 2113 return map->transitions()->number_of_transitions(); |
| 2112 } | 2114 } |
| 2113 | 2115 |
| 2114 | 2116 |
| 2115 // Test that map transitions are cleared and maps are collected with | 2117 // Test that map transitions are cleared and maps are collected with |
| 2116 // incremental marking as well. | 2118 // incremental marking as well. |
| 2117 TEST(Regress1465) { | 2119 TEST(Regress1465) { |
| 2118 i::FLAG_allow_natives_syntax = true; | 2120 i::FLAG_allow_natives_syntax = true; |
| 2119 i::FLAG_trace_incremental_marking = true; | 2121 i::FLAG_trace_incremental_marking = true; |
| 2120 InitializeVM(); | 2122 InitializeVM(); |
| 2121 v8::HandleScope scope; | 2123 v8::HandleScope scope(env->GetIsolate()); |
| 2122 static const int transitions_count = 256; | 2124 static const int transitions_count = 256; |
| 2123 | 2125 |
| 2124 { | 2126 { |
| 2125 AlwaysAllocateScope always_allocate; | 2127 AlwaysAllocateScope always_allocate; |
| 2126 for (int i = 0; i < transitions_count; i++) { | 2128 for (int i = 0; i < transitions_count; i++) { |
| 2127 EmbeddedVector<char, 64> buffer; | 2129 EmbeddedVector<char, 64> buffer; |
| 2128 OS::SNPrintF(buffer, "var o = new Object; o.prop%d = %d;", i, i); | 2130 OS::SNPrintF(buffer, "var o = new Object; o.prop%d = %d;", i, i); |
| 2129 CompileRun(buffer.start()); | 2131 CompileRun(buffer.start()); |
| 2130 } | 2132 } |
| 2131 CompileRun("var root = new Object;"); | 2133 CompileRun("var root = new Object;"); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2149 int transitions_after = CountMapTransitions(root->map()); | 2151 int transitions_after = CountMapTransitions(root->map()); |
| 2150 CompileRun("%DebugPrint(root);"); | 2152 CompileRun("%DebugPrint(root);"); |
| 2151 CHECK_EQ(1, transitions_after); | 2153 CHECK_EQ(1, transitions_after); |
| 2152 } | 2154 } |
| 2153 | 2155 |
| 2154 | 2156 |
| 2155 TEST(Regress2143a) { | 2157 TEST(Regress2143a) { |
| 2156 i::FLAG_collect_maps = true; | 2158 i::FLAG_collect_maps = true; |
| 2157 i::FLAG_incremental_marking = true; | 2159 i::FLAG_incremental_marking = true; |
| 2158 InitializeVM(); | 2160 InitializeVM(); |
| 2159 v8::HandleScope scope; | 2161 v8::HandleScope scope(env->GetIsolate()); |
| 2160 | 2162 |
| 2161 // Prepare a map transition from the root object together with a yet | 2163 // Prepare a map transition from the root object together with a yet |
| 2162 // untransitioned root object. | 2164 // untransitioned root object. |
| 2163 CompileRun("var root = new Object;" | 2165 CompileRun("var root = new Object;" |
| 2164 "root.foo = 0;" | 2166 "root.foo = 0;" |
| 2165 "root = new Object;"); | 2167 "root = new Object;"); |
| 2166 | 2168 |
| 2167 SimulateIncrementalMarking(); | 2169 SimulateIncrementalMarking(); |
| 2168 | 2170 |
| 2169 // Compile a StoreIC that performs the prepared map transition. This | 2171 // Compile a StoreIC that performs the prepared map transition. This |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2190 CHECK(root->IsJSObject()); | 2192 CHECK(root->IsJSObject()); |
| 2191 CHECK(root->map()->IsMap()); | 2193 CHECK(root->map()->IsMap()); |
| 2192 } | 2194 } |
| 2193 | 2195 |
| 2194 | 2196 |
| 2195 TEST(Regress2143b) { | 2197 TEST(Regress2143b) { |
| 2196 i::FLAG_collect_maps = true; | 2198 i::FLAG_collect_maps = true; |
| 2197 i::FLAG_incremental_marking = true; | 2199 i::FLAG_incremental_marking = true; |
| 2198 i::FLAG_allow_natives_syntax = true; | 2200 i::FLAG_allow_natives_syntax = true; |
| 2199 InitializeVM(); | 2201 InitializeVM(); |
| 2200 v8::HandleScope scope; | 2202 v8::HandleScope scope(env->GetIsolate()); |
| 2201 | 2203 |
| 2202 // Prepare a map transition from the root object together with a yet | 2204 // Prepare a map transition from the root object together with a yet |
| 2203 // untransitioned root object. | 2205 // untransitioned root object. |
| 2204 CompileRun("var root = new Object;" | 2206 CompileRun("var root = new Object;" |
| 2205 "root.foo = 0;" | 2207 "root.foo = 0;" |
| 2206 "root = new Object;"); | 2208 "root = new Object;"); |
| 2207 | 2209 |
| 2208 SimulateIncrementalMarking(); | 2210 SimulateIncrementalMarking(); |
| 2209 | 2211 |
| 2210 // Compile an optimized LStoreNamedField that performs the prepared | 2212 // Compile an optimized LStoreNamedField that performs the prepared |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2235 CHECK(root->map()->IsMap()); | 2237 CHECK(root->map()->IsMap()); |
| 2236 } | 2238 } |
| 2237 | 2239 |
| 2238 | 2240 |
| 2239 TEST(ReleaseOverReservedPages) { | 2241 TEST(ReleaseOverReservedPages) { |
| 2240 i::FLAG_trace_gc = true; | 2242 i::FLAG_trace_gc = true; |
| 2241 // The optimizer can allocate stuff, messing up the test. | 2243 // The optimizer can allocate stuff, messing up the test. |
| 2242 i::FLAG_crankshaft = false; | 2244 i::FLAG_crankshaft = false; |
| 2243 i::FLAG_always_opt = false; | 2245 i::FLAG_always_opt = false; |
| 2244 InitializeVM(); | 2246 InitializeVM(); |
| 2245 v8::HandleScope scope; | 2247 v8::HandleScope scope(env->GetIsolate()); |
| 2246 static const int number_of_test_pages = 20; | 2248 static const int number_of_test_pages = 20; |
| 2247 | 2249 |
| 2248 // Prepare many pages with low live-bytes count. | 2250 // Prepare many pages with low live-bytes count. |
| 2249 PagedSpace* old_pointer_space = HEAP->old_pointer_space(); | 2251 PagedSpace* old_pointer_space = HEAP->old_pointer_space(); |
| 2250 CHECK_EQ(1, old_pointer_space->CountTotalPages()); | 2252 CHECK_EQ(1, old_pointer_space->CountTotalPages()); |
| 2251 for (int i = 0; i < number_of_test_pages; i++) { | 2253 for (int i = 0; i < number_of_test_pages; i++) { |
| 2252 AlwaysAllocateScope always_allocate; | 2254 AlwaysAllocateScope always_allocate; |
| 2253 SimulateFullSpace(old_pointer_space); | 2255 SimulateFullSpace(old_pointer_space); |
| 2254 FACTORY->NewFixedArray(1, TENURED); | 2256 FACTORY->NewFixedArray(1, TENURED); |
| 2255 } | 2257 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2274 // first page should be small in order to reduce memory used when the VM | 2276 // first page should be small in order to reduce memory used when the VM |
| 2275 // boots, but if the 20 small arrays don't fit on the first page then that's | 2277 // boots, but if the 20 small arrays don't fit on the first page then that's |
| 2276 // an indication that it is too small. | 2278 // an indication that it is too small. |
| 2277 HEAP->CollectAllAvailableGarbage("triggered really hard"); | 2279 HEAP->CollectAllAvailableGarbage("triggered really hard"); |
| 2278 CHECK_EQ(1, old_pointer_space->CountTotalPages()); | 2280 CHECK_EQ(1, old_pointer_space->CountTotalPages()); |
| 2279 } | 2281 } |
| 2280 | 2282 |
| 2281 | 2283 |
| 2282 TEST(Regress2237) { | 2284 TEST(Regress2237) { |
| 2283 InitializeVM(); | 2285 InitializeVM(); |
| 2284 v8::HandleScope scope; | 2286 v8::HandleScope scope(env->GetIsolate()); |
| 2285 Handle<String> slice(HEAP->empty_string()); | 2287 Handle<String> slice(HEAP->empty_string()); |
| 2286 | 2288 |
| 2287 { | 2289 { |
| 2288 // Generate a parent that lives in new-space. | 2290 // Generate a parent that lives in new-space. |
| 2289 v8::HandleScope inner_scope; | 2291 v8::HandleScope inner_scope(env->GetIsolate()); |
| 2290 const char* c = "This text is long enough to trigger sliced strings."; | 2292 const char* c = "This text is long enough to trigger sliced strings."; |
| 2291 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector(c)); | 2293 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector(c)); |
| 2292 CHECK(s->IsSeqOneByteString()); | 2294 CHECK(s->IsSeqOneByteString()); |
| 2293 CHECK(HEAP->InNewSpace(*s)); | 2295 CHECK(HEAP->InNewSpace(*s)); |
| 2294 | 2296 |
| 2295 // Generate a sliced string that is based on the above parent and | 2297 // Generate a sliced string that is based on the above parent and |
| 2296 // lives in old-space. | 2298 // lives in old-space. |
| 2297 SimulateFullSpace(HEAP->new_space()); | 2299 SimulateFullSpace(HEAP->new_space()); |
| 2298 AlwaysAllocateScope always_allocate; | 2300 AlwaysAllocateScope always_allocate; |
| 2299 Handle<String> t = FACTORY->NewProperSubString(s, 5, 35); | 2301 Handle<String> t = FACTORY->NewProperSubString(s, 5, 35); |
| 2300 CHECK(t->IsSlicedString()); | 2302 CHECK(t->IsSlicedString()); |
| 2301 CHECK(!HEAP->InNewSpace(*t)); | 2303 CHECK(!HEAP->InNewSpace(*t)); |
| 2302 *slice.location() = *t.location(); | 2304 *slice.location() = *t.location(); |
| 2303 } | 2305 } |
| 2304 | 2306 |
| 2305 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); | 2307 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); |
| 2306 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 2308 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 2307 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); | 2309 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); |
| 2308 } | 2310 } |
| 2309 | 2311 |
| 2310 | 2312 |
| 2311 #ifdef OBJECT_PRINT | 2313 #ifdef OBJECT_PRINT |
| 2312 TEST(PrintSharedFunctionInfo) { | 2314 TEST(PrintSharedFunctionInfo) { |
| 2313 InitializeVM(); | 2315 InitializeVM(); |
| 2314 v8::HandleScope scope; | 2316 v8::HandleScope scope(env->GetIsolate()); |
| 2315 const char* source = "f = function() { return 987654321; }\n" | 2317 const char* source = "f = function() { return 987654321; }\n" |
| 2316 "g = function() { return 123456789; }\n"; | 2318 "g = function() { return 123456789; }\n"; |
| 2317 CompileRun(source); | 2319 CompileRun(source); |
| 2318 Handle<JSFunction> g = | 2320 Handle<JSFunction> g = |
| 2319 v8::Utils::OpenHandle( | 2321 v8::Utils::OpenHandle( |
| 2320 *v8::Handle<v8::Function>::Cast( | 2322 *v8::Handle<v8::Function>::Cast( |
| 2321 v8::Context::GetCurrent()->Global()->Get(v8_str("g")))); | 2323 v8::Context::GetCurrent()->Global()->Get(v8_str("g")))); |
| 2322 | 2324 |
| 2323 AssertNoAllocation no_alloc; | 2325 AssertNoAllocation no_alloc; |
| 2324 g->shared()->PrintLn(); | 2326 g->shared()->PrintLn(); |
| 2325 } | 2327 } |
| 2326 #endif // OBJECT_PRINT | 2328 #endif // OBJECT_PRINT |
| 2327 | 2329 |
| 2328 | 2330 |
| 2329 TEST(Regress2211) { | 2331 TEST(Regress2211) { |
| 2330 InitializeVM(); | 2332 InitializeVM(); |
| 2331 v8::HandleScope scope; | 2333 v8::HandleScope scope(env->GetIsolate()); |
| 2332 | 2334 |
| 2333 v8::Handle<v8::String> value = v8_str("val string"); | 2335 v8::Handle<v8::String> value = v8_str("val string"); |
| 2334 Smi* hash = Smi::FromInt(321); | 2336 Smi* hash = Smi::FromInt(321); |
| 2335 Heap* heap = Isolate::Current()->heap(); | 2337 Heap* heap = Isolate::Current()->heap(); |
| 2336 | 2338 |
| 2337 for (int i = 0; i < 2; i++) { | 2339 for (int i = 0; i < 2; i++) { |
| 2338 // Store identity hash first and common hidden property second. | 2340 // Store identity hash first and common hidden property second. |
| 2339 v8::Handle<v8::Object> obj = v8::Object::New(); | 2341 v8::Handle<v8::Object> obj = v8::Object::New(); |
| 2340 Handle<JSObject> internal_obj = v8::Utils::OpenHandle(*obj); | 2342 Handle<JSObject> internal_obj = v8::Utils::OpenHandle(*obj); |
| 2341 CHECK(internal_obj->HasFastProperties()); | 2343 CHECK(internal_obj->HasFastProperties()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2359 internal_obj->FastPropertyAt(descriptors->GetFieldIndex(0))); | 2361 internal_obj->FastPropertyAt(descriptors->GetFieldIndex(0))); |
| 2360 // HashTable header (5) and 4 initial entries (8). | 2362 // HashTable header (5) and 4 initial entries (8). |
| 2361 CHECK_LE(hashtable->SizeFor(hashtable->length()), 13 * kPointerSize); | 2363 CHECK_LE(hashtable->SizeFor(hashtable->length()), 13 * kPointerSize); |
| 2362 } | 2364 } |
| 2363 } | 2365 } |
| 2364 | 2366 |
| 2365 | 2367 |
| 2366 TEST(IncrementalMarkingClearsTypeFeedbackCells) { | 2368 TEST(IncrementalMarkingClearsTypeFeedbackCells) { |
| 2367 if (i::FLAG_always_opt) return; | 2369 if (i::FLAG_always_opt) return; |
| 2368 InitializeVM(); | 2370 InitializeVM(); |
| 2369 v8::HandleScope scope; | 2371 v8::HandleScope scope(env->GetIsolate()); |
| 2370 v8::Local<v8::Value> fun1, fun2; | 2372 v8::Local<v8::Value> fun1, fun2; |
| 2371 | 2373 |
| 2372 { | 2374 { |
| 2373 LocalContext env; | 2375 LocalContext env; |
| 2374 CompileRun("function fun() {};"); | 2376 CompileRun("function fun() {};"); |
| 2375 fun1 = env->Global()->Get(v8_str("fun")); | 2377 fun1 = env->Global()->Get(v8_str("fun")); |
| 2376 } | 2378 } |
| 2377 | 2379 |
| 2378 { | 2380 { |
| 2379 LocalContext env; | 2381 LocalContext env; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2418 return target; | 2420 return target; |
| 2419 } | 2421 } |
| 2420 } | 2422 } |
| 2421 return NULL; | 2423 return NULL; |
| 2422 } | 2424 } |
| 2423 | 2425 |
| 2424 | 2426 |
| 2425 TEST(IncrementalMarkingPreservesMonomorhpicIC) { | 2427 TEST(IncrementalMarkingPreservesMonomorhpicIC) { |
| 2426 if (i::FLAG_always_opt) return; | 2428 if (i::FLAG_always_opt) return; |
| 2427 InitializeVM(); | 2429 InitializeVM(); |
| 2428 v8::HandleScope scope; | 2430 v8::HandleScope scope(env->GetIsolate()); |
| 2429 | 2431 |
| 2430 // Prepare function f that contains a monomorphic IC for object | 2432 // Prepare function f that contains a monomorphic IC for object |
| 2431 // originating from the same native context. | 2433 // originating from the same native context. |
| 2432 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" | 2434 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" |
| 2433 "function f(o) { return o.x; } f(obj); f(obj);"); | 2435 "function f(o) { return o.x; } f(obj); f(obj);"); |
| 2434 Handle<JSFunction> f = | 2436 Handle<JSFunction> f = |
| 2435 v8::Utils::OpenHandle( | 2437 v8::Utils::OpenHandle( |
| 2436 *v8::Handle<v8::Function>::Cast( | 2438 *v8::Handle<v8::Function>::Cast( |
| 2437 v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); | 2439 v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); |
| 2438 | 2440 |
| 2439 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 2441 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
| 2440 CHECK(ic_before->ic_state() == MONOMORPHIC); | 2442 CHECK(ic_before->ic_state() == MONOMORPHIC); |
| 2441 | 2443 |
| 2442 SimulateIncrementalMarking(); | 2444 SimulateIncrementalMarking(); |
| 2443 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 2445 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 2444 | 2446 |
| 2445 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 2447 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
| 2446 CHECK(ic_after->ic_state() == MONOMORPHIC); | 2448 CHECK(ic_after->ic_state() == MONOMORPHIC); |
| 2447 } | 2449 } |
| 2448 | 2450 |
| 2449 | 2451 |
| 2450 TEST(IncrementalMarkingClearsMonomorhpicIC) { | 2452 TEST(IncrementalMarkingClearsMonomorhpicIC) { |
| 2451 if (i::FLAG_always_opt) return; | 2453 if (i::FLAG_always_opt) return; |
| 2452 InitializeVM(); | 2454 InitializeVM(); |
| 2453 v8::HandleScope scope; | 2455 v8::HandleScope scope(env->GetIsolate()); |
| 2454 v8::Local<v8::Value> obj1; | 2456 v8::Local<v8::Value> obj1; |
| 2455 | 2457 |
| 2456 { | 2458 { |
| 2457 LocalContext env; | 2459 LocalContext env; |
| 2458 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | 2460 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
| 2459 obj1 = env->Global()->Get(v8_str("obj")); | 2461 obj1 = env->Global()->Get(v8_str("obj")); |
| 2460 } | 2462 } |
| 2461 | 2463 |
| 2462 // Prepare function f that contains a monomorphic IC for object | 2464 // Prepare function f that contains a monomorphic IC for object |
| 2463 // originating from a different native context. | 2465 // originating from a different native context. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2477 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 2479 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 2478 | 2480 |
| 2479 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 2481 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
| 2480 CHECK(ic_after->ic_state() == UNINITIALIZED); | 2482 CHECK(ic_after->ic_state() == UNINITIALIZED); |
| 2481 } | 2483 } |
| 2482 | 2484 |
| 2483 | 2485 |
| 2484 TEST(IncrementalMarkingClearsPolymorhpicIC) { | 2486 TEST(IncrementalMarkingClearsPolymorhpicIC) { |
| 2485 if (i::FLAG_always_opt) return; | 2487 if (i::FLAG_always_opt) return; |
| 2486 InitializeVM(); | 2488 InitializeVM(); |
| 2487 v8::HandleScope scope; | 2489 v8::HandleScope scope(env->GetIsolate()); |
| 2488 v8::Local<v8::Value> obj1, obj2; | 2490 v8::Local<v8::Value> obj1, obj2; |
| 2489 | 2491 |
| 2490 { | 2492 { |
| 2491 LocalContext env; | 2493 LocalContext env; |
| 2492 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | 2494 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
| 2493 obj1 = env->Global()->Get(v8_str("obj")); | 2495 obj1 = env->Global()->Get(v8_str("obj")); |
| 2494 } | 2496 } |
| 2495 | 2497 |
| 2496 { | 2498 { |
| 2497 LocalContext env; | 2499 LocalContext env; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2543 size_t length_; | 2545 size_t length_; |
| 2544 }; | 2546 }; |
| 2545 | 2547 |
| 2546 | 2548 |
| 2547 void ReleaseStackTraceDataTest(const char* source) { | 2549 void ReleaseStackTraceDataTest(const char* source) { |
| 2548 // Test that the data retained by the Error.stack accessor is released | 2550 // Test that the data retained by the Error.stack accessor is released |
| 2549 // after the first time the accessor is fired. We use external string | 2551 // after the first time the accessor is fired. We use external string |
| 2550 // to check whether the data is being released since the external string | 2552 // to check whether the data is being released since the external string |
| 2551 // resource's callback is fired when the external string is GC'ed. | 2553 // resource's callback is fired when the external string is GC'ed. |
| 2552 InitializeVM(); | 2554 InitializeVM(); |
| 2553 v8::HandleScope scope; | 2555 v8::HandleScope scope(env->GetIsolate()); |
| 2554 SourceResource* resource = new SourceResource(i::StrDup(source)); | 2556 SourceResource* resource = new SourceResource(i::StrDup(source)); |
| 2555 { | 2557 { |
| 2556 v8::HandleScope scope; | 2558 v8::HandleScope scope(env->GetIsolate()); |
| 2557 v8::Handle<v8::String> source_string = v8::String::NewExternal(resource); | 2559 v8::Handle<v8::String> source_string = v8::String::NewExternal(resource); |
| 2558 v8::Script::Compile(source_string)->Run(); | 2560 v8::Script::Compile(source_string)->Run(); |
| 2559 CHECK(!resource->IsDisposed()); | 2561 CHECK(!resource->IsDisposed()); |
| 2560 } | 2562 } |
| 2561 HEAP->CollectAllAvailableGarbage(); | 2563 HEAP->CollectAllAvailableGarbage(); |
| 2562 | 2564 |
| 2563 // External source has been released. | 2565 // External source has been released. |
| 2564 CHECK(resource->IsDisposed()); | 2566 CHECK(resource->IsDisposed()); |
| 2565 delete resource; | 2567 delete resource; |
| 2566 } | 2568 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2581 "} "; | 2583 "} "; |
| 2582 ReleaseStackTraceDataTest(source1); | 2584 ReleaseStackTraceDataTest(source1); |
| 2583 ReleaseStackTraceDataTest(source2); | 2585 ReleaseStackTraceDataTest(source2); |
| 2584 } | 2586 } |
| 2585 | 2587 |
| 2586 | 2588 |
| 2587 TEST(Regression144230) { | 2589 TEST(Regression144230) { |
| 2588 InitializeVM(); | 2590 InitializeVM(); |
| 2589 Isolate* isolate = Isolate::Current(); | 2591 Isolate* isolate = Isolate::Current(); |
| 2590 Heap* heap = isolate->heap(); | 2592 Heap* heap = isolate->heap(); |
| 2591 v8::HandleScope scope; | 2593 HandleScope scope(isolate); |
| 2592 | 2594 |
| 2593 // First make sure that the uninitialized CallIC stub is on a single page | 2595 // First make sure that the uninitialized CallIC stub is on a single page |
| 2594 // that will later be selected as an evacuation candidate. | 2596 // that will later be selected as an evacuation candidate. |
| 2595 { | 2597 { |
| 2596 v8::HandleScope inner_scope; | 2598 HandleScope inner_scope(isolate); |
| 2597 AlwaysAllocateScope always_allocate; | 2599 AlwaysAllocateScope always_allocate; |
| 2598 SimulateFullSpace(heap->code_space()); | 2600 SimulateFullSpace(heap->code_space()); |
| 2599 isolate->stub_cache()->ComputeCallInitialize(9, RelocInfo::CODE_TARGET); | 2601 isolate->stub_cache()->ComputeCallInitialize(9, RelocInfo::CODE_TARGET); |
| 2600 } | 2602 } |
| 2601 | 2603 |
| 2602 // Second compile a CallIC and execute it once so that it gets patched to | 2604 // Second compile a CallIC and execute it once so that it gets patched to |
| 2603 // the pre-monomorphic stub. These code objects are on yet another page. | 2605 // the pre-monomorphic stub. These code objects are on yet another page. |
| 2604 { | 2606 { |
| 2605 v8::HandleScope inner_scope; | 2607 HandleScope inner_scope(isolate); |
| 2606 AlwaysAllocateScope always_allocate; | 2608 AlwaysAllocateScope always_allocate; |
| 2607 SimulateFullSpace(heap->code_space()); | 2609 SimulateFullSpace(heap->code_space()); |
| 2608 CompileRun("var o = { f:function(a,b,c,d,e,f,g,h,i) {}};" | 2610 CompileRun("var o = { f:function(a,b,c,d,e,f,g,h,i) {}};" |
| 2609 "function call() { o.f(1,2,3,4,5,6,7,8,9); };" | 2611 "function call() { o.f(1,2,3,4,5,6,7,8,9); };" |
| 2610 "call();"); | 2612 "call();"); |
| 2611 } | 2613 } |
| 2612 | 2614 |
| 2613 // Third we fill up the last page of the code space so that it does not get | 2615 // Third we fill up the last page of the code space so that it does not get |
| 2614 // chosen as an evacuation candidate. | 2616 // chosen as an evacuation candidate. |
| 2615 { | 2617 { |
| 2616 v8::HandleScope inner_scope; | 2618 HandleScope inner_scope(isolate); |
| 2617 AlwaysAllocateScope always_allocate; | 2619 AlwaysAllocateScope always_allocate; |
| 2618 CompileRun("for (var i = 0; i < 2000; i++) {" | 2620 CompileRun("for (var i = 0; i < 2000; i++) {" |
| 2619 " eval('function f' + i + '() { return ' + i +'; };' +" | 2621 " eval('function f' + i + '() { return ' + i +'; };' +" |
| 2620 " 'f' + i + '();');" | 2622 " 'f' + i + '();');" |
| 2621 "}"); | 2623 "}"); |
| 2622 } | 2624 } |
| 2623 heap->CollectAllGarbage(Heap::kNoGCFlags); | 2625 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 2624 | 2626 |
| 2625 // Fourth is the tricky part. Make sure the code containing the CallIC is | 2627 // Fourth is the tricky part. Make sure the code containing the CallIC is |
| 2626 // visited first without clearing the IC. The shared function info is then | 2628 // visited first without clearing the IC. The shared function info is then |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2644 CompileRun("call();"); | 2646 CompileRun("call();"); |
| 2645 } | 2647 } |
| 2646 | 2648 |
| 2647 | 2649 |
| 2648 TEST(Regress159140) { | 2650 TEST(Regress159140) { |
| 2649 i::FLAG_allow_natives_syntax = true; | 2651 i::FLAG_allow_natives_syntax = true; |
| 2650 i::FLAG_flush_code_incrementally = true; | 2652 i::FLAG_flush_code_incrementally = true; |
| 2651 InitializeVM(); | 2653 InitializeVM(); |
| 2652 Isolate* isolate = Isolate::Current(); | 2654 Isolate* isolate = Isolate::Current(); |
| 2653 Heap* heap = isolate->heap(); | 2655 Heap* heap = isolate->heap(); |
| 2654 v8::HandleScope scope; | 2656 HandleScope scope(isolate); |
| 2655 | 2657 |
| 2656 // Perform one initial GC to enable code flushing. | 2658 // Perform one initial GC to enable code flushing. |
| 2657 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 2659 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 2658 | 2660 |
| 2659 // Prepare several closures that are all eligible for code flushing | 2661 // Prepare several closures that are all eligible for code flushing |
| 2660 // because all reachable ones are not optimized. Make sure that the | 2662 // because all reachable ones are not optimized. Make sure that the |
| 2661 // optimized code object is directly reachable through a handle so | 2663 // optimized code object is directly reachable through a handle so |
| 2662 // that it is marked black during incremental marking. | 2664 // that it is marked black during incremental marking. |
| 2663 Handle<Code> code; | 2665 Handle<Code> code; |
| 2664 { | 2666 { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2706 CompileRun("g('bozo');"); | 2708 CompileRun("g('bozo');"); |
| 2707 } | 2709 } |
| 2708 | 2710 |
| 2709 | 2711 |
| 2710 TEST(Regress165495) { | 2712 TEST(Regress165495) { |
| 2711 i::FLAG_allow_natives_syntax = true; | 2713 i::FLAG_allow_natives_syntax = true; |
| 2712 i::FLAG_flush_code_incrementally = true; | 2714 i::FLAG_flush_code_incrementally = true; |
| 2713 InitializeVM(); | 2715 InitializeVM(); |
| 2714 Isolate* isolate = Isolate::Current(); | 2716 Isolate* isolate = Isolate::Current(); |
| 2715 Heap* heap = isolate->heap(); | 2717 Heap* heap = isolate->heap(); |
| 2716 v8::HandleScope scope; | 2718 HandleScope scope(isolate); |
| 2717 | 2719 |
| 2718 // Perform one initial GC to enable code flushing. | 2720 // Perform one initial GC to enable code flushing. |
| 2719 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 2721 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 2720 | 2722 |
| 2721 // Prepare an optimized closure that the optimized code map will get | 2723 // Prepare an optimized closure that the optimized code map will get |
| 2722 // populated. Then age the unoptimized code to trigger code flushing | 2724 // populated. Then age the unoptimized code to trigger code flushing |
| 2723 // but make sure the optimized code is unreachable. | 2725 // but make sure the optimized code is unreachable. |
| 2724 { | 2726 { |
| 2725 HandleScope inner_scope(isolate); | 2727 HandleScope inner_scope(isolate); |
| 2726 CompileRun("function mkClosure() {" | 2728 CompileRun("function mkClosure() {" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2754 } | 2756 } |
| 2755 | 2757 |
| 2756 | 2758 |
| 2757 TEST(Regress169209) { | 2759 TEST(Regress169209) { |
| 2758 i::FLAG_stress_compaction = false; | 2760 i::FLAG_stress_compaction = false; |
| 2759 i::FLAG_allow_natives_syntax = true; | 2761 i::FLAG_allow_natives_syntax = true; |
| 2760 i::FLAG_flush_code_incrementally = true; | 2762 i::FLAG_flush_code_incrementally = true; |
| 2761 InitializeVM(); | 2763 InitializeVM(); |
| 2762 Isolate* isolate = Isolate::Current(); | 2764 Isolate* isolate = Isolate::Current(); |
| 2763 Heap* heap = isolate->heap(); | 2765 Heap* heap = isolate->heap(); |
| 2764 v8::HandleScope scope; | 2766 HandleScope scope(isolate); |
| 2765 | 2767 |
| 2766 // Perform one initial GC to enable code flushing. | 2768 // Perform one initial GC to enable code flushing. |
| 2767 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 2769 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 2768 | 2770 |
| 2769 // Prepare a shared function info eligible for code flushing for which | 2771 // Prepare a shared function info eligible for code flushing for which |
| 2770 // the unoptimized code will be replaced during optimization. | 2772 // the unoptimized code will be replaced during optimization. |
| 2771 Handle<SharedFunctionInfo> shared1; | 2773 Handle<SharedFunctionInfo> shared1; |
| 2772 { | 2774 { |
| 2773 HandleScope inner_scope(isolate); | 2775 HandleScope inner_scope(isolate); |
| 2774 CompileRun("function f() { return 'foobar'; }" | 2776 CompileRun("function f() { return 'foobar'; }" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2838 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size); | 2840 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size); |
| 2839 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe); | 2841 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe); |
| 2840 node->set_size(space->heap(), new_linear_size); | 2842 node->set_size(space->heap(), new_linear_size); |
| 2841 } | 2843 } |
| 2842 | 2844 |
| 2843 | 2845 |
| 2844 TEST(Regress169928) { | 2846 TEST(Regress169928) { |
| 2845 i::FLAG_allow_natives_syntax = true; | 2847 i::FLAG_allow_natives_syntax = true; |
| 2846 i::FLAG_crankshaft = false; | 2848 i::FLAG_crankshaft = false; |
| 2847 InitializeVM(); | 2849 InitializeVM(); |
| 2848 v8::HandleScope scope; | 2850 v8::HandleScope scope(env->GetIsolate()); |
| 2849 | 2851 |
| 2850 // Some flags turn Scavenge collections into Mark-sweep collections | 2852 // Some flags turn Scavenge collections into Mark-sweep collections |
| 2851 // and hence are incompatible with this test case. | 2853 // and hence are incompatible with this test case. |
| 2852 if (FLAG_gc_global || FLAG_stress_compaction) return; | 2854 if (FLAG_gc_global || FLAG_stress_compaction) return; |
| 2853 | 2855 |
| 2854 // Prepare the environment | 2856 // Prepare the environment |
| 2855 CompileRun("function fastliteralcase(literal, value) {" | 2857 CompileRun("function fastliteralcase(literal, value) {" |
| 2856 " literal[0] = value;" | 2858 " literal[0] = value;" |
| 2857 " return literal;" | 2859 " return literal;" |
| 2858 "}" | 2860 "}" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2913 | 2915 |
| 2914 | 2916 |
| 2915 TEST(Regress168801) { | 2917 TEST(Regress168801) { |
| 2916 i::FLAG_always_compact = true; | 2918 i::FLAG_always_compact = true; |
| 2917 i::FLAG_cache_optimized_code = false; | 2919 i::FLAG_cache_optimized_code = false; |
| 2918 i::FLAG_allow_natives_syntax = true; | 2920 i::FLAG_allow_natives_syntax = true; |
| 2919 i::FLAG_flush_code_incrementally = true; | 2921 i::FLAG_flush_code_incrementally = true; |
| 2920 InitializeVM(); | 2922 InitializeVM(); |
| 2921 Isolate* isolate = Isolate::Current(); | 2923 Isolate* isolate = Isolate::Current(); |
| 2922 Heap* heap = isolate->heap(); | 2924 Heap* heap = isolate->heap(); |
| 2923 v8::HandleScope scope; | 2925 HandleScope scope(isolate); |
| 2924 | 2926 |
| 2925 // Perform one initial GC to enable code flushing. | 2927 // Perform one initial GC to enable code flushing. |
| 2926 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 2928 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 2927 | 2929 |
| 2928 // Ensure the code ends up on an evacuation candidate. | 2930 // Ensure the code ends up on an evacuation candidate. |
| 2929 SimulateFullSpace(heap->code_space()); | 2931 SimulateFullSpace(heap->code_space()); |
| 2930 | 2932 |
| 2931 // Prepare an unoptimized function that is eligible for code flushing. | 2933 // Prepare an unoptimized function that is eligible for code flushing. |
| 2932 Handle<JSFunction> function; | 2934 Handle<JSFunction> function; |
| 2933 { | 2935 { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2969 | 2971 |
| 2970 | 2972 |
| 2971 TEST(Regress173458) { | 2973 TEST(Regress173458) { |
| 2972 i::FLAG_always_compact = true; | 2974 i::FLAG_always_compact = true; |
| 2973 i::FLAG_cache_optimized_code = false; | 2975 i::FLAG_cache_optimized_code = false; |
| 2974 i::FLAG_allow_natives_syntax = true; | 2976 i::FLAG_allow_natives_syntax = true; |
| 2975 i::FLAG_flush_code_incrementally = true; | 2977 i::FLAG_flush_code_incrementally = true; |
| 2976 InitializeVM(); | 2978 InitializeVM(); |
| 2977 Isolate* isolate = Isolate::Current(); | 2979 Isolate* isolate = Isolate::Current(); |
| 2978 Heap* heap = isolate->heap(); | 2980 Heap* heap = isolate->heap(); |
| 2979 v8::HandleScope scope; | 2981 HandleScope scope(isolate); |
| 2980 | 2982 |
| 2981 // Perform one initial GC to enable code flushing. | 2983 // Perform one initial GC to enable code flushing. |
| 2982 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 2984 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 2983 | 2985 |
| 2984 // Ensure the code ends up on an evacuation candidate. | 2986 // Ensure the code ends up on an evacuation candidate. |
| 2985 SimulateFullSpace(heap->code_space()); | 2987 SimulateFullSpace(heap->code_space()); |
| 2986 | 2988 |
| 2987 // Prepare an unoptimized function that is eligible for code flushing. | 2989 // Prepare an unoptimized function that is eligible for code flushing. |
| 2988 Handle<JSFunction> function; | 2990 Handle<JSFunction> function; |
| 2989 { | 2991 { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3012 // explicitly enqueued. | 3014 // explicitly enqueued. |
| 3013 SimulateIncrementalMarking(); | 3015 SimulateIncrementalMarking(); |
| 3014 | 3016 |
| 3015 // Now enable the debugger which in turn will disable code flushing. | 3017 // Now enable the debugger which in turn will disable code flushing. |
| 3016 CHECK(isolate->debug()->Load()); | 3018 CHECK(isolate->debug()->Load()); |
| 3017 | 3019 |
| 3018 // This cycle will bust the heap and subsequent cycles will go ballistic. | 3020 // This cycle will bust the heap and subsequent cycles will go ballistic. |
| 3019 heap->CollectAllGarbage(Heap::kNoGCFlags); | 3021 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 3020 heap->CollectAllGarbage(Heap::kNoGCFlags); | 3022 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 3021 } | 3023 } |
| OLD | NEW |