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

Side by Side Diff: src/objects.cc

Issue 10412030: Merging ContentArray into DescriptorArray (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix unused variable in release mode Created 8 years, 7 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 4871 matching lines...) Expand 10 before | Expand all | Expand 10 after
4882 4882
4883 // An iterator over all map transitions in an descriptor array, reusing the map 4883 // An iterator over all map transitions in an descriptor array, reusing the map
4884 // field of the contens array while it is running. 4884 // field of the contens array while it is running.
4885 class IntrusiveMapTransitionIterator { 4885 class IntrusiveMapTransitionIterator {
4886 public: 4886 public:
4887 explicit IntrusiveMapTransitionIterator(DescriptorArray* descriptor_array) 4887 explicit IntrusiveMapTransitionIterator(DescriptorArray* descriptor_array)
4888 : descriptor_array_(descriptor_array) { } 4888 : descriptor_array_(descriptor_array) { }
4889 4889
4890 void Start() { 4890 void Start() {
4891 ASSERT(!IsIterating()); 4891 ASSERT(!IsIterating());
4892 if (HasContentArray()) *ContentHeader() = Smi::FromInt(0); 4892 if (HasDescriptors()) *DescriptorArrayHeader() = Smi::FromInt(0);
4893 } 4893 }
4894 4894
4895 bool IsIterating() { 4895 bool IsIterating() {
4896 return HasContentArray() && (*ContentHeader())->IsSmi(); 4896 return HasDescriptors() && (*DescriptorArrayHeader())->IsSmi();
4897 } 4897 }
4898 4898
4899 Map* Next() { 4899 Map* Next() {
4900 ASSERT(IsIterating()); 4900 ASSERT(IsIterating());
4901 FixedArray* contents = ContentArray(); 4901 // Attention, tricky index manipulation ahead: Two two consecutive indices
4902 // Attention, tricky index manipulation ahead: Every entry in the contents 4902 // are assigned to each descriptor. Most descriptors directly advance to the
4903 // array consists of a value/details pair, so the index is typically even. 4903 // next descriptor by adding 2 to the index. The exceptions are the
4904 // An exception is made for CALLBACKS entries: An even index means we look 4904 // CALLBACKS entries: An even index means we look at its getter, and an odd
4905 // at its getter, and an odd index means we look at its setter. 4905 // index means we look at its setter.
4906 int index = Smi::cast(*ContentHeader())->value(); 4906 int index = Smi::cast(*DescriptorArrayHeader())->value();
4907 while (index < contents->length()) { 4907 while ((index / 2) < descriptor_array_->number_of_descriptors()) {
4908 PropertyDetails details(Smi::cast(contents->get(index | 1))); 4908 PropertyDetails details(descriptor_array_->GetDetails(index / 2));
4909 switch (details.type()) { 4909 switch (details.type()) {
4910 case MAP_TRANSITION: 4910 case MAP_TRANSITION:
4911 case CONSTANT_TRANSITION: 4911 case CONSTANT_TRANSITION:
4912 case ELEMENTS_TRANSITION: 4912 case ELEMENTS_TRANSITION:
4913 // We definitely have a map transition. 4913 // We definitely have a map transition.
4914 *ContentHeader() = Smi::FromInt(index + 2); 4914 *DescriptorArrayHeader() = Smi::FromInt(index + 2);
4915 return static_cast<Map*>(contents->get(index)); 4915 return static_cast<Map*>(descriptor_array_->GetValue(index / 2));
4916 case CALLBACKS: { 4916 case CALLBACKS: {
4917 // We might have a map transition in a getter or in a setter. 4917 // We might have a map transition in a getter or in a setter.
4918 AccessorPair* accessors = 4918 AccessorPair* accessors =
4919 static_cast<AccessorPair*>(contents->get(index & ~1)); 4919 static_cast<AccessorPair*>(descriptor_array_->GetValue(index / 2)) ;
Florian Schneider 2012/05/22 16:53:09 Long line.
4920 Object* accessor = 4920 Object* accessor =
4921 ((index & 1) == 0) ? accessors->getter() : accessors->setter(); 4921 ((index & 1) == 0) ? accessors->getter() : accessors->setter();
4922 index++; 4922 index++;
4923 if (accessor->IsMap()) { 4923 if (accessor->IsMap()) {
4924 *ContentHeader() = Smi::FromInt(index); 4924 *DescriptorArrayHeader() = Smi::FromInt(index);
4925 return static_cast<Map*>(accessor); 4925 return static_cast<Map*>(accessor);
4926 } 4926 }
4927 break; 4927 break;
4928 } 4928 }
4929 case NORMAL: 4929 case NORMAL:
4930 case FIELD: 4930 case FIELD:
4931 case CONSTANT_FUNCTION: 4931 case CONSTANT_FUNCTION:
4932 case HANDLER: 4932 case HANDLER:
4933 case INTERCEPTOR: 4933 case INTERCEPTOR:
4934 case NULL_DESCRIPTOR: 4934 case NULL_DESCRIPTOR:
4935 // We definitely have no map transition. 4935 // We definitely have no map transition.
4936 index += 2; 4936 index += 2;
4937 break; 4937 break;
4938 } 4938 }
4939 } 4939 }
4940 *ContentHeader() = descriptor_array_->GetHeap()->fixed_array_map(); 4940 *DescriptorArrayHeader() = descriptor_array_->GetHeap()->fixed_array_map();
4941 return NULL; 4941 return NULL;
4942 } 4942 }
4943 4943
4944 private: 4944 private:
4945 bool HasContentArray() { 4945 bool HasDescriptors() {
4946 return descriptor_array_-> length() > DescriptorArray::kContentArrayIndex; 4946 return !descriptor_array_->IsEmpty();
4947 } 4947 }
4948 4948
4949 FixedArray* ContentArray() { 4949 Object** DescriptorArrayHeader() {
4950 Object* array = descriptor_array_->get(DescriptorArray::kContentArrayIndex); 4950 return HeapObject::RawField(descriptor_array_, DescriptorArray::kMapOffset);
4951 return static_cast<FixedArray*>(array);
4952 }
4953
4954 Object** ContentHeader() {
4955 return HeapObject::RawField(ContentArray(), DescriptorArray::kMapOffset);
4956 } 4951 }
4957 4952
4958 DescriptorArray* descriptor_array_; 4953 DescriptorArray* descriptor_array_;
4959 }; 4954 };
4960 4955
4961 4956
4962 // An iterator over all prototype transitions, reusing the map field of the 4957 // An iterator over all prototype transitions, reusing the map field of the
4963 // underlying array while it is running. 4958 // underlying array while it is running.
4964 class IntrusivePrototypeTransitionIterator { 4959 class IntrusivePrototypeTransitionIterator {
4965 public: 4960 public:
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
5046 // this map's map! 5041 // this map's map!
5047 void SetParent(TraversableMap* parent) { set_map_no_write_barrier(parent); } 5042 void SetParent(TraversableMap* parent) { set_map_no_write_barrier(parent); }
5048 5043
5049 // Reset the current map's map, returning the parent previously stored in it. 5044 // Reset the current map's map, returning the parent previously stored in it.
5050 TraversableMap* GetAndResetParent() { 5045 TraversableMap* GetAndResetParent() {
5051 TraversableMap* old_parent = static_cast<TraversableMap*>(map()); 5046 TraversableMap* old_parent = static_cast<TraversableMap*>(map());
5052 set_map_no_write_barrier(GetHeap()->meta_map()); 5047 set_map_no_write_barrier(GetHeap()->meta_map());
5053 return old_parent; 5048 return old_parent;
5054 } 5049 }
5055 5050
5051 // Can either be Smi (no instance descriptors), or a descriptor array with the
5052 // header overwritten as a Smi (thus iterating).
5053 DescriptorArray* MutatedInstanceDescriptors() {
5054 Object* object = *HeapObject::RawField(this, kInstanceDescriptorsOrBitField3 Offset);
Florian Schneider 2012/05/22 16:53:09 Long line.
5055 if (object->IsSmi()) {
5056 return GetHeap()->empty_descriptor_array();
5057 } else {
5058 DescriptorArray* descriptor_array = static_cast<DescriptorArray*>(object);
5059 ASSERT((*HeapObject::RawField(descriptor_array,
5060 DescriptorArray::kMapOffset))->IsSmi());
5061 return descriptor_array;
5062 }
5063 }
5064
5056 // Start iterating over this map's children, possibly destroying a FixedArray 5065 // Start iterating over this map's children, possibly destroying a FixedArray
5057 // map (see explanation above). 5066 // map (see explanation above).
5058 void ChildIteratorStart() { 5067 void ChildIteratorStart() {
5059 IntrusiveMapTransitionIterator(instance_descriptors()).Start(); 5068 IntrusiveMapTransitionIterator(instance_descriptors()).Start();
5060 IntrusivePrototypeTransitionIterator( 5069 IntrusivePrototypeTransitionIterator(
5061 unchecked_prototype_transitions()).Start(); 5070 unchecked_prototype_transitions()).Start();
5062 } 5071 }
5063 5072
5064 // If we have an unvisited child map, return that one and advance. If we have 5073 // If we have an unvisited child map, return that one and advance. If we have
5065 // none, return NULL and reset any destroyed FixedArray maps. 5074 // none, return NULL and reset any destroyed FixedArray maps.
5066 TraversableMap* ChildIteratorNext() { 5075 TraversableMap* ChildIteratorNext() {
5067 IntrusiveMapTransitionIterator descriptor_iterator(instance_descriptors());
5068 if (descriptor_iterator.IsIterating()) {
5069 Map* next = descriptor_iterator.Next();
5070 if (next != NULL) return static_cast<TraversableMap*>(next);
5071 }
5072 IntrusivePrototypeTransitionIterator 5076 IntrusivePrototypeTransitionIterator
5073 proto_iterator(unchecked_prototype_transitions()); 5077 proto_iterator(unchecked_prototype_transitions());
5074 if (proto_iterator.IsIterating()) { 5078 if (proto_iterator.IsIterating()) {
5075 Map* next = proto_iterator.Next(); 5079 Map* next = proto_iterator.Next();
5076 if (next != NULL) return static_cast<TraversableMap*>(next); 5080 if (next != NULL) return static_cast<TraversableMap*>(next);
5077 } 5081 }
5082 IntrusiveMapTransitionIterator descriptor_iterator(MutatedInstanceDescriptor s());
Florian Schneider 2012/05/22 16:53:09 Long line.
5083 if (descriptor_iterator.IsIterating()) {
5084 Map* next = descriptor_iterator.Next();
5085 if (next != NULL) return static_cast<TraversableMap*>(next);
5086 }
5078 return NULL; 5087 return NULL;
5079 } 5088 }
5080 }; 5089 };
5081 5090
5082 5091
5083 // Traverse the transition tree in postorder without using the C++ stack by 5092 // Traverse the transition tree in postorder without using the C++ stack by
5084 // doing pointer reversal. 5093 // doing pointer reversal.
5085 void Map::TraverseTransitionTree(TraverseCallback callback, void* data) { 5094 void Map::TraverseTransitionTree(TraverseCallback callback, void* data) {
5086 TraversableMap* current = static_cast<TraversableMap*>(this); 5095 TraversableMap* current = static_cast<TraversableMap*>(this);
5087 current->ChildIteratorStart(); 5096 current->ChildIteratorStart();
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
5631 } 5640 }
5632 // Allocate the array of keys. 5641 // Allocate the array of keys.
5633 Object* array; 5642 Object* array;
5634 { MaybeObject* maybe_array = 5643 { MaybeObject* maybe_array =
5635 heap->AllocateFixedArray(ToKeyIndex(number_of_descriptors)); 5644 heap->AllocateFixedArray(ToKeyIndex(number_of_descriptors));
5636 if (!maybe_array->ToObject(&array)) return maybe_array; 5645 if (!maybe_array->ToObject(&array)) return maybe_array;
5637 } 5646 }
5638 // Do not use DescriptorArray::cast on incomplete object. 5647 // Do not use DescriptorArray::cast on incomplete object.
5639 FixedArray* result = FixedArray::cast(array); 5648 FixedArray* result = FixedArray::cast(array);
5640 5649
5641 // Allocate the content array and set it in the descriptor array.
5642 { MaybeObject* maybe_array =
5643 heap->AllocateFixedArray(number_of_descriptors << 1);
5644 if (!maybe_array->ToObject(&array)) return maybe_array;
5645 }
5646 result->set(kBitField3StorageIndex, Smi::FromInt(0)); 5650 result->set(kBitField3StorageIndex, Smi::FromInt(0));
5647 result->set(kContentArrayIndex, array);
5648 result->set(kEnumerationIndexIndex, 5651 result->set(kEnumerationIndexIndex,
5649 Smi::FromInt(PropertyDetails::kInitialIndex)); 5652 Smi::FromInt(PropertyDetails::kInitialIndex));
5650 return result; 5653 return result;
5651 } 5654 }
5652 5655
5653 5656
5654 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, 5657 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage,
5655 FixedArray* new_cache, 5658 FixedArray* new_cache,
5656 Object* new_index_cache) { 5659 Object* new_index_cache) {
5657 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength); 5660 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength);
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
5822 MaybeObject* copy_result = 5825 MaybeObject* copy_result =
5823 new_descriptors->CopyFrom(next_descriptor++, this, i, witness); 5826 new_descriptors->CopyFrom(next_descriptor++, this, i, witness);
5824 if (copy_result->IsFailure()) return copy_result; 5827 if (copy_result->IsFailure()) return copy_result;
5825 } 5828 }
5826 } 5829 }
5827 ASSERT(next_descriptor == new_descriptors->number_of_descriptors()); 5830 ASSERT(next_descriptor == new_descriptors->number_of_descriptors());
5828 5831
5829 return new_descriptors; 5832 return new_descriptors;
5830 } 5833 }
5831 5834
5832 5835 // The whiteness witness is needed since sort will reshuffle the entries in the
5836 // descriptor array. If the descriptor array were to be gray, the sort would
5837 // potentially swap a black and a white member. This would result in
5838 // accidentally reclaiming the white member if the descriptor array owned the
5839 // unique pointer.
5833 void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) { 5840 void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) {
5834 // In-place heap sort. 5841 // In-place heap sort.
5835 int len = number_of_descriptors(); 5842 int len = number_of_descriptors();
5836 5843
5837 // Bottom-up max-heap construction. 5844 // Bottom-up max-heap construction.
5838 // Index of the last node with children 5845 // Index of the last node with children
5839 const int max_parent_index = (len / 2) - 1; 5846 const int max_parent_index = (len / 2) - 1;
5840 for (int i = max_parent_index; i >= 0; --i) { 5847 for (int i = max_parent_index; i >= 0; --i) {
5841 int parent_index = i; 5848 int parent_index = i;
5842 const uint32_t parent_hash = GetKey(i)->Hash(); 5849 const uint32_t parent_hash = GetKey(i)->Hash();
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
5967 pretenure); 5974 pretenure);
5968 } 5975 }
5969 5976
5970 5977
5971 #ifdef DEBUG 5978 #ifdef DEBUG
5972 bool DescriptorArray::IsEqualTo(DescriptorArray* other) { 5979 bool DescriptorArray::IsEqualTo(DescriptorArray* other) {
5973 if (IsEmpty()) return other->IsEmpty(); 5980 if (IsEmpty()) return other->IsEmpty();
5974 if (other->IsEmpty()) return false; 5981 if (other->IsEmpty()) return false;
5975 if (length() != other->length()) return false; 5982 if (length() != other->length()) return false;
5976 for (int i = 0; i < length(); ++i) { 5983 for (int i = 0; i < length(); ++i) {
5977 if (get(i) != other->get(i) && i != kContentArrayIndex) return false; 5984 if (get(i) != other->get(i)) return false;
5978 } 5985 }
5979 return GetContentArray()->IsEqualTo(other->GetContentArray()); 5986 return true;
5980 } 5987 }
5981 #endif 5988 #endif
5982 5989
5983 5990
5984 bool String::LooksValid() { 5991 bool String::LooksValid() {
5985 if (!Isolate::Current()->heap()->Contains(this)) return false; 5992 if (!Isolate::Current()->heap()->Contains(this)) return false;
5986 return true; 5993 return true;
5987 } 5994 }
5988 5995
5989 5996
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after
7191 } 7198 }
7192 } 7199 }
7193 7200
7194 7201
7195 void Map::ClearNonLiveTransitions(Heap* heap) { 7202 void Map::ClearNonLiveTransitions(Heap* heap) {
7196 DescriptorArray* d = DescriptorArray::cast( 7203 DescriptorArray* d = DescriptorArray::cast(
7197 *RawField(this, Map::kInstanceDescriptorsOrBitField3Offset)); 7204 *RawField(this, Map::kInstanceDescriptorsOrBitField3Offset));
7198 if (d->IsEmpty()) return; 7205 if (d->IsEmpty()) return;
7199 Smi* NullDescriptorDetails = 7206 Smi* NullDescriptorDetails =
7200 PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi(); 7207 PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi();
7201 FixedArray* contents = FixedArray::cast( 7208 for (int i = 0; i < d->number_of_descriptors(); ++i) {
7202 d->get(DescriptorArray::kContentArrayIndex));
7203 ASSERT(contents->length() >= 2);
7204 for (int i = 0; i < contents->length(); i += 2) {
7205 // If the pair (value, details) is a map transition, check if the target is 7209 // If the pair (value, details) is a map transition, check if the target is
7206 // live. If not, null the descriptor. Also drop the back pointer for that 7210 // live. If not, null the descriptor. Also drop the back pointer for that
7207 // map transition, so that this map is not reached again by following a back 7211 // map transition, so that this map is not reached again by following a back
7208 // pointer from that non-live map. 7212 // pointer from that non-live map.
7209 bool keep_entry = false; 7213 bool keep_entry = false;
7210 PropertyDetails details(Smi::cast(contents->get(i + 1))); 7214 PropertyDetails details(d->GetDetails(i));
7211 switch (details.type()) { 7215 switch (details.type()) {
7212 case MAP_TRANSITION: 7216 case MAP_TRANSITION:
7213 case CONSTANT_TRANSITION: 7217 case CONSTANT_TRANSITION:
7214 ClearBackPointer(heap, contents->get(i), &keep_entry); 7218 ClearBackPointer(heap, d->GetValue(i), &keep_entry);
7215 break; 7219 break;
7216 case ELEMENTS_TRANSITION: { 7220 case ELEMENTS_TRANSITION: {
7217 Object* object = contents->get(i); 7221 Object* object = d->GetValue(i);
7218 if (object->IsMap()) { 7222 if (object->IsMap()) {
7219 ClearBackPointer(heap, object, &keep_entry); 7223 ClearBackPointer(heap, object, &keep_entry);
7220 } else { 7224 } else {
7221 FixedArray* array = FixedArray::cast(object); 7225 FixedArray* array = FixedArray::cast(object);
7222 for (int j = 0; j < array->length(); ++j) { 7226 for (int j = 0; j < array->length(); ++j) {
7223 if (ClearBackPointer(heap, array->get(j), &keep_entry)) { 7227 if (ClearBackPointer(heap, array->get(j), &keep_entry)) {
7224 array->set_undefined(j); 7228 array->set_undefined(j);
7225 } 7229 }
7226 } 7230 }
7227 } 7231 }
7228 break; 7232 break;
7229 } 7233 }
7230 case CALLBACKS: { 7234 case CALLBACKS: {
7231 Object* object = contents->get(i); 7235 Object* object = d->GetValue(i);
7232 if (object->IsAccessorPair()) { 7236 if (object->IsAccessorPair()) {
7233 AccessorPair* accessors = AccessorPair::cast(object); 7237 AccessorPair* accessors = AccessorPair::cast(object);
7234 if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) { 7238 if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) {
7235 accessors->set_getter(heap->the_hole_value()); 7239 accessors->set_getter(heap->the_hole_value());
7236 } 7240 }
7237 if (ClearBackPointer(heap, accessors->setter(), &keep_entry)) { 7241 if (ClearBackPointer(heap, accessors->setter(), &keep_entry)) {
7238 accessors->set_setter(heap->the_hole_value()); 7242 accessors->set_setter(heap->the_hole_value());
7239 } 7243 }
7240 } else { 7244 } else {
7241 keep_entry = true; 7245 keep_entry = true;
7242 } 7246 }
7243 break; 7247 break;
7244 } 7248 }
7245 case NORMAL: 7249 case NORMAL:
7246 case FIELD: 7250 case FIELD:
7247 case CONSTANT_FUNCTION: 7251 case CONSTANT_FUNCTION:
7248 case HANDLER: 7252 case HANDLER:
7249 case INTERCEPTOR: 7253 case INTERCEPTOR:
7250 case NULL_DESCRIPTOR: 7254 case NULL_DESCRIPTOR:
7251 keep_entry = true; 7255 keep_entry = true;
7252 break; 7256 break;
7253 } 7257 }
7254 // Make sure that an entry containing only dead transitions gets collected. 7258 // Make sure that an entry containing only dead transitions gets collected.
7255 // What we *really* want to do here is removing this entry completely, but 7259 // What we *really* want to do here is removing this entry completely, but
7256 // for technical reasons we can't do this, so we zero it out instead. 7260 // for technical reasons we can't do this, so we zero it out instead.
7257 if (!keep_entry) { 7261 if (!keep_entry) {
7258 contents->set_unchecked(i + 1, NullDescriptorDetails); 7262 d->SetDetailsUnchecked(i, NullDescriptorDetails);
7259 contents->set_null_unchecked(heap, i); 7263 d->SetNullValueUnchecked(i, heap);
7260 } 7264 }
7261 } 7265 }
7262 } 7266 }
7263 7267
7264 7268
7265 int Map::Hash() { 7269 int Map::Hash() {
7266 // For performance reasons we only hash the 3 most variable fields of a map: 7270 // For performance reasons we only hash the 3 most variable fields of a map:
7267 // constructor, prototype and bit_field2. 7271 // constructor, prototype and bit_field2.
7268 7272
7269 // Shift away the tag. 7273 // Shift away the tag.
(...skipping 5661 matching lines...) Expand 10 before | Expand all | Expand 10 after
12931 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 12935 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
12932 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 12936 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
12933 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 12937 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
12934 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 12938 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
12935 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 12939 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
12936 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 12940 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
12937 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 12941 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
12938 } 12942 }
12939 12943
12940 } } // namespace v8::internal 12944 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698