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 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 return heap->undefined_value(); | 685 return heap->undefined_value(); |
686 } | 686 } |
687 } | 687 } |
688 | 688 |
689 if (js_object->HasIndexedInterceptor()) { | 689 if (js_object->HasIndexedInterceptor()) { |
690 return js_object->GetElementWithInterceptor(receiver, index); | 690 return js_object->GetElementWithInterceptor(receiver, index); |
691 } | 691 } |
692 | 692 |
693 if (js_object->elements() != heap->empty_fixed_array()) { | 693 if (js_object->elements() != heap->empty_fixed_array()) { |
694 MaybeObject* result = js_object->GetElementsAccessor()->Get( | 694 MaybeObject* result = js_object->GetElementsAccessor()->Get( |
695 js_object->elements(), | 695 receiver, js_object, index); |
696 index, | |
697 js_object, | |
698 receiver); | |
699 if (result != heap->the_hole_value()) return result; | 696 if (result != heap->the_hole_value()) return result; |
700 } | 697 } |
701 } | 698 } |
702 | 699 |
703 return heap->undefined_value(); | 700 return heap->undefined_value(); |
704 } | 701 } |
705 | 702 |
706 | 703 |
707 Object* Object::GetPrototype() { | 704 Object* Object::GetPrototype() { |
708 if (IsSmi()) { | 705 if (IsSmi()) { |
(...skipping 4836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5545 cache->set(EntryToIndex(entry), obj); | 5542 cache->set(EntryToIndex(entry), obj); |
5546 cache->set(EntryToIndex(entry) + 1, code); | 5543 cache->set(EntryToIndex(entry) + 1, code); |
5547 cache->ElementAdded(); | 5544 cache->ElementAdded(); |
5548 return cache; | 5545 return cache; |
5549 } | 5546 } |
5550 | 5547 |
5551 | 5548 |
5552 MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { | 5549 MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { |
5553 ElementsAccessor* accessor = array->GetElementsAccessor(); | 5550 ElementsAccessor* accessor = array->GetElementsAccessor(); |
5554 MaybeObject* maybe_result = | 5551 MaybeObject* maybe_result = |
5555 accessor->AddElementsToFixedArray(array->elements(), this, array, array); | 5552 accessor->AddElementsToFixedArray(array, array, this); |
5556 FixedArray* result; | 5553 FixedArray* result; |
5557 if (!maybe_result->To<FixedArray>(&result)) return maybe_result; | 5554 if (!maybe_result->To<FixedArray>(&result)) return maybe_result; |
5558 #ifdef DEBUG | 5555 #ifdef DEBUG |
5559 if (FLAG_enable_slow_asserts) { | 5556 if (FLAG_enable_slow_asserts) { |
5560 for (int i = 0; i < result->length(); i++) { | 5557 for (int i = 0; i < result->length(); i++) { |
5561 Object* current = result->get(i); | 5558 Object* current = result->get(i); |
5562 ASSERT(current->IsNumber() || current->IsString()); | 5559 ASSERT(current->IsNumber() || current->IsString()); |
5563 } | 5560 } |
5564 } | 5561 } |
5565 #endif | 5562 #endif |
5566 return result; | 5563 return result; |
5567 } | 5564 } |
5568 | 5565 |
5569 | 5566 |
5570 MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) { | 5567 MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) { |
5571 ElementsAccessor* accessor = ElementsAccessor::ForArray(other); | 5568 ElementsAccessor* accessor = ElementsAccessor::ForArray(other); |
5572 MaybeObject* maybe_result = | 5569 MaybeObject* maybe_result = |
5573 accessor->AddElementsToFixedArray(other, this, NULL, NULL); | 5570 accessor->AddElementsToFixedArray(NULL, NULL, this, other); |
5574 FixedArray* result; | 5571 FixedArray* result; |
5575 if (!maybe_result->To<FixedArray>(&result)) return maybe_result; | 5572 if (!maybe_result->To<FixedArray>(&result)) return maybe_result; |
5576 #ifdef DEBUG | 5573 #ifdef DEBUG |
5577 if (FLAG_enable_slow_asserts) { | 5574 if (FLAG_enable_slow_asserts) { |
5578 for (int i = 0; i < result->length(); i++) { | 5575 for (int i = 0; i < result->length(); i++) { |
5579 Object* current = result->get(i); | 5576 Object* current = result->get(i); |
5580 ASSERT(current->IsNumber() || current->IsString()); | 5577 ASSERT(current->IsNumber() || current->IsString()); |
5581 } | 5578 } |
5582 } | 5579 } |
5583 #endif | 5580 #endif |
(...skipping 3326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8910 v8::Handle<v8::Value> result; | 8907 v8::Handle<v8::Value> result; |
8911 { | 8908 { |
8912 // Leaving JavaScript. | 8909 // Leaving JavaScript. |
8913 VMState state(isolate, EXTERNAL); | 8910 VMState state(isolate, EXTERNAL); |
8914 result = getter(index, info); | 8911 result = getter(index, info); |
8915 } | 8912 } |
8916 if (!result.IsEmpty()) return true; | 8913 if (!result.IsEmpty()) return true; |
8917 } | 8914 } |
8918 | 8915 |
8919 if (holder_handle->GetElementsAccessor()->HasElement( | 8916 if (holder_handle->GetElementsAccessor()->HasElement( |
8920 holder_handle->elements(), index, *holder_handle, *receiver_handle)) { | 8917 *receiver_handle, *holder_handle, index)) { |
8921 return true; | 8918 return true; |
8922 } | 8919 } |
8923 | 8920 |
8924 if (holder_handle->IsStringObjectWithCharacterAt(index)) return true; | 8921 if (holder_handle->IsStringObjectWithCharacterAt(index)) return true; |
8925 Object* pt = holder_handle->GetPrototype(); | 8922 Object* pt = holder_handle->GetPrototype(); |
8926 if (pt->IsJSProxy()) { | 8923 if (pt->IsJSProxy()) { |
8927 // We need to follow the spec and simulate a call to [[GetOwnProperty]]. | 8924 // We need to follow the spec and simulate a call to [[GetOwnProperty]]. |
8928 return JSProxy::cast(pt)->GetElementAttributeWithHandler( | 8925 return JSProxy::cast(pt)->GetElementAttributeWithHandler( |
8929 receiver, index) != ABSENT; | 8926 receiver, index) != ABSENT; |
8930 } | 8927 } |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9048 return false; | 9045 return false; |
9049 } | 9046 } |
9050 } | 9047 } |
9051 | 9048 |
9052 // Check for lookup interceptor | 9049 // Check for lookup interceptor |
9053 if (HasIndexedInterceptor()) { | 9050 if (HasIndexedInterceptor()) { |
9054 return HasElementWithInterceptor(receiver, index); | 9051 return HasElementWithInterceptor(receiver, index); |
9055 } | 9052 } |
9056 | 9053 |
9057 ElementsAccessor* accessor = GetElementsAccessor(); | 9054 ElementsAccessor* accessor = GetElementsAccessor(); |
9058 if (accessor->HasElement(elements(), index, this, receiver)) { | 9055 if (accessor->HasElement(receiver, this, index)) { |
9059 return true; | 9056 return true; |
9060 } | 9057 } |
9061 | 9058 |
9062 // Handle [] on String objects. | 9059 // Handle [] on String objects. |
9063 if (this->IsStringObjectWithCharacterAt(index)) return true; | 9060 if (this->IsStringObjectWithCharacterAt(index)) return true; |
9064 | 9061 |
9065 Object* pt = GetPrototype(); | 9062 Object* pt = GetPrototype(); |
9066 if (pt->IsNull()) return false; | 9063 if (pt->IsNull()) return false; |
9067 if (pt->IsJSProxy()) { | 9064 if (pt->IsJSProxy()) { |
9068 // We need to follow the spec and simulate a call to [[GetOwnProperty]]. | 9065 // We need to follow the spec and simulate a call to [[GetOwnProperty]]. |
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9909 // Leaving JavaScript. | 9906 // Leaving JavaScript. |
9910 VMState state(isolate, EXTERNAL); | 9907 VMState state(isolate, EXTERNAL); |
9911 result = getter(index, info); | 9908 result = getter(index, info); |
9912 } | 9909 } |
9913 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 9910 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
9914 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); | 9911 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); |
9915 } | 9912 } |
9916 | 9913 |
9917 Heap* heap = holder_handle->GetHeap(); | 9914 Heap* heap = holder_handle->GetHeap(); |
9918 ElementsAccessor* handler = holder_handle->GetElementsAccessor(); | 9915 ElementsAccessor* handler = holder_handle->GetElementsAccessor(); |
9919 MaybeObject* raw_result = handler->Get(holder_handle->elements(), | 9916 MaybeObject* raw_result = handler->Get(*this_handle, |
9920 index, | |
9921 *holder_handle, | 9917 *holder_handle, |
9922 *this_handle); | 9918 index); |
9923 if (raw_result != heap->the_hole_value()) return raw_result; | 9919 if (raw_result != heap->the_hole_value()) return raw_result; |
9924 | 9920 |
9925 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 9921 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
9926 | 9922 |
9927 Object* pt = holder_handle->GetPrototype(); | 9923 Object* pt = holder_handle->GetPrototype(); |
9928 if (pt == heap->null_value()) return heap->undefined_value(); | 9924 if (pt == heap->null_value()) return heap->undefined_value(); |
9929 return pt->GetElementWithReceiver(*this_handle, index); | 9925 return pt->GetElementWithReceiver(*this_handle, index); |
9930 } | 9926 } |
9931 | 9927 |
9932 | 9928 |
(...skipping 3050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12983 if (break_point_objects()->IsUndefined()) return 0; | 12979 if (break_point_objects()->IsUndefined()) return 0; |
12984 // Single break point. | 12980 // Single break point. |
12985 if (!break_point_objects()->IsFixedArray()) return 1; | 12981 if (!break_point_objects()->IsFixedArray()) return 1; |
12986 // Multiple break points. | 12982 // Multiple break points. |
12987 return FixedArray::cast(break_point_objects())->length(); | 12983 return FixedArray::cast(break_point_objects())->length(); |
12988 } | 12984 } |
12989 #endif // ENABLE_DEBUGGER_SUPPORT | 12985 #endif // ENABLE_DEBUGGER_SUPPORT |
12990 | 12986 |
12991 | 12987 |
12992 } } // namespace v8::internal | 12988 } } // namespace v8::internal |
OLD | NEW |