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

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: Review feedback 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
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.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 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 8430 matching lines...) Expand 10 before | Expand all | Expand 10 after
8441 ((set_capacity_mode == kAllowSmiOnlyElements) && 8441 ((set_capacity_mode == kAllowSmiOnlyElements) &&
8442 (elements()->map()->has_fast_smi_only_elements() || 8442 (elements()->map()->has_fast_smi_only_elements() ||
8443 elements() == heap->empty_fixed_array())); 8443 elements() == heap->empty_fixed_array()));
8444 ElementsKind elements_kind = has_fast_smi_only_elements 8444 ElementsKind elements_kind = has_fast_smi_only_elements
8445 ? FAST_SMI_ONLY_ELEMENTS 8445 ? FAST_SMI_ONLY_ELEMENTS
8446 : FAST_ELEMENTS; 8446 : FAST_ELEMENTS;
8447 MaybeObject* maybe = GetElementsTransitionMap(GetIsolate(), elements_kind); 8447 MaybeObject* maybe = GetElementsTransitionMap(GetIsolate(), elements_kind);
8448 if (!maybe->To(&new_map)) return maybe; 8448 if (!maybe->To(&new_map)) return maybe;
8449 } 8449 }
8450 8450
8451 FixedArrayBase* old_elements_raw = elements(); 8451 FixedArrayBase* old_elements = elements();
8452 ElementsKind elements_kind = GetElementsKind(); 8452 ElementsKind elements_kind = GetElementsKind();
8453 ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind); 8453 ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind);
8454 ElementsKind to_kind = (elements_kind == FAST_SMI_ONLY_ELEMENTS) 8454 ElementsKind to_kind = (elements_kind == FAST_SMI_ONLY_ELEMENTS)
8455 ? FAST_SMI_ONLY_ELEMENTS 8455 ? FAST_SMI_ONLY_ELEMENTS
8456 : FAST_ELEMENTS; 8456 : FAST_ELEMENTS;
8457 // int copy_size = Min(old_elements_raw->length(), new_elements->length()); 8457 // int copy_size = Min(old_elements_raw->length(), new_elements->length());
8458 accessor->CopyElements(this, new_elements, to_kind); 8458 accessor->CopyElements(this, new_elements, to_kind, SKIP_WRITE_BARRIER);
8459 if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) { 8459 if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) {
8460 set_map_and_elements(new_map, new_elements); 8460 set_map_and_elements(new_map, new_elements);
8461 } else { 8461 } else {
8462 FixedArray* parameter_map = FixedArray::cast(old_elements_raw); 8462 FixedArray* parameter_map = FixedArray::cast(old_elements);
8463 parameter_map->set(1, new_elements); 8463 parameter_map->set(1, new_elements);
8464 } 8464 }
8465 8465
8466 if (FLAG_trace_elements_transitions) { 8466 if (FLAG_trace_elements_transitions) {
8467 PrintElementsTransition(stdout, elements_kind, old_elements_raw, 8467 PrintElementsTransition(stdout, elements_kind, old_elements,
8468 GetElementsKind(), new_elements); 8468 GetElementsKind(), new_elements);
8469 } 8469 }
8470 8470
8471 // Update the length if necessary. 8471 // Update the length if necessary.
8472 if (IsJSArray()) { 8472 if (IsJSArray()) {
8473 JSArray::cast(this)->set_length(Smi::FromInt(length)); 8473 JSArray::cast(this)->set_length(Smi::FromInt(length));
8474 } 8474 }
8475 8475
8476 return new_elements; 8476 return new_elements;
8477 } 8477 }
(...skipping 12 matching lines...) Expand all
8490 if (!maybe_obj->To(&elems)) return maybe_obj; 8490 if (!maybe_obj->To(&elems)) return maybe_obj;
8491 } 8491 }
8492 8492
8493 Map* new_map; 8493 Map* new_map;
8494 { MaybeObject* maybe_obj = 8494 { MaybeObject* maybe_obj =
8495 GetElementsTransitionMap(heap->isolate(), FAST_DOUBLE_ELEMENTS); 8495 GetElementsTransitionMap(heap->isolate(), FAST_DOUBLE_ELEMENTS);
8496 if (!maybe_obj->To(&new_map)) return maybe_obj; 8496 if (!maybe_obj->To(&new_map)) return maybe_obj;
8497 } 8497 }
8498 8498
8499 FixedArrayBase* old_elements = elements(); 8499 FixedArrayBase* old_elements = elements();
8500 ElementsKind elements_kind(GetElementsKind()); 8500 ElementsKind elements_kind = GetElementsKind();
8501 AssertNoAllocation no_gc; 8501 ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind);
8502 if (old_elements->length() != 0) { 8502 accessor->CopyElements(this, elems, FAST_DOUBLE_ELEMENTS,
8503 switch (elements_kind) { 8503 SKIP_WRITE_BARRIER);
8504 case FAST_SMI_ONLY_ELEMENTS: 8504 if (elements_kind != NON_STRICT_ARGUMENTS_ELEMENTS) {
8505 case FAST_ELEMENTS: { 8505 set_map_and_elements(new_map, elems);
8506 elems->Initialize(FixedArray::cast(old_elements)); 8506 } else {
8507 break; 8507 FixedArray* parameter_map = FixedArray::cast(old_elements);
8508 } 8508 parameter_map->set(1, elems);
8509 case FAST_DOUBLE_ELEMENTS: {
8510 elems->Initialize(FixedDoubleArray::cast(old_elements));
8511 break;
8512 }
8513 case DICTIONARY_ELEMENTS: {
8514 elems->Initialize(SeededNumberDictionary::cast(old_elements));
8515 break;
8516 }
8517 default:
8518 UNREACHABLE();
8519 break;
8520 }
8521 } 8509 }
8522 8510
8523 if (FLAG_trace_elements_transitions) { 8511 if (FLAG_trace_elements_transitions) {
8524 PrintElementsTransition(stdout, elements_kind, old_elements, 8512 PrintElementsTransition(stdout, elements_kind, old_elements,
8525 FAST_DOUBLE_ELEMENTS, elems); 8513 FAST_DOUBLE_ELEMENTS, elems);
8526 } 8514 }
8527 8515
8528 ASSERT(new_map->has_fast_double_elements());
8529 set_map(new_map);
8530 ASSERT(elems->IsFixedDoubleArray());
8531 set_elements(elems);
8532
8533 if (IsJSArray()) { 8516 if (IsJSArray()) {
8534 JSArray::cast(this)->set_length(Smi::FromInt(length)); 8517 JSArray::cast(this)->set_length(Smi::FromInt(length));
8535 } 8518 }
8536 8519
8537 return this; 8520 return this;
8538 } 8521 }
8539 8522
8540 8523
8541 MaybeObject* JSArray::Initialize(int capacity) { 8524 MaybeObject* JSArray::Initialize(int capacity) {
8542 Heap* heap = GetHeap(); 8525 Heap* heap = GetHeap();
(...skipping 4413 matching lines...) Expand 10 before | Expand all | Expand 10 after
12956 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 12939 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
12957 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 12940 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
12958 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 12941 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
12959 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 12942 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
12960 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 12943 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
12961 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 12944 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
12962 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 12945 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
12963 } 12946 }
12964 12947
12965 } } // namespace v8::internal 12948 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698