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 6529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6540 !isolate->MayNamedAccess(*object, *name, v8::ACCESS_HAS)) { | 6540 !isolate->MayNamedAccess(*object, *name, v8::ACCESS_HAS)) { |
6541 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_HAS); | 6541 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_HAS); |
6542 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 6542 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
6543 return isolate->factory()->undefined_value(); | 6543 return isolate->factory()->undefined_value(); |
6544 } | 6544 } |
6545 | 6545 |
6546 // Make the lookup and include prototypes. | 6546 // Make the lookup and include prototypes. |
6547 uint32_t index = 0; | 6547 uint32_t index = 0; |
6548 if (name->AsArrayIndex(&index)) { | 6548 if (name->AsArrayIndex(&index)) { |
6549 for (Handle<Object> obj = object; | 6549 for (Handle<Object> obj = object; |
6550 *obj != isolate->heap()->null_value(); | 6550 !obj->IsNull(); |
6551 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { | 6551 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { |
6552 if (obj->IsJSObject() && JSObject::cast(*obj)->HasDictionaryElements()) { | 6552 if (obj->IsJSObject() && JSObject::cast(*obj)->HasDictionaryElements()) { |
6553 JSObject* js_object = JSObject::cast(*obj); | 6553 JSObject* js_object = JSObject::cast(*obj); |
6554 SeededNumberDictionary* dictionary = js_object->element_dictionary(); | 6554 SeededNumberDictionary* dictionary = js_object->element_dictionary(); |
6555 int entry = dictionary->FindEntry(index); | 6555 int entry = dictionary->FindEntry(index); |
6556 if (entry != SeededNumberDictionary::kNotFound) { | 6556 if (entry != SeededNumberDictionary::kNotFound) { |
6557 Object* element = dictionary->ValueAt(entry); | 6557 Object* element = dictionary->ValueAt(entry); |
6558 if (dictionary->DetailsAt(entry).type() == CALLBACKS && | 6558 if (dictionary->DetailsAt(entry).type() == CALLBACKS && |
6559 element->IsAccessorPair()) { | 6559 element->IsAccessorPair()) { |
6560 return handle(AccessorPair::cast(element)->GetComponent(component), | 6560 return handle(AccessorPair::cast(element)->GetComponent(component), |
6561 isolate); | 6561 isolate); |
6562 } | 6562 } |
6563 } | 6563 } |
6564 } | 6564 } |
6565 } | 6565 } |
6566 } else { | 6566 } else { |
6567 for (Handle<Object> obj = object; | 6567 for (Handle<Object> obj = object; |
6568 *obj != isolate->heap()->null_value(); | 6568 !obj->IsNull(); |
6569 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { | 6569 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { |
6570 LookupResult result(isolate); | 6570 LookupResult result(isolate); |
6571 JSReceiver::cast(*obj)->LocalLookup(*name, &result); | 6571 JSReceiver::cast(*obj)->LocalLookup(*name, &result); |
6572 if (result.IsFound()) { | 6572 if (result.IsFound()) { |
6573 if (result.IsReadOnly()) return isolate->factory()->undefined_value(); | 6573 if (result.IsReadOnly()) return isolate->factory()->undefined_value(); |
6574 if (result.IsPropertyCallbacks()) { | 6574 if (result.IsPropertyCallbacks()) { |
6575 Object* obj = result.GetCallbackObject(); | 6575 Object* obj = result.GetCallbackObject(); |
6576 if (obj->IsAccessorPair()) { | 6576 if (obj->IsAccessorPair()) { |
6577 return handle(AccessorPair::cast(obj)->GetComponent(component), | 6577 return handle(AccessorPair::cast(obj)->GetComponent(component), |
6578 isolate); | 6578 isolate); |
(...skipping 6581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13160 result_internal->VerifyApiCallResultType(); | 13160 result_internal->VerifyApiCallResultType(); |
13161 // Rebox handle to escape this scope. | 13161 // Rebox handle to escape this scope. |
13162 return handle(*result_internal, isolate); | 13162 return handle(*result_internal, isolate); |
13163 } | 13163 } |
13164 } | 13164 } |
13165 | 13165 |
13166 return GetPropertyPostInterceptor(object, receiver, name, attributes); | 13166 return GetPropertyPostInterceptor(object, receiver, name, attributes); |
13167 } | 13167 } |
13168 | 13168 |
13169 | 13169 |
13170 bool JSObject::HasRealNamedProperty(Isolate* isolate, Name* key) { | 13170 bool JSObject::HasRealNamedProperty(Handle<JSObject> object, |
| 13171 Handle<Name> key) { |
| 13172 Isolate* isolate = object->GetIsolate(); |
| 13173 SealHandleScope shs(isolate); |
13171 // Check access rights if needed. | 13174 // Check access rights if needed. |
13172 if (IsAccessCheckNeeded()) { | 13175 if (object->IsAccessCheckNeeded()) { |
13173 if (!isolate->MayNamedAccess(this, key, v8::ACCESS_HAS)) { | 13176 if (!isolate->MayNamedAccess(*object, *key, v8::ACCESS_HAS)) { |
13174 isolate->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 13177 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_HAS); |
13175 return false; | 13178 return false; |
13176 } | 13179 } |
13177 } | 13180 } |
13178 | 13181 |
13179 LookupResult result(isolate); | 13182 LookupResult result(isolate); |
13180 LocalLookupRealNamedProperty(key, &result); | 13183 object->LocalLookupRealNamedProperty(*key, &result); |
13181 return result.IsFound() && !result.IsInterceptor(); | 13184 return result.IsFound() && !result.IsInterceptor(); |
13182 } | 13185 } |
13183 | 13186 |
13184 | 13187 |
13185 bool JSObject::HasRealElementProperty(Isolate* isolate, uint32_t index) { | 13188 bool JSObject::HasRealElementProperty(Handle<JSObject> object, uint32_t index) { |
| 13189 Isolate* isolate = object->GetIsolate(); |
| 13190 SealHandleScope shs(isolate); |
13186 // Check access rights if needed. | 13191 // Check access rights if needed. |
13187 if (IsAccessCheckNeeded()) { | 13192 if (object->IsAccessCheckNeeded()) { |
13188 if (!isolate->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 13193 if (!isolate->MayIndexedAccess(*object, index, v8::ACCESS_HAS)) { |
13189 isolate->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 13194 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_HAS); |
13190 return false; | 13195 return false; |
13191 } | 13196 } |
13192 } | 13197 } |
13193 | 13198 |
13194 if (IsJSGlobalProxy()) { | 13199 if (object->IsJSGlobalProxy()) { |
13195 Object* proto = GetPrototype(); | 13200 HandleScope scope(isolate); |
| 13201 Handle<Object> proto(object->GetPrototype(), isolate); |
13196 if (proto->IsNull()) return false; | 13202 if (proto->IsNull()) return false; |
13197 ASSERT(proto->IsJSGlobalObject()); | 13203 ASSERT(proto->IsJSGlobalObject()); |
13198 return JSObject::cast(proto)->HasRealElementProperty(isolate, index); | 13204 return HasRealElementProperty(Handle<JSObject>::cast(proto), index); |
13199 } | 13205 } |
13200 | 13206 |
13201 return GetElementAttributeWithoutInterceptor(this, index, false) != ABSENT; | 13207 return object->GetElementAttributeWithoutInterceptor( |
| 13208 *object, index, false) != ABSENT; |
13202 } | 13209 } |
13203 | 13210 |
13204 | 13211 |
13205 bool JSObject::HasRealNamedCallbackProperty(Isolate* isolate, Name* key) { | 13212 bool JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object, |
| 13213 Handle<Name> key) { |
| 13214 Isolate* isolate = object->GetIsolate(); |
| 13215 SealHandleScope shs(isolate); |
13206 // Check access rights if needed. | 13216 // Check access rights if needed. |
13207 if (IsAccessCheckNeeded()) { | 13217 if (object->IsAccessCheckNeeded()) { |
13208 if (!isolate->MayNamedAccess(this, key, v8::ACCESS_HAS)) { | 13218 if (!isolate->MayNamedAccess(*object, *key, v8::ACCESS_HAS)) { |
13209 isolate->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 13219 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_HAS); |
13210 return false; | 13220 return false; |
13211 } | 13221 } |
13212 } | 13222 } |
13213 | 13223 |
13214 LookupResult result(isolate); | 13224 LookupResult result(isolate); |
13215 LocalLookupRealNamedProperty(key, &result); | 13225 object->LocalLookupRealNamedProperty(*key, &result); |
13216 return result.IsPropertyCallbacks(); | 13226 return result.IsPropertyCallbacks(); |
13217 } | 13227 } |
13218 | 13228 |
13219 | 13229 |
13220 int JSObject::NumberOfLocalProperties(PropertyAttributes filter) { | 13230 int JSObject::NumberOfLocalProperties(PropertyAttributes filter) { |
13221 if (HasFastProperties()) { | 13231 if (HasFastProperties()) { |
13222 Map* map = this->map(); | 13232 Map* map = this->map(); |
13223 if (filter == NONE) return map->NumberOfOwnDescriptors(); | 13233 if (filter == NONE) return map->NumberOfOwnDescriptors(); |
13224 if (filter & DONT_ENUM) { | 13234 if (filter & DONT_ENUM) { |
13225 int result = map->EnumLength(); | 13235 int result = map->EnumLength(); |
(...skipping 3138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16364 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16374 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16365 static const char* error_messages_[] = { | 16375 static const char* error_messages_[] = { |
16366 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16376 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16367 }; | 16377 }; |
16368 #undef ERROR_MESSAGES_TEXTS | 16378 #undef ERROR_MESSAGES_TEXTS |
16369 return error_messages_[reason]; | 16379 return error_messages_[reason]; |
16370 } | 16380 } |
16371 | 16381 |
16372 | 16382 |
16373 } } // namespace v8::internal | 16383 } } // namespace v8::internal |
OLD | NEW |