| 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 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 HeapObject* obj_copy = HeapObject::cast(copy); | 139 HeapObject* obj_copy = HeapObject::cast(copy); |
| 140 Object* not_right = heap->FindCodeObject(obj_copy->address() + | 140 Object* not_right = heap->FindCodeObject(obj_copy->address() + |
| 141 obj_copy->Size() / 2); | 141 obj_copy->Size() / 2); |
| 142 CHECK(not_right != code); | 142 CHECK(not_right != code); |
| 143 } | 143 } |
| 144 | 144 |
| 145 | 145 |
| 146 TEST(HeapObjects) { | 146 TEST(HeapObjects) { |
| 147 CcTest::InitializeVM(); | 147 CcTest::InitializeVM(); |
| 148 Isolate* isolate = Isolate::Current(); | 148 Isolate* isolate = Isolate::Current(); |
| 149 Factory* factory = isolate->factory(); |
| 149 Heap* heap = isolate->heap(); | 150 Heap* heap = isolate->heap(); |
| 150 | 151 |
| 151 HandleScope sc(isolate); | 152 HandleScope sc(isolate); |
| 152 Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked(); | 153 Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked(); |
| 153 CHECK(value->IsHeapNumber()); | 154 CHECK(value->IsHeapNumber()); |
| 154 CHECK(value->IsNumber()); | 155 CHECK(value->IsNumber()); |
| 155 CHECK_EQ(1.000123, value->Number()); | 156 CHECK_EQ(1.000123, value->Number()); |
| 156 | 157 |
| 157 value = heap->NumberFromDouble(1.0)->ToObjectChecked(); | 158 value = heap->NumberFromDouble(1.0)->ToObjectChecked(); |
| 158 CHECK(value->IsSmi()); | 159 CHECK(value->IsSmi()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 value = maybe_value->ToObjectChecked(); | 195 value = maybe_value->ToObjectChecked(); |
| 195 CHECK(value->IsHeapNumber()); | 196 CHECK(value->IsHeapNumber()); |
| 196 CHECK(value->IsNumber()); | 197 CHECK(value->IsNumber()); |
| 197 CHECK_EQ(static_cast<double>(static_cast<uint32_t>(1) << 31), | 198 CHECK_EQ(static_cast<double>(static_cast<uint32_t>(1) << 31), |
| 198 value->Number()); | 199 value->Number()); |
| 199 | 200 |
| 200 // nan oddball checks | 201 // nan oddball checks |
| 201 CHECK(heap->nan_value()->IsNumber()); | 202 CHECK(heap->nan_value()->IsNumber()); |
| 202 CHECK(std::isnan(heap->nan_value()->Number())); | 203 CHECK(std::isnan(heap->nan_value()->Number())); |
| 203 | 204 |
| 204 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector("fisk hest ")); | 205 Handle<String> s = factory->NewStringFromAscii(CStrVector("fisk hest ")); |
| 205 CHECK(s->IsString()); | 206 CHECK(s->IsString()); |
| 206 CHECK_EQ(10, s->length()); | 207 CHECK_EQ(10, s->length()); |
| 207 | 208 |
| 208 String* object_string = String::cast(heap->Object_string()); | 209 String* object_string = String::cast(heap->Object_string()); |
| 209 CHECK( | 210 CHECK( |
| 210 Isolate::Current()->context()->global_object()->HasLocalProperty( | 211 Isolate::Current()->context()->global_object()->HasLocalProperty( |
| 211 object_string)); | 212 object_string)); |
| 212 | 213 |
| 213 // Check ToString for oddballs | 214 // Check ToString for oddballs |
| 214 CheckOddball(isolate, heap->true_value(), "true"); | 215 CheckOddball(isolate, heap->true_value(), "true"); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 VerifyStringAllocation(isolate, "a"); | 333 VerifyStringAllocation(isolate, "a"); |
| 333 VerifyStringAllocation(isolate, "ab"); | 334 VerifyStringAllocation(isolate, "ab"); |
| 334 VerifyStringAllocation(isolate, "abc"); | 335 VerifyStringAllocation(isolate, "abc"); |
| 335 VerifyStringAllocation(isolate, "abcd"); | 336 VerifyStringAllocation(isolate, "abcd"); |
| 336 VerifyStringAllocation(isolate, "fiskerdrengen er paa havet"); | 337 VerifyStringAllocation(isolate, "fiskerdrengen er paa havet"); |
| 337 } | 338 } |
| 338 | 339 |
| 339 | 340 |
| 340 TEST(LocalHandles) { | 341 TEST(LocalHandles) { |
| 341 CcTest::InitializeVM(); | 342 CcTest::InitializeVM(); |
| 343 Isolate* isolate = Isolate::Current(); |
| 344 Factory* factory = isolate->factory(); |
| 342 | 345 |
| 343 v8::HandleScope scope(CcTest::isolate()); | 346 v8::HandleScope scope(CcTest::isolate()); |
| 344 const char* name = "Kasper the spunky"; | 347 const char* name = "Kasper the spunky"; |
| 345 Handle<String> string = FACTORY->NewStringFromAscii(CStrVector(name)); | 348 Handle<String> string = factory->NewStringFromAscii(CStrVector(name)); |
| 346 CHECK_EQ(StrLength(name), string->length()); | 349 CHECK_EQ(StrLength(name), string->length()); |
| 347 } | 350 } |
| 348 | 351 |
| 349 | 352 |
| 350 TEST(GlobalHandles) { | 353 TEST(GlobalHandles) { |
| 351 CcTest::InitializeVM(); | 354 CcTest::InitializeVM(); |
| 352 Isolate* isolate = Isolate::Current(); | 355 Isolate* isolate = Isolate::Current(); |
| 353 Heap* heap = isolate->heap(); | 356 Heap* heap = isolate->heap(); |
| 354 Factory* factory = isolate->factory(); | 357 Factory* factory = isolate->factory(); |
| 355 GlobalHandles* global_handles = isolate->global_handles(); | 358 GlobalHandles* global_handles = isolate->global_handles(); |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 TEST(StringTable) { | 605 TEST(StringTable) { |
| 603 CcTest::InitializeVM(); | 606 CcTest::InitializeVM(); |
| 604 | 607 |
| 605 CheckInternalizedStrings(not_so_random_string_table); | 608 CheckInternalizedStrings(not_so_random_string_table); |
| 606 CheckInternalizedStrings(not_so_random_string_table); | 609 CheckInternalizedStrings(not_so_random_string_table); |
| 607 } | 610 } |
| 608 | 611 |
| 609 | 612 |
| 610 TEST(FunctionAllocation) { | 613 TEST(FunctionAllocation) { |
| 611 CcTest::InitializeVM(); | 614 CcTest::InitializeVM(); |
| 615 Isolate* isolate = Isolate::Current(); |
| 616 Factory* factory = isolate->factory(); |
| 612 | 617 |
| 613 v8::HandleScope sc(CcTest::isolate()); | 618 v8::HandleScope sc(CcTest::isolate()); |
| 614 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction"); | 619 Handle<String> name = factory->InternalizeUtf8String("theFunction"); |
| 615 Handle<JSFunction> function = | 620 Handle<JSFunction> function = |
| 616 FACTORY->NewFunction(name, FACTORY->undefined_value()); | 621 factory->NewFunction(name, factory->undefined_value()); |
| 617 Handle<Map> initial_map = | 622 Handle<Map> initial_map = |
| 618 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 623 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 619 function->set_initial_map(*initial_map); | 624 function->set_initial_map(*initial_map); |
| 620 | 625 |
| 621 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot"); | 626 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); |
| 622 Handle<JSObject> obj = FACTORY->NewJSObject(function); | 627 Handle<JSObject> obj = factory->NewJSObject(function); |
| 623 obj->SetProperty( | 628 obj->SetProperty( |
| 624 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); | 629 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); |
| 625 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 630 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 626 // Check that we can add properties to function objects. | 631 // Check that we can add properties to function objects. |
| 627 function->SetProperty( | 632 function->SetProperty( |
| 628 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); | 633 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); |
| 629 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); | 634 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); |
| 630 } | 635 } |
| 631 | 636 |
| 632 | 637 |
| 633 TEST(ObjectProperties) { | 638 TEST(ObjectProperties) { |
| 634 CcTest::InitializeVM(); | 639 CcTest::InitializeVM(); |
| 640 Isolate* isolate = Isolate::Current(); |
| 641 Factory* factory = isolate->factory(); |
| 635 | 642 |
| 636 v8::HandleScope sc(CcTest::isolate()); | 643 v8::HandleScope sc(CcTest::isolate()); |
| 637 String* object_string = String::cast(HEAP->Object_string()); | 644 String* object_string = String::cast(HEAP->Object_string()); |
| 638 Object* raw_object = Isolate::Current()->context()->global_object()-> | 645 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 639 GetProperty(object_string)->ToObjectChecked(); | 646 GetProperty(object_string)->ToObjectChecked(); |
| 640 JSFunction* object_function = JSFunction::cast(raw_object); | 647 JSFunction* object_function = JSFunction::cast(raw_object); |
| 641 Handle<JSFunction> constructor(object_function); | 648 Handle<JSFunction> constructor(object_function); |
| 642 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); | 649 Handle<JSObject> obj = factory->NewJSObject(constructor); |
| 643 Handle<String> first = FACTORY->InternalizeUtf8String("first"); | 650 Handle<String> first = factory->InternalizeUtf8String("first"); |
| 644 Handle<String> second = FACTORY->InternalizeUtf8String("second"); | 651 Handle<String> second = factory->InternalizeUtf8String("second"); |
| 645 | 652 |
| 646 // check for empty | 653 // check for empty |
| 647 CHECK(!obj->HasLocalProperty(*first)); | 654 CHECK(!obj->HasLocalProperty(*first)); |
| 648 | 655 |
| 649 // add first | 656 // add first |
| 650 obj->SetProperty( | 657 obj->SetProperty( |
| 651 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); | 658 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); |
| 652 CHECK(obj->HasLocalProperty(*first)); | 659 CHECK(obj->HasLocalProperty(*first)); |
| 653 | 660 |
| 654 // delete first | 661 // delete first |
| (...skipping 25 matching lines...) Expand all Loading... |
| 680 | 687 |
| 681 // delete second and then first | 688 // delete second and then first |
| 682 CHECK(obj->DeleteProperty(*second, JSObject::NORMAL_DELETION)); | 689 CHECK(obj->DeleteProperty(*second, JSObject::NORMAL_DELETION)); |
| 683 CHECK(obj->HasLocalProperty(*first)); | 690 CHECK(obj->HasLocalProperty(*first)); |
| 684 CHECK(obj->DeleteProperty(*first, JSObject::NORMAL_DELETION)); | 691 CHECK(obj->DeleteProperty(*first, JSObject::NORMAL_DELETION)); |
| 685 CHECK(!obj->HasLocalProperty(*first)); | 692 CHECK(!obj->HasLocalProperty(*first)); |
| 686 CHECK(!obj->HasLocalProperty(*second)); | 693 CHECK(!obj->HasLocalProperty(*second)); |
| 687 | 694 |
| 688 // check string and internalized string match | 695 // check string and internalized string match |
| 689 const char* string1 = "fisk"; | 696 const char* string1 = "fisk"; |
| 690 Handle<String> s1 = FACTORY->NewStringFromAscii(CStrVector(string1)); | 697 Handle<String> s1 = factory->NewStringFromAscii(CStrVector(string1)); |
| 691 obj->SetProperty( | 698 obj->SetProperty( |
| 692 *s1, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); | 699 *s1, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); |
| 693 Handle<String> s1_string = FACTORY->InternalizeUtf8String(string1); | 700 Handle<String> s1_string = factory->InternalizeUtf8String(string1); |
| 694 CHECK(obj->HasLocalProperty(*s1_string)); | 701 CHECK(obj->HasLocalProperty(*s1_string)); |
| 695 | 702 |
| 696 // check internalized string and string match | 703 // check internalized string and string match |
| 697 const char* string2 = "fugl"; | 704 const char* string2 = "fugl"; |
| 698 Handle<String> s2_string = FACTORY->InternalizeUtf8String(string2); | 705 Handle<String> s2_string = factory->InternalizeUtf8String(string2); |
| 699 obj->SetProperty( | 706 obj->SetProperty( |
| 700 *s2_string, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); | 707 *s2_string, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); |
| 701 Handle<String> s2 = FACTORY->NewStringFromAscii(CStrVector(string2)); | 708 Handle<String> s2 = factory->NewStringFromAscii(CStrVector(string2)); |
| 702 CHECK(obj->HasLocalProperty(*s2)); | 709 CHECK(obj->HasLocalProperty(*s2)); |
| 703 } | 710 } |
| 704 | 711 |
| 705 | 712 |
| 706 TEST(JSObjectMaps) { | 713 TEST(JSObjectMaps) { |
| 707 CcTest::InitializeVM(); | 714 CcTest::InitializeVM(); |
| 715 Isolate* isolate = Isolate::Current(); |
| 716 Factory* factory = isolate->factory(); |
| 708 | 717 |
| 709 v8::HandleScope sc(CcTest::isolate()); | 718 v8::HandleScope sc(CcTest::isolate()); |
| 710 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction"); | 719 Handle<String> name = factory->InternalizeUtf8String("theFunction"); |
| 711 Handle<JSFunction> function = | 720 Handle<JSFunction> function = |
| 712 FACTORY->NewFunction(name, FACTORY->undefined_value()); | 721 factory->NewFunction(name, factory->undefined_value()); |
| 713 Handle<Map> initial_map = | 722 Handle<Map> initial_map = |
| 714 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 723 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 715 function->set_initial_map(*initial_map); | 724 function->set_initial_map(*initial_map); |
| 716 | 725 |
| 717 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot"); | 726 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); |
| 718 Handle<JSObject> obj = FACTORY->NewJSObject(function); | 727 Handle<JSObject> obj = factory->NewJSObject(function); |
| 719 | 728 |
| 720 // Set a propery | 729 // Set a propery |
| 721 obj->SetProperty( | 730 obj->SetProperty( |
| 722 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); | 731 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); |
| 723 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 732 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 724 | 733 |
| 725 // Check the map has changed | 734 // Check the map has changed |
| 726 CHECK(*initial_map != obj->map()); | 735 CHECK(*initial_map != obj->map()); |
| 727 } | 736 } |
| 728 | 737 |
| 729 | 738 |
| 730 TEST(JSArray) { | 739 TEST(JSArray) { |
| 731 CcTest::InitializeVM(); | 740 CcTest::InitializeVM(); |
| 741 Isolate* isolate = Isolate::Current(); |
| 742 Factory* factory = isolate->factory(); |
| 732 | 743 |
| 733 v8::HandleScope sc(CcTest::isolate()); | 744 v8::HandleScope sc(CcTest::isolate()); |
| 734 Handle<String> name = FACTORY->InternalizeUtf8String("Array"); | 745 Handle<String> name = factory->InternalizeUtf8String("Array"); |
| 735 Object* raw_object = Isolate::Current()->context()->global_object()-> | 746 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 736 GetProperty(*name)->ToObjectChecked(); | 747 GetProperty(*name)->ToObjectChecked(); |
| 737 Handle<JSFunction> function = Handle<JSFunction>( | 748 Handle<JSFunction> function = Handle<JSFunction>( |
| 738 JSFunction::cast(raw_object)); | 749 JSFunction::cast(raw_object)); |
| 739 | 750 |
| 740 // Allocate the object. | 751 // Allocate the object. |
| 741 Handle<JSObject> object = FACTORY->NewJSObject(function); | 752 Handle<JSObject> object = factory->NewJSObject(function); |
| 742 Handle<JSArray> array = Handle<JSArray>::cast(object); | 753 Handle<JSArray> array = Handle<JSArray>::cast(object); |
| 743 // We just initialized the VM, no heap allocation failure yet. | 754 // We just initialized the VM, no heap allocation failure yet. |
| 744 array->Initialize(0)->ToObjectChecked(); | 755 array->Initialize(0)->ToObjectChecked(); |
| 745 | 756 |
| 746 // Set array length to 0. | 757 // Set array length to 0. |
| 747 array->SetElementsLength(Smi::FromInt(0))->ToObjectChecked(); | 758 array->SetElementsLength(Smi::FromInt(0))->ToObjectChecked(); |
| 748 CHECK_EQ(Smi::FromInt(0), array->length()); | 759 CHECK_EQ(Smi::FromInt(0), array->length()); |
| 749 // Must be in fast mode. | 760 // Must be in fast mode. |
| 750 CHECK(array->HasFastSmiOrObjectElements()); | 761 CHECK(array->HasFastSmiOrObjectElements()); |
| 751 | 762 |
| 752 // array[length] = name. | 763 // array[length] = name. |
| 753 array->SetElement(0, *name, NONE, kNonStrictMode)->ToObjectChecked(); | 764 array->SetElement(0, *name, NONE, kNonStrictMode)->ToObjectChecked(); |
| 754 CHECK_EQ(Smi::FromInt(1), array->length()); | 765 CHECK_EQ(Smi::FromInt(1), array->length()); |
| 755 CHECK_EQ(array->GetElement(0), *name); | 766 CHECK_EQ(array->GetElement(0), *name); |
| 756 | 767 |
| 757 // Set array length with larger than smi value. | 768 // Set array length with larger than smi value. |
| 758 Handle<Object> length = | 769 Handle<Object> length = |
| 759 FACTORY->NewNumberFromUint(static_cast<uint32_t>(Smi::kMaxValue) + 1); | 770 factory->NewNumberFromUint(static_cast<uint32_t>(Smi::kMaxValue) + 1); |
| 760 array->SetElementsLength(*length)->ToObjectChecked(); | 771 array->SetElementsLength(*length)->ToObjectChecked(); |
| 761 | 772 |
| 762 uint32_t int_length = 0; | 773 uint32_t int_length = 0; |
| 763 CHECK(length->ToArrayIndex(&int_length)); | 774 CHECK(length->ToArrayIndex(&int_length)); |
| 764 CHECK_EQ(*length, array->length()); | 775 CHECK_EQ(*length, array->length()); |
| 765 CHECK(array->HasDictionaryElements()); // Must be in slow mode. | 776 CHECK(array->HasDictionaryElements()); // Must be in slow mode. |
| 766 | 777 |
| 767 // array[length] = name. | 778 // array[length] = name. |
| 768 array->SetElement(int_length, *name, NONE, kNonStrictMode)->ToObjectChecked(); | 779 array->SetElement(int_length, *name, NONE, kNonStrictMode)->ToObjectChecked(); |
| 769 uint32_t new_int_length = 0; | 780 uint32_t new_int_length = 0; |
| 770 CHECK(array->length()->ToArrayIndex(&new_int_length)); | 781 CHECK(array->length()->ToArrayIndex(&new_int_length)); |
| 771 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1); | 782 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1); |
| 772 CHECK_EQ(array->GetElement(int_length), *name); | 783 CHECK_EQ(array->GetElement(int_length), *name); |
| 773 CHECK_EQ(array->GetElement(0), *name); | 784 CHECK_EQ(array->GetElement(0), *name); |
| 774 } | 785 } |
| 775 | 786 |
| 776 | 787 |
| 777 TEST(JSObjectCopy) { | 788 TEST(JSObjectCopy) { |
| 778 CcTest::InitializeVM(); | 789 CcTest::InitializeVM(); |
| 790 Isolate* isolate = Isolate::Current(); |
| 791 Factory* factory = isolate->factory(); |
| 779 | 792 |
| 780 v8::HandleScope sc(CcTest::isolate()); | 793 v8::HandleScope sc(CcTest::isolate()); |
| 781 String* object_string = String::cast(HEAP->Object_string()); | 794 String* object_string = String::cast(HEAP->Object_string()); |
| 782 Object* raw_object = Isolate::Current()->context()->global_object()-> | 795 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 783 GetProperty(object_string)->ToObjectChecked(); | 796 GetProperty(object_string)->ToObjectChecked(); |
| 784 JSFunction* object_function = JSFunction::cast(raw_object); | 797 JSFunction* object_function = JSFunction::cast(raw_object); |
| 785 Handle<JSFunction> constructor(object_function); | 798 Handle<JSFunction> constructor(object_function); |
| 786 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); | 799 Handle<JSObject> obj = factory->NewJSObject(constructor); |
| 787 Handle<String> first = FACTORY->InternalizeUtf8String("first"); | 800 Handle<String> first = factory->InternalizeUtf8String("first"); |
| 788 Handle<String> second = FACTORY->InternalizeUtf8String("second"); | 801 Handle<String> second = factory->InternalizeUtf8String("second"); |
| 789 | 802 |
| 790 obj->SetProperty( | 803 obj->SetProperty( |
| 791 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); | 804 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); |
| 792 obj->SetProperty( | 805 obj->SetProperty( |
| 793 *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked(); | 806 *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked(); |
| 794 | 807 |
| 795 obj->SetElement(0, *first, NONE, kNonStrictMode)->ToObjectChecked(); | 808 obj->SetElement(0, *first, NONE, kNonStrictMode)->ToObjectChecked(); |
| 796 obj->SetElement(1, *second, NONE, kNonStrictMode)->ToObjectChecked(); | 809 obj->SetElement(1, *second, NONE, kNonStrictMode)->ToObjectChecked(); |
| 797 | 810 |
| 798 // Make the clone. | 811 // Make the clone. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 817 CHECK_EQ(obj->GetElement(1), clone->GetElement(0)); | 830 CHECK_EQ(obj->GetElement(1), clone->GetElement(0)); |
| 818 CHECK_EQ(obj->GetElement(0), clone->GetElement(1)); | 831 CHECK_EQ(obj->GetElement(0), clone->GetElement(1)); |
| 819 | 832 |
| 820 CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first)); | 833 CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first)); |
| 821 CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second)); | 834 CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second)); |
| 822 } | 835 } |
| 823 | 836 |
| 824 | 837 |
| 825 TEST(StringAllocation) { | 838 TEST(StringAllocation) { |
| 826 CcTest::InitializeVM(); | 839 CcTest::InitializeVM(); |
| 840 Isolate* isolate = Isolate::Current(); |
| 841 Factory* factory = isolate->factory(); |
| 827 | 842 |
| 828 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; | 843 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; |
| 829 for (int length = 0; length < 100; length++) { | 844 for (int length = 0; length < 100; length++) { |
| 830 v8::HandleScope scope(CcTest::isolate()); | 845 v8::HandleScope scope(CcTest::isolate()); |
| 831 char* non_ascii = NewArray<char>(3 * length + 1); | 846 char* non_ascii = NewArray<char>(3 * length + 1); |
| 832 char* ascii = NewArray<char>(length + 1); | 847 char* ascii = NewArray<char>(length + 1); |
| 833 non_ascii[3 * length] = 0; | 848 non_ascii[3 * length] = 0; |
| 834 ascii[length] = 0; | 849 ascii[length] = 0; |
| 835 for (int i = 0; i < length; i++) { | 850 for (int i = 0; i < length; i++) { |
| 836 ascii[i] = 'a'; | 851 ascii[i] = 'a'; |
| 837 non_ascii[3 * i] = chars[0]; | 852 non_ascii[3 * i] = chars[0]; |
| 838 non_ascii[3 * i + 1] = chars[1]; | 853 non_ascii[3 * i + 1] = chars[1]; |
| 839 non_ascii[3 * i + 2] = chars[2]; | 854 non_ascii[3 * i + 2] = chars[2]; |
| 840 } | 855 } |
| 841 Handle<String> non_ascii_sym = | 856 Handle<String> non_ascii_sym = |
| 842 FACTORY->InternalizeUtf8String( | 857 factory->InternalizeUtf8String( |
| 843 Vector<const char>(non_ascii, 3 * length)); | 858 Vector<const char>(non_ascii, 3 * length)); |
| 844 CHECK_EQ(length, non_ascii_sym->length()); | 859 CHECK_EQ(length, non_ascii_sym->length()); |
| 845 Handle<String> ascii_sym = | 860 Handle<String> ascii_sym = |
| 846 FACTORY->InternalizeOneByteString(OneByteVector(ascii, length)); | 861 factory->InternalizeOneByteString(OneByteVector(ascii, length)); |
| 847 CHECK_EQ(length, ascii_sym->length()); | 862 CHECK_EQ(length, ascii_sym->length()); |
| 848 Handle<String> non_ascii_str = | 863 Handle<String> non_ascii_str = |
| 849 FACTORY->NewStringFromUtf8(Vector<const char>(non_ascii, 3 * length)); | 864 factory->NewStringFromUtf8(Vector<const char>(non_ascii, 3 * length)); |
| 850 non_ascii_str->Hash(); | 865 non_ascii_str->Hash(); |
| 851 CHECK_EQ(length, non_ascii_str->length()); | 866 CHECK_EQ(length, non_ascii_str->length()); |
| 852 Handle<String> ascii_str = | 867 Handle<String> ascii_str = |
| 853 FACTORY->NewStringFromUtf8(Vector<const char>(ascii, length)); | 868 factory->NewStringFromUtf8(Vector<const char>(ascii, length)); |
| 854 ascii_str->Hash(); | 869 ascii_str->Hash(); |
| 855 CHECK_EQ(length, ascii_str->length()); | 870 CHECK_EQ(length, ascii_str->length()); |
| 856 DeleteArray(non_ascii); | 871 DeleteArray(non_ascii); |
| 857 DeleteArray(ascii); | 872 DeleteArray(ascii); |
| 858 } | 873 } |
| 859 } | 874 } |
| 860 | 875 |
| 861 | 876 |
| 862 static int ObjectsFoundInHeap(Heap* heap, Handle<Object> objs[], int size) { | 877 static int ObjectsFoundInHeap(Heap* heap, Handle<Object> objs[], int size) { |
| 863 // Count the number of objects found in the heap. | 878 // Count the number of objects found in the heap. |
| 864 int found_count = 0; | 879 int found_count = 0; |
| 865 HeapIterator iterator(heap); | 880 HeapIterator iterator(heap); |
| 866 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 881 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { |
| 867 for (int i = 0; i < size; i++) { | 882 for (int i = 0; i < size; i++) { |
| 868 if (*objs[i] == obj) { | 883 if (*objs[i] == obj) { |
| 869 found_count++; | 884 found_count++; |
| 870 } | 885 } |
| 871 } | 886 } |
| 872 } | 887 } |
| 873 return found_count; | 888 return found_count; |
| 874 } | 889 } |
| 875 | 890 |
| 876 | 891 |
| 877 TEST(Iteration) { | 892 TEST(Iteration) { |
| 878 CcTest::InitializeVM(); | 893 CcTest::InitializeVM(); |
| 894 Isolate* isolate = Isolate::Current(); |
| 895 Factory* factory = isolate->factory(); |
| 879 v8::HandleScope scope(CcTest::isolate()); | 896 v8::HandleScope scope(CcTest::isolate()); |
| 880 | 897 |
| 881 // Array of objects to scan haep for. | 898 // Array of objects to scan haep for. |
| 882 const int objs_count = 6; | 899 const int objs_count = 6; |
| 883 Handle<Object> objs[objs_count]; | 900 Handle<Object> objs[objs_count]; |
| 884 int next_objs_index = 0; | 901 int next_objs_index = 0; |
| 885 | 902 |
| 886 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE | 903 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE |
| 887 objs[next_objs_index++] = FACTORY->NewJSArray(10); | 904 objs[next_objs_index++] = factory->NewJSArray(10); |
| 888 objs[next_objs_index++] = FACTORY->NewJSArray(10, | 905 objs[next_objs_index++] = factory->NewJSArray(10, |
| 889 FAST_HOLEY_ELEMENTS, | 906 FAST_HOLEY_ELEMENTS, |
| 890 TENURED); | 907 TENURED); |
| 891 | 908 |
| 892 // Allocate a small string to OLD_DATA_SPACE and NEW_SPACE | 909 // Allocate a small string to OLD_DATA_SPACE and NEW_SPACE |
| 893 objs[next_objs_index++] = | 910 objs[next_objs_index++] = |
| 894 FACTORY->NewStringFromAscii(CStrVector("abcdefghij")); | 911 factory->NewStringFromAscii(CStrVector("abcdefghij")); |
| 895 objs[next_objs_index++] = | 912 objs[next_objs_index++] = |
| 896 FACTORY->NewStringFromAscii(CStrVector("abcdefghij"), TENURED); | 913 factory->NewStringFromAscii(CStrVector("abcdefghij"), TENURED); |
| 897 | 914 |
| 898 // Allocate a large string (for large object space). | 915 // Allocate a large string (for large object space). |
| 899 int large_size = Page::kMaxNonCodeHeapObjectSize + 1; | 916 int large_size = Page::kMaxNonCodeHeapObjectSize + 1; |
| 900 char* str = new char[large_size]; | 917 char* str = new char[large_size]; |
| 901 for (int i = 0; i < large_size - 1; ++i) str[i] = 'a'; | 918 for (int i = 0; i < large_size - 1; ++i) str[i] = 'a'; |
| 902 str[large_size - 1] = '\0'; | 919 str[large_size - 1] = '\0'; |
| 903 objs[next_objs_index++] = | 920 objs[next_objs_index++] = |
| 904 FACTORY->NewStringFromAscii(CStrVector(str), TENURED); | 921 factory->NewStringFromAscii(CStrVector(str), TENURED); |
| 905 delete[] str; | 922 delete[] str; |
| 906 | 923 |
| 907 // Add a Map object to look for. | 924 // Add a Map object to look for. |
| 908 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); | 925 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); |
| 909 | 926 |
| 910 CHECK_EQ(objs_count, next_objs_index); | 927 CHECK_EQ(objs_count, next_objs_index); |
| 911 CHECK_EQ(objs_count, ObjectsFoundInHeap(HEAP, objs, objs_count)); | 928 CHECK_EQ(objs_count, ObjectsFoundInHeap(HEAP, objs, objs_count)); |
| 912 } | 929 } |
| 913 | 930 |
| 914 | 931 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 929 | 946 |
| 930 | 947 |
| 931 static int LenFromSize(int size) { | 948 static int LenFromSize(int size) { |
| 932 return (size - FixedArray::kHeaderSize) / kPointerSize; | 949 return (size - FixedArray::kHeaderSize) / kPointerSize; |
| 933 } | 950 } |
| 934 | 951 |
| 935 | 952 |
| 936 TEST(Regression39128) { | 953 TEST(Regression39128) { |
| 937 // Test case for crbug.com/39128. | 954 // Test case for crbug.com/39128. |
| 938 CcTest::InitializeVM(); | 955 CcTest::InitializeVM(); |
| 956 Isolate* isolate = Isolate::Current(); |
| 957 Factory* factory = isolate->factory(); |
| 939 | 958 |
| 940 // Increase the chance of 'bump-the-pointer' allocation in old space. | 959 // Increase the chance of 'bump-the-pointer' allocation in old space. |
| 941 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 960 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 942 | 961 |
| 943 v8::HandleScope scope(CcTest::isolate()); | 962 v8::HandleScope scope(CcTest::isolate()); |
| 944 | 963 |
| 945 // The plan: create JSObject which references objects in new space. | 964 // The plan: create JSObject which references objects in new space. |
| 946 // Then clone this object (forcing it to go into old space) and check | 965 // Then clone this object (forcing it to go into old space) and check |
| 947 // that region dirty marks are updated correctly. | 966 // that region dirty marks are updated correctly. |
| 948 | 967 |
| 949 // Step 1: prepare a map for the object. We add 1 inobject property to it. | 968 // Step 1: prepare a map for the object. We add 1 inobject property to it. |
| 950 Handle<JSFunction> object_ctor( | 969 Handle<JSFunction> object_ctor( |
| 951 Isolate::Current()->native_context()->object_function()); | 970 Isolate::Current()->native_context()->object_function()); |
| 952 CHECK(object_ctor->has_initial_map()); | 971 CHECK(object_ctor->has_initial_map()); |
| 953 Handle<Map> object_map(object_ctor->initial_map()); | 972 Handle<Map> object_map(object_ctor->initial_map()); |
| 954 // Create a map with single inobject property. | 973 // Create a map with single inobject property. |
| 955 Handle<Map> my_map = FACTORY->CopyMap(object_map, 1); | 974 Handle<Map> my_map = factory->CopyMap(object_map, 1); |
| 956 int n_properties = my_map->inobject_properties(); | 975 int n_properties = my_map->inobject_properties(); |
| 957 CHECK_GT(n_properties, 0); | 976 CHECK_GT(n_properties, 0); |
| 958 | 977 |
| 959 int object_size = my_map->instance_size(); | 978 int object_size = my_map->instance_size(); |
| 960 | 979 |
| 961 // Step 2: allocate a lot of objects so to almost fill new space: we need | 980 // Step 2: allocate a lot of objects so to almost fill new space: we need |
| 962 // just enough room to allocate JSObject and thus fill the newspace. | 981 // just enough room to allocate JSObject and thus fill the newspace. |
| 963 | 982 |
| 964 int allocation_amount = Min(FixedArray::kMaxSize, | 983 int allocation_amount = Min(FixedArray::kMaxSize, |
| 965 HEAP->MaxObjectSizeInNewSpace()); | 984 HEAP->MaxObjectSizeInNewSpace()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 } | 1025 } |
| 1007 CHECK(HEAP->old_pointer_space()->Contains(clone->address())); | 1026 CHECK(HEAP->old_pointer_space()->Contains(clone->address())); |
| 1008 } | 1027 } |
| 1009 | 1028 |
| 1010 | 1029 |
| 1011 TEST(TestCodeFlushing) { | 1030 TEST(TestCodeFlushing) { |
| 1012 // If we do not flush code this test is invalid. | 1031 // If we do not flush code this test is invalid. |
| 1013 if (!FLAG_flush_code) return; | 1032 if (!FLAG_flush_code) return; |
| 1014 i::FLAG_allow_natives_syntax = true; | 1033 i::FLAG_allow_natives_syntax = true; |
| 1015 CcTest::InitializeVM(); | 1034 CcTest::InitializeVM(); |
| 1035 Isolate* isolate = Isolate::Current(); |
| 1036 Factory* factory = isolate->factory(); |
| 1016 v8::HandleScope scope(CcTest::isolate()); | 1037 v8::HandleScope scope(CcTest::isolate()); |
| 1017 const char* source = "function foo() {" | 1038 const char* source = "function foo() {" |
| 1018 " var x = 42;" | 1039 " var x = 42;" |
| 1019 " var y = 42;" | 1040 " var y = 42;" |
| 1020 " var z = x + y;" | 1041 " var z = x + y;" |
| 1021 "};" | 1042 "};" |
| 1022 "foo()"; | 1043 "foo()"; |
| 1023 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); | 1044 Handle<String> foo_name = factory->InternalizeUtf8String("foo"); |
| 1024 | 1045 |
| 1025 // This compile will add the code to the compilation cache. | 1046 // This compile will add the code to the compilation cache. |
| 1026 { v8::HandleScope scope(CcTest::isolate()); | 1047 { v8::HandleScope scope(CcTest::isolate()); |
| 1027 CompileRun(source); | 1048 CompileRun(source); |
| 1028 } | 1049 } |
| 1029 | 1050 |
| 1030 // Check function is compiled. | 1051 // Check function is compiled. |
| 1031 Object* func_value = Isolate::Current()->context()->global_object()-> | 1052 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1032 GetProperty(*foo_name)->ToObjectChecked(); | 1053 GetProperty(*foo_name)->ToObjectChecked(); |
| 1033 CHECK(func_value->IsJSFunction()); | 1054 CHECK(func_value->IsJSFunction()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1053 CHECK(function->shared()->is_compiled()); | 1074 CHECK(function->shared()->is_compiled()); |
| 1054 CHECK(function->is_compiled()); | 1075 CHECK(function->is_compiled()); |
| 1055 } | 1076 } |
| 1056 | 1077 |
| 1057 | 1078 |
| 1058 TEST(TestCodeFlushingIncremental) { | 1079 TEST(TestCodeFlushingIncremental) { |
| 1059 // If we do not flush code this test is invalid. | 1080 // If we do not flush code this test is invalid. |
| 1060 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1081 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1061 i::FLAG_allow_natives_syntax = true; | 1082 i::FLAG_allow_natives_syntax = true; |
| 1062 CcTest::InitializeVM(); | 1083 CcTest::InitializeVM(); |
| 1084 Isolate* isolate = Isolate::Current(); |
| 1085 Factory* factory = isolate->factory(); |
| 1063 v8::HandleScope scope(CcTest::isolate()); | 1086 v8::HandleScope scope(CcTest::isolate()); |
| 1064 const char* source = "function foo() {" | 1087 const char* source = "function foo() {" |
| 1065 " var x = 42;" | 1088 " var x = 42;" |
| 1066 " var y = 42;" | 1089 " var y = 42;" |
| 1067 " var z = x + y;" | 1090 " var z = x + y;" |
| 1068 "};" | 1091 "};" |
| 1069 "foo()"; | 1092 "foo()"; |
| 1070 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); | 1093 Handle<String> foo_name = factory->InternalizeUtf8String("foo"); |
| 1071 | 1094 |
| 1072 // This compile will add the code to the compilation cache. | 1095 // This compile will add the code to the compilation cache. |
| 1073 { v8::HandleScope scope(CcTest::isolate()); | 1096 { v8::HandleScope scope(CcTest::isolate()); |
| 1074 CompileRun(source); | 1097 CompileRun(source); |
| 1075 } | 1098 } |
| 1076 | 1099 |
| 1077 // Check function is compiled. | 1100 // Check function is compiled. |
| 1078 Object* func_value = Isolate::Current()->context()->global_object()-> | 1101 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1079 GetProperty(*foo_name)->ToObjectChecked(); | 1102 GetProperty(*foo_name)->ToObjectChecked(); |
| 1080 CHECK(func_value->IsJSFunction()); | 1103 CHECK(func_value->IsJSFunction()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1119 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); | 1142 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); |
| 1120 CHECK(function->is_compiled() || !function->IsOptimized()); | 1143 CHECK(function->is_compiled() || !function->IsOptimized()); |
| 1121 } | 1144 } |
| 1122 | 1145 |
| 1123 | 1146 |
| 1124 TEST(TestCodeFlushingIncrementalScavenge) { | 1147 TEST(TestCodeFlushingIncrementalScavenge) { |
| 1125 // If we do not flush code this test is invalid. | 1148 // If we do not flush code this test is invalid. |
| 1126 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1149 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1127 i::FLAG_allow_natives_syntax = true; | 1150 i::FLAG_allow_natives_syntax = true; |
| 1128 CcTest::InitializeVM(); | 1151 CcTest::InitializeVM(); |
| 1152 Isolate* isolate = Isolate::Current(); |
| 1153 Factory* factory = isolate->factory(); |
| 1129 v8::HandleScope scope(CcTest::isolate()); | 1154 v8::HandleScope scope(CcTest::isolate()); |
| 1130 const char* source = "var foo = function() {" | 1155 const char* source = "var foo = function() {" |
| 1131 " var x = 42;" | 1156 " var x = 42;" |
| 1132 " var y = 42;" | 1157 " var y = 42;" |
| 1133 " var z = x + y;" | 1158 " var z = x + y;" |
| 1134 "};" | 1159 "};" |
| 1135 "foo();" | 1160 "foo();" |
| 1136 "var bar = function() {" | 1161 "var bar = function() {" |
| 1137 " var x = 23;" | 1162 " var x = 23;" |
| 1138 "};" | 1163 "};" |
| 1139 "bar();"; | 1164 "bar();"; |
| 1140 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); | 1165 Handle<String> foo_name = factory->InternalizeUtf8String("foo"); |
| 1141 Handle<String> bar_name = FACTORY->InternalizeUtf8String("bar"); | 1166 Handle<String> bar_name = factory->InternalizeUtf8String("bar"); |
| 1142 | 1167 |
| 1143 // Perfrom one initial GC to enable code flushing. | 1168 // Perfrom one initial GC to enable code flushing. |
| 1144 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 1169 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1145 | 1170 |
| 1146 // This compile will add the code to the compilation cache. | 1171 // This compile will add the code to the compilation cache. |
| 1147 { v8::HandleScope scope(CcTest::isolate()); | 1172 { v8::HandleScope scope(CcTest::isolate()); |
| 1148 CompileRun(source); | 1173 CompileRun(source); |
| 1149 } | 1174 } |
| 1150 | 1175 |
| 1151 // Check functions are compiled. | 1176 // Check functions are compiled. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1186 CHECK(!function->is_compiled() || function->IsOptimized()); | 1211 CHECK(!function->is_compiled() || function->IsOptimized()); |
| 1187 } | 1212 } |
| 1188 | 1213 |
| 1189 | 1214 |
| 1190 TEST(TestCodeFlushingIncrementalAbort) { | 1215 TEST(TestCodeFlushingIncrementalAbort) { |
| 1191 // If we do not flush code this test is invalid. | 1216 // If we do not flush code this test is invalid. |
| 1192 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1217 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1193 i::FLAG_allow_natives_syntax = true; | 1218 i::FLAG_allow_natives_syntax = true; |
| 1194 CcTest::InitializeVM(); | 1219 CcTest::InitializeVM(); |
| 1195 Isolate* isolate = Isolate::Current(); | 1220 Isolate* isolate = Isolate::Current(); |
| 1221 Factory* factory = isolate->factory(); |
| 1196 Heap* heap = isolate->heap(); | 1222 Heap* heap = isolate->heap(); |
| 1197 v8::HandleScope scope(CcTest::isolate()); | 1223 v8::HandleScope scope(CcTest::isolate()); |
| 1198 const char* source = "function foo() {" | 1224 const char* source = "function foo() {" |
| 1199 " var x = 42;" | 1225 " var x = 42;" |
| 1200 " var y = 42;" | 1226 " var y = 42;" |
| 1201 " var z = x + y;" | 1227 " var z = x + y;" |
| 1202 "};" | 1228 "};" |
| 1203 "foo()"; | 1229 "foo()"; |
| 1204 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); | 1230 Handle<String> foo_name = factory->InternalizeUtf8String("foo"); |
| 1205 | 1231 |
| 1206 // This compile will add the code to the compilation cache. | 1232 // This compile will add the code to the compilation cache. |
| 1207 { v8::HandleScope scope(CcTest::isolate()); | 1233 { v8::HandleScope scope(CcTest::isolate()); |
| 1208 CompileRun(source); | 1234 CompileRun(source); |
| 1209 } | 1235 } |
| 1210 | 1236 |
| 1211 // Check function is compiled. | 1237 // Check function is compiled. |
| 1212 Object* func_value = Isolate::Current()->context()->global_object()-> | 1238 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1213 GetProperty(*foo_name)->ToObjectChecked(); | 1239 GetProperty(*foo_name)->ToObjectChecked(); |
| 1214 CHECK(func_value->IsJSFunction()); | 1240 CHECK(func_value->IsJSFunction()); |
| (...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1885 g->Call(global, 0, NULL); | 1911 g->Call(global, 0, NULL); |
| 1886 } | 1912 } |
| 1887 | 1913 |
| 1888 HEAP->incremental_marking()->set_should_hurry(true); | 1914 HEAP->incremental_marking()->set_should_hurry(true); |
| 1889 HEAP->CollectGarbage(OLD_POINTER_SPACE); | 1915 HEAP->CollectGarbage(OLD_POINTER_SPACE); |
| 1890 } | 1916 } |
| 1891 | 1917 |
| 1892 | 1918 |
| 1893 TEST(PrototypeTransitionClearing) { | 1919 TEST(PrototypeTransitionClearing) { |
| 1894 CcTest::InitializeVM(); | 1920 CcTest::InitializeVM(); |
| 1921 Isolate* isolate = Isolate::Current(); |
| 1922 Factory* factory = isolate->factory(); |
| 1895 v8::HandleScope scope(CcTest::isolate()); | 1923 v8::HandleScope scope(CcTest::isolate()); |
| 1896 | 1924 |
| 1897 CompileRun( | 1925 CompileRun( |
| 1898 "var base = {};" | 1926 "var base = {};" |
| 1899 "var live = [];" | 1927 "var live = [];" |
| 1900 "for (var i = 0; i < 10; i++) {" | 1928 "for (var i = 0; i < 10; i++) {" |
| 1901 " var object = {};" | 1929 " var object = {};" |
| 1902 " var prototype = {};" | 1930 " var prototype = {};" |
| 1903 " object.__proto__ = prototype;" | 1931 " object.__proto__ = prototype;" |
| 1904 " if (i >= 3) live.push(object, prototype);" | 1932 " if (i >= 3) live.push(object, prototype);" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1924 Object* proto = trans->get(j + Map::kProtoTransitionPrototypeOffset); | 1952 Object* proto = trans->get(j + Map::kProtoTransitionPrototypeOffset); |
| 1925 CHECK(proto->IsTheHole() || proto->IsJSObject()); | 1953 CHECK(proto->IsTheHole() || proto->IsJSObject()); |
| 1926 } | 1954 } |
| 1927 | 1955 |
| 1928 // Make sure next prototype is placed on an old-space evacuation candidate. | 1956 // Make sure next prototype is placed on an old-space evacuation candidate. |
| 1929 Handle<JSObject> prototype; | 1957 Handle<JSObject> prototype; |
| 1930 PagedSpace* space = HEAP->old_pointer_space(); | 1958 PagedSpace* space = HEAP->old_pointer_space(); |
| 1931 { | 1959 { |
| 1932 AlwaysAllocateScope always_allocate; | 1960 AlwaysAllocateScope always_allocate; |
| 1933 SimulateFullSpace(space); | 1961 SimulateFullSpace(space); |
| 1934 prototype = FACTORY->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); | 1962 prototype = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); |
| 1935 } | 1963 } |
| 1936 | 1964 |
| 1937 // Add a prototype on an evacuation candidate and verify that transition | 1965 // Add a prototype on an evacuation candidate and verify that transition |
| 1938 // clearing correctly records slots in prototype transition array. | 1966 // clearing correctly records slots in prototype transition array. |
| 1939 i::FLAG_always_compact = true; | 1967 i::FLAG_always_compact = true; |
| 1940 Handle<Map> map(baseObject->map()); | 1968 Handle<Map> map(baseObject->map()); |
| 1941 CHECK(!space->LastPage()->Contains( | 1969 CHECK(!space->LastPage()->Contains( |
| 1942 map->GetPrototypeTransitions()->address())); | 1970 map->GetPrototypeTransitions()->address())); |
| 1943 CHECK(space->LastPage()->Contains(prototype->address())); | 1971 CHECK(space->LastPage()->Contains(prototype->address())); |
| 1944 baseObject->SetPrototype(*prototype, false)->ToObjectChecked(); | 1972 baseObject->SetPrototype(*prototype, false)->ToObjectChecked(); |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2283 CHECK(root->map()->IsMap()); | 2311 CHECK(root->map()->IsMap()); |
| 2284 } | 2312 } |
| 2285 | 2313 |
| 2286 | 2314 |
| 2287 TEST(ReleaseOverReservedPages) { | 2315 TEST(ReleaseOverReservedPages) { |
| 2288 i::FLAG_trace_gc = true; | 2316 i::FLAG_trace_gc = true; |
| 2289 // The optimizer can allocate stuff, messing up the test. | 2317 // The optimizer can allocate stuff, messing up the test. |
| 2290 i::FLAG_crankshaft = false; | 2318 i::FLAG_crankshaft = false; |
| 2291 i::FLAG_always_opt = false; | 2319 i::FLAG_always_opt = false; |
| 2292 CcTest::InitializeVM(); | 2320 CcTest::InitializeVM(); |
| 2321 Isolate* isolate = Isolate::Current(); |
| 2322 Factory* factory = isolate->factory(); |
| 2293 v8::HandleScope scope(CcTest::isolate()); | 2323 v8::HandleScope scope(CcTest::isolate()); |
| 2294 static const int number_of_test_pages = 20; | 2324 static const int number_of_test_pages = 20; |
| 2295 | 2325 |
| 2296 // Prepare many pages with low live-bytes count. | 2326 // Prepare many pages with low live-bytes count. |
| 2297 PagedSpace* old_pointer_space = HEAP->old_pointer_space(); | 2327 PagedSpace* old_pointer_space = HEAP->old_pointer_space(); |
| 2298 CHECK_EQ(1, old_pointer_space->CountTotalPages()); | 2328 CHECK_EQ(1, old_pointer_space->CountTotalPages()); |
| 2299 for (int i = 0; i < number_of_test_pages; i++) { | 2329 for (int i = 0; i < number_of_test_pages; i++) { |
| 2300 AlwaysAllocateScope always_allocate; | 2330 AlwaysAllocateScope always_allocate; |
| 2301 SimulateFullSpace(old_pointer_space); | 2331 SimulateFullSpace(old_pointer_space); |
| 2302 FACTORY->NewFixedArray(1, TENURED); | 2332 factory->NewFixedArray(1, TENURED); |
| 2303 } | 2333 } |
| 2304 CHECK_EQ(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); | 2334 CHECK_EQ(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); |
| 2305 | 2335 |
| 2306 // Triggering one GC will cause a lot of garbage to be discovered but | 2336 // Triggering one GC will cause a lot of garbage to be discovered but |
| 2307 // even spread across all allocated pages. | 2337 // even spread across all allocated pages. |
| 2308 HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered for preparation"); | 2338 HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered for preparation"); |
| 2309 CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); | 2339 CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); |
| 2310 | 2340 |
| 2311 // Triggering subsequent GCs should cause at least half of the pages | 2341 // Triggering subsequent GCs should cause at least half of the pages |
| 2312 // to be released to the OS after at most two cycles. | 2342 // to be released to the OS after at most two cycles. |
| 2313 HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 1"); | 2343 HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 1"); |
| 2314 CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); | 2344 CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); |
| 2315 HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 2"); | 2345 HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 2"); |
| 2316 CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages() * 2); | 2346 CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages() * 2); |
| 2317 | 2347 |
| 2318 // Triggering a last-resort GC should cause all pages to be released to the | 2348 // Triggering a last-resort GC should cause all pages to be released to the |
| 2319 // OS so that other processes can seize the memory. If we get a failure here | 2349 // OS so that other processes can seize the memory. If we get a failure here |
| 2320 // where there are 2 pages left instead of 1, then we should increase the | 2350 // where there are 2 pages left instead of 1, then we should increase the |
| 2321 // size of the first page a little in SizeOfFirstPage in spaces.cc. The | 2351 // size of the first page a little in SizeOfFirstPage in spaces.cc. The |
| 2322 // first page should be small in order to reduce memory used when the VM | 2352 // first page should be small in order to reduce memory used when the VM |
| 2323 // boots, but if the 20 small arrays don't fit on the first page then that's | 2353 // boots, but if the 20 small arrays don't fit on the first page then that's |
| 2324 // an indication that it is too small. | 2354 // an indication that it is too small. |
| 2325 HEAP->CollectAllAvailableGarbage("triggered really hard"); | 2355 HEAP->CollectAllAvailableGarbage("triggered really hard"); |
| 2326 CHECK_EQ(1, old_pointer_space->CountTotalPages()); | 2356 CHECK_EQ(1, old_pointer_space->CountTotalPages()); |
| 2327 } | 2357 } |
| 2328 | 2358 |
| 2329 | 2359 |
| 2330 TEST(Regress2237) { | 2360 TEST(Regress2237) { |
| 2331 CcTest::InitializeVM(); | 2361 CcTest::InitializeVM(); |
| 2362 Isolate* isolate = Isolate::Current(); |
| 2363 Factory* factory = isolate->factory(); |
| 2332 v8::HandleScope scope(CcTest::isolate()); | 2364 v8::HandleScope scope(CcTest::isolate()); |
| 2333 Handle<String> slice(HEAP->empty_string()); | 2365 Handle<String> slice(HEAP->empty_string()); |
| 2334 | 2366 |
| 2335 { | 2367 { |
| 2336 // Generate a parent that lives in new-space. | 2368 // Generate a parent that lives in new-space. |
| 2337 v8::HandleScope inner_scope(CcTest::isolate()); | 2369 v8::HandleScope inner_scope(CcTest::isolate()); |
| 2338 const char* c = "This text is long enough to trigger sliced strings."; | 2370 const char* c = "This text is long enough to trigger sliced strings."; |
| 2339 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector(c)); | 2371 Handle<String> s = factory->NewStringFromAscii(CStrVector(c)); |
| 2340 CHECK(s->IsSeqOneByteString()); | 2372 CHECK(s->IsSeqOneByteString()); |
| 2341 CHECK(HEAP->InNewSpace(*s)); | 2373 CHECK(HEAP->InNewSpace(*s)); |
| 2342 | 2374 |
| 2343 // Generate a sliced string that is based on the above parent and | 2375 // Generate a sliced string that is based on the above parent and |
| 2344 // lives in old-space. | 2376 // lives in old-space. |
| 2345 SimulateFullSpace(HEAP->new_space()); | 2377 SimulateFullSpace(HEAP->new_space()); |
| 2346 AlwaysAllocateScope always_allocate; | 2378 AlwaysAllocateScope always_allocate; |
| 2347 Handle<String> t = FACTORY->NewProperSubString(s, 5, 35); | 2379 Handle<String> t = factory->NewProperSubString(s, 5, 35); |
| 2348 CHECK(t->IsSlicedString()); | 2380 CHECK(t->IsSlicedString()); |
| 2349 CHECK(!HEAP->InNewSpace(*t)); | 2381 CHECK(!HEAP->InNewSpace(*t)); |
| 2350 *slice.location() = *t.location(); | 2382 *slice.location() = *t.location(); |
| 2351 } | 2383 } |
| 2352 | 2384 |
| 2353 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); | 2385 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); |
| 2354 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 2386 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 2355 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); | 2387 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); |
| 2356 } | 2388 } |
| 2357 | 2389 |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2893 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size); | 2925 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size); |
| 2894 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe); | 2926 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe); |
| 2895 node->set_size(space->heap(), new_linear_size); | 2927 node->set_size(space->heap(), new_linear_size); |
| 2896 } | 2928 } |
| 2897 | 2929 |
| 2898 | 2930 |
| 2899 TEST(Regress169928) { | 2931 TEST(Regress169928) { |
| 2900 i::FLAG_allow_natives_syntax = true; | 2932 i::FLAG_allow_natives_syntax = true; |
| 2901 i::FLAG_crankshaft = false; | 2933 i::FLAG_crankshaft = false; |
| 2902 CcTest::InitializeVM(); | 2934 CcTest::InitializeVM(); |
| 2935 Isolate* isolate = Isolate::Current(); |
| 2936 Factory* factory = isolate->factory(); |
| 2903 v8::HandleScope scope(CcTest::isolate()); | 2937 v8::HandleScope scope(CcTest::isolate()); |
| 2904 | 2938 |
| 2905 // Some flags turn Scavenge collections into Mark-sweep collections | 2939 // Some flags turn Scavenge collections into Mark-sweep collections |
| 2906 // and hence are incompatible with this test case. | 2940 // and hence are incompatible with this test case. |
| 2907 if (FLAG_gc_global || FLAG_stress_compaction) return; | 2941 if (FLAG_gc_global || FLAG_stress_compaction) return; |
| 2908 | 2942 |
| 2909 // Prepare the environment | 2943 // Prepare the environment |
| 2910 CompileRun("function fastliteralcase(literal, value) {" | 2944 CompileRun("function fastliteralcase(literal, value) {" |
| 2911 " literal[0] = value;" | 2945 " literal[0] = value;" |
| 2912 " return literal;" | 2946 " return literal;" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2923 v8::Local<v8::String> mote_code_string = | 2957 v8::Local<v8::String> mote_code_string = |
| 2924 v8_str("fastliteralcase(mote, 2.5);"); | 2958 v8_str("fastliteralcase(mote, 2.5);"); |
| 2925 | 2959 |
| 2926 v8::Local<v8::String> array_name = v8_str("mote"); | 2960 v8::Local<v8::String> array_name = v8_str("mote"); |
| 2927 v8::Context::GetCurrent()->Global()->Set(array_name, v8::Int32::New(0)); | 2961 v8::Context::GetCurrent()->Global()->Set(array_name, v8::Int32::New(0)); |
| 2928 | 2962 |
| 2929 // First make sure we flip spaces | 2963 // First make sure we flip spaces |
| 2930 HEAP->CollectGarbage(NEW_SPACE); | 2964 HEAP->CollectGarbage(NEW_SPACE); |
| 2931 | 2965 |
| 2932 // Allocate the object. | 2966 // Allocate the object. |
| 2933 Handle<FixedArray> array_data = FACTORY->NewFixedArray(2, NOT_TENURED); | 2967 Handle<FixedArray> array_data = factory->NewFixedArray(2, NOT_TENURED); |
| 2934 array_data->set(0, Smi::FromInt(1)); | 2968 array_data->set(0, Smi::FromInt(1)); |
| 2935 array_data->set(1, Smi::FromInt(2)); | 2969 array_data->set(1, Smi::FromInt(2)); |
| 2936 | 2970 |
| 2937 AllocateAllButNBytes(HEAP->new_space(), | 2971 AllocateAllButNBytes(HEAP->new_space(), |
| 2938 JSArray::kSize + AllocationSiteInfo::kSize + | 2972 JSArray::kSize + AllocationSiteInfo::kSize + |
| 2939 kPointerSize); | 2973 kPointerSize); |
| 2940 | 2974 |
| 2941 Handle<JSArray> array = FACTORY->NewJSArrayWithElements(array_data, | 2975 Handle<JSArray> array = factory->NewJSArrayWithElements(array_data, |
| 2942 FAST_SMI_ELEMENTS, | 2976 FAST_SMI_ELEMENTS, |
| 2943 NOT_TENURED); | 2977 NOT_TENURED); |
| 2944 | 2978 |
| 2945 CHECK_EQ(Smi::FromInt(2), array->length()); | 2979 CHECK_EQ(Smi::FromInt(2), array->length()); |
| 2946 CHECK(array->HasFastSmiOrObjectElements()); | 2980 CHECK(array->HasFastSmiOrObjectElements()); |
| 2947 | 2981 |
| 2948 // We need filler the size of AllocationSiteInfo object, plus an extra | 2982 // We need filler the size of AllocationSiteInfo object, plus an extra |
| 2949 // fill pointer value. | 2983 // fill pointer value. |
| 2950 MaybeObject* maybe_object = HEAP->AllocateRaw( | 2984 MaybeObject* maybe_object = HEAP->AllocateRaw( |
| 2951 AllocationSiteInfo::kSize + kPointerSize, NEW_SPACE, OLD_POINTER_SPACE); | 2985 AllocationSiteInfo::kSize + kPointerSize, NEW_SPACE, OLD_POINTER_SPACE); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3113 " var a = new Array(n);" | 3147 " var a = new Array(n);" |
| 3114 " for (var i = 0; i < n; i += 100) a[i] = i;" | 3148 " for (var i = 0; i < n; i += 100) a[i] = i;" |
| 3115 "};" | 3149 "};" |
| 3116 "f(10 * 1024 * 1024);"); | 3150 "f(10 * 1024 * 1024);"); |
| 3117 IncrementalMarking* marking = HEAP->incremental_marking(); | 3151 IncrementalMarking* marking = HEAP->incremental_marking(); |
| 3118 if (marking->IsStopped()) marking->Start(); | 3152 if (marking->IsStopped()) marking->Start(); |
| 3119 // This big step should be sufficient to mark the whole array. | 3153 // This big step should be sufficient to mark the whole array. |
| 3120 marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 3154 marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
| 3121 ASSERT(marking->IsComplete()); | 3155 ASSERT(marking->IsComplete()); |
| 3122 } | 3156 } |
| OLD | NEW |