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 <iomanip> | 5 #include <iomanip> |
6 #include <sstream> | 6 #include <sstream> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 if (it->isolate()->has_pending_exception()) return maybe_result; | 126 if (it->isolate()->has_pending_exception()) return maybe_result; |
127 break; | 127 break; |
128 } | 128 } |
129 case LookupIterator::ACCESS_CHECK: | 129 case LookupIterator::ACCESS_CHECK: |
130 if (it->HasAccess()) break; | 130 if (it->HasAccess()) break; |
131 return JSObject::GetPropertyWithFailedAccessCheck(it); | 131 return JSObject::GetPropertyWithFailedAccessCheck(it); |
132 case LookupIterator::ACCESSOR: | 132 case LookupIterator::ACCESSOR: |
133 return GetPropertyWithAccessor(it->GetReceiver(), it->name(), | 133 return GetPropertyWithAccessor(it->GetReceiver(), it->name(), |
134 it->GetHolder<JSObject>(), | 134 it->GetHolder<JSObject>(), |
135 it->GetAccessors()); | 135 it->GetAccessors()); |
| 136 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 137 return it->factory()->undefined_value(); |
136 case LookupIterator::DATA: | 138 case LookupIterator::DATA: |
137 return it->GetDataValue(); | 139 return it->GetDataValue(); |
138 } | 140 } |
139 } | 141 } |
140 return it->factory()->undefined_value(); | 142 return it->factory()->undefined_value(); |
141 } | 143 } |
142 | 144 |
143 | 145 |
144 Handle<Object> JSObject::GetDataProperty(Handle<JSObject> object, | 146 Handle<Object> JSObject::GetDataProperty(Handle<JSObject> object, |
145 Handle<Name> key) { | 147 Handle<Name> key) { |
(...skipping 15 matching lines...) Expand all Loading... |
161 // Fall through. | 163 // Fall through. |
162 case LookupIterator::JSPROXY: | 164 case LookupIterator::JSPROXY: |
163 it->NotFound(); | 165 it->NotFound(); |
164 return it->isolate()->factory()->undefined_value(); | 166 return it->isolate()->factory()->undefined_value(); |
165 case LookupIterator::ACCESSOR: | 167 case LookupIterator::ACCESSOR: |
166 // TODO(verwaest): For now this doesn't call into | 168 // TODO(verwaest): For now this doesn't call into |
167 // ExecutableAccessorInfo, since clients don't need it. Update once | 169 // ExecutableAccessorInfo, since clients don't need it. Update once |
168 // relevant. | 170 // relevant. |
169 it->NotFound(); | 171 it->NotFound(); |
170 return it->isolate()->factory()->undefined_value(); | 172 return it->isolate()->factory()->undefined_value(); |
| 173 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 174 return it->isolate()->factory()->undefined_value(); |
171 case LookupIterator::DATA: | 175 case LookupIterator::DATA: |
172 return it->GetDataValue(); | 176 return it->GetDataValue(); |
173 } | 177 } |
174 } | 178 } |
175 return it->isolate()->factory()->undefined_value(); | 179 return it->isolate()->factory()->undefined_value(); |
176 } | 180 } |
177 | 181 |
178 | 182 |
179 bool Object::ToInt32(int32_t* value) { | 183 bool Object::ToInt32(int32_t* value) { |
180 if (IsSmi()) { | 184 if (IsSmi()) { |
(...skipping 2942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3123 break; | 3127 break; |
3124 | 3128 |
3125 case LookupIterator::ACCESSOR: | 3129 case LookupIterator::ACCESSOR: |
3126 if (it->property_details().IsReadOnly()) { | 3130 if (it->property_details().IsReadOnly()) { |
3127 return WriteToReadOnlyProperty(it, value, language_mode); | 3131 return WriteToReadOnlyProperty(it, value, language_mode); |
3128 } | 3132 } |
3129 return SetPropertyWithAccessor(it->GetReceiver(), it->name(), value, | 3133 return SetPropertyWithAccessor(it->GetReceiver(), it->name(), value, |
3130 it->GetHolder<JSObject>(), | 3134 it->GetHolder<JSObject>(), |
3131 it->GetAccessors(), language_mode); | 3135 it->GetAccessors(), language_mode); |
3132 | 3136 |
| 3137 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 3138 done = true; |
| 3139 break; |
| 3140 |
3133 case LookupIterator::DATA: | 3141 case LookupIterator::DATA: |
3134 if (it->property_details().IsReadOnly()) { | 3142 if (it->property_details().IsReadOnly()) { |
3135 return WriteToReadOnlyProperty(it, value, language_mode); | 3143 return WriteToReadOnlyProperty(it, value, language_mode); |
3136 } | 3144 } |
3137 if (it->HolderIsReceiverOrHiddenPrototype()) { | 3145 if (it->HolderIsReceiverOrHiddenPrototype()) { |
3138 return SetDataProperty(it, value); | 3146 return SetDataProperty(it, value); |
3139 } | 3147 } |
3140 done = true; | 3148 done = true; |
3141 break; | 3149 break; |
3142 | 3150 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3185 SetPropertyInternal(it, value, language_mode, store_mode, &found); | 3193 SetPropertyInternal(it, value, language_mode, store_mode, &found); |
3186 if (found) return result; | 3194 if (found) return result; |
3187 | 3195 |
3188 LookupIterator own_lookup(it->GetReceiver(), it->name(), LookupIterator::OWN); | 3196 LookupIterator own_lookup(it->GetReceiver(), it->name(), LookupIterator::OWN); |
3189 | 3197 |
3190 switch (own_lookup.state()) { | 3198 switch (own_lookup.state()) { |
3191 case LookupIterator::NOT_FOUND: | 3199 case LookupIterator::NOT_FOUND: |
3192 return JSObject::AddDataProperty(&own_lookup, value, NONE, language_mode, | 3200 return JSObject::AddDataProperty(&own_lookup, value, NONE, language_mode, |
3193 store_mode); | 3201 store_mode); |
3194 | 3202 |
| 3203 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 3204 return result; |
| 3205 |
3195 case LookupIterator::DATA: { | 3206 case LookupIterator::DATA: { |
3196 PropertyDetails details = own_lookup.property_details(); | 3207 PropertyDetails details = own_lookup.property_details(); |
3197 if (details.IsConfigurable() || !details.IsReadOnly()) { | 3208 if (details.IsConfigurable() || !details.IsReadOnly()) { |
3198 return JSObject::SetOwnPropertyIgnoreAttributes( | 3209 return JSObject::SetOwnPropertyIgnoreAttributes( |
3199 Handle<JSObject>::cast(it->GetReceiver()), it->name(), value, | 3210 Handle<JSObject>::cast(it->GetReceiver()), it->name(), value, |
3200 details.attributes()); | 3211 details.attributes()); |
3201 } | 3212 } |
3202 return WriteToReadOnlyProperty(&own_lookup, value, language_mode); | 3213 return WriteToReadOnlyProperty(&own_lookup, value, language_mode); |
3203 } | 3214 } |
3204 | 3215 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3314 Handle<Object> value, | 3325 Handle<Object> value, |
3315 PropertyAttributes attributes, | 3326 PropertyAttributes attributes, |
3316 LanguageMode language_mode, | 3327 LanguageMode language_mode, |
3317 StoreFromKeyed store_mode) { | 3328 StoreFromKeyed store_mode) { |
3318 DCHECK(!it->GetReceiver()->IsJSProxy()); | 3329 DCHECK(!it->GetReceiver()->IsJSProxy()); |
3319 if (!it->GetReceiver()->IsJSObject()) { | 3330 if (!it->GetReceiver()->IsJSObject()) { |
3320 // TODO(verwaest): Throw a TypeError with a more specific message. | 3331 // TODO(verwaest): Throw a TypeError with a more specific message. |
3321 return WriteToReadOnlyProperty(it, value, language_mode); | 3332 return WriteToReadOnlyProperty(it, value, language_mode); |
3322 } | 3333 } |
3323 | 3334 |
| 3335 if (it->state() == LookupIterator::INTEGER_INDEXED_EXOTIC) return value; |
| 3336 |
3324 Handle<JSObject> receiver = it->GetStoreTarget(); | 3337 Handle<JSObject> receiver = it->GetStoreTarget(); |
3325 | 3338 |
3326 // If the receiver is a JSGlobalProxy, store on the prototype (JSGlobalObject) | 3339 // If the receiver is a JSGlobalProxy, store on the prototype (JSGlobalObject) |
3327 // instead. If the prototype is Null, the proxy is detached. | 3340 // instead. If the prototype is Null, the proxy is detached. |
3328 if (receiver->IsJSGlobalProxy()) return value; | 3341 if (receiver->IsJSGlobalProxy()) return value; |
3329 | 3342 |
3330 // If the receiver is Indexed Exotic object (currently only typed arrays), | |
3331 // disallow adding properties with numeric names. | |
3332 if (it->IsSpecialNumericIndex()) return value; | |
3333 | |
3334 // Possibly migrate to the most up-to-date map that will be able to store | 3343 // Possibly migrate to the most up-to-date map that will be able to store |
3335 // |value| under it->name() with |attributes|. | 3344 // |value| under it->name() with |attributes|. |
3336 it->PrepareTransitionToDataProperty(value, attributes, store_mode); | 3345 it->PrepareTransitionToDataProperty(value, attributes, store_mode); |
3337 if (it->state() != LookupIterator::TRANSITION) { | 3346 if (it->state() != LookupIterator::TRANSITION) { |
3338 if (is_sloppy(language_mode)) return value; | 3347 if (is_sloppy(language_mode)) return value; |
3339 | 3348 |
3340 Handle<Object> args[] = {it->name()}; | 3349 Handle<Object> args[] = {it->name()}; |
3341 THROW_NEW_ERROR(it->isolate(), | 3350 THROW_NEW_ERROR(it->isolate(), |
3342 NewTypeError("object_not_extensible", | 3351 NewTypeError("object_not_extensible", |
3343 HandleVector(args, arraysize(args))), | 3352 HandleVector(args, arraysize(args))), |
(...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4151 Handle<Name> name, | 4160 Handle<Name> name, |
4152 Handle<Object> value, | 4161 Handle<Object> value, |
4153 PropertyAttributes attributes, | 4162 PropertyAttributes attributes, |
4154 ExecutableAccessorInfoHandling handling) { | 4163 ExecutableAccessorInfoHandling handling) { |
4155 DCHECK(!value->IsTheHole()); | 4164 DCHECK(!value->IsTheHole()); |
4156 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); | 4165 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
4157 bool is_observed = object->map()->is_observed() && | 4166 bool is_observed = object->map()->is_observed() && |
4158 !it.isolate()->IsInternallyUsedPropertyName(name); | 4167 !it.isolate()->IsInternallyUsedPropertyName(name); |
4159 for (; it.IsFound(); it.Next()) { | 4168 for (; it.IsFound(); it.Next()) { |
4160 switch (it.state()) { | 4169 switch (it.state()) { |
| 4170 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
4161 case LookupIterator::INTERCEPTOR: | 4171 case LookupIterator::INTERCEPTOR: |
4162 case LookupIterator::JSPROXY: | 4172 case LookupIterator::JSPROXY: |
4163 case LookupIterator::NOT_FOUND: | 4173 case LookupIterator::NOT_FOUND: |
4164 case LookupIterator::TRANSITION: | 4174 case LookupIterator::TRANSITION: |
4165 UNREACHABLE(); | 4175 UNREACHABLE(); |
4166 | 4176 |
4167 case LookupIterator::ACCESS_CHECK: | 4177 case LookupIterator::ACCESS_CHECK: |
4168 if (!it.isolate()->MayAccess(object)) { | 4178 if (!it.isolate()->MayAccess(object)) { |
4169 return SetPropertyWithFailedAccessCheck(&it, value, SLOPPY); | 4179 return SetPropertyWithFailedAccessCheck(&it, value, SLOPPY); |
4170 } | 4180 } |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4329 Maybe<PropertyAttributes> result = | 4339 Maybe<PropertyAttributes> result = |
4330 JSObject::GetPropertyAttributesWithInterceptor( | 4340 JSObject::GetPropertyAttributesWithInterceptor( |
4331 it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); | 4341 it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); |
4332 if (!result.IsJust()) return result; | 4342 if (!result.IsJust()) return result; |
4333 if (result.FromJust() != ABSENT) return result; | 4343 if (result.FromJust() != ABSENT) return result; |
4334 break; | 4344 break; |
4335 } | 4345 } |
4336 case LookupIterator::ACCESS_CHECK: | 4346 case LookupIterator::ACCESS_CHECK: |
4337 if (it->HasAccess()) break; | 4347 if (it->HasAccess()) break; |
4338 return JSObject::GetPropertyAttributesWithFailedAccessCheck(it); | 4348 return JSObject::GetPropertyAttributesWithFailedAccessCheck(it); |
| 4349 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 4350 return Just(ABSENT); |
4339 case LookupIterator::ACCESSOR: | 4351 case LookupIterator::ACCESSOR: |
4340 case LookupIterator::DATA: | 4352 case LookupIterator::DATA: |
4341 return Just(it->property_details().attributes()); | 4353 return Just(it->property_details().attributes()); |
4342 } | 4354 } |
4343 } | 4355 } |
4344 return Just(ABSENT); | 4356 return Just(ABSENT); |
4345 } | 4357 } |
4346 | 4358 |
4347 | 4359 |
4348 Maybe<PropertyAttributes> JSObject::GetElementAttributeWithReceiver( | 4360 Maybe<PropertyAttributes> JSObject::GetElementAttributeWithReceiver( |
(...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5330 case LookupIterator::INTERCEPTOR: { | 5342 case LookupIterator::INTERCEPTOR: { |
5331 MaybeHandle<Object> maybe_result = | 5343 MaybeHandle<Object> maybe_result = |
5332 JSObject::DeletePropertyWithInterceptor(it.GetHolder<JSObject>(), | 5344 JSObject::DeletePropertyWithInterceptor(it.GetHolder<JSObject>(), |
5333 object, it.name()); | 5345 object, it.name()); |
5334 // Delete with interceptor succeeded. Return result. | 5346 // Delete with interceptor succeeded. Return result. |
5335 if (!maybe_result.is_null()) return maybe_result; | 5347 if (!maybe_result.is_null()) return maybe_result; |
5336 // An exception was thrown in the interceptor. Propagate. | 5348 // An exception was thrown in the interceptor. Propagate. |
5337 if (it.isolate()->has_pending_exception()) return maybe_result; | 5349 if (it.isolate()->has_pending_exception()) return maybe_result; |
5338 break; | 5350 break; |
5339 } | 5351 } |
| 5352 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 5353 return it.isolate()->factory()->true_value(); |
5340 case LookupIterator::DATA: | 5354 case LookupIterator::DATA: |
5341 if (is_observed) { | 5355 if (is_observed) { |
5342 old_value = it.GetDataValue(); | 5356 old_value = it.GetDataValue(); |
5343 } | 5357 } |
5344 // Fall through. | 5358 // Fall through. |
5345 case LookupIterator::ACCESSOR: { | 5359 case LookupIterator::ACCESSOR: { |
5346 if (!it.IsConfigurable()) { | 5360 if (!it.IsConfigurable()) { |
5347 // Fail if the property is not configurable. | 5361 // Fail if the property is not configurable. |
5348 if (is_strict(language_mode)) { | 5362 if (is_strict(language_mode)) { |
5349 Handle<Object> args[] = {name, object}; | 5363 Handle<Object> args[] = {name, object}; |
(...skipping 1407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6757 | 6771 |
6758 case LookupIterator::ACCESS_CHECK: | 6772 case LookupIterator::ACCESS_CHECK: |
6759 if (it.HasAccess()) continue; | 6773 if (it.HasAccess()) continue; |
6760 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); | 6774 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); |
6761 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 6775 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
6762 return isolate->factory()->undefined_value(); | 6776 return isolate->factory()->undefined_value(); |
6763 | 6777 |
6764 case LookupIterator::JSPROXY: | 6778 case LookupIterator::JSPROXY: |
6765 return isolate->factory()->undefined_value(); | 6779 return isolate->factory()->undefined_value(); |
6766 | 6780 |
| 6781 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
| 6782 return isolate->factory()->undefined_value(); |
6767 case LookupIterator::DATA: | 6783 case LookupIterator::DATA: |
6768 continue; | 6784 continue; |
6769 case LookupIterator::ACCESSOR: { | 6785 case LookupIterator::ACCESSOR: { |
6770 Handle<Object> maybe_pair = it.GetAccessors(); | 6786 Handle<Object> maybe_pair = it.GetAccessors(); |
6771 if (maybe_pair->IsAccessorPair()) { | 6787 if (maybe_pair->IsAccessorPair()) { |
6772 return handle( | 6788 return handle( |
6773 AccessorPair::cast(*maybe_pair)->GetComponent(component), | 6789 AccessorPair::cast(*maybe_pair)->GetComponent(component), |
6774 isolate); | 6790 isolate); |
6775 } | 6791 } |
6776 } | 6792 } |
(...skipping 10293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17070 CompilationInfo* info) { | 17086 CompilationInfo* info) { |
17071 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( | 17087 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( |
17072 handle(cell->dependent_code(), info->isolate()), | 17088 handle(cell->dependent_code(), info->isolate()), |
17073 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); | 17089 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); |
17074 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 17090 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
17075 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 17091 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
17076 cell, info->zone()); | 17092 cell, info->zone()); |
17077 } | 17093 } |
17078 | 17094 |
17079 } } // namespace v8::internal | 17095 } } // namespace v8::internal |
OLD | NEW |