| OLD | NEW | 
|---|
| 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 4619 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4630     if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 4630     if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 
| 4631   } | 4631   } | 
| 4632   cache->set(EntryToIndex(entry), obj); | 4632   cache->set(EntryToIndex(entry), obj); | 
| 4633   cache->set(EntryToIndex(entry) + 1, code); | 4633   cache->set(EntryToIndex(entry) + 1, code); | 
| 4634   cache->ElementAdded(); | 4634   cache->ElementAdded(); | 
| 4635   return cache; | 4635   return cache; | 
| 4636 } | 4636 } | 
| 4637 | 4637 | 
| 4638 | 4638 | 
| 4639 MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { | 4639 MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { | 
| 4640   ASSERT(!array->HasExternalArrayElements()); | 4640   return array->GetElementsAccessor()->AddJSArrayKeysToFixedArray(array, this); | 
| 4641   switch (array->GetElementsKind()) { |  | 
| 4642     case JSObject::FAST_ELEMENTS: |  | 
| 4643       return UnionOfKeys(FixedArray::cast(array->elements())); |  | 
| 4644     case JSObject::FAST_DOUBLE_ELEMENTS: |  | 
| 4645       return UnionOfDoubleKeys(FixedDoubleArray::cast(array->elements())); |  | 
| 4646       break; |  | 
| 4647     case JSObject::DICTIONARY_ELEMENTS: { |  | 
| 4648       NumberDictionary* dict = array->element_dictionary(); |  | 
| 4649       int size = dict->NumberOfElements(); |  | 
| 4650 |  | 
| 4651       // Allocate a temporary fixed array. |  | 
| 4652       Object* object; |  | 
| 4653       { MaybeObject* maybe_object = GetHeap()->AllocateFixedArray(size); |  | 
| 4654         if (!maybe_object->ToObject(&object)) return maybe_object; |  | 
| 4655       } |  | 
| 4656       FixedArray* key_array = FixedArray::cast(object); |  | 
| 4657 |  | 
| 4658       int capacity = dict->Capacity(); |  | 
| 4659       int pos = 0; |  | 
| 4660       // Copy the elements from the JSArray to the temporary fixed array. |  | 
| 4661       for (int i = 0; i < capacity; i++) { |  | 
| 4662         if (dict->IsKey(dict->KeyAt(i))) { |  | 
| 4663           key_array->set(pos++, dict->ValueAt(i)); |  | 
| 4664         } |  | 
| 4665       } |  | 
| 4666       // Compute the union of this and the temporary fixed array. |  | 
| 4667       return UnionOfKeys(key_array); |  | 
| 4668     } |  | 
| 4669     case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: |  | 
| 4670       UNIMPLEMENTED(); |  | 
| 4671       break; |  | 
| 4672     case JSObject::EXTERNAL_BYTE_ELEMENTS: |  | 
| 4673     case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |  | 
| 4674     case JSObject::EXTERNAL_SHORT_ELEMENTS: |  | 
| 4675     case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |  | 
| 4676     case JSObject::EXTERNAL_INT_ELEMENTS: |  | 
| 4677     case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |  | 
| 4678     case JSObject::EXTERNAL_FLOAT_ELEMENTS: |  | 
| 4679     case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |  | 
| 4680     case JSObject::EXTERNAL_PIXEL_ELEMENTS: |  | 
| 4681       break; |  | 
| 4682   } |  | 
| 4683   UNREACHABLE(); |  | 
| 4684   return GetHeap()->null_value();  // Failure case needs to "return" a value. |  | 
| 4685 } | 4641 } | 
| 4686 | 4642 | 
| 4687 | 4643 | 
| 4688 MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) { | 4644 MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) { | 
| 4689   int len0 = length(); | 4645   int len0 = length(); | 
| 4690 #ifdef DEBUG | 4646 #ifdef DEBUG | 
| 4691   if (FLAG_enable_slow_asserts) { | 4647   if (FLAG_enable_slow_asserts) { | 
| 4692     for (int i = 0; i < len0; i++) { | 4648     for (int i = 0; i < len0; i++) { | 
| 4693       ASSERT(get(i)->IsString() || get(i)->IsNumber()); | 4649       ASSERT(get(i)->IsString() || get(i)->IsNumber()); | 
| 4694     } | 4650     } | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4732       ASSERT(e->IsString() || e->IsNumber()); | 4688       ASSERT(e->IsString() || e->IsNumber()); | 
| 4733       result->set(len0 + index, e, mode); | 4689       result->set(len0 + index, e, mode); | 
| 4734       index++; | 4690       index++; | 
| 4735     } | 4691     } | 
| 4736   } | 4692   } | 
| 4737   ASSERT(extra == index); | 4693   ASSERT(extra == index); | 
| 4738   return result; | 4694   return result; | 
| 4739 } | 4695 } | 
| 4740 | 4696 | 
| 4741 | 4697 | 
| 4742 MaybeObject* FixedArray::UnionOfDoubleKeys(FixedDoubleArray* other) { |  | 
| 4743   int len0 = length(); |  | 
| 4744 #ifdef DEBUG |  | 
| 4745   if (FLAG_enable_slow_asserts) { |  | 
| 4746     for (int i = 0; i < len0; i++) { |  | 
| 4747       ASSERT(get(i)->IsString() || get(i)->IsNumber()); |  | 
| 4748     } |  | 
| 4749   } |  | 
| 4750 #endif |  | 
| 4751   int len1 = other->length(); |  | 
| 4752   // Optimize if 'other' is empty. |  | 
| 4753   // We cannot optimize if 'this' is empty, as other may have holes |  | 
| 4754   // or non keys. |  | 
| 4755   if (len1 == 0) return this; |  | 
| 4756 |  | 
| 4757   // Compute how many elements are not in this. |  | 
| 4758   int extra = 0; |  | 
| 4759   Heap* heap = GetHeap(); |  | 
| 4760   Object* obj; |  | 
| 4761   for (int y = 0; y < len1; y++) { |  | 
| 4762     if (!other->is_the_hole(y)) { |  | 
| 4763       MaybeObject* maybe_obj = heap->NumberFromDouble(other->get_scalar(y)); |  | 
| 4764       if (!maybe_obj->ToObject(&obj)) return maybe_obj; |  | 
| 4765       if (!HasKey(this, obj)) extra++; |  | 
| 4766     } |  | 
| 4767   } |  | 
| 4768 |  | 
| 4769   if (extra == 0) return this; |  | 
| 4770 |  | 
| 4771   // Allocate the result |  | 
| 4772   { MaybeObject* maybe_obj = GetHeap()->AllocateFixedArray(len0 + extra); |  | 
| 4773     if (!maybe_obj->ToObject(&obj)) return maybe_obj; |  | 
| 4774   } |  | 
| 4775   // Fill in the content |  | 
| 4776   FixedArray* result = FixedArray::cast(obj); |  | 
| 4777   { |  | 
| 4778     // Limit the scope of the AssertNoAllocation |  | 
| 4779     AssertNoAllocation no_gc; |  | 
| 4780     WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); |  | 
| 4781     for (int i = 0; i < len0; i++) { |  | 
| 4782       Object* e = get(i); |  | 
| 4783       ASSERT(e->IsString() || e->IsNumber()); |  | 
| 4784       result->set(i, e, mode); |  | 
| 4785     } |  | 
| 4786   } |  | 
| 4787 |  | 
| 4788   // Fill in the extra keys. |  | 
| 4789   int index = 0; |  | 
| 4790   for (int y = 0; y < len1; y++) { |  | 
| 4791     if (!other->is_the_hole(y)) { |  | 
| 4792       MaybeObject* maybe_obj = heap->NumberFromDouble(other->get_scalar(y)); |  | 
| 4793       if (!maybe_obj->ToObject(&obj)) return maybe_obj; |  | 
| 4794       if (!HasKey(this, obj)) { |  | 
| 4795         result->set(len0 + index, obj); |  | 
| 4796         index++; |  | 
| 4797       } |  | 
| 4798     } |  | 
| 4799   } |  | 
| 4800   ASSERT(extra == index); |  | 
| 4801   return result; |  | 
| 4802 } |  | 
| 4803 |  | 
| 4804 |  | 
| 4805 MaybeObject* FixedArray::CopySize(int new_length) { | 4698 MaybeObject* FixedArray::CopySize(int new_length) { | 
| 4806   Heap* heap = GetHeap(); | 4699   Heap* heap = GetHeap(); | 
| 4807   if (new_length == 0) return heap->empty_fixed_array(); | 4700   if (new_length == 0) return heap->empty_fixed_array(); | 
| 4808   Object* obj; | 4701   Object* obj; | 
| 4809   { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length); | 4702   { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length); | 
| 4810     if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 4703     if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 
| 4811   } | 4704   } | 
| 4812   FixedArray* result = FixedArray::cast(obj); | 4705   FixedArray* result = FixedArray::cast(obj); | 
| 4813   // Copy the content | 4706   // Copy the content | 
| 4814   AssertNoAllocation no_gc; | 4707   AssertNoAllocation no_gc; | 
| (...skipping 6874 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 11689   if (break_point_objects()->IsUndefined()) return 0; | 11582   if (break_point_objects()->IsUndefined()) return 0; | 
| 11690   // Single break point. | 11583   // Single break point. | 
| 11691   if (!break_point_objects()->IsFixedArray()) return 1; | 11584   if (!break_point_objects()->IsFixedArray()) return 1; | 
| 11692   // Multiple break points. | 11585   // Multiple break points. | 
| 11693   return FixedArray::cast(break_point_objects())->length(); | 11586   return FixedArray::cast(break_point_objects())->length(); | 
| 11694 } | 11587 } | 
| 11695 #endif | 11588 #endif | 
| 11696 | 11589 | 
| 11697 | 11590 | 
| 11698 } }  // namespace v8::internal | 11591 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|