| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 3583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3594 default: | 3594 default: |
| 3595 UNREACHABLE(); | 3595 UNREACHABLE(); |
| 3596 } | 3596 } |
| 3597 UNREACHABLE(); | 3597 UNREACHABLE(); |
| 3598 return Heap::null_value(); // Failure case needs to "return" a value. | 3598 return Heap::null_value(); // Failure case needs to "return" a value. |
| 3599 } | 3599 } |
| 3600 | 3600 |
| 3601 | 3601 |
| 3602 Object* FixedArray::UnionOfKeys(FixedArray* other) { | 3602 Object* FixedArray::UnionOfKeys(FixedArray* other) { |
| 3603 int len0 = length(); | 3603 int len0 = length(); |
| 3604 #ifdef DEBUG |
| 3605 if (FLAG_enable_slow_asserts) { |
| 3606 for (int i = 0; i < len0; i++) { |
| 3607 ASSERT(get(i)->IsString() || get(i)->IsNumber()); |
| 3608 } |
| 3609 } |
| 3610 #endif |
| 3604 int len1 = other->length(); | 3611 int len1 = other->length(); |
| 3605 // Optimize if either is empty. | 3612 // Optimize if 'other' is empty. |
| 3606 if (len0 == 0) return other; | 3613 // We cannot optimize if 'this' is empty, as other may have holes |
| 3614 // or non keys. |
| 3607 if (len1 == 0) return this; | 3615 if (len1 == 0) return this; |
| 3608 | 3616 |
| 3609 // Compute how many elements are not in this. | 3617 // Compute how many elements are not in this. |
| 3610 int extra = 0; | 3618 int extra = 0; |
| 3611 for (int y = 0; y < len1; y++) { | 3619 for (int y = 0; y < len1; y++) { |
| 3612 Object* value = other->get(y); | 3620 Object* value = other->get(y); |
| 3613 if (!value->IsTheHole() && !HasKey(this, value)) extra++; | 3621 if (!value->IsTheHole() && !HasKey(this, value)) extra++; |
| 3614 } | 3622 } |
| 3615 | 3623 |
| 3616 if (extra == 0) return this; | 3624 if (extra == 0) return this; |
| 3617 | 3625 |
| 3618 // Allocate the result | 3626 // Allocate the result |
| 3619 Object* obj = Heap::AllocateFixedArray(len0 + extra); | 3627 Object* obj = Heap::AllocateFixedArray(len0 + extra); |
| 3620 if (obj->IsFailure()) return obj; | 3628 if (obj->IsFailure()) return obj; |
| 3621 // Fill in the content | 3629 // Fill in the content |
| 3622 AssertNoAllocation no_gc; | 3630 AssertNoAllocation no_gc; |
| 3623 FixedArray* result = FixedArray::cast(obj); | 3631 FixedArray* result = FixedArray::cast(obj); |
| 3624 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); | 3632 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); |
| 3625 for (int i = 0; i < len0; i++) { | 3633 for (int i = 0; i < len0; i++) { |
| 3626 result->set(i, get(i), mode); | 3634 Object* e = get(i); |
| 3635 ASSERT(e->IsString() || e->IsNumber()); |
| 3636 result->set(i, e, mode); |
| 3627 } | 3637 } |
| 3628 // Fill in the extra keys. | 3638 // Fill in the extra keys. |
| 3629 int index = 0; | 3639 int index = 0; |
| 3630 for (int y = 0; y < len1; y++) { | 3640 for (int y = 0; y < len1; y++) { |
| 3631 Object* value = other->get(y); | 3641 Object* value = other->get(y); |
| 3632 if (!value->IsTheHole() && !HasKey(this, value)) { | 3642 if (!value->IsTheHole() && !HasKey(this, value)) { |
| 3633 result->set(len0 + index, other->get(y), mode); | 3643 Object* e = other->get(y); |
| 3644 ASSERT(e->IsString() || e->IsNumber()); |
| 3645 result->set(len0 + index, e, mode); |
| 3634 index++; | 3646 index++; |
| 3635 } | 3647 } |
| 3636 } | 3648 } |
| 3637 ASSERT(extra == index); | 3649 ASSERT(extra == index); |
| 3638 return result; | 3650 return result; |
| 3639 } | 3651 } |
| 3640 | 3652 |
| 3641 | 3653 |
| 3642 Object* FixedArray::CopySize(int new_length) { | 3654 Object* FixedArray::CopySize(int new_length) { |
| 3643 if (new_length == 0) return Heap::empty_fixed_array(); | 3655 if (new_length == 0) return Heap::empty_fixed_array(); |
| (...skipping 5400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9044 if (break_point_objects()->IsUndefined()) return 0; | 9056 if (break_point_objects()->IsUndefined()) return 0; |
| 9045 // Single beak point. | 9057 // Single beak point. |
| 9046 if (!break_point_objects()->IsFixedArray()) return 1; | 9058 if (!break_point_objects()->IsFixedArray()) return 1; |
| 9047 // Multiple break points. | 9059 // Multiple break points. |
| 9048 return FixedArray::cast(break_point_objects())->length(); | 9060 return FixedArray::cast(break_point_objects())->length(); |
| 9049 } | 9061 } |
| 9050 #endif | 9062 #endif |
| 9051 | 9063 |
| 9052 | 9064 |
| 9053 } } // namespace v8::internal | 9065 } } // namespace v8::internal |
| OLD | NEW |