Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(275)

Side by Side Diff: src/objects.cc

Issue 230733003: ElementsAccessor::Delete() maybehandlified. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 5162 matching lines...) Expand 10 before | Expand all | Expand 10 after
5173 return handle(*result_internal, isolate); 5173 return handle(*result_internal, isolate);
5174 } 5174 }
5175 } 5175 }
5176 Handle<Object> result = 5176 Handle<Object> result =
5177 DeletePropertyPostInterceptor(object, name, NORMAL_DELETION); 5177 DeletePropertyPostInterceptor(object, name, NORMAL_DELETION);
5178 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 5178 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
5179 return result; 5179 return result;
5180 } 5180 }
5181 5181
5182 5182
5183 Handle<Object> JSObject::DeleteElementWithInterceptor(Handle<JSObject> object, 5183 MaybeHandle<Object> JSObject::DeleteElementWithInterceptor(
5184 uint32_t index) { 5184 Handle<JSObject> object,
5185 uint32_t index) {
5185 Isolate* isolate = object->GetIsolate(); 5186 Isolate* isolate = object->GetIsolate();
5186 Factory* factory = isolate->factory(); 5187 Factory* factory = isolate->factory();
5187 5188
5188 // Make sure that the top context does not change when doing 5189 // Make sure that the top context does not change when doing
5189 // callbacks or interceptor calls. 5190 // callbacks or interceptor calls.
5190 AssertNoContextChange ncc(isolate); 5191 AssertNoContextChange ncc(isolate);
5191 5192
5192 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); 5193 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor());
5193 if (interceptor->deleter()->IsUndefined()) return factory->false_value(); 5194 if (interceptor->deleter()->IsUndefined()) return factory->false_value();
5194 v8::IndexedPropertyDeleterCallback deleter = 5195 v8::IndexedPropertyDeleterCallback deleter =
5195 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); 5196 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter());
5196 LOG(isolate, 5197 LOG(isolate,
5197 ApiIndexedPropertyAccess("interceptor-indexed-delete", *object, index)); 5198 ApiIndexedPropertyAccess("interceptor-indexed-delete", *object, index));
5198 PropertyCallbackArguments args( 5199 PropertyCallbackArguments args(
5199 isolate, interceptor->data(), *object, *object); 5200 isolate, interceptor->data(), *object, *object);
5200 v8::Handle<v8::Boolean> result = args.Call(deleter, index); 5201 v8::Handle<v8::Boolean> result = args.Call(deleter, index);
5201 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 5202 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
5202 if (!result.IsEmpty()) { 5203 if (!result.IsEmpty()) {
5203 ASSERT(result->IsBoolean()); 5204 ASSERT(result->IsBoolean());
5204 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 5205 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
5205 result_internal->VerifyApiCallResultType(); 5206 result_internal->VerifyApiCallResultType();
5206 // Rebox CustomArguments::kReturnValueOffset before returning. 5207 // Rebox CustomArguments::kReturnValueOffset before returning.
5207 return handle(*result_internal, isolate); 5208 return handle(*result_internal, isolate);
5208 } 5209 }
5209 Handle<Object> delete_result = object->GetElementsAccessor()->Delete( 5210 MaybeHandle<Object> delete_result = object->GetElementsAccessor()->Delete(
5210 object, index, NORMAL_DELETION); 5211 object, index, NORMAL_DELETION);
5211 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 5212 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
Yang 2014/04/09 15:09:59 Where does the API callback happen? Could we move
Igor Sheludko 2014/04/09 15:44:54 I did not find any callbacks inside Delete() call
5212 return delete_result; 5213 return delete_result;
5213 } 5214 }
5214 5215
5215 5216
5216 Handle<Object> JSObject::DeleteElement(Handle<JSObject> object, 5217 MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object,
5217 uint32_t index, 5218 uint32_t index,
5218 DeleteMode mode) { 5219 DeleteMode mode) {
5219 Isolate* isolate = object->GetIsolate(); 5220 Isolate* isolate = object->GetIsolate();
5220 Factory* factory = isolate->factory(); 5221 Factory* factory = isolate->factory();
5221 5222
5222 // Check access rights if needed. 5223 // Check access rights if needed.
5223 if (object->IsAccessCheckNeeded() && 5224 if (object->IsAccessCheckNeeded() &&
5224 !isolate->MayIndexedAccessWrapper(object, index, v8::ACCESS_DELETE)) { 5225 !isolate->MayIndexedAccessWrapper(object, index, v8::ACCESS_DELETE)) {
5225 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE); 5226 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE);
5226 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 5227 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
5227 return factory->false_value(); 5228 return factory->false_value();
5228 } 5229 }
(...skipping 26 matching lines...) Expand all
5255 if (should_enqueue_change_record) { 5256 if (should_enqueue_change_record) {
5256 if (!GetLocalElementAccessorPair(object, index).is_null()) { 5257 if (!GetLocalElementAccessorPair(object, index).is_null()) {
5257 old_value = Handle<Object>::cast(factory->the_hole_value()); 5258 old_value = Handle<Object>::cast(factory->the_hole_value());
5258 } else { 5259 } else {
5259 old_value = Object::GetElementNoExceptionThrown(isolate, object, index); 5260 old_value = Object::GetElementNoExceptionThrown(isolate, object, index);
5260 } 5261 }
5261 } 5262 }
5262 } 5263 }
5263 5264
5264 // Skip interceptor if forcing deletion. 5265 // Skip interceptor if forcing deletion.
5266 MaybeHandle<Object> maybe_result;
5267 if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) {
5268 maybe_result = DeleteElementWithInterceptor(object, index);
5269 } else {
5270 maybe_result = object->GetElementsAccessor()->Delete(object, index, mode);
Yang 2014/04/09 15:09:59 Seems like here we don't do the API callback excep
Igor Sheludko 2014/04/09 15:44:54 We don't need API callback exception check for Del
5271 }
5265 Handle<Object> result; 5272 Handle<Object> result;
5266 if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) { 5273 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, maybe_result, Object);
5267 result = DeleteElementWithInterceptor(object, index);
5268 } else {
5269 result = object->GetElementsAccessor()->Delete(object, index, mode);
5270 }
5271 5274
5272 if (should_enqueue_change_record && !HasLocalElement(object, index)) { 5275 if (should_enqueue_change_record && !HasLocalElement(object, index)) {
5273 Handle<String> name = factory->Uint32ToString(index); 5276 Handle<String> name = factory->Uint32ToString(index);
5274 EnqueueChangeRecord(object, "delete", name, old_value); 5277 EnqueueChangeRecord(object, "delete", name, old_value);
5275 } 5278 }
5276 5279
5277 return result; 5280 return result;
5278 } 5281 }
5279 5282
5280 5283
5281 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> object, 5284 MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object,
5282 Handle<Name> name, 5285 Handle<Name> name,
5283 DeleteMode mode) { 5286 DeleteMode mode) {
5284 Isolate* isolate = object->GetIsolate(); 5287 Isolate* isolate = object->GetIsolate();
5285 // ECMA-262, 3rd, 8.6.2.5 5288 // ECMA-262, 3rd, 8.6.2.5
5286 ASSERT(name->IsName()); 5289 ASSERT(name->IsName());
5287 5290
5288 // Check access rights if needed. 5291 // Check access rights if needed.
5289 if (object->IsAccessCheckNeeded() && 5292 if (object->IsAccessCheckNeeded() &&
5290 !isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_DELETE)) { 5293 !isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_DELETE)) {
5291 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE); 5294 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE);
5292 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 5295 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
5293 return isolate->factory()->false_value(); 5296 return isolate->factory()->false_value();
(...skipping 8982 matching lines...) Expand 10 before | Expand all | Expand 10 after
14276 Object*); 14279 Object*);
14277 14280
14278 template void Dictionary<SeededNumberDictionaryShape, uint32_t>::CopyKeysTo( 14281 template void Dictionary<SeededNumberDictionaryShape, uint32_t>::CopyKeysTo(
14279 FixedArray*, 14282 FixedArray*,
14280 PropertyAttributes, 14283 PropertyAttributes,
14281 Dictionary<SeededNumberDictionaryShape, uint32_t>::SortMode); 14284 Dictionary<SeededNumberDictionaryShape, uint32_t>::SortMode);
14282 14285
14283 template Object* Dictionary<NameDictionaryShape, Name*>::DeleteProperty( 14286 template Object* Dictionary<NameDictionaryShape, Name*>::DeleteProperty(
14284 int, JSObject::DeleteMode); 14287 int, JSObject::DeleteMode);
14285 14288
14289 template Handle<Object> Dictionary<NameDictionaryShape, Name*>::DeleteProperty(
14290 Handle<Dictionary<NameDictionaryShape, Name*> >,
14291 int,
14292 JSObject::DeleteMode);
14293
14286 template Object* Dictionary<SeededNumberDictionaryShape, uint32_t>:: 14294 template Object* Dictionary<SeededNumberDictionaryShape, uint32_t>::
14287 DeleteProperty(int, JSObject::DeleteMode); 14295 DeleteProperty(int, JSObject::DeleteMode);
14288 14296
14297 template Handle<Object>
14298 Dictionary<SeededNumberDictionaryShape, uint32_t>::DeleteProperty(
14299 Handle<Dictionary<SeededNumberDictionaryShape, uint32_t> >,
14300 int,
14301 JSObject::DeleteMode);
14302
14289 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Shrink(Name* n); 14303 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Shrink(Name* n);
14290 14304
14291 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( 14305 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink(
14292 uint32_t); 14306 uint32_t);
14307 template Handle<FixedArray>
14308 Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink(
14309 Handle<Dictionary<SeededNumberDictionaryShape, uint32_t> >,
14310 uint32_t);
14293 14311
14294 template void Dictionary<NameDictionaryShape, Name*>::CopyKeysTo( 14312 template void Dictionary<NameDictionaryShape, Name*>::CopyKeysTo(
14295 FixedArray*, 14313 FixedArray*,
14296 int, 14314 int,
14297 PropertyAttributes, 14315 PropertyAttributes,
14298 Dictionary<NameDictionaryShape, Name*>::SortMode); 14316 Dictionary<NameDictionaryShape, Name*>::SortMode);
14299 14317
14300 template int 14318 template int
14301 Dictionary<NameDictionaryShape, Name*>::NumberOfElementsFilterAttributes( 14319 Dictionary<NameDictionaryShape, Name*>::NumberOfElementsFilterAttributes(
14302 PropertyAttributes); 14320 PropertyAttributes);
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after
15281 // If not, we generate new indices for the properties. 15299 // If not, we generate new indices for the properties.
15282 Object* result; 15300 Object* result;
15283 { MaybeObject* maybe_result = GenerateNewEnumerationIndices(); 15301 { MaybeObject* maybe_result = GenerateNewEnumerationIndices();
15284 if (!maybe_result->ToObject(&result)) return maybe_result; 15302 if (!maybe_result->ToObject(&result)) return maybe_result;
15285 } 15303 }
15286 } 15304 }
15287 return HashTable<Shape, Key>::EnsureCapacity(n, key); 15305 return HashTable<Shape, Key>::EnsureCapacity(n, key);
15288 } 15306 }
15289 15307
15290 15308
15309 // TODO(ishell): Temporary wrapper until handlified.
15310 template<typename Shape, typename Key>
15311 Handle<Object> Dictionary<Shape, Key>::DeleteProperty(
15312 Handle<Dictionary<Shape, Key> > dictionary,
15313 int entry,
15314 JSObject::DeleteMode mode) {
15315 CALL_HEAP_FUNCTION(dictionary->GetIsolate(),
15316 dictionary->DeleteProperty(entry, mode),
15317 Object);
15318 }
15319
15320
15291 template<typename Shape, typename Key> 15321 template<typename Shape, typename Key>
15292 Object* Dictionary<Shape, Key>::DeleteProperty(int entry, 15322 Object* Dictionary<Shape, Key>::DeleteProperty(int entry,
15293 JSReceiver::DeleteMode mode) { 15323 JSReceiver::DeleteMode mode) {
15294 Heap* heap = Dictionary<Shape, Key>::GetHeap(); 15324 Heap* heap = Dictionary<Shape, Key>::GetHeap();
15295 PropertyDetails details = DetailsAt(entry); 15325 PropertyDetails details = DetailsAt(entry);
15296 // Ignore attributes if forcing a deletion. 15326 // Ignore attributes if forcing a deletion.
15297 if (details.IsDontDelete() && mode != JSReceiver::FORCE_DELETION) { 15327 if (details.IsDontDelete() && mode != JSReceiver::FORCE_DELETION) {
15298 return heap->false_value(); 15328 return heap->false_value();
15299 } 15329 }
15300 SetEntry(entry, heap->the_hole_value(), heap->the_hole_value()); 15330 SetEntry(entry, heap->the_hole_value(), heap->the_hole_value());
15301 HashTable<Shape, Key>::ElementRemoved(); 15331 HashTable<Shape, Key>::ElementRemoved();
15302 return heap->true_value(); 15332 return heap->true_value();
15303 } 15333 }
15304 15334
15305 15335
15336 // TODO(ishell): Temporary wrapper until handlified.
15337 template<typename Shape, typename Key>
15338 Handle<FixedArray> Dictionary<Shape, Key>::Shrink(
15339 Handle<Dictionary<Shape, Key> > dictionary,
15340 Key key) {
15341 CALL_HEAP_FUNCTION(dictionary->GetIsolate(),
15342 dictionary->Shrink(key),
15343 FixedArray);
15344 }
15345
15346
15306 template<typename Shape, typename Key> 15347 template<typename Shape, typename Key>
15307 MaybeObject* Dictionary<Shape, Key>::Shrink(Key key) { 15348 MaybeObject* Dictionary<Shape, Key>::Shrink(Key key) {
15308 return HashTable<Shape, Key>::Shrink(key); 15349 return HashTable<Shape, Key>::Shrink(key);
15309 } 15350 }
15310 15351
15311 15352
15312 template<typename Shape, typename Key> 15353 template<typename Shape, typename Key>
15313 MaybeObject* Dictionary<Shape, Key>::AtPut(Key key, Object* value) { 15354 MaybeObject* Dictionary<Shape, Key>::AtPut(Key key, Object* value) {
15314 int entry = this->FindEntry(key); 15355 int entry = this->FindEntry(key);
15315 15356
(...skipping 1340 matching lines...) Expand 10 before | Expand all | Expand 10 after
16656 #define ERROR_MESSAGES_TEXTS(C, T) T, 16697 #define ERROR_MESSAGES_TEXTS(C, T) T,
16657 static const char* error_messages_[] = { 16698 static const char* error_messages_[] = {
16658 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16699 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16659 }; 16700 };
16660 #undef ERROR_MESSAGES_TEXTS 16701 #undef ERROR_MESSAGES_TEXTS
16661 return error_messages_[reason]; 16702 return error_messages_[reason];
16662 } 16703 }
16663 16704
16664 16705
16665 } } // namespace v8::internal 16706 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698