| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "accessors.h" | 7 #include "accessors.h" |
| 8 #include "api.h" | 8 #include "api.h" |
| 9 #include "bootstrapper.h" | 9 #include "bootstrapper.h" |
| 10 #include "codegen.h" | 10 #include "codegen.h" |
| (...skipping 2379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2390 } | 2390 } |
| 2391 #ifdef DEBUG | 2391 #ifdef DEBUG |
| 2392 MemoryChunk* chunk = MemoryChunk::FromAddress(allocation->address()); | 2392 MemoryChunk* chunk = MemoryChunk::FromAddress(allocation->address()); |
| 2393 ASSERT(chunk->owner()->identity() == space); | 2393 ASSERT(chunk->owner()->identity() == space); |
| 2394 #endif | 2394 #endif |
| 2395 CreateFillerObjectAt(allocation->address(), size); | 2395 CreateFillerObjectAt(allocation->address(), size); |
| 2396 return allocation; | 2396 return allocation; |
| 2397 } | 2397 } |
| 2398 | 2398 |
| 2399 | 2399 |
| 2400 MaybeObject* Heap::AllocatePolymorphicCodeCache() { | |
| 2401 return AllocateStruct(POLYMORPHIC_CODE_CACHE_TYPE); | |
| 2402 } | |
| 2403 | |
| 2404 | |
| 2405 const Heap::StringTypeTable Heap::string_type_table[] = { | 2400 const Heap::StringTypeTable Heap::string_type_table[] = { |
| 2406 #define STRING_TYPE_ELEMENT(type, size, name, camel_name) \ | 2401 #define STRING_TYPE_ELEMENT(type, size, name, camel_name) \ |
| 2407 {type, size, k##camel_name##MapRootIndex}, | 2402 {type, size, k##camel_name##MapRootIndex}, |
| 2408 STRING_TYPE_LIST(STRING_TYPE_ELEMENT) | 2403 STRING_TYPE_LIST(STRING_TYPE_ELEMENT) |
| 2409 #undef STRING_TYPE_ELEMENT | 2404 #undef STRING_TYPE_ELEMENT |
| 2410 }; | 2405 }; |
| 2411 | 2406 |
| 2412 | 2407 |
| 2413 const Heap::ConstantStringTable Heap::constant_string_table[] = { | 2408 const Heap::ConstantStringTable Heap::constant_string_table[] = { |
| 2414 #define CONSTANT_STRING_ELEMENT(name, contents) \ | 2409 #define CONSTANT_STRING_ELEMENT(name, contents) \ |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2714 global_property_cell_map()); | 2709 global_property_cell_map()); |
| 2715 PropertyCell* cell = PropertyCell::cast(result); | 2710 PropertyCell* cell = PropertyCell::cast(result); |
| 2716 cell->set_dependent_code(DependentCode::cast(empty_fixed_array()), | 2711 cell->set_dependent_code(DependentCode::cast(empty_fixed_array()), |
| 2717 SKIP_WRITE_BARRIER); | 2712 SKIP_WRITE_BARRIER); |
| 2718 cell->set_value(the_hole_value()); | 2713 cell->set_value(the_hole_value()); |
| 2719 cell->set_type(HeapType::None()); | 2714 cell->set_type(HeapType::None()); |
| 2720 return result; | 2715 return result; |
| 2721 } | 2716 } |
| 2722 | 2717 |
| 2723 | 2718 |
| 2724 bool Heap::CreateApiObjects() { | 2719 void Heap::CreateApiObjects() { |
| 2725 Object* obj; | 2720 HandleScope scope(isolate()); |
| 2721 Factory* factory = isolate()->factory(); |
| 2722 Handle<Map> new_neander_map = |
| 2723 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 2726 | 2724 |
| 2727 { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | |
| 2728 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2729 } | |
| 2730 // Don't use Smi-only elements optimizations for objects with the neander | 2725 // Don't use Smi-only elements optimizations for objects with the neander |
| 2731 // map. There are too many cases where element values are set directly with a | 2726 // map. There are too many cases where element values are set directly with a |
| 2732 // bottleneck to trap the Smi-only -> fast elements transition, and there | 2727 // bottleneck to trap the Smi-only -> fast elements transition, and there |
| 2733 // appears to be no benefit for optimize this case. | 2728 // appears to be no benefit for optimize this case. |
| 2734 Map* new_neander_map = Map::cast(obj); | |
| 2735 new_neander_map->set_elements_kind(TERMINAL_FAST_ELEMENTS_KIND); | 2729 new_neander_map->set_elements_kind(TERMINAL_FAST_ELEMENTS_KIND); |
| 2736 set_neander_map(new_neander_map); | 2730 set_neander_map(*new_neander_map); |
| 2737 | 2731 |
| 2738 { MaybeObject* maybe_obj = AllocateJSObjectFromMap(neander_map()); | 2732 Handle<JSObject> listeners = factory->NewNeanderObject(); |
| 2739 if (!maybe_obj->ToObject(&obj)) return false; | 2733 Handle<FixedArray> elements = factory->NewFixedArray(2); |
| 2740 } | 2734 elements->set(0, Smi::FromInt(0)); |
| 2741 Object* elements; | 2735 listeners->set_elements(*elements); |
| 2742 { MaybeObject* maybe_elements = AllocateFixedArray(2); | 2736 set_message_listeners(*listeners); |
| 2743 if (!maybe_elements->ToObject(&elements)) return false; | |
| 2744 } | |
| 2745 FixedArray::cast(elements)->set(0, Smi::FromInt(0)); | |
| 2746 JSObject::cast(obj)->set_elements(FixedArray::cast(elements)); | |
| 2747 set_message_listeners(JSObject::cast(obj)); | |
| 2748 | |
| 2749 return true; | |
| 2750 } | 2737 } |
| 2751 | 2738 |
| 2752 | 2739 |
| 2753 void Heap::CreateJSEntryStub() { | 2740 void Heap::CreateJSEntryStub() { |
| 2754 JSEntryStub stub(isolate()); | 2741 JSEntryStub stub(isolate()); |
| 2755 set_js_entry_code(*stub.GetCode()); | 2742 set_js_entry_code(*stub.GetCode()); |
| 2756 } | 2743 } |
| 2757 | 2744 |
| 2758 | 2745 |
| 2759 void Heap::CreateJSConstructEntryStub() { | 2746 void Heap::CreateJSConstructEntryStub() { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2785 // } | 2772 // } |
| 2786 // { JSConstructEntryStub stub; | 2773 // { JSConstructEntryStub stub; |
| 2787 // js_construct_entry_code_ = *stub.GetCode(); | 2774 // js_construct_entry_code_ = *stub.GetCode(); |
| 2788 // } | 2775 // } |
| 2789 // To workaround the problem, make separate functions without inlining. | 2776 // To workaround the problem, make separate functions without inlining. |
| 2790 Heap::CreateJSEntryStub(); | 2777 Heap::CreateJSEntryStub(); |
| 2791 Heap::CreateJSConstructEntryStub(); | 2778 Heap::CreateJSConstructEntryStub(); |
| 2792 } | 2779 } |
| 2793 | 2780 |
| 2794 | 2781 |
| 2795 bool Heap::CreateInitialObjects() { | 2782 void Heap::CreateInitialObjects() { |
| 2796 HandleScope scope(isolate()); | 2783 HandleScope scope(isolate()); |
| 2797 Factory* factory = isolate()->factory(); | 2784 Factory* factory = isolate()->factory(); |
| 2798 | 2785 |
| 2799 // The -0 value must be set before NumberFromDouble works. | 2786 // The -0 value must be set before NumberFromDouble works. |
| 2800 set_minus_zero_value(*factory->NewHeapNumber(-0.0, TENURED)); | 2787 set_minus_zero_value(*factory->NewHeapNumber(-0.0, TENURED)); |
| 2801 ASSERT(std::signbit(minus_zero_value()->Number()) != 0); | 2788 ASSERT(std::signbit(minus_zero_value()->Number()) != 0); |
| 2802 | 2789 |
| 2803 set_nan_value(*factory->NewHeapNumber(OS::nan_value(), TENURED)); | 2790 set_nan_value(*factory->NewHeapNumber(OS::nan_value(), TENURED)); |
| 2804 set_infinity_value(*factory->NewHeapNumber(V8_INFINITY, TENURED)); | 2791 set_infinity_value(*factory->NewHeapNumber(V8_INFINITY, TENURED)); |
| 2805 | 2792 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2867 "exception", | 2854 "exception", |
| 2868 handle(Smi::FromInt(-5), isolate()), | 2855 handle(Smi::FromInt(-5), isolate()), |
| 2869 Oddball::kException)); | 2856 Oddball::kException)); |
| 2870 | 2857 |
| 2871 for (unsigned i = 0; i < ARRAY_SIZE(constant_string_table); i++) { | 2858 for (unsigned i = 0; i < ARRAY_SIZE(constant_string_table); i++) { |
| 2872 Handle<String> str = | 2859 Handle<String> str = |
| 2873 factory->InternalizeUtf8String(constant_string_table[i].contents); | 2860 factory->InternalizeUtf8String(constant_string_table[i].contents); |
| 2874 roots_[constant_string_table[i].index] = *str; | 2861 roots_[constant_string_table[i].index] = *str; |
| 2875 } | 2862 } |
| 2876 | 2863 |
| 2877 Object* obj; | |
| 2878 | |
| 2879 // Allocate the hidden string which is used to identify the hidden properties | 2864 // Allocate the hidden string which is used to identify the hidden properties |
| 2880 // in JSObjects. The hash code has a special value so that it will not match | 2865 // in JSObjects. The hash code has a special value so that it will not match |
| 2881 // the empty string when searching for the property. It cannot be part of the | 2866 // the empty string when searching for the property. It cannot be part of the |
| 2882 // loop above because it needs to be allocated manually with the special | 2867 // loop above because it needs to be allocated manually with the special |
| 2883 // hash code in place. The hash code for the hidden_string is zero to ensure | 2868 // hash code in place. The hash code for the hidden_string is zero to ensure |
| 2884 // that it will always be at the first entry in property descriptors. | 2869 // that it will always be at the first entry in property descriptors. |
| 2885 { MaybeObject* maybe_obj = AllocateOneByteInternalizedString( | 2870 hidden_string_ = *factory->NewOneByteInternalizedString( |
| 2886 OneByteVector("", 0), String::kEmptyStringHash); | 2871 OneByteVector("", 0), String::kEmptyStringHash); |
| 2887 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2888 } | |
| 2889 hidden_string_ = String::cast(obj); | |
| 2890 | 2872 |
| 2891 // Create the code_stubs dictionary. The initial size is set to avoid | 2873 // Create the code_stubs dictionary. The initial size is set to avoid |
| 2892 // expanding the dictionary during bootstrapping. | 2874 // expanding the dictionary during bootstrapping. |
| 2893 set_code_stubs(*UnseededNumberDictionary::New(isolate(), 128)); | 2875 set_code_stubs(*UnseededNumberDictionary::New(isolate(), 128)); |
| 2894 | 2876 |
| 2895 // Create the non_monomorphic_cache used in stub-cache.cc. The initial size | 2877 // Create the non_monomorphic_cache used in stub-cache.cc. The initial size |
| 2896 // is set to avoid expanding the dictionary during bootstrapping. | 2878 // is set to avoid expanding the dictionary during bootstrapping. |
| 2897 set_non_monomorphic_cache(*UnseededNumberDictionary::New(isolate(), 64)); | 2879 set_non_monomorphic_cache(*UnseededNumberDictionary::New(isolate(), 64)); |
| 2898 | 2880 |
| 2899 { MaybeObject* maybe_obj = AllocatePolymorphicCodeCache(); | 2881 set_polymorphic_code_cache(PolymorphicCodeCache::cast( |
| 2900 if (!maybe_obj->ToObject(&obj)) return false; | 2882 *factory->NewStruct(POLYMORPHIC_CODE_CACHE_TYPE))); |
| 2901 } | |
| 2902 set_polymorphic_code_cache(PolymorphicCodeCache::cast(obj)); | |
| 2903 | 2883 |
| 2904 set_instanceof_cache_function(Smi::FromInt(0)); | 2884 set_instanceof_cache_function(Smi::FromInt(0)); |
| 2905 set_instanceof_cache_map(Smi::FromInt(0)); | 2885 set_instanceof_cache_map(Smi::FromInt(0)); |
| 2906 set_instanceof_cache_answer(Smi::FromInt(0)); | 2886 set_instanceof_cache_answer(Smi::FromInt(0)); |
| 2907 | 2887 |
| 2908 CreateFixedStubs(); | 2888 CreateFixedStubs(); |
| 2909 | 2889 |
| 2910 // Allocate the dictionary of intrinsic function names. | 2890 // Allocate the dictionary of intrinsic function names. |
| 2911 { | 2891 Handle<NameDictionary> intrinsic_names = |
| 2912 Handle<NameDictionary> function_names = | 2892 NameDictionary::New(isolate(), Runtime::kNumFunctions); |
| 2913 NameDictionary::New(isolate(), Runtime::kNumFunctions); | 2893 Runtime::InitializeIntrinsicFunctionNames(isolate(), intrinsic_names); |
| 2914 Runtime::InitializeIntrinsicFunctionNames(isolate(), function_names); | 2894 set_intrinsic_function_names(*intrinsic_names); |
| 2915 set_intrinsic_function_names(*function_names); | |
| 2916 } | |
| 2917 | 2895 |
| 2918 { MaybeObject* maybe_obj = AllocateInitialNumberStringCache(); | 2896 set_number_string_cache(*factory->NewFixedArray( |
| 2919 if (!maybe_obj->ToObject(&obj)) return false; | 2897 kInitialNumberStringCacheSize * 2, TENURED)); |
| 2920 } | |
| 2921 set_number_string_cache(FixedArray::cast(obj)); | |
| 2922 | 2898 |
| 2923 // Allocate cache for single character one byte strings. | 2899 // Allocate cache for single character one byte strings. |
| 2924 { MaybeObject* maybe_obj = | 2900 set_single_character_string_cache(*factory->NewFixedArray( |
| 2925 AllocateFixedArray(String::kMaxOneByteCharCode + 1, TENURED); | 2901 String::kMaxOneByteCharCode + 1, TENURED)); |
| 2926 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2927 } | |
| 2928 set_single_character_string_cache(FixedArray::cast(obj)); | |
| 2929 | 2902 |
| 2930 // Allocate cache for string split. | 2903 // Allocate cache for string split and regexp-multiple. |
| 2931 { MaybeObject* maybe_obj = AllocateFixedArray( | 2904 set_string_split_cache(*factory->NewFixedArray( |
| 2932 RegExpResultsCache::kRegExpResultsCacheSize, TENURED); | 2905 RegExpResultsCache::kRegExpResultsCacheSize, TENURED)); |
| 2933 if (!maybe_obj->ToObject(&obj)) return false; | 2906 set_regexp_multiple_cache(*factory->NewFixedArray( |
| 2934 } | 2907 RegExpResultsCache::kRegExpResultsCacheSize, TENURED)); |
| 2935 set_string_split_cache(FixedArray::cast(obj)); | |
| 2936 | |
| 2937 { MaybeObject* maybe_obj = AllocateFixedArray( | |
| 2938 RegExpResultsCache::kRegExpResultsCacheSize, TENURED); | |
| 2939 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2940 } | |
| 2941 set_regexp_multiple_cache(FixedArray::cast(obj)); | |
| 2942 | 2908 |
| 2943 // Allocate cache for external strings pointing to native source code. | 2909 // Allocate cache for external strings pointing to native source code. |
| 2944 { MaybeObject* maybe_obj = AllocateFixedArray(Natives::GetBuiltinsCount()); | 2910 set_natives_source_cache(*factory->NewFixedArray( |
| 2945 if (!maybe_obj->ToObject(&obj)) return false; | 2911 Natives::GetBuiltinsCount())); |
| 2946 } | |
| 2947 set_natives_source_cache(FixedArray::cast(obj)); | |
| 2948 | 2912 |
| 2949 { MaybeObject* maybe_obj = AllocateCell(undefined_value()); | 2913 set_undefined_cell(*factory->NewCell(factory->undefined_value())); |
| 2950 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2951 } | |
| 2952 set_undefined_cell(Cell::cast(obj)); | |
| 2953 | 2914 |
| 2954 // The symbol registry is initialized lazily. | 2915 // The symbol registry is initialized lazily. |
| 2955 set_symbol_registry(undefined_value()); | 2916 set_symbol_registry(undefined_value()); |
| 2956 | 2917 |
| 2957 // Allocate object to hold object observation state. | 2918 // Allocate object to hold object observation state. |
| 2958 { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 2919 set_observation_state(*factory->NewJSObjectFromMap( |
| 2959 if (!maybe_obj->ToObject(&obj)) return false; | 2920 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize))); |
| 2960 } | |
| 2961 { MaybeObject* maybe_obj = AllocateJSObjectFromMap(Map::cast(obj)); | |
| 2962 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2963 } | |
| 2964 set_observation_state(JSObject::cast(obj)); | |
| 2965 | 2921 |
| 2966 // Allocate object to hold object microtask state. | 2922 // Allocate object to hold object microtask state. |
| 2967 { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 2923 set_microtask_state(*factory->NewJSObjectFromMap( |
| 2968 if (!maybe_obj->ToObject(&obj)) return false; | 2924 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize))); |
| 2969 } | |
| 2970 { MaybeObject* maybe_obj = AllocateJSObjectFromMap(Map::cast(obj)); | |
| 2971 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2972 } | |
| 2973 set_microtask_state(JSObject::cast(obj)); | |
| 2974 | 2925 |
| 2975 { MaybeObject* maybe_obj = AllocateSymbol(); | 2926 set_frozen_symbol(*factory->NewPrivateSymbol()); |
| 2976 if (!maybe_obj->ToObject(&obj)) return false; | 2927 set_nonexistent_symbol(*factory->NewPrivateSymbol()); |
| 2977 } | 2928 set_elements_transition_symbol(*factory->NewPrivateSymbol()); |
| 2978 Symbol::cast(obj)->set_is_private(true); | 2929 set_uninitialized_symbol(*factory->NewPrivateSymbol()); |
| 2979 set_frozen_symbol(Symbol::cast(obj)); | 2930 set_megamorphic_symbol(*factory->NewPrivateSymbol()); |
| 2931 set_observed_symbol(*factory->NewPrivateSymbol()); |
| 2980 | 2932 |
| 2981 { MaybeObject* maybe_obj = AllocateSymbol(); | 2933 Handle<SeededNumberDictionary> slow_element_dictionary = |
| 2982 if (!maybe_obj->ToObject(&obj)) return false; | 2934 SeededNumberDictionary::New(isolate(), 0, TENURED); |
| 2983 } | 2935 slow_element_dictionary->set_requires_slow_elements(); |
| 2984 Symbol::cast(obj)->set_is_private(true); | 2936 set_empty_slow_element_dictionary(*slow_element_dictionary); |
| 2985 set_nonexistent_symbol(Symbol::cast(obj)); | |
| 2986 | 2937 |
| 2987 { MaybeObject* maybe_obj = AllocateSymbol(); | 2938 set_materialized_objects(*factory->NewFixedArray(0, TENURED)); |
| 2988 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2989 } | |
| 2990 Symbol::cast(obj)->set_is_private(true); | |
| 2991 set_elements_transition_symbol(Symbol::cast(obj)); | |
| 2992 | |
| 2993 { MaybeObject* maybe_obj = AllocateSymbol(); | |
| 2994 if (!maybe_obj->ToObject(&obj)) return false; | |
| 2995 } | |
| 2996 Symbol::cast(obj)->set_is_private(true); | |
| 2997 set_uninitialized_symbol(Symbol::cast(obj)); | |
| 2998 | |
| 2999 { MaybeObject* maybe_obj = AllocateSymbol(); | |
| 3000 if (!maybe_obj->ToObject(&obj)) return false; | |
| 3001 } | |
| 3002 Symbol::cast(obj)->set_is_private(true); | |
| 3003 set_megamorphic_symbol(Symbol::cast(obj)); | |
| 3004 | |
| 3005 { | |
| 3006 Handle<SeededNumberDictionary> dict = | |
| 3007 SeededNumberDictionary::New(isolate(), 0, TENURED); | |
| 3008 dict->set_requires_slow_elements(); | |
| 3009 set_empty_slow_element_dictionary(*dict); | |
| 3010 } | |
| 3011 | |
| 3012 { MaybeObject* maybe_obj = AllocateSymbol(); | |
| 3013 if (!maybe_obj->ToObject(&obj)) return false; | |
| 3014 } | |
| 3015 Symbol::cast(obj)->set_is_private(true); | |
| 3016 set_observed_symbol(Symbol::cast(obj)); | |
| 3017 | |
| 3018 { MaybeObject* maybe_obj = AllocateFixedArray(0, TENURED); | |
| 3019 if (!maybe_obj->ToObject(&obj)) return false; | |
| 3020 } | |
| 3021 set_materialized_objects(FixedArray::cast(obj)); | |
| 3022 | 2939 |
| 3023 // Handling of script id generation is in Factory::NewScript. | 2940 // Handling of script id generation is in Factory::NewScript. |
| 3024 set_last_script_id(Smi::FromInt(v8::UnboundScript::kNoScriptId)); | 2941 set_last_script_id(Smi::FromInt(v8::UnboundScript::kNoScriptId)); |
| 3025 | 2942 |
| 3026 { MaybeObject* maybe_obj = AllocateAllocationSitesScratchpad(); | 2943 set_allocation_sites_scratchpad(*factory->NewFixedArray( |
| 3027 if (!maybe_obj->ToObject(&obj)) return false; | 2944 kAllocationSiteScratchpadSize, TENURED)); |
| 3028 } | |
| 3029 set_allocation_sites_scratchpad(FixedArray::cast(obj)); | |
| 3030 InitializeAllocationSitesScratchpad(); | 2945 InitializeAllocationSitesScratchpad(); |
| 3031 | 2946 |
| 3032 // Initialize keyed lookup cache. | 2947 // Initialize keyed lookup cache. |
| 3033 isolate_->keyed_lookup_cache()->Clear(); | 2948 isolate_->keyed_lookup_cache()->Clear(); |
| 3034 | 2949 |
| 3035 // Initialize context slot cache. | 2950 // Initialize context slot cache. |
| 3036 isolate_->context_slot_cache()->Clear(); | 2951 isolate_->context_slot_cache()->Clear(); |
| 3037 | 2952 |
| 3038 // Initialize descriptor cache. | 2953 // Initialize descriptor cache. |
| 3039 isolate_->descriptor_lookup_cache()->Clear(); | 2954 isolate_->descriptor_lookup_cache()->Clear(); |
| 3040 | 2955 |
| 3041 // Initialize compilation cache. | 2956 // Initialize compilation cache. |
| 3042 isolate_->compilation_cache()->Clear(); | 2957 isolate_->compilation_cache()->Clear(); |
| 3043 | |
| 3044 return true; | |
| 3045 } | 2958 } |
| 3046 | 2959 |
| 3047 | 2960 |
| 3048 bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { | 2961 bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { |
| 3049 RootListIndex writable_roots[] = { | 2962 RootListIndex writable_roots[] = { |
| 3050 kStoreBufferTopRootIndex, | 2963 kStoreBufferTopRootIndex, |
| 3051 kStackLimitRootIndex, | 2964 kStackLimitRootIndex, |
| 3052 kNumberStringCacheRootIndex, | 2965 kNumberStringCacheRootIndex, |
| 3053 kInstanceofCacheFunctionRootIndex, | 2966 kInstanceofCacheFunctionRootIndex, |
| 3054 kInstanceofCacheMapRootIndex, | 2967 kInstanceofCacheMapRootIndex, |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3168 } | 3081 } |
| 3169 | 3082 |
| 3170 | 3083 |
| 3171 void RegExpResultsCache::Clear(FixedArray* cache) { | 3084 void RegExpResultsCache::Clear(FixedArray* cache) { |
| 3172 for (int i = 0; i < kRegExpResultsCacheSize; i++) { | 3085 for (int i = 0; i < kRegExpResultsCacheSize; i++) { |
| 3173 cache->set(i, Smi::FromInt(0)); | 3086 cache->set(i, Smi::FromInt(0)); |
| 3174 } | 3087 } |
| 3175 } | 3088 } |
| 3176 | 3089 |
| 3177 | 3090 |
| 3178 MaybeObject* Heap::AllocateInitialNumberStringCache() { | |
| 3179 MaybeObject* maybe_obj = | |
| 3180 AllocateFixedArray(kInitialNumberStringCacheSize * 2, TENURED); | |
| 3181 return maybe_obj; | |
| 3182 } | |
| 3183 | |
| 3184 | |
| 3185 int Heap::FullSizeNumberStringCacheLength() { | 3091 int Heap::FullSizeNumberStringCacheLength() { |
| 3186 // Compute the size of the number string cache based on the max newspace size. | 3092 // Compute the size of the number string cache based on the max newspace size. |
| 3187 // The number string cache has a minimum size based on twice the initial cache | 3093 // The number string cache has a minimum size based on twice the initial cache |
| 3188 // size to ensure that it is bigger after being made 'full size'. | 3094 // size to ensure that it is bigger after being made 'full size'. |
| 3189 int number_string_cache_size = max_semispace_size_ / 512; | 3095 int number_string_cache_size = max_semispace_size_ / 512; |
| 3190 number_string_cache_size = Max(kInitialNumberStringCacheSize * 2, | 3096 number_string_cache_size = Max(kInitialNumberStringCacheSize * 2, |
| 3191 Min(0x4000, number_string_cache_size)); | 3097 Min(0x4000, number_string_cache_size)); |
| 3192 // There is a string and a number per entry so the length is twice the number | 3098 // There is a string and a number per entry so the length is twice the number |
| 3193 // of entries. | 3099 // of entries. |
| 3194 return number_string_cache_size * 2; | 3100 return number_string_cache_size * 2; |
| 3195 } | 3101 } |
| 3196 | 3102 |
| 3197 | 3103 |
| 3198 void Heap::FlushNumberStringCache() { | 3104 void Heap::FlushNumberStringCache() { |
| 3199 // Flush the number to string cache. | 3105 // Flush the number to string cache. |
| 3200 int len = number_string_cache()->length(); | 3106 int len = number_string_cache()->length(); |
| 3201 for (int i = 0; i < len; i++) { | 3107 for (int i = 0; i < len; i++) { |
| 3202 number_string_cache()->set_undefined(i); | 3108 number_string_cache()->set_undefined(i); |
| 3203 } | 3109 } |
| 3204 } | 3110 } |
| 3205 | 3111 |
| 3206 | 3112 |
| 3207 MaybeObject* Heap::AllocateAllocationSitesScratchpad() { | |
| 3208 MaybeObject* maybe_obj = | |
| 3209 AllocateFixedArray(kAllocationSiteScratchpadSize, TENURED); | |
| 3210 return maybe_obj; | |
| 3211 } | |
| 3212 | |
| 3213 | |
| 3214 void Heap::FlushAllocationSitesScratchpad() { | 3113 void Heap::FlushAllocationSitesScratchpad() { |
| 3215 for (int i = 0; i < allocation_sites_scratchpad_length_; i++) { | 3114 for (int i = 0; i < allocation_sites_scratchpad_length_; i++) { |
| 3216 allocation_sites_scratchpad()->set_undefined(i); | 3115 allocation_sites_scratchpad()->set_undefined(i); |
| 3217 } | 3116 } |
| 3218 allocation_sites_scratchpad_length_ = 0; | 3117 allocation_sites_scratchpad_length_ = 0; |
| 3219 } | 3118 } |
| 3220 | 3119 |
| 3221 | 3120 |
| 3222 void Heap::InitializeAllocationSitesScratchpad() { | 3121 void Heap::InitializeAllocationSitesScratchpad() { |
| 3223 ASSERT(allocation_sites_scratchpad()->length() == | 3122 ASSERT(allocation_sites_scratchpad()->length() == |
| (...skipping 2188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5412 | 5311 |
| 5413 mark_compact_collector()->SetUp(); | 5312 mark_compact_collector()->SetUp(); |
| 5414 | 5313 |
| 5415 return true; | 5314 return true; |
| 5416 } | 5315 } |
| 5417 | 5316 |
| 5418 | 5317 |
| 5419 bool Heap::CreateHeapObjects() { | 5318 bool Heap::CreateHeapObjects() { |
| 5420 // Create initial maps. | 5319 // Create initial maps. |
| 5421 if (!CreateInitialMaps()) return false; | 5320 if (!CreateInitialMaps()) return false; |
| 5422 if (!CreateApiObjects()) return false; | 5321 CreateApiObjects(); |
| 5423 | 5322 |
| 5424 // Create initial objects | 5323 // Create initial objects |
| 5425 if (!CreateInitialObjects()) return false; | 5324 CreateInitialObjects(); |
| 5426 CHECK_EQ(0, gc_count_); | 5325 CHECK_EQ(0, gc_count_); |
| 5427 | 5326 |
| 5428 native_contexts_list_ = undefined_value(); | 5327 native_contexts_list_ = undefined_value(); |
| 5429 array_buffers_list_ = undefined_value(); | 5328 array_buffers_list_ = undefined_value(); |
| 5430 allocation_sites_list_ = undefined_value(); | 5329 allocation_sites_list_ = undefined_value(); |
| 5431 weak_object_to_code_table_ = undefined_value(); | 5330 weak_object_to_code_table_ = undefined_value(); |
| 5432 return true; | 5331 return true; |
| 5433 } | 5332 } |
| 5434 | 5333 |
| 5435 | 5334 |
| (...skipping 1171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6607 static_cast<int>(object_sizes_last_time_[index])); | 6506 static_cast<int>(object_sizes_last_time_[index])); |
| 6608 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 6507 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
| 6609 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 6508 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
| 6610 | 6509 |
| 6611 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 6510 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
| 6612 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 6511 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
| 6613 ClearObjectStats(); | 6512 ClearObjectStats(); |
| 6614 } | 6513 } |
| 6615 | 6514 |
| 6616 } } // namespace v8::internal | 6515 } } // namespace v8::internal |
| OLD | NEW |