| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 } | 137 } |
| 138 break; | 138 break; |
| 139 } | 139 } |
| 140 } | 140 } |
| 141 return it->factory()->undefined_value(); | 141 return it->factory()->undefined_value(); |
| 142 } | 142 } |
| 143 | 143 |
| 144 | 144 |
| 145 Handle<Object> JSObject::GetDataProperty(Handle<JSObject> object, | 145 Handle<Object> JSObject::GetDataProperty(Handle<JSObject> object, |
| 146 Handle<Name> key) { | 146 Handle<Name> key) { |
| 147 LookupIterator it(object, key, LookupIterator::PROTOTYPE_CHAIN_PROPERTY); | 147 LookupIterator it(object, key, |
| 148 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); |
| 148 return GetDataProperty(&it); | 149 return GetDataProperty(&it); |
| 149 } | 150 } |
| 150 | 151 |
| 151 | 152 |
| 152 Handle<Object> JSObject::GetDataProperty(LookupIterator* it) { | 153 Handle<Object> JSObject::GetDataProperty(LookupIterator* it) { |
| 153 for (; it->IsFound(); it->Next()) { | 154 for (; it->IsFound(); it->Next()) { |
| 154 switch (it->state()) { | 155 switch (it->state()) { |
| 155 case LookupIterator::ACCESS_CHECK: | |
| 156 case LookupIterator::INTERCEPTOR: | 156 case LookupIterator::INTERCEPTOR: |
| 157 case LookupIterator::NOT_FOUND: | 157 case LookupIterator::NOT_FOUND: |
| 158 case LookupIterator::TRANSITION: | 158 case LookupIterator::TRANSITION: |
| 159 UNREACHABLE(); | 159 UNREACHABLE(); |
| 160 case LookupIterator::ACCESS_CHECK: |
| 161 if (it->HasAccess(v8::ACCESS_GET)) continue; |
| 162 // Fall through. |
| 160 case LookupIterator::JSPROXY: | 163 case LookupIterator::JSPROXY: |
| 161 it->NotFound(); | 164 it->NotFound(); |
| 162 return it->isolate()->factory()->undefined_value(); | 165 return it->isolate()->factory()->undefined_value(); |
| 163 case LookupIterator::PROPERTY: | 166 case LookupIterator::PROPERTY: |
| 164 if (!it->HasProperty()) continue; | 167 if (!it->HasProperty()) continue; |
| 165 switch (it->property_kind()) { | 168 switch (it->property_kind()) { |
| 166 case LookupIterator::DATA: | 169 case LookupIterator::DATA: |
| 167 return it->GetDataValue(); | 170 return it->GetDataValue(); |
| 168 case LookupIterator::ACCESSOR: | 171 case LookupIterator::ACCESSOR: |
| 169 // TODO(verwaest): For now this doesn't call into | 172 // TODO(verwaest): For now this doesn't call into |
| (...skipping 3610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3780 box->set_value(value->Number()); | 3783 box->set_value(value->Number()); |
| 3781 } else { | 3784 } else { |
| 3782 FastPropertyAtPut(index, value); | 3785 FastPropertyAtPut(index, value); |
| 3783 } | 3786 } |
| 3784 } | 3787 } |
| 3785 | 3788 |
| 3786 | 3789 |
| 3787 void JSObject::AddProperty(Handle<JSObject> object, Handle<Name> name, | 3790 void JSObject::AddProperty(Handle<JSObject> object, Handle<Name> name, |
| 3788 Handle<Object> value, | 3791 Handle<Object> value, |
| 3789 PropertyAttributes attributes) { | 3792 PropertyAttributes attributes) { |
| 3790 LookupIterator it(object, name, LookupIterator::OWN_PROPERTY); | 3793 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
| 3794 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); |
| 3791 #ifdef DEBUG | 3795 #ifdef DEBUG |
| 3792 uint32_t index; | 3796 uint32_t index; |
| 3793 DCHECK(!object->IsJSProxy()); | 3797 DCHECK(!object->IsJSProxy()); |
| 3794 DCHECK(!name->AsArrayIndex(&index)); | 3798 DCHECK(!name->AsArrayIndex(&index)); |
| 3795 Maybe<PropertyAttributes> maybe = GetPropertyAttributes(&it); | 3799 Maybe<PropertyAttributes> maybe = GetPropertyAttributes(&it); |
| 3796 DCHECK(maybe.has_value); | 3800 DCHECK(maybe.has_value); |
| 3797 DCHECK(!it.IsFound()); | 3801 DCHECK(!it.IsFound()); |
| 3798 DCHECK(object->map()->is_extensible() || | 3802 DCHECK(object->map()->is_extensible() || |
| 3799 name.is_identical_to(it.isolate()->factory()->hidden_string())); | 3803 name.is_identical_to(it.isolate()->factory()->hidden_string())); |
| 3800 #endif | 3804 #endif |
| (...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4680 if (inline_value->IsUndefined() || inline_value->IsSmi()) return; | 4684 if (inline_value->IsUndefined() || inline_value->IsSmi()) return; |
| 4681 | 4685 |
| 4682 Handle<ObjectHashTable> hashtable(ObjectHashTable::cast(inline_value)); | 4686 Handle<ObjectHashTable> hashtable(ObjectHashTable::cast(inline_value)); |
| 4683 bool was_present = false; | 4687 bool was_present = false; |
| 4684 ObjectHashTable::Remove(hashtable, key, &was_present); | 4688 ObjectHashTable::Remove(hashtable, key, &was_present); |
| 4685 } | 4689 } |
| 4686 | 4690 |
| 4687 | 4691 |
| 4688 bool JSObject::HasHiddenProperties(Handle<JSObject> object) { | 4692 bool JSObject::HasHiddenProperties(Handle<JSObject> object) { |
| 4689 Handle<Name> hidden = object->GetIsolate()->factory()->hidden_string(); | 4693 Handle<Name> hidden = object->GetIsolate()->factory()->hidden_string(); |
| 4690 LookupIterator it(object, hidden, LookupIterator::OWN_PROPERTY); | 4694 LookupIterator it(object, hidden, LookupIterator::OWN_SKIP_INTERCEPTOR); |
| 4691 Maybe<PropertyAttributes> maybe = GetPropertyAttributes(&it); | 4695 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); |
| 4692 // Cannot get an exception since the hidden_string isn't accessible to JS. | 4696 return it.IsFound() && it.HasProperty(); |
| 4693 DCHECK(maybe.has_value); | |
| 4694 return maybe.value != ABSENT; | |
| 4695 } | 4697 } |
| 4696 | 4698 |
| 4697 | 4699 |
| 4698 Object* JSObject::GetHiddenPropertiesHashTable() { | 4700 Object* JSObject::GetHiddenPropertiesHashTable() { |
| 4699 DCHECK(!IsJSGlobalProxy()); | 4701 DCHECK(!IsJSGlobalProxy()); |
| 4700 if (HasFastProperties()) { | 4702 if (HasFastProperties()) { |
| 4701 // If the object has fast properties, check whether the first slot | 4703 // If the object has fast properties, check whether the first slot |
| 4702 // in the descriptor array matches the hidden string. Since the | 4704 // in the descriptor array matches the hidden string. Since the |
| 4703 // hidden strings hash code is zero (and no other name has hash | 4705 // hidden strings hash code is zero (and no other name has hash |
| 4704 // code zero) it will always occupy the first entry if present. | 4706 // code zero) it will always occupy the first entry if present. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4715 return this->RawFastPropertyAt(index); | 4717 return this->RawFastPropertyAt(index); |
| 4716 } else { | 4718 } else { |
| 4717 return GetHeap()->undefined_value(); | 4719 return GetHeap()->undefined_value(); |
| 4718 } | 4720 } |
| 4719 } else { | 4721 } else { |
| 4720 return GetHeap()->undefined_value(); | 4722 return GetHeap()->undefined_value(); |
| 4721 } | 4723 } |
| 4722 } else { | 4724 } else { |
| 4723 Isolate* isolate = GetIsolate(); | 4725 Isolate* isolate = GetIsolate(); |
| 4724 LookupIterator it(handle(this), isolate->factory()->hidden_string(), | 4726 LookupIterator it(handle(this), isolate->factory()->hidden_string(), |
| 4725 LookupIterator::OWN_PROPERTY); | 4727 LookupIterator::OWN_SKIP_INTERCEPTOR); |
| 4728 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); |
| 4726 if (it.IsFound() && it.HasProperty()) { | 4729 if (it.IsFound() && it.HasProperty()) { |
| 4727 DCHECK_EQ(LookupIterator::DATA, it.property_kind()); | 4730 DCHECK_EQ(LookupIterator::DATA, it.property_kind()); |
| 4728 return *it.GetDataValue(); | 4731 return *it.GetDataValue(); |
| 4729 } | 4732 } |
| 4730 return GetHeap()->undefined_value(); | 4733 return GetHeap()->undefined_value(); |
| 4731 } | 4734 } |
| 4732 } | 4735 } |
| 4733 | 4736 |
| 4734 Handle<ObjectHashTable> JSObject::GetOrCreateHiddenPropertiesHashtable( | 4737 Handle<ObjectHashTable> JSObject::GetOrCreateHiddenPropertiesHashtable( |
| 4735 Handle<JSObject> object) { | 4738 Handle<JSObject> object) { |
| (...skipping 1420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6156 | 6159 |
| 6157 if (is_element) { | 6160 if (is_element) { |
| 6158 DefineElementAccessor(object, index, getter, setter, attributes); | 6161 DefineElementAccessor(object, index, getter, setter, attributes); |
| 6159 } else { | 6162 } else { |
| 6160 DCHECK(getter->IsSpecFunction() || getter->IsUndefined() || | 6163 DCHECK(getter->IsSpecFunction() || getter->IsUndefined() || |
| 6161 getter->IsNull()); | 6164 getter->IsNull()); |
| 6162 DCHECK(setter->IsSpecFunction() || setter->IsUndefined() || | 6165 DCHECK(setter->IsSpecFunction() || setter->IsUndefined() || |
| 6163 setter->IsNull()); | 6166 setter->IsNull()); |
| 6164 // At least one of the accessors needs to be a new value. | 6167 // At least one of the accessors needs to be a new value. |
| 6165 DCHECK(!getter->IsNull() || !setter->IsNull()); | 6168 DCHECK(!getter->IsNull() || !setter->IsNull()); |
| 6166 LookupIterator it(object, name, LookupIterator::OWN_PROPERTY); | 6169 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
| 6170 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); |
| 6167 if (!getter->IsNull()) { | 6171 if (!getter->IsNull()) { |
| 6168 it.TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes); | 6172 it.TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes); |
| 6169 } | 6173 } |
| 6170 if (!setter->IsNull()) { | 6174 if (!setter->IsNull()) { |
| 6171 it.TransitionToAccessorProperty(ACCESSOR_SETTER, setter, attributes); | 6175 it.TransitionToAccessorProperty(ACCESSOR_SETTER, setter, attributes); |
| 6172 } | 6176 } |
| 6173 } | 6177 } |
| 6174 | 6178 |
| 6175 if (is_observed) { | 6179 if (is_observed) { |
| 6176 const char* type = preexists ? "reconfigure" : "add"; | 6180 const char* type = preexists ? "reconfigure" : "add"; |
| (...skipping 6659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12836 return lookup.IsReadOnly(); | 12840 return lookup.IsReadOnly(); |
| 12837 } | 12841 } |
| 12838 | 12842 |
| 12839 | 12843 |
| 12840 bool JSArray::WouldChangeReadOnlyLength(Handle<JSArray> array, | 12844 bool JSArray::WouldChangeReadOnlyLength(Handle<JSArray> array, |
| 12841 uint32_t index) { | 12845 uint32_t index) { |
| 12842 uint32_t length = 0; | 12846 uint32_t length = 0; |
| 12843 CHECK(array->length()->ToArrayIndex(&length)); | 12847 CHECK(array->length()->ToArrayIndex(&length)); |
| 12844 if (length <= index) { | 12848 if (length <= index) { |
| 12845 LookupIterator it(array, array->GetIsolate()->factory()->length_string(), | 12849 LookupIterator it(array, array->GetIsolate()->factory()->length_string(), |
| 12846 LookupIterator::OWN_PROPERTY); | 12850 LookupIterator::OWN_SKIP_INTERCEPTOR); |
| 12851 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); |
| 12847 CHECK(it.IsFound()); | 12852 CHECK(it.IsFound()); |
| 12848 CHECK(it.HasProperty()); | 12853 CHECK(it.HasProperty()); |
| 12849 return it.IsReadOnly(); | 12854 return it.IsReadOnly(); |
| 12850 } | 12855 } |
| 12851 return false; | 12856 return false; |
| 12852 } | 12857 } |
| 12853 | 12858 |
| 12854 | 12859 |
| 12855 MaybeHandle<Object> JSArray::ReadOnlyLengthError(Handle<JSArray> array) { | 12860 MaybeHandle<Object> JSArray::ReadOnlyLengthError(Handle<JSArray> array) { |
| 12856 Isolate* isolate = array->GetIsolate(); | 12861 Isolate* isolate = array->GetIsolate(); |
| (...skipping 3561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16418 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16423 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16419 static const char* error_messages_[] = { | 16424 static const char* error_messages_[] = { |
| 16420 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16425 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16421 }; | 16426 }; |
| 16422 #undef ERROR_MESSAGES_TEXTS | 16427 #undef ERROR_MESSAGES_TEXTS |
| 16423 return error_messages_[reason]; | 16428 return error_messages_[reason]; |
| 16424 } | 16429 } |
| 16425 | 16430 |
| 16426 | 16431 |
| 16427 } } // namespace v8::internal | 16432 } } // namespace v8::internal |
| OLD | NEW |