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

Side by Side Diff: src/objects.cc

Issue 9663002: Use CopyElements for SetFastDoubleElementsCapacityAndLength (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix bugs Created 8 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 8469 matching lines...) Expand 10 before | Expand all | Expand 10 after
8480 ((set_capacity_mode == kAllowSmiOnlyElements) && 8480 ((set_capacity_mode == kAllowSmiOnlyElements) &&
8481 (elements()->map()->has_fast_smi_only_elements() || 8481 (elements()->map()->has_fast_smi_only_elements() ||
8482 elements() == heap->empty_fixed_array())); 8482 elements() == heap->empty_fixed_array()));
8483 ElementsKind elements_kind = has_fast_smi_only_elements 8483 ElementsKind elements_kind = has_fast_smi_only_elements
8484 ? FAST_SMI_ONLY_ELEMENTS 8484 ? FAST_SMI_ONLY_ELEMENTS
8485 : FAST_ELEMENTS; 8485 : FAST_ELEMENTS;
8486 MaybeObject* maybe = GetElementsTransitionMap(GetIsolate(), elements_kind); 8486 MaybeObject* maybe = GetElementsTransitionMap(GetIsolate(), elements_kind);
8487 if (!maybe->To(&new_map)) return maybe; 8487 if (!maybe->To(&new_map)) return maybe;
8488 } 8488 }
8489 8489
8490 FixedArrayBase* old_elements_raw = elements(); 8490 FixedArrayBase* old_elements = elements();
8491 ElementsKind elements_kind = GetElementsKind(); 8491 ElementsKind elements_kind = GetElementsKind();
8492 ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind); 8492 ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind);
8493 ElementsKind to_kind = (elements_kind == FAST_SMI_ONLY_ELEMENTS) 8493 ElementsKind to_kind = (elements_kind == FAST_SMI_ONLY_ELEMENTS)
8494 ? FAST_SMI_ONLY_ELEMENTS 8494 ? FAST_SMI_ONLY_ELEMENTS
8495 : FAST_ELEMENTS; 8495 : FAST_ELEMENTS;
8496 // int copy_size = Min(old_elements_raw->length(), new_elements->length()); 8496 // int copy_size = Min(old_elements_raw->length(), new_elements->length());
8497 accessor->CopyElements(this, new_elements, to_kind); 8497 accessor->CopyElements(this, new_elements, to_kind, SKIP_WRITE_BARRIER);
8498 if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) { 8498 if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) {
8499 set_map_and_elements(new_map, new_elements); 8499 set_map_and_elements(new_map, new_elements);
8500 } else { 8500 } else {
8501 FixedArray* parameter_map = FixedArray::cast(old_elements_raw); 8501 FixedArray* parameter_map = FixedArray::cast(old_elements);
8502 parameter_map->set(1, new_elements); 8502 parameter_map->set(1, new_elements);
8503 } 8503 }
8504 8504
8505 if (FLAG_trace_elements_transitions) { 8505 if (FLAG_trace_elements_transitions) {
8506 PrintElementsTransition(stdout, elements_kind, old_elements_raw, 8506 PrintElementsTransition(stdout, elements_kind, old_elements,
8507 GetElementsKind(), new_elements); 8507 GetElementsKind(), new_elements);
8508 } 8508 }
8509 8509
8510 // Update the length if necessary. 8510 // Update the length if necessary.
8511 if (IsJSArray()) { 8511 if (IsJSArray()) {
8512 JSArray::cast(this)->set_length(Smi::FromInt(length)); 8512 JSArray::cast(this)->set_length(Smi::FromInt(length));
8513 } 8513 }
8514 8514
8515 return new_elements; 8515 return new_elements;
8516 } 8516 }
(...skipping 12 matching lines...) Expand all
8529 if (!maybe_obj->To(&elems)) return maybe_obj; 8529 if (!maybe_obj->To(&elems)) return maybe_obj;
8530 } 8530 }
8531 8531
8532 Map* new_map; 8532 Map* new_map;
8533 { MaybeObject* maybe_obj = 8533 { MaybeObject* maybe_obj =
8534 GetElementsTransitionMap(heap->isolate(), FAST_DOUBLE_ELEMENTS); 8534 GetElementsTransitionMap(heap->isolate(), FAST_DOUBLE_ELEMENTS);
8535 if (!maybe_obj->To(&new_map)) return maybe_obj; 8535 if (!maybe_obj->To(&new_map)) return maybe_obj;
8536 } 8536 }
8537 8537
8538 FixedArrayBase* old_elements = elements(); 8538 FixedArrayBase* old_elements = elements();
8539 ElementsKind elements_kind(GetElementsKind()); 8539 ElementsKind elements_kind = GetElementsKind();
8540 AssertNoAllocation no_gc; 8540 ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind);
8541 if (old_elements->length() != 0) { 8541 accessor->CopyElements(this, elems, FAST_DOUBLE_ELEMENTS,
8542 switch (elements_kind) { 8542 SKIP_WRITE_BARRIER);
8543 case FAST_SMI_ONLY_ELEMENTS: 8543 if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) {
Jakob Kummerow 2012/03/12 15:33:28 I don't think this if/else block makes sense. Can
danno 2012/03/12 20:35:03 I think it's theoretically possible, it least it m
8544 case FAST_ELEMENTS: { 8544 set_map_and_elements(new_map, elems);
8545 elems->Initialize(FixedArray::cast(old_elements)); 8545 } else {
8546 break; 8546 FixedArray* parameter_map = FixedArray::cast(old_elements);
8547 } 8547 parameter_map->set(1, elems);
8548 case FAST_DOUBLE_ELEMENTS: {
8549 elems->Initialize(FixedDoubleArray::cast(old_elements));
8550 break;
8551 }
8552 case DICTIONARY_ELEMENTS: {
8553 elems->Initialize(SeededNumberDictionary::cast(old_elements));
8554 break;
8555 }
8556 default:
8557 UNREACHABLE();
8558 break;
8559 }
8560 } 8548 }
8561 8549
8562 if (FLAG_trace_elements_transitions) { 8550 if (FLAG_trace_elements_transitions) {
8563 PrintElementsTransition(stdout, elements_kind, old_elements, 8551 PrintElementsTransition(stdout, elements_kind, old_elements,
8564 FAST_DOUBLE_ELEMENTS, elems); 8552 FAST_DOUBLE_ELEMENTS, elems);
8565 } 8553 }
8566 8554
8567 ASSERT(new_map->has_fast_double_elements()); 8555 ASSERT(new_map->has_fast_double_elements());
8568 set_map(new_map); 8556 set_map(new_map);
8569 ASSERT(elems->IsFixedDoubleArray()); 8557 ASSERT(elems->IsFixedDoubleArray());
(...skipping 4425 matching lines...) Expand 10 before | Expand all | Expand 10 after
12995 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 12983 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
12996 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 12984 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
12997 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 12985 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
12998 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 12986 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
12999 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 12987 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13000 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 12988 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13001 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 12989 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13002 } 12990 }
13003 12991
13004 } } // namespace v8::internal 12992 } } // namespace v8::internal
OLDNEW
« src/elements.cc ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698