| 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 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 break; | 544 break; |
| 545 } | 545 } |
| 546 default: | 546 default: |
| 547 UNREACHABLE(); | 547 UNREACHABLE(); |
| 548 } | 548 } |
| 549 } | 549 } |
| 550 | 550 |
| 551 // No accessible property found. | 551 // No accessible property found. |
| 552 *attributes = ABSENT; | 552 *attributes = ABSENT; |
| 553 Heap* heap = name->GetHeap(); | 553 Heap* heap = name->GetHeap(); |
| 554 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_GET); | 554 Isolate* isolate = heap->isolate(); |
| 555 isolate->ReportFailedAccessCheck(this, v8::ACCESS_GET); |
| 556 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 555 return heap->undefined_value(); | 557 return heap->undefined_value(); |
| 556 } | 558 } |
| 557 | 559 |
| 558 | 560 |
| 559 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( | 561 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( |
| 560 Object* receiver, | 562 Object* receiver, |
| 561 LookupResult* result, | 563 LookupResult* result, |
| 562 Name* name, | 564 Name* name, |
| 563 bool continue_search) { | 565 bool continue_search) { |
| 564 if (result->IsProperty()) { | 566 if (result->IsProperty()) { |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 // Inline the case for JSObjects. Doing so significantly improves the | 920 // Inline the case for JSObjects. Doing so significantly improves the |
| 919 // performance of fetching elements where checking the prototype chain is | 921 // performance of fetching elements where checking the prototype chain is |
| 920 // necessary. | 922 // necessary. |
| 921 JSObject* js_object = JSObject::cast(holder); | 923 JSObject* js_object = JSObject::cast(holder); |
| 922 | 924 |
| 923 // Check access rights if needed. | 925 // Check access rights if needed. |
| 924 if (js_object->IsAccessCheckNeeded()) { | 926 if (js_object->IsAccessCheckNeeded()) { |
| 925 Isolate* isolate = heap->isolate(); | 927 Isolate* isolate = heap->isolate(); |
| 926 if (!isolate->MayIndexedAccess(js_object, index, v8::ACCESS_GET)) { | 928 if (!isolate->MayIndexedAccess(js_object, index, v8::ACCESS_GET)) { |
| 927 isolate->ReportFailedAccessCheck(js_object, v8::ACCESS_GET); | 929 isolate->ReportFailedAccessCheck(js_object, v8::ACCESS_GET); |
| 930 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 928 return heap->undefined_value(); | 931 return heap->undefined_value(); |
| 929 } | 932 } |
| 930 } | 933 } |
| 931 | 934 |
| 932 if (js_object->HasIndexedInterceptor()) { | 935 if (js_object->HasIndexedInterceptor()) { |
| 933 return js_object->GetElementWithInterceptor(receiver, index); | 936 return js_object->GetElementWithInterceptor(receiver, index); |
| 934 } | 937 } |
| 935 | 938 |
| 936 if (js_object->elements() != heap->empty_fixed_array()) { | 939 if (js_object->elements() != heap->empty_fixed_array()) { |
| 937 MaybeObject* result = js_object->GetElementsAccessor()->Get( | 940 MaybeObject* result = js_object->GetElementsAccessor()->Get( |
| (...skipping 2419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3357 break; | 3360 break; |
| 3358 } | 3361 } |
| 3359 } | 3362 } |
| 3360 } | 3363 } |
| 3361 } | 3364 } |
| 3362 | 3365 |
| 3363 Isolate* isolate = GetIsolate(); | 3366 Isolate* isolate = GetIsolate(); |
| 3364 HandleScope scope(isolate); | 3367 HandleScope scope(isolate); |
| 3365 Handle<Object> value_handle(value, isolate); | 3368 Handle<Object> value_handle(value, isolate); |
| 3366 isolate->ReportFailedAccessCheck(this, v8::ACCESS_SET); | 3369 isolate->ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 3370 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 3367 return *value_handle; | 3371 return *value_handle; |
| 3368 } | 3372 } |
| 3369 | 3373 |
| 3370 | 3374 |
| 3371 MaybeObject* JSReceiver::SetProperty(LookupResult* result, | 3375 MaybeObject* JSReceiver::SetProperty(LookupResult* result, |
| 3372 Name* key, | 3376 Name* key, |
| 3373 Object* value, | 3377 Object* value, |
| 3374 PropertyAttributes attributes, | 3378 PropertyAttributes attributes, |
| 3375 StrictModeFlag strict_mode, | 3379 StrictModeFlag strict_mode, |
| 3376 JSReceiver::StoreFromKeyed store_mode) { | 3380 JSReceiver::StoreFromKeyed store_mode) { |
| (...skipping 1675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5052 Object); | 5056 Object); |
| 5053 } | 5057 } |
| 5054 | 5058 |
| 5055 | 5059 |
| 5056 MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { | 5060 MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { |
| 5057 Isolate* isolate = GetIsolate(); | 5061 Isolate* isolate = GetIsolate(); |
| 5058 // Check access rights if needed. | 5062 // Check access rights if needed. |
| 5059 if (IsAccessCheckNeeded() && | 5063 if (IsAccessCheckNeeded() && |
| 5060 !isolate->MayIndexedAccess(this, index, v8::ACCESS_DELETE)) { | 5064 !isolate->MayIndexedAccess(this, index, v8::ACCESS_DELETE)) { |
| 5061 isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); | 5065 isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); |
| 5066 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 5062 return isolate->heap()->false_value(); | 5067 return isolate->heap()->false_value(); |
| 5063 } | 5068 } |
| 5064 | 5069 |
| 5065 if (IsStringObjectWithCharacterAt(index)) { | 5070 if (IsStringObjectWithCharacterAt(index)) { |
| 5066 if (mode == STRICT_DELETION) { | 5071 if (mode == STRICT_DELETION) { |
| 5067 // Deleting a non-configurable property in strict mode. | 5072 // Deleting a non-configurable property in strict mode. |
| 5068 HandleScope scope(isolate); | 5073 HandleScope scope(isolate); |
| 5069 Handle<Object> holder(this, isolate); | 5074 Handle<Object> holder(this, isolate); |
| 5070 Handle<Object> name = isolate->factory()->NewNumberFromUint(index); | 5075 Handle<Object> name = isolate->factory()->NewNumberFromUint(index); |
| 5071 Handle<Object> args[2] = { name, holder }; | 5076 Handle<Object> args[2] = { name, holder }; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5129 | 5134 |
| 5130 MaybeObject* JSObject::DeleteProperty(Name* name, DeleteMode mode) { | 5135 MaybeObject* JSObject::DeleteProperty(Name* name, DeleteMode mode) { |
| 5131 Isolate* isolate = GetIsolate(); | 5136 Isolate* isolate = GetIsolate(); |
| 5132 // ECMA-262, 3rd, 8.6.2.5 | 5137 // ECMA-262, 3rd, 8.6.2.5 |
| 5133 ASSERT(name->IsName()); | 5138 ASSERT(name->IsName()); |
| 5134 | 5139 |
| 5135 // Check access rights if needed. | 5140 // Check access rights if needed. |
| 5136 if (IsAccessCheckNeeded() && | 5141 if (IsAccessCheckNeeded() && |
| 5137 !isolate->MayNamedAccess(this, name, v8::ACCESS_DELETE)) { | 5142 !isolate->MayNamedAccess(this, name, v8::ACCESS_DELETE)) { |
| 5138 isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); | 5143 isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); |
| 5144 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 5139 return isolate->heap()->false_value(); | 5145 return isolate->heap()->false_value(); |
| 5140 } | 5146 } |
| 5141 | 5147 |
| 5142 if (IsJSGlobalProxy()) { | 5148 if (IsJSGlobalProxy()) { |
| 5143 Object* proto = GetPrototype(); | 5149 Object* proto = GetPrototype(); |
| 5144 if (proto->IsNull()) return isolate->heap()->false_value(); | 5150 if (proto->IsNull()) return isolate->heap()->false_value(); |
| 5145 ASSERT(proto->IsJSGlobalObject()); | 5151 ASSERT(proto->IsJSGlobalObject()); |
| 5146 return JSGlobalObject::cast(proto)->DeleteProperty(name, mode); | 5152 return JSGlobalObject::cast(proto)->DeleteProperty(name, mode); |
| 5147 } | 5153 } |
| 5148 | 5154 |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5359 } | 5365 } |
| 5360 | 5366 |
| 5361 | 5367 |
| 5362 MaybeObject* JSObject::PreventExtensions() { | 5368 MaybeObject* JSObject::PreventExtensions() { |
| 5363 Isolate* isolate = GetIsolate(); | 5369 Isolate* isolate = GetIsolate(); |
| 5364 if (IsAccessCheckNeeded() && | 5370 if (IsAccessCheckNeeded() && |
| 5365 !isolate->MayNamedAccess(this, | 5371 !isolate->MayNamedAccess(this, |
| 5366 isolate->heap()->undefined_value(), | 5372 isolate->heap()->undefined_value(), |
| 5367 v8::ACCESS_KEYS)) { | 5373 v8::ACCESS_KEYS)) { |
| 5368 isolate->ReportFailedAccessCheck(this, v8::ACCESS_KEYS); | 5374 isolate->ReportFailedAccessCheck(this, v8::ACCESS_KEYS); |
| 5375 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 5369 return isolate->heap()->false_value(); | 5376 return isolate->heap()->false_value(); |
| 5370 } | 5377 } |
| 5371 | 5378 |
| 5372 if (IsJSGlobalProxy()) { | 5379 if (IsJSGlobalProxy()) { |
| 5373 Object* proto = GetPrototype(); | 5380 Object* proto = GetPrototype(); |
| 5374 if (proto->IsNull()) return this; | 5381 if (proto->IsNull()) return this; |
| 5375 ASSERT(proto->IsJSGlobalObject()); | 5382 ASSERT(proto->IsJSGlobalObject()); |
| 5376 return JSObject::cast(proto)->PreventExtensions(); | 5383 return JSObject::cast(proto)->PreventExtensions(); |
| 5377 } | 5384 } |
| 5378 | 5385 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5437 | 5444 |
| 5438 Heap* heap = isolate->heap(); | 5445 Heap* heap = isolate->heap(); |
| 5439 | 5446 |
| 5440 if (map()->is_frozen()) return this; | 5447 if (map()->is_frozen()) return this; |
| 5441 | 5448 |
| 5442 if (IsAccessCheckNeeded() && | 5449 if (IsAccessCheckNeeded() && |
| 5443 !isolate->MayNamedAccess(this, | 5450 !isolate->MayNamedAccess(this, |
| 5444 heap->undefined_value(), | 5451 heap->undefined_value(), |
| 5445 v8::ACCESS_KEYS)) { | 5452 v8::ACCESS_KEYS)) { |
| 5446 isolate->ReportFailedAccessCheck(this, v8::ACCESS_KEYS); | 5453 isolate->ReportFailedAccessCheck(this, v8::ACCESS_KEYS); |
| 5454 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 5447 return heap->false_value(); | 5455 return heap->false_value(); |
| 5448 } | 5456 } |
| 5449 | 5457 |
| 5450 if (IsJSGlobalProxy()) { | 5458 if (IsJSGlobalProxy()) { |
| 5451 Object* proto = GetPrototype(); | 5459 Object* proto = GetPrototype(); |
| 5452 if (proto->IsNull()) return this; | 5460 if (proto->IsNull()) return this; |
| 5453 ASSERT(proto->IsJSGlobalObject()); | 5461 ASSERT(proto->IsJSGlobalObject()); |
| 5454 return JSObject::cast(proto)->Freeze(isolate); | 5462 return JSObject::cast(proto)->Freeze(isolate); |
| 5455 } | 5463 } |
| 5456 | 5464 |
| (...skipping 793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6250 } | 6258 } |
| 6251 | 6259 |
| 6252 | 6260 |
| 6253 MaybeObject* JSObject::DefineAccessor(AccessorInfo* info) { | 6261 MaybeObject* JSObject::DefineAccessor(AccessorInfo* info) { |
| 6254 Isolate* isolate = GetIsolate(); | 6262 Isolate* isolate = GetIsolate(); |
| 6255 Name* name = Name::cast(info->name()); | 6263 Name* name = Name::cast(info->name()); |
| 6256 // Check access rights if needed. | 6264 // Check access rights if needed. |
| 6257 if (IsAccessCheckNeeded() && | 6265 if (IsAccessCheckNeeded() && |
| 6258 !isolate->MayNamedAccess(this, name, v8::ACCESS_SET)) { | 6266 !isolate->MayNamedAccess(this, name, v8::ACCESS_SET)) { |
| 6259 isolate->ReportFailedAccessCheck(this, v8::ACCESS_SET); | 6267 isolate->ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 6268 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 6260 return isolate->heap()->undefined_value(); | 6269 return isolate->heap()->undefined_value(); |
| 6261 } | 6270 } |
| 6262 | 6271 |
| 6263 if (IsJSGlobalProxy()) { | 6272 if (IsJSGlobalProxy()) { |
| 6264 Object* proto = GetPrototype(); | 6273 Object* proto = GetPrototype(); |
| 6265 if (proto->IsNull()) return this; | 6274 if (proto->IsNull()) return this; |
| 6266 ASSERT(proto->IsJSGlobalObject()); | 6275 ASSERT(proto->IsJSGlobalObject()); |
| 6267 return JSObject::cast(proto)->DefineAccessor(info); | 6276 return JSObject::cast(proto)->DefineAccessor(info); |
| 6268 } | 6277 } |
| 6269 | 6278 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6325 | 6334 |
| 6326 MaybeObject* maybe_ok = | 6335 MaybeObject* maybe_ok = |
| 6327 SetPropertyCallback(name, info, info->property_attributes()); | 6336 SetPropertyCallback(name, info, info->property_attributes()); |
| 6328 if (maybe_ok->IsFailure()) return maybe_ok; | 6337 if (maybe_ok->IsFailure()) return maybe_ok; |
| 6329 } | 6338 } |
| 6330 | 6339 |
| 6331 return this; | 6340 return this; |
| 6332 } | 6341 } |
| 6333 | 6342 |
| 6334 | 6343 |
| 6335 Object* JSObject::LookupAccessor(Name* name, AccessorComponent component) { | 6344 MaybeObject* JSObject::LookupAccessor(Name* name, AccessorComponent component) { |
| 6336 Heap* heap = GetHeap(); | 6345 Heap* heap = GetHeap(); |
| 6337 | 6346 |
| 6338 // Make sure that the top context does not change when doing callbacks or | 6347 // Make sure that the top context does not change when doing callbacks or |
| 6339 // interceptor calls. | 6348 // interceptor calls. |
| 6340 AssertNoContextChange ncc; | 6349 AssertNoContextChange ncc; |
| 6341 | 6350 |
| 6342 // Check access rights if needed. | 6351 // Check access rights if needed. |
| 6343 if (IsAccessCheckNeeded() && | 6352 if (IsAccessCheckNeeded() && |
| 6344 !heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_HAS)) { | 6353 !heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_HAS)) { |
| 6345 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 6354 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
| 6355 RETURN_IF_SCHEDULED_EXCEPTION(heap->isolate()); |
| 6346 return heap->undefined_value(); | 6356 return heap->undefined_value(); |
| 6347 } | 6357 } |
| 6348 | 6358 |
| 6349 // Make the lookup and include prototypes. | 6359 // Make the lookup and include prototypes. |
| 6350 uint32_t index = 0; | 6360 uint32_t index = 0; |
| 6351 if (name->AsArrayIndex(&index)) { | 6361 if (name->AsArrayIndex(&index)) { |
| 6352 for (Object* obj = this; | 6362 for (Object* obj = this; |
| 6353 obj != heap->null_value(); | 6363 obj != heap->null_value(); |
| 6354 obj = JSReceiver::cast(obj)->GetPrototype()) { | 6364 obj = JSReceiver::cast(obj)->GetPrototype()) { |
| 6355 if (obj->IsJSObject() && JSObject::cast(obj)->HasDictionaryElements()) { | 6365 if (obj->IsJSObject() && JSObject::cast(obj)->HasDictionaryElements()) { |
| (...skipping 5702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12058 PropertyAttributes attributes, | 12068 PropertyAttributes attributes, |
| 12059 StrictModeFlag strict_mode, | 12069 StrictModeFlag strict_mode, |
| 12060 bool check_prototype, | 12070 bool check_prototype, |
| 12061 SetPropertyMode set_mode) { | 12071 SetPropertyMode set_mode) { |
| 12062 Isolate* isolate = GetIsolate(); | 12072 Isolate* isolate = GetIsolate(); |
| 12063 | 12073 |
| 12064 // Check access rights if needed. | 12074 // Check access rights if needed. |
| 12065 if (IsAccessCheckNeeded()) { | 12075 if (IsAccessCheckNeeded()) { |
| 12066 if (!isolate->MayIndexedAccess(this, index, v8::ACCESS_SET)) { | 12076 if (!isolate->MayIndexedAccess(this, index, v8::ACCESS_SET)) { |
| 12067 isolate->ReportFailedAccessCheck(this, v8::ACCESS_SET); | 12077 isolate->ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 12078 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 12068 return value_raw; | 12079 return value_raw; |
| 12069 } | 12080 } |
| 12070 } | 12081 } |
| 12071 | 12082 |
| 12072 if (IsJSGlobalProxy()) { | 12083 if (IsJSGlobalProxy()) { |
| 12073 Object* proto = GetPrototype(); | 12084 Object* proto = GetPrototype(); |
| 12074 if (proto->IsNull()) return value_raw; | 12085 if (proto->IsNull()) return value_raw; |
| 12075 ASSERT(proto->IsJSGlobalObject()); | 12086 ASSERT(proto->IsJSGlobalObject()); |
| 12076 return JSObject::cast(proto)->SetElement(index, | 12087 return JSObject::cast(proto)->SetElement(index, |
| 12077 value_raw, | 12088 value_raw, |
| (...skipping 3792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15870 | 15881 |
| 15871 void PropertyCell::AddDependentCode(Handle<Code> code) { | 15882 void PropertyCell::AddDependentCode(Handle<Code> code) { |
| 15872 Handle<DependentCode> codes = DependentCode::Insert( | 15883 Handle<DependentCode> codes = DependentCode::Insert( |
| 15873 Handle<DependentCode>(dependent_code()), | 15884 Handle<DependentCode>(dependent_code()), |
| 15874 DependentCode::kPropertyCellChangedGroup, code); | 15885 DependentCode::kPropertyCellChangedGroup, code); |
| 15875 if (*codes != dependent_code()) set_dependent_code(*codes); | 15886 if (*codes != dependent_code()) set_dependent_code(*codes); |
| 15876 } | 15887 } |
| 15877 | 15888 |
| 15878 | 15889 |
| 15879 } } // namespace v8::internal | 15890 } } // namespace v8::internal |
| OLD | NEW |