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

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

Issue 238543005: Move property addition code from JSObject to Map (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed last comments Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2619 matching lines...) Expand 10 before | Expand all | Expand 10 after
2630 // Test that map transitions are cleared and maps are collected with 2630 // Test that map transitions are cleared and maps are collected with
2631 // incremental marking as well. 2631 // incremental marking as well.
2632 TEST(Regress1465) { 2632 TEST(Regress1465) {
2633 i::FLAG_stress_compaction = false; 2633 i::FLAG_stress_compaction = false;
2634 i::FLAG_allow_natives_syntax = true; 2634 i::FLAG_allow_natives_syntax = true;
2635 i::FLAG_trace_incremental_marking = true; 2635 i::FLAG_trace_incremental_marking = true;
2636 CcTest::InitializeVM(); 2636 CcTest::InitializeVM();
2637 v8::HandleScope scope(CcTest::isolate()); 2637 v8::HandleScope scope(CcTest::isolate());
2638 static const int transitions_count = 256; 2638 static const int transitions_count = 256;
2639 2639
2640 CompileRun("function F() {}");
2640 { 2641 {
2641 AlwaysAllocateScope always_allocate(CcTest::i_isolate()); 2642 AlwaysAllocateScope always_allocate(CcTest::i_isolate());
2642 for (int i = 0; i < transitions_count; i++) { 2643 for (int i = 0; i < transitions_count; i++) {
2643 EmbeddedVector<char, 64> buffer; 2644 EmbeddedVector<char, 64> buffer;
2644 OS::SNPrintF(buffer, "var o = new Object; o.prop%d = %d;", i, i); 2645 OS::SNPrintF(buffer, "var o = new F; o.prop%d = %d;", i, i);
2645 CompileRun(buffer.start()); 2646 CompileRun(buffer.start());
2646 } 2647 }
2647 CompileRun("var root = new Object;"); 2648 CompileRun("var root = new F;");
2648 } 2649 }
2649 2650
2650 Handle<JSObject> root = 2651 Handle<JSObject> root =
2651 v8::Utils::OpenHandle( 2652 v8::Utils::OpenHandle(
2652 *v8::Handle<v8::Object>::Cast( 2653 *v8::Handle<v8::Object>::Cast(
2653 CcTest::global()->Get(v8_str("root")))); 2654 CcTest::global()->Get(v8_str("root"))));
2654 2655
2655 // Count number of live transitions before marking. 2656 // Count number of live transitions before marking.
2656 int transitions_before = CountMapTransitions(root->map()); 2657 int transitions_before = CountMapTransitions(root->map());
2657 CompileRun("%DebugPrint(root);"); 2658 CompileRun("%DebugPrint(root);");
2658 CHECK_EQ(transitions_count, transitions_before); 2659 CHECK_EQ(transitions_count, transitions_before);
2659 2660
2660 SimulateIncrementalMarking(); 2661 SimulateIncrementalMarking();
2661 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); 2662 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
2662 2663
2663 // Count number of live transitions after marking. Note that one transition 2664 // Count number of live transitions after marking. Note that one transition
2664 // is left, because 'o' still holds an instance of one transition target. 2665 // is left, because 'o' still holds an instance of one transition target.
2665 int transitions_after = CountMapTransitions(root->map()); 2666 int transitions_after = CountMapTransitions(root->map());
2666 CompileRun("%DebugPrint(root);"); 2667 CompileRun("%DebugPrint(root);");
2667 CHECK_EQ(1, transitions_after); 2668 CHECK_EQ(1, transitions_after);
2668 } 2669 }
2669 2670
2670 2671
2671 #ifdef DEBUG 2672 #ifdef DEBUG
2672 static void AddTransitions(int transitions_count) { 2673 static void AddTransitions(int transitions_count) {
2673 AlwaysAllocateScope always_allocate(CcTest::i_isolate()); 2674 AlwaysAllocateScope always_allocate(CcTest::i_isolate());
2674 for (int i = 0; i < transitions_count; i++) { 2675 for (int i = 0; i < transitions_count; i++) {
2675 EmbeddedVector<char, 64> buffer; 2676 EmbeddedVector<char, 64> buffer;
2676 OS::SNPrintF(buffer, "var o = new Object; o.prop%d = %d;", i, i); 2677 OS::SNPrintF(buffer, "var o = new F; o.prop%d = %d;", i, i);
2677 CompileRun(buffer.start()); 2678 CompileRun(buffer.start());
2678 } 2679 }
2679 } 2680 }
2680 2681
2681 2682
2682 static Handle<JSObject> GetByName(const char* name) { 2683 static Handle<JSObject> GetByName(const char* name) {
2683 return v8::Utils::OpenHandle( 2684 return v8::Utils::OpenHandle(
2684 *v8::Handle<v8::Object>::Cast( 2685 *v8::Handle<v8::Object>::Cast(
2685 CcTest::global()->Get(v8_str(name)))); 2686 CcTest::global()->Get(v8_str(name))));
2686 } 2687 }
(...skipping 12 matching lines...) Expand all
2699 object, prop_name, twenty_three, NONE, SLOPPY).Check(); 2700 object, prop_name, twenty_three, NONE, SLOPPY).Check();
2700 } 2701 }
2701 2702
2702 2703
2703 TEST(TransitionArrayShrinksDuringAllocToZero) { 2704 TEST(TransitionArrayShrinksDuringAllocToZero) {
2704 i::FLAG_stress_compaction = false; 2705 i::FLAG_stress_compaction = false;
2705 i::FLAG_allow_natives_syntax = true; 2706 i::FLAG_allow_natives_syntax = true;
2706 CcTest::InitializeVM(); 2707 CcTest::InitializeVM();
2707 v8::HandleScope scope(CcTest::isolate()); 2708 v8::HandleScope scope(CcTest::isolate());
2708 static const int transitions_count = 10; 2709 static const int transitions_count = 10;
2710 CompileRun("function F() { }");
2709 AddTransitions(transitions_count); 2711 AddTransitions(transitions_count);
2710 CompileRun("var root = new Object;"); 2712 CompileRun("var root = new F;");
2711 Handle<JSObject> root = GetByName("root"); 2713 Handle<JSObject> root = GetByName("root");
2712 2714
2713 // Count number of live transitions before marking. 2715 // Count number of live transitions before marking.
2714 int transitions_before = CountMapTransitions(root->map()); 2716 int transitions_before = CountMapTransitions(root->map());
2715 CHECK_EQ(transitions_count, transitions_before); 2717 CHECK_EQ(transitions_count, transitions_before);
2716 2718
2717 // Get rid of o 2719 // Get rid of o
2718 CompileRun("o = new Object;" 2720 CompileRun("o = new F;"
2719 "root = new Object"); 2721 "root = new F");
2720 root = GetByName("root"); 2722 root = GetByName("root");
2721 AddPropertyTo(2, root, "funny"); 2723 AddPropertyTo(2, root, "funny");
2722 2724
2723 // Count number of live transitions after marking. Note that one transition 2725 // Count number of live transitions after marking. Note that one transition
2724 // is left, because 'o' still holds an instance of one transition target. 2726 // is left, because 'o' still holds an instance of one transition target.
2725 int transitions_after = CountMapTransitions( 2727 int transitions_after = CountMapTransitions(
2726 Map::cast(root->map()->GetBackPointer())); 2728 Map::cast(root->map()->GetBackPointer()));
2727 CHECK_EQ(1, transitions_after); 2729 CHECK_EQ(1, transitions_after);
2728 } 2730 }
2729 2731
2730 2732
2731 TEST(TransitionArrayShrinksDuringAllocToOne) { 2733 TEST(TransitionArrayShrinksDuringAllocToOne) {
2732 i::FLAG_stress_compaction = false; 2734 i::FLAG_stress_compaction = false;
2733 i::FLAG_allow_natives_syntax = true; 2735 i::FLAG_allow_natives_syntax = true;
2734 CcTest::InitializeVM(); 2736 CcTest::InitializeVM();
2735 v8::HandleScope scope(CcTest::isolate()); 2737 v8::HandleScope scope(CcTest::isolate());
2736 static const int transitions_count = 10; 2738 static const int transitions_count = 10;
2739 CompileRun("function F() {}");
2737 AddTransitions(transitions_count); 2740 AddTransitions(transitions_count);
2738 CompileRun("var root = new Object;"); 2741 CompileRun("var root = new F;");
2739 Handle<JSObject> root = GetByName("root"); 2742 Handle<JSObject> root = GetByName("root");
2740 2743
2741 // Count number of live transitions before marking. 2744 // Count number of live transitions before marking.
2742 int transitions_before = CountMapTransitions(root->map()); 2745 int transitions_before = CountMapTransitions(root->map());
2743 CHECK_EQ(transitions_count, transitions_before); 2746 CHECK_EQ(transitions_count, transitions_before);
2744 2747
2745 root = GetByName("root"); 2748 root = GetByName("root");
2746 AddPropertyTo(2, root, "funny"); 2749 AddPropertyTo(2, root, "funny");
2747 2750
2748 // Count number of live transitions after marking. Note that one transition 2751 // Count number of live transitions after marking. Note that one transition
2749 // is left, because 'o' still holds an instance of one transition target. 2752 // is left, because 'o' still holds an instance of one transition target.
2750 int transitions_after = CountMapTransitions( 2753 int transitions_after = CountMapTransitions(
2751 Map::cast(root->map()->GetBackPointer())); 2754 Map::cast(root->map()->GetBackPointer()));
2752 CHECK_EQ(2, transitions_after); 2755 CHECK_EQ(2, transitions_after);
2753 } 2756 }
2754 2757
2755 2758
2756 TEST(TransitionArrayShrinksDuringAllocToOnePropertyFound) { 2759 TEST(TransitionArrayShrinksDuringAllocToOnePropertyFound) {
2757 i::FLAG_stress_compaction = false; 2760 i::FLAG_stress_compaction = false;
2758 i::FLAG_allow_natives_syntax = true; 2761 i::FLAG_allow_natives_syntax = true;
2759 CcTest::InitializeVM(); 2762 CcTest::InitializeVM();
2760 v8::HandleScope scope(CcTest::isolate()); 2763 v8::HandleScope scope(CcTest::isolate());
2761 static const int transitions_count = 10; 2764 static const int transitions_count = 10;
2765 CompileRun("function F() {}");
2762 AddTransitions(transitions_count); 2766 AddTransitions(transitions_count);
2763 CompileRun("var root = new Object;"); 2767 CompileRun("var root = new F;");
2764 Handle<JSObject> root = GetByName("root"); 2768 Handle<JSObject> root = GetByName("root");
2765 2769
2766 // Count number of live transitions before marking. 2770 // Count number of live transitions before marking.
2767 int transitions_before = CountMapTransitions(root->map()); 2771 int transitions_before = CountMapTransitions(root->map());
2768 CHECK_EQ(transitions_count, transitions_before); 2772 CHECK_EQ(transitions_count, transitions_before);
2769 2773
2770 root = GetByName("root"); 2774 root = GetByName("root");
2771 AddPropertyTo(0, root, "prop9"); 2775 AddPropertyTo(0, root, "prop9");
2772 2776
2773 // Count number of live transitions after marking. Note that one transition 2777 // Count number of live transitions after marking. Note that one transition
2774 // is left, because 'o' still holds an instance of one transition target. 2778 // is left, because 'o' still holds an instance of one transition target.
2775 int transitions_after = CountMapTransitions( 2779 int transitions_after = CountMapTransitions(
2776 Map::cast(root->map()->GetBackPointer())); 2780 Map::cast(root->map()->GetBackPointer()));
2777 CHECK_EQ(1, transitions_after); 2781 CHECK_EQ(1, transitions_after);
2778 } 2782 }
2779 2783
2780 2784
2781 TEST(TransitionArraySimpleToFull) { 2785 TEST(TransitionArraySimpleToFull) {
2782 i::FLAG_stress_compaction = false; 2786 i::FLAG_stress_compaction = false;
2783 i::FLAG_allow_natives_syntax = true; 2787 i::FLAG_allow_natives_syntax = true;
2784 CcTest::InitializeVM(); 2788 CcTest::InitializeVM();
2785 v8::HandleScope scope(CcTest::isolate()); 2789 v8::HandleScope scope(CcTest::isolate());
2786 static const int transitions_count = 1; 2790 static const int transitions_count = 1;
2791 CompileRun("function F() {}");
2787 AddTransitions(transitions_count); 2792 AddTransitions(transitions_count);
2788 CompileRun("var root = new Object;"); 2793 CompileRun("var root = new F;");
2789 Handle<JSObject> root = GetByName("root"); 2794 Handle<JSObject> root = GetByName("root");
2790 2795
2791 // Count number of live transitions before marking. 2796 // Count number of live transitions before marking.
2792 int transitions_before = CountMapTransitions(root->map()); 2797 int transitions_before = CountMapTransitions(root->map());
2793 CHECK_EQ(transitions_count, transitions_before); 2798 CHECK_EQ(transitions_count, transitions_before);
2794 2799
2795 CompileRun("o = new Object;" 2800 CompileRun("o = new F;"
2796 "root = new Object"); 2801 "root = new F");
2797 root = GetByName("root"); 2802 root = GetByName("root");
2798 ASSERT(root->map()->transitions()->IsSimpleTransition()); 2803 ASSERT(root->map()->transitions()->IsSimpleTransition());
2799 AddPropertyTo(2, root, "happy"); 2804 AddPropertyTo(2, root, "happy");
2800 2805
2801 // Count number of live transitions after marking. Note that one transition 2806 // Count number of live transitions after marking. Note that one transition
2802 // is left, because 'o' still holds an instance of one transition target. 2807 // is left, because 'o' still holds an instance of one transition target.
2803 int transitions_after = CountMapTransitions( 2808 int transitions_after = CountMapTransitions(
2804 Map::cast(root->map()->GetBackPointer())); 2809 Map::cast(root->map()->GetBackPointer()));
2805 CHECK_EQ(1, transitions_after); 2810 CHECK_EQ(1, transitions_after);
2806 } 2811 }
(...skipping 1380 matching lines...) Expand 10 before | Expand all | Expand 10 after
4187 v8::Context::Scope cscope(context); 4192 v8::Context::Scope cscope(context);
4188 4193
4189 v8::Local<v8::Value> result = CompileRun( 4194 v8::Local<v8::Value> result = CompileRun(
4190 "var locals = '';" 4195 "var locals = '';"
4191 "for (var i = 0; i < 512; i++) locals += 'var v' + i + '= 42;';" 4196 "for (var i = 0; i < 512; i++) locals += 'var v' + i + '= 42;';"
4192 "eval('function f() {' + locals + 'return function() { return v0; }; }');" 4197 "eval('function f() {' + locals + 'return function() { return v0; }; }');"
4193 "interrupt();" // This triggers a fake stack overflow in f. 4198 "interrupt();" // This triggers a fake stack overflow in f.
4194 "f()()"); 4199 "f()()");
4195 CHECK_EQ(42.0, result->ToNumber()->Value()); 4200 CHECK_EQ(42.0, result->ToNumber()->Value());
4196 } 4201 }
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698