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

Side by Side Diff: src/objects.cc

Issue 23496058: Handlify JSReceiver::HasProperty and friends. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 3 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') | src/objects-inl.h » ('j') | 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 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 uint32_t index, 453 uint32_t index,
454 Handle<Object> value, 454 Handle<Object> value,
455 StrictModeFlag strict_mode) { 455 StrictModeFlag strict_mode) {
456 Isolate* isolate = proxy->GetIsolate(); 456 Isolate* isolate = proxy->GetIsolate();
457 Handle<String> name = isolate->factory()->Uint32ToString(index); 457 Handle<String> name = isolate->factory()->Uint32ToString(index);
458 return SetPropertyWithHandler( 458 return SetPropertyWithHandler(
459 proxy, receiver, name, value, NONE, strict_mode); 459 proxy, receiver, name, value, NONE, strict_mode);
460 } 460 }
461 461
462 462
463 bool JSProxy::HasElementWithHandler(uint32_t index) { 463 bool JSProxy::HasElementWithHandler(Handle<JSProxy> proxy, uint32_t index) {
464 String* name; 464 Isolate* isolate = proxy->GetIsolate();
465 MaybeObject* maybe = GetHeap()->Uint32ToString(index); 465 Handle<String> name = isolate->factory()->Uint32ToString(index);
466 if (!maybe->To<String>(&name)) return maybe; 466 return HasPropertyWithHandler(proxy, name);
467 return HasPropertyWithHandler(name);
468 } 467 }
469 468
470 469
471 MaybeObject* Object::GetPropertyWithDefinedGetter(Object* receiver, 470 MaybeObject* Object::GetPropertyWithDefinedGetter(Object* receiver,
472 JSReceiver* getter) { 471 JSReceiver* getter) {
473 Isolate* isolate = getter->GetIsolate(); 472 Isolate* isolate = getter->GetIsolate();
474 HandleScope scope(isolate); 473 HandleScope scope(isolate);
475 Handle<JSReceiver> fun(getter); 474 Handle<JSReceiver> fun(getter);
476 Handle<Object> self(receiver, isolate); 475 Handle<Object> self(receiver, isolate);
477 #ifdef ENABLE_DEBUGGER_SUPPORT 476 #ifdef ENABLE_DEBUGGER_SUPPORT
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 if (mode != FORCE_DELETION) return isolate->factory()->false_value(); 732 if (mode != FORCE_DELETION) return isolate->factory()->false_value();
734 // When forced to delete global properties, we have to make a 733 // When forced to delete global properties, we have to make a
735 // map change to invalidate any ICs that think they can load 734 // map change to invalidate any ICs that think they can load
736 // from the DontDelete cell without checking if it contains 735 // from the DontDelete cell without checking if it contains
737 // the hole value. 736 // the hole value.
738 Handle<Map> new_map = Map::CopyDropDescriptors(handle(object->map())); 737 Handle<Map> new_map = Map::CopyDropDescriptors(handle(object->map()));
739 ASSERT(new_map->is_dictionary_map()); 738 ASSERT(new_map->is_dictionary_map());
740 object->set_map(*new_map); 739 object->set_map(*new_map);
741 } 740 }
742 Handle<PropertyCell> cell(PropertyCell::cast(dictionary->ValueAt(entry))); 741 Handle<PropertyCell> cell(PropertyCell::cast(dictionary->ValueAt(entry)));
743 PropertyCell::SetValueInferType(cell, isolate->factory()->the_hole_value() ); 742 Handle<Object> value = isolate->factory()->the_hole_value();
743 PropertyCell::SetValueInferType(cell, value);
744 dictionary->DetailsAtPut(entry, details.AsDeleted()); 744 dictionary->DetailsAtPut(entry, details.AsDeleted());
745 } else { 745 } else {
746 Handle<Object> deleted(dictionary->DeleteProperty(entry, mode), isolate); 746 Handle<Object> deleted(dictionary->DeleteProperty(entry, mode), isolate);
747 if (*deleted == isolate->heap()->true_value()) { 747 if (*deleted == isolate->heap()->true_value()) {
748 Handle<NameDictionary> new_properties = 748 Handle<NameDictionary> new_properties =
749 NameDictionaryShrink(dictionary, name); 749 NameDictionaryShrink(dictionary, name);
750 object->set_properties(*new_properties); 750 object->set_properties(*new_properties);
751 } 751 }
752 return deleted; 752 return deleted;
753 } 753 }
(...skipping 2656 matching lines...) Expand 10 before | Expand all | Expand 10 after
3410 if (result->IsHandler()) { 3410 if (result->IsHandler()) {
3411 return JSProxy::SetPropertyWithHandler(handle(result->proxy()), 3411 return JSProxy::SetPropertyWithHandler(handle(result->proxy()),
3412 object, key, value, attributes, strict_mode); 3412 object, key, value, attributes, strict_mode);
3413 } else { 3413 } else {
3414 return JSObject::SetPropertyForResult(Handle<JSObject>::cast(object), 3414 return JSObject::SetPropertyForResult(Handle<JSObject>::cast(object),
3415 result, key, value, attributes, strict_mode, store_mode); 3415 result, key, value, attributes, strict_mode, store_mode);
3416 } 3416 }
3417 } 3417 }
3418 3418
3419 3419
3420 bool JSProxy::HasPropertyWithHandler(Name* name_raw) { 3420 bool JSProxy::HasPropertyWithHandler(Handle<JSProxy> proxy, Handle<Name> name) {
3421 Isolate* isolate = GetIsolate(); 3421 Isolate* isolate = proxy->GetIsolate();
3422 HandleScope scope(isolate);
3423 Handle<Object> receiver(this, isolate);
3424 Handle<Object> name(name_raw, isolate);
3425 3422
3426 // TODO(rossberg): adjust once there is a story for symbols vs proxies. 3423 // TODO(rossberg): adjust once there is a story for symbols vs proxies.
3427 if (name->IsSymbol()) return false; 3424 if (name->IsSymbol()) return false;
3428 3425
3429 Handle<Object> args[] = { name }; 3426 Handle<Object> args[] = { name };
3430 Handle<Object> result = CallTrap( 3427 Handle<Object> result = proxy->CallTrap(
3431 "has", isolate->derived_has_trap(), ARRAY_SIZE(args), args); 3428 "has", isolate->derived_has_trap(), ARRAY_SIZE(args), args);
3432 if (isolate->has_pending_exception()) return false; 3429 if (isolate->has_pending_exception()) return false;
3433 3430
3434 return result->BooleanValue(); 3431 return result->BooleanValue();
3435 } 3432 }
3436 3433
3437 3434
3438 Handle<Object> JSProxy::SetPropertyWithHandler(Handle<JSProxy> proxy, 3435 Handle<Object> JSProxy::SetPropertyWithHandler(Handle<JSProxy> proxy,
3439 Handle<JSReceiver> receiver, 3436 Handle<JSReceiver> receiver,
3440 Handle<Name> name, 3437 Handle<Name> name,
(...skipping 1638 matching lines...) Expand 10 before | Expand all | Expand 10 after
5079 if (object->IsJSGlobalProxy()) { 5076 if (object->IsJSGlobalProxy()) {
5080 Handle<Object> proto(object->GetPrototype(), isolate); 5077 Handle<Object> proto(object->GetPrototype(), isolate);
5081 if (proto->IsNull()) return factory->false_value(); 5078 if (proto->IsNull()) return factory->false_value();
5082 ASSERT(proto->IsJSGlobalObject()); 5079 ASSERT(proto->IsJSGlobalObject());
5083 return DeleteElement(Handle<JSObject>::cast(proto), index, mode); 5080 return DeleteElement(Handle<JSObject>::cast(proto), index, mode);
5084 } 5081 }
5085 5082
5086 Handle<Object> old_value; 5083 Handle<Object> old_value;
5087 bool should_enqueue_change_record = false; 5084 bool should_enqueue_change_record = false;
5088 if (FLAG_harmony_observation && object->map()->is_observed()) { 5085 if (FLAG_harmony_observation && object->map()->is_observed()) {
5089 should_enqueue_change_record = object->HasLocalElement(index); 5086 should_enqueue_change_record = HasLocalElement(object, index);
5090 if (should_enqueue_change_record) { 5087 if (should_enqueue_change_record) {
5091 old_value = object->GetLocalElementAccessorPair(index) != NULL 5088 old_value = object->GetLocalElementAccessorPair(index) != NULL
5092 ? Handle<Object>::cast(factory->the_hole_value()) 5089 ? Handle<Object>::cast(factory->the_hole_value())
5093 : Object::GetElement(isolate, object, index); 5090 : Object::GetElement(isolate, object, index);
5094 } 5091 }
5095 } 5092 }
5096 5093
5097 // Skip interceptor if forcing deletion. 5094 // Skip interceptor if forcing deletion.
5098 Handle<Object> result; 5095 Handle<Object> result;
5099 if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) { 5096 if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) {
5100 result = DeleteElementWithInterceptor(object, index); 5097 result = DeleteElementWithInterceptor(object, index);
5101 } else { 5098 } else {
5102 result = AccessorDelete(object, index, mode); 5099 result = AccessorDelete(object, index, mode);
5103 } 5100 }
5104 5101
5105 if (should_enqueue_change_record && !object->HasLocalElement(index)) { 5102 if (should_enqueue_change_record && !HasLocalElement(object, index)) {
5106 Handle<String> name = factory->Uint32ToString(index); 5103 Handle<String> name = factory->Uint32ToString(index);
5107 EnqueueChangeRecord(object, "deleted", name, old_value); 5104 EnqueueChangeRecord(object, "deleted", name, old_value);
5108 } 5105 }
5109 5106
5110 return result; 5107 return result;
5111 } 5108 }
5112 5109
5113 5110
5114 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> object, 5111 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> object,
5115 Handle<Name> name, 5112 Handle<Name> name,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
5170 } else { 5167 } else {
5171 result = DeletePropertyWithInterceptor(object, name); 5168 result = DeletePropertyWithInterceptor(object, name);
5172 } 5169 }
5173 } else { 5170 } else {
5174 // Normalize object if needed. 5171 // Normalize object if needed.
5175 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); 5172 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0);
5176 // Make sure the properties are normalized before removing the entry. 5173 // Make sure the properties are normalized before removing the entry.
5177 result = DeleteNormalizedProperty(object, name, mode); 5174 result = DeleteNormalizedProperty(object, name, mode);
5178 } 5175 }
5179 5176
5180 if (is_observed && !object->HasLocalProperty(*name)) { 5177 if (is_observed && !HasLocalProperty(object, name)) {
5181 EnqueueChangeRecord(object, "deleted", name, old_value); 5178 EnqueueChangeRecord(object, "deleted", name, old_value);
5182 } 5179 }
5183 5180
5184 return result; 5181 return result;
5185 } 5182 }
5186 5183
5187 5184
5188 Handle<Object> JSReceiver::DeleteElement(Handle<JSReceiver> object, 5185 Handle<Object> JSReceiver::DeleteElement(Handle<JSReceiver> object,
5189 uint32_t index, 5186 uint32_t index,
5190 DeleteMode mode) { 5187 DeleteMode mode) {
(...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after
6121 if (!object->CanSetCallback(*name)) return; 6118 if (!object->CanSetCallback(*name)) return;
6122 6119
6123 uint32_t index = 0; 6120 uint32_t index = 0;
6124 bool is_element = name->AsArrayIndex(&index); 6121 bool is_element = name->AsArrayIndex(&index);
6125 6122
6126 Handle<Object> old_value = isolate->factory()->the_hole_value(); 6123 Handle<Object> old_value = isolate->factory()->the_hole_value();
6127 bool is_observed = FLAG_harmony_observation && object->map()->is_observed(); 6124 bool is_observed = FLAG_harmony_observation && object->map()->is_observed();
6128 bool preexists = false; 6125 bool preexists = false;
6129 if (is_observed) { 6126 if (is_observed) {
6130 if (is_element) { 6127 if (is_element) {
6131 preexists = object->HasLocalElement(index); 6128 preexists = HasLocalElement(object, index);
6132 if (preexists && object->GetLocalElementAccessorPair(index) == NULL) { 6129 if (preexists && object->GetLocalElementAccessorPair(index) == NULL) {
6133 old_value = Object::GetElement(isolate, object, index); 6130 old_value = Object::GetElement(isolate, object, index);
6134 } 6131 }
6135 } else { 6132 } else {
6136 LookupResult lookup(isolate); 6133 LookupResult lookup(isolate);
6137 object->LocalLookup(*name, &lookup, true); 6134 object->LocalLookup(*name, &lookup, true);
6138 preexists = lookup.IsProperty(); 6135 preexists = lookup.IsProperty();
6139 if (preexists && lookup.IsDataProperty()) { 6136 if (preexists && lookup.IsDataProperty()) {
6140 old_value = Object::GetProperty(object, name); 6137 old_value = Object::GetProperty(object, name);
6141 } 6138 }
(...skipping 9965 matching lines...) Expand 10 before | Expand all | Expand 10 after
16107 #define ERROR_MESSAGES_TEXTS(C, T) T, 16104 #define ERROR_MESSAGES_TEXTS(C, T) T,
16108 static const char* error_messages_[] = { 16105 static const char* error_messages_[] = {
16109 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16106 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16110 }; 16107 };
16111 #undef ERROR_MESSAGES_TEXTS 16108 #undef ERROR_MESSAGES_TEXTS
16112 return error_messages_[reason]; 16109 return error_messages_[reason];
16113 } 16110 }
16114 16111
16115 16112
16116 } } // namespace v8::internal 16113 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698