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

Side by Side Diff: src/heap.cc

Issue 150813004: In-heap small typed arrays (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Patch for review Created 6 years, 9 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
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 2908 matching lines...) Expand 10 before | Expand all | Expand 10 after
2919 2919
2920 #define ALLOCATE_EMPTY_EXTERNAL_ARRAY(Type, type, TYPE, ctype, size) \ 2920 #define ALLOCATE_EMPTY_EXTERNAL_ARRAY(Type, type, TYPE, ctype, size) \
2921 { ExternalArray* obj; \ 2921 { ExternalArray* obj; \
2922 if (!AllocateEmptyExternalArray(kExternal##Type##Array)->To(&obj)) \ 2922 if (!AllocateEmptyExternalArray(kExternal##Type##Array)->To(&obj)) \
2923 return false; \ 2923 return false; \
2924 set_empty_external_##type##_array(obj); \ 2924 set_empty_external_##type##_array(obj); \
2925 } 2925 }
2926 2926
2927 TYPED_ARRAYS(ALLOCATE_EMPTY_EXTERNAL_ARRAY) 2927 TYPED_ARRAYS(ALLOCATE_EMPTY_EXTERNAL_ARRAY)
2928 #undef ALLOCATE_EMPTY_EXTERNAL_ARRAY 2928 #undef ALLOCATE_EMPTY_EXTERNAL_ARRAY
2929
2930 #define ALLOCATE_EMPTY_FIXED_TYPED_ARRAY(Type, type, TYPE, ctype, size) \
2931 { FixedTypedArrayBase* obj; \
2932 if (!AllocateEmptyFixedTypedArray(kExternal##Type##Array)->To(&obj)) \
2933 return false; \
2934 set_empty_fixed_##type##_array(obj); \
2935 }
2936
2937 TYPED_ARRAYS(ALLOCATE_EMPTY_FIXED_TYPED_ARRAY)
2938 #undef ALLOCATE_EMPTY_FIXED_TYPED_ARRAY
2929 } 2939 }
2930 ASSERT(!InNewSpace(empty_fixed_array())); 2940 ASSERT(!InNewSpace(empty_fixed_array()));
2931 return true; 2941 return true;
2932 } 2942 }
2933 2943
2934 2944
2935 MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { 2945 MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) {
2936 // Statically ensure that it is safe to allocate heap numbers in paged 2946 // Statically ensure that it is safe to allocate heap numbers in paged
2937 // spaces. 2947 // spaces.
2938 int size = HeapNumber::kSize; 2948 int size = HeapNumber::kSize;
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
3717 TYPED_ARRAYS(ELEMENT_KIND_TO_ROOT_INDEX) 3727 TYPED_ARRAYS(ELEMENT_KIND_TO_ROOT_INDEX)
3718 #undef ELEMENT_KIND_TO_ROOT_INDEX 3728 #undef ELEMENT_KIND_TO_ROOT_INDEX
3719 3729
3720 default: 3730 default:
3721 UNREACHABLE(); 3731 UNREACHABLE();
3722 return kUndefinedValueRootIndex; 3732 return kUndefinedValueRootIndex;
3723 } 3733 }
3724 } 3734 }
3725 3735
3726 3736
3737 Heap::RootListIndex Heap::RootIndexForEmptyFixedTypedArray(
3738 ElementsKind elementsKind) {
3739 switch (elementsKind) {
3740 #define ELEMENT_KIND_TO_ROOT_INDEX(Type, type, TYPE, ctype, size) \
3741 case TYPE##_ELEMENTS: \
3742 return kEmptyFixed##Type##ArrayRootIndex;
3743
3744 TYPED_ARRAYS(ELEMENT_KIND_TO_ROOT_INDEX)
3745 #undef ELEMENT_KIND_TO_ROOT_INDEX
3746 default:
3747 UNREACHABLE();
3748 return kUndefinedValueRootIndex;
3749 }
3750 }
3751
3752
3727 ExternalArray* Heap::EmptyExternalArrayForMap(Map* map) { 3753 ExternalArray* Heap::EmptyExternalArrayForMap(Map* map) {
3728 return ExternalArray::cast( 3754 return ExternalArray::cast(
3729 roots_[RootIndexForEmptyExternalArray(map->elements_kind())]); 3755 roots_[RootIndexForEmptyExternalArray(map->elements_kind())]);
3730 } 3756 }
3731 3757
3732 3758
3759 FixedTypedArrayBase* Heap::EmptyFixedTypedArrayForMap(Map* map) {
3760 return FixedTypedArrayBase::cast(
3761 roots_[RootIndexForEmptyFixedTypedArray(map->elements_kind())]);
3762 }
3763
3764
3733 MaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) { 3765 MaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) {
3734 // We need to distinguish the minus zero value and this cannot be 3766 // We need to distinguish the minus zero value and this cannot be
3735 // done after conversion to int. Doing this by comparing bit 3767 // done after conversion to int. Doing this by comparing bit
3736 // patterns is faster than using fpclassify() et al. 3768 // patterns is faster than using fpclassify() et al.
3737 if (IsMinusZero(value)) { 3769 if (IsMinusZero(value)) {
3738 return AllocateHeapNumber(-0.0, pretenure); 3770 return AllocateHeapNumber(-0.0, pretenure);
3739 } 3771 }
3740 3772
3741 int int_value = FastD2I(value); 3773 int int_value = FastD2I(value);
3742 if (value == int_value && Smi::IsValid(int_value)) { 3774 if (value == int_value && Smi::IsValid(int_value)) {
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
3993 if (!maybe_object->To(&object)) return maybe_object; 4025 if (!maybe_object->To(&object)) return maybe_object;
3994 4026
3995 if (array_type == kExternalFloat64Array) { 4027 if (array_type == kExternalFloat64Array) {
3996 object = EnsureDoubleAligned(this, object, size); 4028 object = EnsureDoubleAligned(this, object, size);
3997 } 4029 }
3998 4030
3999 FixedTypedArrayBase* elements = 4031 FixedTypedArrayBase* elements =
4000 reinterpret_cast<FixedTypedArrayBase*>(object); 4032 reinterpret_cast<FixedTypedArrayBase*>(object);
4001 elements->set_map(MapForFixedTypedArray(array_type)); 4033 elements->set_map(MapForFixedTypedArray(array_type));
4002 elements->set_length(length); 4034 elements->set_length(length);
4035 memset(elements->DataPtr(), 0, elements->DataSize());
4003 return elements; 4036 return elements;
4004 } 4037 }
4005 4038
4006 4039
4007 MaybeObject* Heap::CreateCode(const CodeDesc& desc, 4040 MaybeObject* Heap::CreateCode(const CodeDesc& desc,
4008 Code::Flags flags, 4041 Code::Flags flags,
4009 Handle<Object> self_reference, 4042 Handle<Object> self_reference,
4010 bool immovable, 4043 bool immovable,
4011 bool crankshafted, 4044 bool crankshafted,
4012 int prologue_offset) { 4045 int prologue_offset) {
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
4369 // Allocate the JSObject. 4402 // Allocate the JSObject.
4370 int size = map->instance_size(); 4403 int size = map->instance_size();
4371 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure); 4404 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure);
4372 Object* obj; 4405 Object* obj;
4373 MaybeObject* maybe_obj = Allocate(map, space); 4406 MaybeObject* maybe_obj = Allocate(map, space);
4374 if (!maybe_obj->To(&obj)) return maybe_obj; 4407 if (!maybe_obj->To(&obj)) return maybe_obj;
4375 4408
4376 // Initialize the JSObject. 4409 // Initialize the JSObject.
4377 InitializeJSObjectFromMap(JSObject::cast(obj), properties, map); 4410 InitializeJSObjectFromMap(JSObject::cast(obj), properties, map);
4378 ASSERT(JSObject::cast(obj)->HasFastElements() || 4411 ASSERT(JSObject::cast(obj)->HasFastElements() ||
4379 JSObject::cast(obj)->HasExternalArrayElements()); 4412 JSObject::cast(obj)->HasExternalArrayElements() ||
4413 JSObject::cast(obj)->HasFixedTypedArrayElements());
4380 return obj; 4414 return obj;
4381 } 4415 }
4382 4416
4383 4417
4384 MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite( 4418 MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite(
4385 Map* map, Handle<AllocationSite> allocation_site) { 4419 Map* map, Handle<AllocationSite> allocation_site) {
4386 // JSFunctions should be allocated using AllocateFunction to be 4420 // JSFunctions should be allocated using AllocateFunction to be
4387 // properly initialized. 4421 // properly initialized.
4388 ASSERT(map->instance_type() != JS_FUNCTION_TYPE); 4422 ASSERT(map->instance_type() != JS_FUNCTION_TYPE);
4389 4423
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after
5076 reinterpret_cast<FixedArray*>(result)->set_length(0); 5110 reinterpret_cast<FixedArray*>(result)->set_length(0);
5077 return result; 5111 return result;
5078 } 5112 }
5079 5113
5080 5114
5081 MaybeObject* Heap::AllocateEmptyExternalArray(ExternalArrayType array_type) { 5115 MaybeObject* Heap::AllocateEmptyExternalArray(ExternalArrayType array_type) {
5082 return AllocateExternalArray(0, array_type, NULL, TENURED); 5116 return AllocateExternalArray(0, array_type, NULL, TENURED);
5083 } 5117 }
5084 5118
5085 5119
5120 MaybeObject* Heap::AllocateEmptyFixedTypedArray(ExternalArrayType array_type) {
5121 return AllocateFixedTypedArray(0, array_type, TENURED);
5122 }
5123
5124
5086 MaybeObject* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) { 5125 MaybeObject* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) {
5087 int len = src->length(); 5126 int len = src->length();
5088 Object* obj; 5127 Object* obj;
5089 { MaybeObject* maybe_obj = AllocateRawFixedArray(len, NOT_TENURED); 5128 { MaybeObject* maybe_obj = AllocateRawFixedArray(len, NOT_TENURED);
5090 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 5129 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
5091 } 5130 }
5092 if (InNewSpace(obj)) { 5131 if (InNewSpace(obj)) {
5093 HeapObject* dst = HeapObject::cast(obj); 5132 HeapObject* dst = HeapObject::cast(obj);
5094 dst->set_map_no_write_barrier(map); 5133 dst->set_map_no_write_barrier(map);
5095 CopyBlock(dst->address() + kPointerSize, 5134 CopyBlock(dst->address() + kPointerSize,
(...skipping 2647 matching lines...) Expand 10 before | Expand all | Expand 10 after
7743 static_cast<int>(object_sizes_last_time_[index])); 7782 static_cast<int>(object_sizes_last_time_[index]));
7744 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 7783 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
7745 #undef ADJUST_LAST_TIME_OBJECT_COUNT 7784 #undef ADJUST_LAST_TIME_OBJECT_COUNT
7746 7785
7747 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 7786 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
7748 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 7787 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
7749 ClearObjectStats(); 7788 ClearObjectStats();
7750 } 7789 }
7751 7790
7752 } } // namespace v8::internal 7791 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698