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

Side by Side Diff: src/runtime.cc

Issue 7862036: Share Maps for ElementsKind transitions (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: review feedback Created 9 years, 3 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-printer.cc ('k') | src/v8-counters.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 9396 matching lines...) Expand 10 before | Expand all | Expand 10 after
9407 index_offset_ += delta; 9407 index_offset_ += delta;
9408 } 9408 }
9409 } 9409 }
9410 9410
9411 Handle<JSArray> ToArray() { 9411 Handle<JSArray> ToArray() {
9412 Handle<JSArray> array = isolate_->factory()->NewJSArray(0); 9412 Handle<JSArray> array = isolate_->factory()->NewJSArray(0);
9413 Handle<Object> length = 9413 Handle<Object> length =
9414 isolate_->factory()->NewNumber(static_cast<double>(index_offset_)); 9414 isolate_->factory()->NewNumber(static_cast<double>(index_offset_));
9415 Handle<Map> map; 9415 Handle<Map> map;
9416 if (fast_elements_) { 9416 if (fast_elements_) {
9417 map = isolate_->factory()->GetFastElementsMap(Handle<Map>(array->map())); 9417 map = isolate_->factory()->GetElementsTransitionMap(array,
9418 FAST_ELEMENTS);
9418 } else { 9419 } else {
9419 map = isolate_->factory()->GetSlowElementsMap(Handle<Map>(array->map())); 9420 map = isolate_->factory()->GetElementsTransitionMap(array,
9421 DICTIONARY_ELEMENTS);
9420 } 9422 }
9421 array->set_map(*map); 9423 array->set_map(*map);
9422 array->set_length(*length); 9424 array->set_length(*length);
9423 array->set_elements(*storage_); 9425 array->set_elements(*storage_);
9424 return array; 9426 return array;
9425 } 9427 }
9426 9428
9427 private: 9429 private:
9428 // Convert storage to dictionary mode. 9430 // Convert storage to dictionary mode.
9429 void SetDictionaryMode(uint32_t index) { 9431 void SetDictionaryMode(uint32_t index) {
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after
9900 } 9902 }
9901 9903
9902 9904
9903 // Move contents of argument 0 (an array) to argument 1 (an array) 9905 // Move contents of argument 0 (an array) to argument 1 (an array)
9904 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) { 9906 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) {
9905 ASSERT(args.length() == 2); 9907 ASSERT(args.length() == 2);
9906 CONVERT_CHECKED(JSArray, from, args[0]); 9908 CONVERT_CHECKED(JSArray, from, args[0]);
9907 CONVERT_CHECKED(JSArray, to, args[1]); 9909 CONVERT_CHECKED(JSArray, to, args[1]);
9908 FixedArrayBase* new_elements = from->elements(); 9910 FixedArrayBase* new_elements = from->elements();
9909 MaybeObject* maybe_new_map; 9911 MaybeObject* maybe_new_map;
9912 ElementsKind elements_kind;
9910 if (new_elements->map() == isolate->heap()->fixed_array_map() || 9913 if (new_elements->map() == isolate->heap()->fixed_array_map() ||
9911 new_elements->map() == isolate->heap()->fixed_cow_array_map()) { 9914 new_elements->map() == isolate->heap()->fixed_cow_array_map()) {
9912 maybe_new_map = to->map()->GetFastElementsMap(); 9915 elements_kind = FAST_ELEMENTS;
9913 } else if (new_elements->map() == 9916 } else if (new_elements->map() ==
9914 isolate->heap()->fixed_double_array_map()) { 9917 isolate->heap()->fixed_double_array_map()) {
9915 maybe_new_map = to->map()->GetFastDoubleElementsMap(); 9918 elements_kind = FAST_DOUBLE_ELEMENTS;
9916 } else { 9919 } else {
9917 maybe_new_map = to->map()->GetSlowElementsMap(); 9920 elements_kind = DICTIONARY_ELEMENTS;
9918 } 9921 }
9922 maybe_new_map = to->GetElementsTransitionMap(elements_kind);
9919 Object* new_map; 9923 Object* new_map;
9920 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; 9924 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
9921 to->set_map(Map::cast(new_map)); 9925 to->set_map(Map::cast(new_map));
9922 to->set_elements(new_elements); 9926 to->set_elements(new_elements);
9923 to->set_length(from->length()); 9927 to->set_length(from->length());
9924 Object* obj; 9928 Object* obj;
9925 { MaybeObject* maybe_obj = from->ResetElements(); 9929 { MaybeObject* maybe_obj = from->ResetElements();
9926 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 9930 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
9927 } 9931 }
9928 from->set_length(Smi::FromInt(0)); 9932 from->set_length(Smi::FromInt(0));
(...skipping 3211 matching lines...) Expand 10 before | Expand all | Expand 10 after
13140 } else { 13144 } else {
13141 // Handle last resort GC and make sure to allow future allocations 13145 // Handle last resort GC and make sure to allow future allocations
13142 // to grow the heap without causing GCs (if possible). 13146 // to grow the heap without causing GCs (if possible).
13143 isolate->counters()->gc_last_resort_from_js()->Increment(); 13147 isolate->counters()->gc_last_resort_from_js()->Increment();
13144 isolate->heap()->CollectAllGarbage(false); 13148 isolate->heap()->CollectAllGarbage(false);
13145 } 13149 }
13146 } 13150 }
13147 13151
13148 13152
13149 } } // namespace v8::internal 13153 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects-printer.cc ('k') | src/v8-counters.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698