OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 5171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5182 return handle(*result_internal, isolate); | 5182 return handle(*result_internal, isolate); |
5183 } | 5183 } |
5184 } | 5184 } |
5185 Handle<Object> result = | 5185 Handle<Object> result = |
5186 DeletePropertyPostInterceptor(object, name, NORMAL_DELETION); | 5186 DeletePropertyPostInterceptor(object, name, NORMAL_DELETION); |
5187 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5187 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5188 return result; | 5188 return result; |
5189 } | 5189 } |
5190 | 5190 |
5191 | 5191 |
5192 Handle<Object> JSObject::DeleteElementWithInterceptor(Handle<JSObject> object, | 5192 MaybeHandle<Object> JSObject::DeleteElementWithInterceptor( |
5193 uint32_t index) { | 5193 Handle<JSObject> object, |
| 5194 uint32_t index) { |
5194 Isolate* isolate = object->GetIsolate(); | 5195 Isolate* isolate = object->GetIsolate(); |
5195 Factory* factory = isolate->factory(); | 5196 Factory* factory = isolate->factory(); |
5196 | 5197 |
5197 // Make sure that the top context does not change when doing | 5198 // Make sure that the top context does not change when doing |
5198 // callbacks or interceptor calls. | 5199 // callbacks or interceptor calls. |
5199 AssertNoContextChange ncc(isolate); | 5200 AssertNoContextChange ncc(isolate); |
5200 | 5201 |
5201 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); | 5202 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); |
5202 if (interceptor->deleter()->IsUndefined()) return factory->false_value(); | 5203 if (interceptor->deleter()->IsUndefined()) return factory->false_value(); |
5203 v8::IndexedPropertyDeleterCallback deleter = | 5204 v8::IndexedPropertyDeleterCallback deleter = |
5204 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); | 5205 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); |
5205 LOG(isolate, | 5206 LOG(isolate, |
5206 ApiIndexedPropertyAccess("interceptor-indexed-delete", *object, index)); | 5207 ApiIndexedPropertyAccess("interceptor-indexed-delete", *object, index)); |
5207 PropertyCallbackArguments args( | 5208 PropertyCallbackArguments args( |
5208 isolate, interceptor->data(), *object, *object); | 5209 isolate, interceptor->data(), *object, *object); |
5209 v8::Handle<v8::Boolean> result = args.Call(deleter, index); | 5210 v8::Handle<v8::Boolean> result = args.Call(deleter, index); |
5210 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5211 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5211 if (!result.IsEmpty()) { | 5212 if (!result.IsEmpty()) { |
5212 ASSERT(result->IsBoolean()); | 5213 ASSERT(result->IsBoolean()); |
5213 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 5214 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
5214 result_internal->VerifyApiCallResultType(); | 5215 result_internal->VerifyApiCallResultType(); |
5215 // Rebox CustomArguments::kReturnValueOffset before returning. | 5216 // Rebox CustomArguments::kReturnValueOffset before returning. |
5216 return handle(*result_internal, isolate); | 5217 return handle(*result_internal, isolate); |
5217 } | 5218 } |
5218 Handle<Object> delete_result = object->GetElementsAccessor()->Delete( | 5219 MaybeHandle<Object> delete_result = object->GetElementsAccessor()->Delete( |
5219 object, index, NORMAL_DELETION); | 5220 object, index, NORMAL_DELETION); |
5220 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | |
5221 return delete_result; | 5221 return delete_result; |
5222 } | 5222 } |
5223 | 5223 |
5224 | 5224 |
5225 Handle<Object> JSObject::DeleteElement(Handle<JSObject> object, | 5225 MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object, |
5226 uint32_t index, | 5226 uint32_t index, |
5227 DeleteMode mode) { | 5227 DeleteMode mode) { |
5228 Isolate* isolate = object->GetIsolate(); | 5228 Isolate* isolate = object->GetIsolate(); |
5229 Factory* factory = isolate->factory(); | 5229 Factory* factory = isolate->factory(); |
5230 | 5230 |
5231 // Check access rights if needed. | 5231 // Check access rights if needed. |
5232 if (object->IsAccessCheckNeeded() && | 5232 if (object->IsAccessCheckNeeded() && |
5233 !isolate->MayIndexedAccessWrapper(object, index, v8::ACCESS_DELETE)) { | 5233 !isolate->MayIndexedAccessWrapper(object, index, v8::ACCESS_DELETE)) { |
5234 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE); | 5234 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE); |
5235 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5235 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5236 return factory->false_value(); | 5236 return factory->false_value(); |
5237 } | 5237 } |
(...skipping 26 matching lines...) Expand all Loading... |
5264 if (should_enqueue_change_record) { | 5264 if (should_enqueue_change_record) { |
5265 if (!GetLocalElementAccessorPair(object, index).is_null()) { | 5265 if (!GetLocalElementAccessorPair(object, index).is_null()) { |
5266 old_value = Handle<Object>::cast(factory->the_hole_value()); | 5266 old_value = Handle<Object>::cast(factory->the_hole_value()); |
5267 } else { | 5267 } else { |
5268 old_value = Object::GetElementNoExceptionThrown(isolate, object, index); | 5268 old_value = Object::GetElementNoExceptionThrown(isolate, object, index); |
5269 } | 5269 } |
5270 } | 5270 } |
5271 } | 5271 } |
5272 | 5272 |
5273 // Skip interceptor if forcing deletion. | 5273 // Skip interceptor if forcing deletion. |
| 5274 MaybeHandle<Object> maybe_result; |
| 5275 if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) { |
| 5276 maybe_result = DeleteElementWithInterceptor(object, index); |
| 5277 } else { |
| 5278 maybe_result = object->GetElementsAccessor()->Delete(object, index, mode); |
| 5279 } |
5274 Handle<Object> result; | 5280 Handle<Object> result; |
5275 if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) { | 5281 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, maybe_result, Object); |
5276 result = DeleteElementWithInterceptor(object, index); | |
5277 } else { | |
5278 result = object->GetElementsAccessor()->Delete(object, index, mode); | |
5279 } | |
5280 | 5282 |
5281 if (should_enqueue_change_record && !HasLocalElement(object, index)) { | 5283 if (should_enqueue_change_record && !HasLocalElement(object, index)) { |
5282 Handle<String> name = factory->Uint32ToString(index); | 5284 Handle<String> name = factory->Uint32ToString(index); |
5283 EnqueueChangeRecord(object, "delete", name, old_value); | 5285 EnqueueChangeRecord(object, "delete", name, old_value); |
5284 } | 5286 } |
5285 | 5287 |
5286 return result; | 5288 return result; |
5287 } | 5289 } |
5288 | 5290 |
5289 | 5291 |
5290 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> object, | 5292 MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object, |
5291 Handle<Name> name, | 5293 Handle<Name> name, |
5292 DeleteMode mode) { | 5294 DeleteMode mode) { |
5293 Isolate* isolate = object->GetIsolate(); | 5295 Isolate* isolate = object->GetIsolate(); |
5294 // ECMA-262, 3rd, 8.6.2.5 | 5296 // ECMA-262, 3rd, 8.6.2.5 |
5295 ASSERT(name->IsName()); | 5297 ASSERT(name->IsName()); |
5296 | 5298 |
5297 // Check access rights if needed. | 5299 // Check access rights if needed. |
5298 if (object->IsAccessCheckNeeded() && | 5300 if (object->IsAccessCheckNeeded() && |
5299 !isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_DELETE)) { | 5301 !isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_DELETE)) { |
5300 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE); | 5302 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE); |
5301 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5303 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5302 return isolate->factory()->false_value(); | 5304 return isolate->factory()->false_value(); |
(...skipping 8946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14249 Object*); | 14251 Object*); |
14250 | 14252 |
14251 template void Dictionary<SeededNumberDictionaryShape, uint32_t>::CopyKeysTo( | 14253 template void Dictionary<SeededNumberDictionaryShape, uint32_t>::CopyKeysTo( |
14252 FixedArray*, | 14254 FixedArray*, |
14253 PropertyAttributes, | 14255 PropertyAttributes, |
14254 Dictionary<SeededNumberDictionaryShape, uint32_t>::SortMode); | 14256 Dictionary<SeededNumberDictionaryShape, uint32_t>::SortMode); |
14255 | 14257 |
14256 template Object* Dictionary<NameDictionaryShape, Name*>::DeleteProperty( | 14258 template Object* Dictionary<NameDictionaryShape, Name*>::DeleteProperty( |
14257 int, JSObject::DeleteMode); | 14259 int, JSObject::DeleteMode); |
14258 | 14260 |
| 14261 template Handle<Object> Dictionary<NameDictionaryShape, Name*>::DeleteProperty( |
| 14262 Handle<Dictionary<NameDictionaryShape, Name*> >, |
| 14263 int, |
| 14264 JSObject::DeleteMode); |
| 14265 |
14259 template Object* Dictionary<SeededNumberDictionaryShape, uint32_t>:: | 14266 template Object* Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
14260 DeleteProperty(int, JSObject::DeleteMode); | 14267 DeleteProperty(int, JSObject::DeleteMode); |
14261 | 14268 |
| 14269 template Handle<Object> |
| 14270 Dictionary<SeededNumberDictionaryShape, uint32_t>::DeleteProperty( |
| 14271 Handle<Dictionary<SeededNumberDictionaryShape, uint32_t> >, |
| 14272 int, |
| 14273 JSObject::DeleteMode); |
| 14274 |
14262 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Shrink(Name* n); | 14275 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Shrink(Name* n); |
14263 | 14276 |
14264 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( | 14277 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( |
14265 uint32_t); | 14278 uint32_t); |
| 14279 template Handle<FixedArray> |
| 14280 Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( |
| 14281 Handle<Dictionary<SeededNumberDictionaryShape, uint32_t> >, |
| 14282 uint32_t); |
14266 | 14283 |
14267 template void Dictionary<NameDictionaryShape, Name*>::CopyKeysTo( | 14284 template void Dictionary<NameDictionaryShape, Name*>::CopyKeysTo( |
14268 FixedArray*, | 14285 FixedArray*, |
14269 int, | 14286 int, |
14270 PropertyAttributes, | 14287 PropertyAttributes, |
14271 Dictionary<NameDictionaryShape, Name*>::SortMode); | 14288 Dictionary<NameDictionaryShape, Name*>::SortMode); |
14272 | 14289 |
14273 template int | 14290 template int |
14274 Dictionary<NameDictionaryShape, Name*>::NumberOfElementsFilterAttributes( | 14291 Dictionary<NameDictionaryShape, Name*>::NumberOfElementsFilterAttributes( |
14275 PropertyAttributes); | 14292 PropertyAttributes); |
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15254 // If not, we generate new indices for the properties. | 15271 // If not, we generate new indices for the properties. |
15255 Object* result; | 15272 Object* result; |
15256 { MaybeObject* maybe_result = GenerateNewEnumerationIndices(); | 15273 { MaybeObject* maybe_result = GenerateNewEnumerationIndices(); |
15257 if (!maybe_result->ToObject(&result)) return maybe_result; | 15274 if (!maybe_result->ToObject(&result)) return maybe_result; |
15258 } | 15275 } |
15259 } | 15276 } |
15260 return HashTable<Shape, Key>::EnsureCapacity(n, key); | 15277 return HashTable<Shape, Key>::EnsureCapacity(n, key); |
15261 } | 15278 } |
15262 | 15279 |
15263 | 15280 |
| 15281 // TODO(ishell): Temporary wrapper until handlified. |
| 15282 template<typename Shape, typename Key> |
| 15283 Handle<Object> Dictionary<Shape, Key>::DeleteProperty( |
| 15284 Handle<Dictionary<Shape, Key> > dictionary, |
| 15285 int entry, |
| 15286 JSObject::DeleteMode mode) { |
| 15287 CALL_HEAP_FUNCTION(dictionary->GetIsolate(), |
| 15288 dictionary->DeleteProperty(entry, mode), |
| 15289 Object); |
| 15290 } |
| 15291 |
| 15292 |
15264 template<typename Shape, typename Key> | 15293 template<typename Shape, typename Key> |
15265 Object* Dictionary<Shape, Key>::DeleteProperty(int entry, | 15294 Object* Dictionary<Shape, Key>::DeleteProperty(int entry, |
15266 JSReceiver::DeleteMode mode) { | 15295 JSReceiver::DeleteMode mode) { |
15267 Heap* heap = Dictionary<Shape, Key>::GetHeap(); | 15296 Heap* heap = Dictionary<Shape, Key>::GetHeap(); |
15268 PropertyDetails details = DetailsAt(entry); | 15297 PropertyDetails details = DetailsAt(entry); |
15269 // Ignore attributes if forcing a deletion. | 15298 // Ignore attributes if forcing a deletion. |
15270 if (details.IsDontDelete() && mode != JSReceiver::FORCE_DELETION) { | 15299 if (details.IsDontDelete() && mode != JSReceiver::FORCE_DELETION) { |
15271 return heap->false_value(); | 15300 return heap->false_value(); |
15272 } | 15301 } |
15273 SetEntry(entry, heap->the_hole_value(), heap->the_hole_value()); | 15302 SetEntry(entry, heap->the_hole_value(), heap->the_hole_value()); |
15274 HashTable<Shape, Key>::ElementRemoved(); | 15303 HashTable<Shape, Key>::ElementRemoved(); |
15275 return heap->true_value(); | 15304 return heap->true_value(); |
15276 } | 15305 } |
15277 | 15306 |
15278 | 15307 |
| 15308 // TODO(ishell): Temporary wrapper until handlified. |
| 15309 template<typename Shape, typename Key> |
| 15310 Handle<FixedArray> Dictionary<Shape, Key>::Shrink( |
| 15311 Handle<Dictionary<Shape, Key> > dictionary, |
| 15312 Key key) { |
| 15313 CALL_HEAP_FUNCTION(dictionary->GetIsolate(), |
| 15314 dictionary->Shrink(key), |
| 15315 FixedArray); |
| 15316 } |
| 15317 |
| 15318 |
15279 template<typename Shape, typename Key> | 15319 template<typename Shape, typename Key> |
15280 MaybeObject* Dictionary<Shape, Key>::Shrink(Key key) { | 15320 MaybeObject* Dictionary<Shape, Key>::Shrink(Key key) { |
15281 return HashTable<Shape, Key>::Shrink(key); | 15321 return HashTable<Shape, Key>::Shrink(key); |
15282 } | 15322 } |
15283 | 15323 |
15284 | 15324 |
15285 template<typename Shape, typename Key> | 15325 template<typename Shape, typename Key> |
15286 MaybeObject* Dictionary<Shape, Key>::AtPut(Key key, Object* value) { | 15326 MaybeObject* Dictionary<Shape, Key>::AtPut(Key key, Object* value) { |
15287 int entry = this->FindEntry(key); | 15327 int entry = this->FindEntry(key); |
15288 | 15328 |
(...skipping 1342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16631 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16671 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16632 static const char* error_messages_[] = { | 16672 static const char* error_messages_[] = { |
16633 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16673 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16634 }; | 16674 }; |
16635 #undef ERROR_MESSAGES_TEXTS | 16675 #undef ERROR_MESSAGES_TEXTS |
16636 return error_messages_[reason]; | 16676 return error_messages_[reason]; |
16637 } | 16677 } |
16638 | 16678 |
16639 | 16679 |
16640 } } // namespace v8::internal | 16680 } } // namespace v8::internal |
OLD | NEW |