OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |