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

Side by Side Diff: src/elements.cc

Issue 8820014: Support Smi->Double->HeapObject transitions in constructed Arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 9 years 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/elements.h ('k') | src/factory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 Object* length) { 127 Object* length) {
128 ASSERT(obj->IsJSArray()); 128 ASSERT(obj->IsJSArray());
129 return ElementsAccessorSubclass::SetLength( 129 return ElementsAccessorSubclass::SetLength(
130 BackingStoreClass::cast(obj->elements()), obj, length); 130 BackingStoreClass::cast(obj->elements()), obj, length);
131 } 131 }
132 132
133 static MaybeObject* SetLength(BackingStoreClass* backing_store, 133 static MaybeObject* SetLength(BackingStoreClass* backing_store,
134 JSObject* obj, 134 JSObject* obj,
135 Object* length); 135 Object* length);
136 136
137 virtual MaybeObject* SetCapacityAndLength(JSArray* array,
138 int capacity,
139 int length) {
140 return ElementsAccessorSubclass::SetFastElementsCapacityAndLength(
141 array,
142 capacity,
143 length);
144 }
145
146 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj,
147 int capacity,
148 int length) {
149 UNIMPLEMENTED();
150 return obj;
151 }
152
137 virtual MaybeObject* Delete(JSObject* obj, 153 virtual MaybeObject* Delete(JSObject* obj,
138 uint32_t key, 154 uint32_t key,
139 JSReceiver::DeleteMode mode) = 0; 155 JSReceiver::DeleteMode mode) = 0;
140 156
141 virtual MaybeObject* AddElementsToFixedArray(FixedArrayBase* from, 157 virtual MaybeObject* AddElementsToFixedArray(FixedArrayBase* from,
142 FixedArray* to, 158 FixedArray* to,
143 JSObject* holder, 159 JSObject* holder,
144 Object* receiver) { 160 Object* receiver) {
145 int len0 = to->length(); 161 int len0 = to->length();
146 #ifdef DEBUG 162 #ifdef DEBUG
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 } 385 }
370 if (4 * num_used <= backing_store->length()) { 386 if (4 * num_used <= backing_store->length()) {
371 MaybeObject* result = obj->NormalizeElements(); 387 MaybeObject* result = obj->NormalizeElements();
372 if (result->IsFailure()) return result; 388 if (result->IsFailure()) return result;
373 } 389 }
374 } 390 }
375 } 391 }
376 return heap->true_value(); 392 return heap->true_value();
377 } 393 }
378 394
379 protected:
380 friend class FastElementsAccessor<FastObjectElementsAccessor,
381 FixedArray,
382 kPointerSize>;
383
384 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj, 395 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj,
385 uint32_t capacity, 396 uint32_t capacity,
386 uint32_t length) { 397 uint32_t length) {
387 JSObject::SetFastElementsCapacityMode set_capacity_mode = 398 JSObject::SetFastElementsCapacityMode set_capacity_mode =
388 obj->HasFastSmiOnlyElements() 399 obj->HasFastSmiOnlyElements()
389 ? JSObject::kAllowSmiOnlyElements 400 ? JSObject::kAllowSmiOnlyElements
390 : JSObject::kDontAllowSmiOnlyElements; 401 : JSObject::kDontAllowSmiOnlyElements;
391 return obj->SetFastElementsCapacityAndLength(capacity, 402 return obj->SetFastElementsCapacityAndLength(capacity,
392 length, 403 length,
393 set_capacity_mode); 404 set_capacity_mode);
394 } 405 }
395 406
407 protected:
408 friend class FastElementsAccessor<FastObjectElementsAccessor,
409 FixedArray,
410 kPointerSize>;
411
396 virtual MaybeObject* Delete(JSObject* obj, 412 virtual MaybeObject* Delete(JSObject* obj,
397 uint32_t key, 413 uint32_t key,
398 JSReceiver::DeleteMode mode) { 414 JSReceiver::DeleteMode mode) {
399 return DeleteCommon(obj, key); 415 return DeleteCommon(obj, key);
400 } 416 }
401 }; 417 };
402 418
403 419
404 class FastDoubleElementsAccessor 420 class FastDoubleElementsAccessor
405 : public FastElementsAccessor<FastDoubleElementsAccessor, 421 : public FastElementsAccessor<FastDoubleElementsAccessor,
406 FixedDoubleArray, 422 FixedDoubleArray,
407 kDoubleSize> { 423 kDoubleSize> {
424 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj,
425 uint32_t capacity,
426 uint32_t length) {
427 return obj->SetFastDoubleElementsCapacityAndLength(capacity, length);
428 }
429
408 protected: 430 protected:
409 friend class ElementsAccessorBase<FastDoubleElementsAccessor, 431 friend class ElementsAccessorBase<FastDoubleElementsAccessor,
410 FixedDoubleArray>; 432 FixedDoubleArray>;
411 friend class FastElementsAccessor<FastDoubleElementsAccessor, 433 friend class FastElementsAccessor<FastDoubleElementsAccessor,
412 FixedDoubleArray, 434 FixedDoubleArray,
413 kDoubleSize>; 435 kDoubleSize>;
414 436
415 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj,
416 uint32_t capacity,
417 uint32_t length) {
418 return obj->SetFastDoubleElementsCapacityAndLength(capacity, length);
419 }
420
421 virtual MaybeObject* Delete(JSObject* obj, 437 virtual MaybeObject* Delete(JSObject* obj,
422 uint32_t key, 438 uint32_t key,
423 JSReceiver::DeleteMode mode) { 439 JSReceiver::DeleteMode mode) {
424 int length = obj->IsJSArray() 440 int length = obj->IsJSArray()
425 ? Smi::cast(JSArray::cast(obj)->length())->value() 441 ? Smi::cast(JSArray::cast(obj)->length())->value()
426 : FixedDoubleArray::cast(obj->elements())->length(); 442 : FixedDoubleArray::cast(obj->elements())->length();
427 if (key < static_cast<uint32_t>(length)) { 443 if (key < static_cast<uint32_t>(length)) {
428 FixedDoubleArray::cast(obj->elements())->set_the_hole(key); 444 FixedDoubleArray::cast(obj->elements())->set_the_hole(key);
429 } 445 }
430 return obj->GetHeap()->true_value(); 446 return obj->GetHeap()->true_value();
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 FixedArray* new_backing_store; 915 FixedArray* new_backing_store;
900 MaybeObject* maybe_obj = array->GetHeap()->AllocateFixedArray(1); 916 MaybeObject* maybe_obj = array->GetHeap()->AllocateFixedArray(1);
901 if (!maybe_obj->To(&new_backing_store)) return maybe_obj; 917 if (!maybe_obj->To(&new_backing_store)) return maybe_obj;
902 new_backing_store->set(0, length); 918 new_backing_store->set(0, length);
903 array->SetContent(new_backing_store); 919 array->SetContent(new_backing_store);
904 return array; 920 return array;
905 } 921 }
906 922
907 923
908 } } // namespace v8::internal 924 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/elements.h ('k') | src/factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698