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

Side by Side Diff: src/objects.cc

Issue 234913003: Allow allocation and GC in access check callbacks. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: added TODOs, addressed comments 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/isolate.cc ('k') | src/runtime.cc » ('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 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 } 545 }
546 break; 546 break;
547 } 547 }
548 default: 548 default:
549 UNREACHABLE(); 549 UNREACHABLE();
550 } 550 }
551 } 551 }
552 552
553 // No accessible property found. 553 // No accessible property found.
554 *attributes = ABSENT; 554 *attributes = ABSENT;
555 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_GET); 555 isolate->ReportFailedAccessCheck(object, v8::ACCESS_GET);
556 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 556 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
557 return isolate->factory()->undefined_value(); 557 return isolate->factory()->undefined_value();
558 } 558 }
559 559
560 560
561 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( 561 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck(
562 Handle<JSObject> object, 562 Handle<JSObject> object,
563 LookupResult* result, 563 LookupResult* result,
564 Handle<Name> name, 564 Handle<Name> name,
565 bool continue_search) { 565 bool continue_search) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 return GetPropertyAttributeWithFailedAccessCheck( 609 return GetPropertyAttributeWithFailedAccessCheck(
610 object, &r, name, continue_search); 610 object, &r, name, continue_search);
611 } 611 }
612 612
613 case HANDLER: 613 case HANDLER:
614 case NONEXISTENT: 614 case NONEXISTENT:
615 UNREACHABLE(); 615 UNREACHABLE();
616 } 616 }
617 } 617 }
618 618
619 object->GetIsolate()->ReportFailedAccessCheckWrapper(object, v8::ACCESS_HAS); 619 object->GetIsolate()->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
620 // TODO(yangguo): Issue 3269, check for scheduled exception missing?
620 return ABSENT; 621 return ABSENT;
621 } 622 }
622 623
623 624
624 Object* JSObject::GetNormalizedProperty(const LookupResult* result) { 625 Object* JSObject::GetNormalizedProperty(const LookupResult* result) {
625 ASSERT(!HasFastProperties()); 626 ASSERT(!HasFastProperties());
626 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry()); 627 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry());
627 if (IsGlobalObject()) { 628 if (IsGlobalObject()) {
628 value = PropertyCell::cast(value)->value(); 629 value = PropertyCell::cast(value)->value();
629 } 630 }
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 : Handle<Object>::cast(factory->null_value()); 797 : Handle<Object>::cast(factory->null_value());
797 for (Handle<Object> current = object; 798 for (Handle<Object> current = object;
798 true; 799 true;
799 current = Handle<Object>(current->GetPrototype(isolate), isolate)) { 800 current = Handle<Object>(current->GetPrototype(isolate), isolate)) {
800 if (current->IsAccessCheckNeeded()) { 801 if (current->IsAccessCheckNeeded()) {
801 // Check if we're allowed to read from the current object. Note 802 // Check if we're allowed to read from the current object. Note
802 // that even though we may not actually end up loading the named 803 // that even though we may not actually end up loading the named
803 // property from the current object, we still check that we have 804 // property from the current object, we still check that we have
804 // access to it. 805 // access to it.
805 Handle<JSObject> checked = Handle<JSObject>::cast(current); 806 Handle<JSObject> checked = Handle<JSObject>::cast(current);
806 if (!isolate->MayNamedAccessWrapper(checked, name, v8::ACCESS_GET)) { 807 if (!isolate->MayNamedAccess(checked, name, v8::ACCESS_GET)) {
807 return JSObject::GetPropertyWithFailedAccessCheck( 808 return JSObject::GetPropertyWithFailedAccessCheck(
808 checked, receiver, result, name, attributes); 809 checked, receiver, result, name, attributes);
809 } 810 }
810 } 811 }
811 // Stop traversing the chain once we reach the last object in the 812 // Stop traversing the chain once we reach the last object in the
812 // chain; either the holder of the result or null in case of an 813 // chain; either the holder of the result or null in case of an
813 // absent property. 814 // absent property.
814 if (current.is_identical_to(last)) break; 815 if (current.is_identical_to(last)) break;
815 } 816 }
816 } 817 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 } 893 }
893 } 894 }
894 895
895 // Inline the case for JSObjects. Doing so significantly improves the 896 // Inline the case for JSObjects. Doing so significantly improves the
896 // performance of fetching elements where checking the prototype chain is 897 // performance of fetching elements where checking the prototype chain is
897 // necessary. 898 // necessary.
898 Handle<JSObject> js_object = Handle<JSObject>::cast(holder); 899 Handle<JSObject> js_object = Handle<JSObject>::cast(holder);
899 900
900 // Check access rights if needed. 901 // Check access rights if needed.
901 if (js_object->IsAccessCheckNeeded()) { 902 if (js_object->IsAccessCheckNeeded()) {
902 if (!isolate->MayIndexedAccessWrapper(js_object, index, v8::ACCESS_GET)) { 903 if (!isolate->MayIndexedAccess(js_object, index, v8::ACCESS_GET)) {
903 isolate->ReportFailedAccessCheckWrapper(js_object, v8::ACCESS_GET); 904 isolate->ReportFailedAccessCheck(js_object, v8::ACCESS_GET);
904 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 905 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
905 return isolate->factory()->undefined_value(); 906 return isolate->factory()->undefined_value();
906 } 907 }
907 } 908 }
908 909
909 if (js_object->HasIndexedInterceptor()) { 910 if (js_object->HasIndexedInterceptor()) {
910 return JSObject::GetElementWithInterceptor(js_object, receiver, index); 911 return JSObject::GetElementWithInterceptor(js_object, receiver, index);
911 } 912 }
912 913
913 if (js_object->elements() != isolate->heap()->empty_fixed_array()) { 914 if (js_object->elements() != isolate->heap()->empty_fixed_array()) {
(...skipping 2474 matching lines...) Expand 10 before | Expand all | Expand 10 after
3388 break; 3389 break;
3389 } 3390 }
3390 default: { 3391 default: {
3391 break; 3392 break;
3392 } 3393 }
3393 } 3394 }
3394 } 3395 }
3395 } 3396 }
3396 3397
3397 Isolate* isolate = object->GetIsolate(); 3398 Isolate* isolate = object->GetIsolate();
3398 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_SET); 3399 isolate->ReportFailedAccessCheck(object, v8::ACCESS_SET);
3399 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 3400 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
3400 return value; 3401 return value;
3401 } 3402 }
3402 3403
3403 3404
3404 MaybeHandle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object, 3405 MaybeHandle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object,
3405 LookupResult* result, 3406 LookupResult* result,
3406 Handle<Name> key, 3407 Handle<Name> key,
3407 Handle<Object> value, 3408 Handle<Object> value,
3408 PropertyAttributes attributes, 3409 PropertyAttributes attributes,
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
3938 // Optimization for 2-byte strings often used as keys in a decompression 3939 // Optimization for 2-byte strings often used as keys in a decompression
3939 // dictionary. We internalize these short keys to avoid constantly 3940 // dictionary. We internalize these short keys to avoid constantly
3940 // reallocating them. 3941 // reallocating them.
3941 if (name->IsString() && !name->IsInternalizedString() && 3942 if (name->IsString() && !name->IsInternalizedString() &&
3942 Handle<String>::cast(name)->length() <= 2) { 3943 Handle<String>::cast(name)->length() <= 2) {
3943 name = isolate->factory()->InternalizeString(Handle<String>::cast(name)); 3944 name = isolate->factory()->InternalizeString(Handle<String>::cast(name));
3944 } 3945 }
3945 3946
3946 // Check access rights if needed. 3947 // Check access rights if needed.
3947 if (object->IsAccessCheckNeeded()) { 3948 if (object->IsAccessCheckNeeded()) {
3948 if (!isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_SET)) { 3949 if (!isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) {
3949 return SetPropertyWithFailedAccessCheck(object, lookup, name, value, 3950 return SetPropertyWithFailedAccessCheck(object, lookup, name, value,
3950 true, strict_mode); 3951 true, strict_mode);
3951 } 3952 }
3952 } 3953 }
3953 3954
3954 if (object->IsJSGlobalProxy()) { 3955 if (object->IsJSGlobalProxy()) {
3955 Handle<Object> proto(object->GetPrototype(), isolate); 3956 Handle<Object> proto(object->GetPrototype(), isolate);
3956 if (proto->IsNull()) return value; 3957 if (proto->IsNull()) return value;
3957 ASSERT(proto->IsJSGlobalObject()); 3958 ASSERT(proto->IsJSGlobalObject());
3958 return SetPropertyForResult(Handle<JSObject>::cast(proto), 3959 return SetPropertyForResult(Handle<JSObject>::cast(proto),
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
4078 AssertNoContextChange ncc(isolate); 4079 AssertNoContextChange ncc(isolate);
4079 4080
4080 LookupResult lookup(isolate); 4081 LookupResult lookup(isolate);
4081 object->LocalLookup(*name, &lookup, true); 4082 object->LocalLookup(*name, &lookup, true);
4082 if (!lookup.IsFound()) { 4083 if (!lookup.IsFound()) {
4083 object->map()->LookupTransition(*object, *name, &lookup); 4084 object->map()->LookupTransition(*object, *name, &lookup);
4084 } 4085 }
4085 4086
4086 // Check access rights if needed. 4087 // Check access rights if needed.
4087 if (object->IsAccessCheckNeeded()) { 4088 if (object->IsAccessCheckNeeded()) {
4088 if (!isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_SET)) { 4089 if (!isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) {
4089 return SetPropertyWithFailedAccessCheck(object, &lookup, name, value, 4090 return SetPropertyWithFailedAccessCheck(object, &lookup, name, value,
4090 false, SLOPPY); 4091 false, SLOPPY);
4091 } 4092 }
4092 } 4093 }
4093 4094
4094 if (object->IsJSGlobalProxy()) { 4095 if (object->IsJSGlobalProxy()) {
4095 Handle<Object> proto(object->GetPrototype(), isolate); 4096 Handle<Object> proto(object->GetPrototype(), isolate);
4096 if (proto->IsNull()) return value; 4097 if (proto->IsNull()) return value;
4097 ASSERT(proto->IsJSGlobalObject()); 4098 ASSERT(proto->IsJSGlobalObject());
4098 return SetLocalPropertyIgnoreAttributes(Handle<JSObject>::cast(proto), 4099 return SetLocalPropertyIgnoreAttributes(Handle<JSObject>::cast(proto),
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
4270 PropertyAttributes JSReceiver::GetPropertyAttributeForResult( 4271 PropertyAttributes JSReceiver::GetPropertyAttributeForResult(
4271 Handle<JSReceiver> object, 4272 Handle<JSReceiver> object,
4272 Handle<JSReceiver> receiver, 4273 Handle<JSReceiver> receiver,
4273 LookupResult* lookup, 4274 LookupResult* lookup,
4274 Handle<Name> name, 4275 Handle<Name> name,
4275 bool continue_search) { 4276 bool continue_search) {
4276 // Check access rights if needed. 4277 // Check access rights if needed.
4277 if (object->IsAccessCheckNeeded()) { 4278 if (object->IsAccessCheckNeeded()) {
4278 Heap* heap = object->GetHeap(); 4279 Heap* heap = object->GetHeap();
4279 Handle<JSObject> obj = Handle<JSObject>::cast(object); 4280 Handle<JSObject> obj = Handle<JSObject>::cast(object);
4280 if (!heap->isolate()->MayNamedAccessWrapper(obj, name, v8::ACCESS_HAS)) { 4281 if (!heap->isolate()->MayNamedAccess(obj, name, v8::ACCESS_HAS)) {
4281 return JSObject::GetPropertyAttributeWithFailedAccessCheck( 4282 return JSObject::GetPropertyAttributeWithFailedAccessCheck(
4282 obj, lookup, name, continue_search); 4283 obj, lookup, name, continue_search);
4283 } 4284 }
4284 } 4285 }
4285 if (lookup->IsFound()) { 4286 if (lookup->IsFound()) {
4286 switch (lookup->type()) { 4287 switch (lookup->type()) {
4287 case NORMAL: // fall through 4288 case NORMAL: // fall through
4288 case FIELD: 4289 case FIELD:
4289 case CONSTANT: 4290 case CONSTANT:
4290 case CALLBACKS: 4291 case CALLBACKS:
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4323 4324
4324 PropertyAttributes JSObject::GetElementAttributeWithReceiver( 4325 PropertyAttributes JSObject::GetElementAttributeWithReceiver(
4325 Handle<JSObject> object, 4326 Handle<JSObject> object,
4326 Handle<JSReceiver> receiver, 4327 Handle<JSReceiver> receiver,
4327 uint32_t index, 4328 uint32_t index,
4328 bool continue_search) { 4329 bool continue_search) {
4329 Isolate* isolate = object->GetIsolate(); 4330 Isolate* isolate = object->GetIsolate();
4330 4331
4331 // Check access rights if needed. 4332 // Check access rights if needed.
4332 if (object->IsAccessCheckNeeded()) { 4333 if (object->IsAccessCheckNeeded()) {
4333 if (!isolate->MayIndexedAccessWrapper(object, index, v8::ACCESS_HAS)) { 4334 if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_HAS)) {
4334 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_HAS); 4335 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
4336 // TODO(yangguo): Issue 3269, check for scheduled exception missing?
4335 return ABSENT; 4337 return ABSENT;
4336 } 4338 }
4337 } 4339 }
4338 4340
4339 if (object->IsJSGlobalProxy()) { 4341 if (object->IsJSGlobalProxy()) {
4340 Handle<Object> proto(object->GetPrototype(), isolate); 4342 Handle<Object> proto(object->GetPrototype(), isolate);
4341 if (proto->IsNull()) return ABSENT; 4343 if (proto->IsNull()) return ABSENT;
4342 ASSERT(proto->IsJSGlobalObject()); 4344 ASSERT(proto->IsJSGlobalObject());
4343 return JSObject::GetElementAttributeWithReceiver( 4345 return JSObject::GetElementAttributeWithReceiver(
4344 Handle<JSObject>::cast(proto), receiver, index, continue_search); 4346 Handle<JSObject>::cast(proto), receiver, index, continue_search);
(...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after
5200 5202
5201 5203
5202 MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object, 5204 MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object,
5203 uint32_t index, 5205 uint32_t index,
5204 DeleteMode mode) { 5206 DeleteMode mode) {
5205 Isolate* isolate = object->GetIsolate(); 5207 Isolate* isolate = object->GetIsolate();
5206 Factory* factory = isolate->factory(); 5208 Factory* factory = isolate->factory();
5207 5209
5208 // Check access rights if needed. 5210 // Check access rights if needed.
5209 if (object->IsAccessCheckNeeded() && 5211 if (object->IsAccessCheckNeeded() &&
5210 !isolate->MayIndexedAccessWrapper(object, index, v8::ACCESS_DELETE)) { 5212 !isolate->MayIndexedAccess(object, index, v8::ACCESS_DELETE)) {
5211 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE); 5213 isolate->ReportFailedAccessCheck(object, v8::ACCESS_DELETE);
5212 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 5214 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
5213 return factory->false_value(); 5215 return factory->false_value();
5214 } 5216 }
5215 5217
5216 if (object->IsStringObjectWithCharacterAt(index)) { 5218 if (object->IsStringObjectWithCharacterAt(index)) {
5217 if (mode == STRICT_DELETION) { 5219 if (mode == STRICT_DELETION) {
5218 // Deleting a non-configurable property in strict mode. 5220 // Deleting a non-configurable property in strict mode.
5219 Handle<Object> name = factory->NewNumberFromUint(index); 5221 Handle<Object> name = factory->NewNumberFromUint(index);
5220 Handle<Object> args[2] = { name, object }; 5222 Handle<Object> args[2] = { name, object };
5221 Handle<Object> error = 5223 Handle<Object> error =
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
5269 5271
5270 MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object, 5272 MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object,
5271 Handle<Name> name, 5273 Handle<Name> name,
5272 DeleteMode mode) { 5274 DeleteMode mode) {
5273 Isolate* isolate = object->GetIsolate(); 5275 Isolate* isolate = object->GetIsolate();
5274 // ECMA-262, 3rd, 8.6.2.5 5276 // ECMA-262, 3rd, 8.6.2.5
5275 ASSERT(name->IsName()); 5277 ASSERT(name->IsName());
5276 5278
5277 // Check access rights if needed. 5279 // Check access rights if needed.
5278 if (object->IsAccessCheckNeeded() && 5280 if (object->IsAccessCheckNeeded() &&
5279 !isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_DELETE)) { 5281 !isolate->MayNamedAccess(object, name, v8::ACCESS_DELETE)) {
5280 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_DELETE); 5282 isolate->ReportFailedAccessCheck(object, v8::ACCESS_DELETE);
5281 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 5283 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
5282 return isolate->factory()->false_value(); 5284 return isolate->factory()->false_value();
5283 } 5285 }
5284 5286
5285 if (object->IsJSGlobalProxy()) { 5287 if (object->IsJSGlobalProxy()) {
5286 Object* proto = object->GetPrototype(); 5288 Object* proto = object->GetPrototype();
5287 if (proto->IsNull()) return isolate->factory()->false_value(); 5289 if (proto->IsNull()) return isolate->factory()->false_value();
5288 ASSERT(proto->IsJSGlobalObject()); 5290 ASSERT(proto->IsJSGlobalObject());
5289 return JSGlobalObject::DeleteProperty( 5291 return JSGlobalObject::DeleteProperty(
5290 handle(JSGlobalObject::cast(proto)), name, mode); 5292 handle(JSGlobalObject::cast(proto)), name, mode);
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
5499 return false; 5501 return false;
5500 } 5502 }
5501 5503
5502 5504
5503 Handle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { 5505 Handle<Object> JSObject::PreventExtensions(Handle<JSObject> object) {
5504 Isolate* isolate = object->GetIsolate(); 5506 Isolate* isolate = object->GetIsolate();
5505 5507
5506 if (!object->map()->is_extensible()) return object; 5508 if (!object->map()->is_extensible()) return object;
5507 5509
5508 if (object->IsAccessCheckNeeded() && 5510 if (object->IsAccessCheckNeeded() &&
5509 !isolate->MayNamedAccessWrapper(object, 5511 !isolate->MayNamedAccess(
5510 isolate->factory()->undefined_value(), 5512 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) {
5511 v8::ACCESS_KEYS)) { 5513 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS);
5512 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_KEYS);
5513 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 5514 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
5514 return isolate->factory()->false_value(); 5515 return isolate->factory()->false_value();
5515 } 5516 }
5516 5517
5517 if (object->IsJSGlobalProxy()) { 5518 if (object->IsJSGlobalProxy()) {
5518 Handle<Object> proto(object->GetPrototype(), isolate); 5519 Handle<Object> proto(object->GetPrototype(), isolate);
5519 if (proto->IsNull()) return object; 5520 if (proto->IsNull()) return object;
5520 ASSERT(proto->IsJSGlobalObject()); 5521 ASSERT(proto->IsJSGlobalObject());
5521 return PreventExtensions(Handle<JSObject>::cast(proto)); 5522 return PreventExtensions(Handle<JSObject>::cast(proto));
5522 } 5523 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
5583 5584
5584 MaybeHandle<Object> JSObject::Freeze(Handle<JSObject> object) { 5585 MaybeHandle<Object> JSObject::Freeze(Handle<JSObject> object) {
5585 // Freezing sloppy arguments should be handled elsewhere. 5586 // Freezing sloppy arguments should be handled elsewhere.
5586 ASSERT(!object->HasSloppyArgumentsElements()); 5587 ASSERT(!object->HasSloppyArgumentsElements());
5587 ASSERT(!object->map()->is_observed()); 5588 ASSERT(!object->map()->is_observed());
5588 5589
5589 if (object->map()->is_frozen()) return object; 5590 if (object->map()->is_frozen()) return object;
5590 5591
5591 Isolate* isolate = object->GetIsolate(); 5592 Isolate* isolate = object->GetIsolate();
5592 if (object->IsAccessCheckNeeded() && 5593 if (object->IsAccessCheckNeeded() &&
5593 !isolate->MayNamedAccessWrapper(object, 5594 !isolate->MayNamedAccess(
5594 isolate->factory()->undefined_value(), 5595 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) {
5595 v8::ACCESS_KEYS)) { 5596 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS);
5596 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_KEYS);
5597 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 5597 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
5598 return isolate->factory()->false_value(); 5598 return isolate->factory()->false_value();
5599 } 5599 }
5600 5600
5601 if (object->IsJSGlobalProxy()) { 5601 if (object->IsJSGlobalProxy()) {
5602 Handle<Object> proto(object->GetPrototype(), isolate); 5602 Handle<Object> proto(object->GetPrototype(), isolate);
5603 if (proto->IsNull()) return object; 5603 if (proto->IsNull()) return object;
5604 ASSERT(proto->IsJSGlobalObject()); 5604 ASSERT(proto->IsJSGlobalObject());
5605 return Freeze(Handle<JSObject>::cast(proto)); 5605 return Freeze(Handle<JSObject>::cast(proto));
5606 } 5606 }
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after
6240 accessors->SetComponents(*getter, *setter); 6240 accessors->SetComponents(*getter, *setter);
6241 accessors->set_access_flags(access_control); 6241 accessors->set_access_flags(access_control);
6242 6242
6243 SetPropertyCallback(object, name, accessors, attributes); 6243 SetPropertyCallback(object, name, accessors, attributes);
6244 } 6244 }
6245 6245
6246 6246
6247 bool JSObject::CanSetCallback(Handle<JSObject> object, Handle<Name> name) { 6247 bool JSObject::CanSetCallback(Handle<JSObject> object, Handle<Name> name) {
6248 Isolate* isolate = object->GetIsolate(); 6248 Isolate* isolate = object->GetIsolate();
6249 ASSERT(!object->IsAccessCheckNeeded() || 6249 ASSERT(!object->IsAccessCheckNeeded() ||
6250 isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_SET)); 6250 isolate->MayNamedAccess(object, name, v8::ACCESS_SET));
6251 6251
6252 // Check if there is an API defined callback object which prohibits 6252 // Check if there is an API defined callback object which prohibits
6253 // callback overwriting in this object or its prototype chain. 6253 // callback overwriting in this object or its prototype chain.
6254 // This mechanism is needed for instance in a browser setting, where 6254 // This mechanism is needed for instance in a browser setting, where
6255 // certain accessors such as window.location should not be allowed 6255 // certain accessors such as window.location should not be allowed
6256 // to be overwritten because allowing overwriting could potentially 6256 // to be overwritten because allowing overwriting could potentially
6257 // cause security problems. 6257 // cause security problems.
6258 LookupResult callback_result(isolate); 6258 LookupResult callback_result(isolate);
6259 object->LookupCallbackProperty(*name, &callback_result); 6259 object->LookupCallbackProperty(*name, &callback_result);
6260 if (callback_result.IsFound()) { 6260 if (callback_result.IsFound()) {
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
6363 6363
6364 void JSObject::DefineAccessor(Handle<JSObject> object, 6364 void JSObject::DefineAccessor(Handle<JSObject> object,
6365 Handle<Name> name, 6365 Handle<Name> name,
6366 Handle<Object> getter, 6366 Handle<Object> getter,
6367 Handle<Object> setter, 6367 Handle<Object> setter,
6368 PropertyAttributes attributes, 6368 PropertyAttributes attributes,
6369 v8::AccessControl access_control) { 6369 v8::AccessControl access_control) {
6370 Isolate* isolate = object->GetIsolate(); 6370 Isolate* isolate = object->GetIsolate();
6371 // Check access rights if needed. 6371 // Check access rights if needed.
6372 if (object->IsAccessCheckNeeded() && 6372 if (object->IsAccessCheckNeeded() &&
6373 !isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_SET)) { 6373 !isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) {
6374 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_SET); 6374 isolate->ReportFailedAccessCheck(object, v8::ACCESS_SET);
6375 // TODO(yangguo): Issue 3269, check for scheduled exception missing?
6375 return; 6376 return;
6376 } 6377 }
6377 6378
6378 if (object->IsJSGlobalProxy()) { 6379 if (object->IsJSGlobalProxy()) {
6379 Handle<Object> proto(object->GetPrototype(), isolate); 6380 Handle<Object> proto(object->GetPrototype(), isolate);
6380 if (proto->IsNull()) return; 6381 if (proto->IsNull()) return;
6381 ASSERT(proto->IsJSGlobalObject()); 6382 ASSERT(proto->IsJSGlobalObject());
6382 DefineAccessor(Handle<JSObject>::cast(proto), 6383 DefineAccessor(Handle<JSObject>::cast(proto),
6383 name, 6384 name,
6384 getter, 6385 getter,
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
6547 6548
6548 6549
6549 Handle<Object> JSObject::SetAccessor(Handle<JSObject> object, 6550 Handle<Object> JSObject::SetAccessor(Handle<JSObject> object,
6550 Handle<AccessorInfo> info) { 6551 Handle<AccessorInfo> info) {
6551 Isolate* isolate = object->GetIsolate(); 6552 Isolate* isolate = object->GetIsolate();
6552 Factory* factory = isolate->factory(); 6553 Factory* factory = isolate->factory();
6553 Handle<Name> name(Name::cast(info->name())); 6554 Handle<Name> name(Name::cast(info->name()));
6554 6555
6555 // Check access rights if needed. 6556 // Check access rights if needed.
6556 if (object->IsAccessCheckNeeded() && 6557 if (object->IsAccessCheckNeeded() &&
6557 !isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_SET)) { 6558 !isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) {
6558 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_SET); 6559 isolate->ReportFailedAccessCheck(object, v8::ACCESS_SET);
6559 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 6560 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
6560 return factory->undefined_value(); 6561 return factory->undefined_value();
6561 } 6562 }
6562 6563
6563 if (object->IsJSGlobalProxy()) { 6564 if (object->IsJSGlobalProxy()) {
6564 Handle<Object> proto(object->GetPrototype(), isolate); 6565 Handle<Object> proto(object->GetPrototype(), isolate);
6565 if (proto->IsNull()) return object; 6566 if (proto->IsNull()) return object;
6566 ASSERT(proto->IsJSGlobalObject()); 6567 ASSERT(proto->IsJSGlobalObject());
6567 return SetAccessor(Handle<JSObject>::cast(proto), info); 6568 return SetAccessor(Handle<JSObject>::cast(proto), info);
6568 } 6569 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
6633 Handle<Name> name, 6634 Handle<Name> name,
6634 AccessorComponent component) { 6635 AccessorComponent component) {
6635 Isolate* isolate = object->GetIsolate(); 6636 Isolate* isolate = object->GetIsolate();
6636 6637
6637 // Make sure that the top context does not change when doing callbacks or 6638 // Make sure that the top context does not change when doing callbacks or
6638 // interceptor calls. 6639 // interceptor calls.
6639 AssertNoContextChange ncc(isolate); 6640 AssertNoContextChange ncc(isolate);
6640 6641
6641 // Check access rights if needed. 6642 // Check access rights if needed.
6642 if (object->IsAccessCheckNeeded() && 6643 if (object->IsAccessCheckNeeded() &&
6643 !isolate->MayNamedAccessWrapper(object, name, v8::ACCESS_HAS)) { 6644 !isolate->MayNamedAccess(object, name, v8::ACCESS_HAS)) {
6644 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_HAS); 6645 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
6645 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 6646 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
6646 return isolate->factory()->undefined_value(); 6647 return isolate->factory()->undefined_value();
6647 } 6648 }
6648 6649
6649 // Make the lookup and include prototypes. 6650 // Make the lookup and include prototypes.
6650 uint32_t index = 0; 6651 uint32_t index = 0;
6651 if (name->AsArrayIndex(&index)) { 6652 if (name->AsArrayIndex(&index)) {
6652 for (Handle<Object> obj = object; 6653 for (Handle<Object> obj = object;
6653 !obj->IsNull(); 6654 !obj->IsNull();
6654 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { 6655 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) {
(...skipping 5847 matching lines...) Expand 10 before | Expand all | Expand 10 after
12502 object->HasFixedTypedArrayElements()) { 12503 object->HasFixedTypedArrayElements()) {
12503 if (!value->IsNumber() && !value->IsUndefined()) { 12504 if (!value->IsNumber() && !value->IsUndefined()) {
12504 ASSIGN_RETURN_ON_EXCEPTION( 12505 ASSIGN_RETURN_ON_EXCEPTION(
12505 isolate, value, 12506 isolate, value,
12506 Execution::ToNumber(isolate, value), Object); 12507 Execution::ToNumber(isolate, value), Object);
12507 } 12508 }
12508 } 12509 }
12509 12510
12510 // Check access rights if needed. 12511 // Check access rights if needed.
12511 if (object->IsAccessCheckNeeded()) { 12512 if (object->IsAccessCheckNeeded()) {
12512 if (!isolate->MayIndexedAccessWrapper(object, index, v8::ACCESS_SET)) { 12513 if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_SET)) {
12513 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_SET); 12514 isolate->ReportFailedAccessCheck(object, v8::ACCESS_SET);
12514 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 12515 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
12515 return value; 12516 return value;
12516 } 12517 }
12517 } 12518 }
12518 12519
12519 if (object->IsJSGlobalProxy()) { 12520 if (object->IsJSGlobalProxy()) {
12520 Handle<Object> proto(object->GetPrototype(), isolate); 12521 Handle<Object> proto(object->GetPrototype(), isolate);
12521 if (proto->IsNull()) return value; 12522 if (proto->IsNull()) return value;
12522 ASSERT(proto->IsJSGlobalObject()); 12523 ASSERT(proto->IsJSGlobalObject());
12523 return SetElement(Handle<JSObject>::cast(proto), index, value, attributes, 12524 return SetElement(Handle<JSObject>::cast(proto), index, value, attributes,
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
13281 return GetPropertyPostInterceptor(object, receiver, name, attributes); 13282 return GetPropertyPostInterceptor(object, receiver, name, attributes);
13282 } 13283 }
13283 13284
13284 13285
13285 bool JSObject::HasRealNamedProperty(Handle<JSObject> object, 13286 bool JSObject::HasRealNamedProperty(Handle<JSObject> object,
13286 Handle<Name> key) { 13287 Handle<Name> key) {
13287 Isolate* isolate = object->GetIsolate(); 13288 Isolate* isolate = object->GetIsolate();
13288 SealHandleScope shs(isolate); 13289 SealHandleScope shs(isolate);
13289 // Check access rights if needed. 13290 // Check access rights if needed.
13290 if (object->IsAccessCheckNeeded()) { 13291 if (object->IsAccessCheckNeeded()) {
13291 if (!isolate->MayNamedAccessWrapper(object, key, v8::ACCESS_HAS)) { 13292 if (!isolate->MayNamedAccess(object, key, v8::ACCESS_HAS)) {
13292 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_HAS); 13293 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
13294 // TODO(yangguo): Issue 3269, check for scheduled exception missing?
13293 return false; 13295 return false;
13294 } 13296 }
13295 } 13297 }
13296 13298
13297 LookupResult result(isolate); 13299 LookupResult result(isolate);
13298 object->LocalLookupRealNamedProperty(*key, &result); 13300 object->LocalLookupRealNamedProperty(*key, &result);
13299 return result.IsFound() && !result.IsInterceptor(); 13301 return result.IsFound() && !result.IsInterceptor();
13300 } 13302 }
13301 13303
13302 13304
13303 bool JSObject::HasRealElementProperty(Handle<JSObject> object, uint32_t index) { 13305 bool JSObject::HasRealElementProperty(Handle<JSObject> object, uint32_t index) {
13304 Isolate* isolate = object->GetIsolate(); 13306 Isolate* isolate = object->GetIsolate();
13305 HandleScope scope(isolate); 13307 HandleScope scope(isolate);
13306 // Check access rights if needed. 13308 // Check access rights if needed.
13307 if (object->IsAccessCheckNeeded()) { 13309 if (object->IsAccessCheckNeeded()) {
13308 if (!isolate->MayIndexedAccessWrapper(object, index, v8::ACCESS_HAS)) { 13310 if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_HAS)) {
13309 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_HAS); 13311 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
13312 // TODO(yangguo): Issue 3269, check for scheduled exception missing?
13310 return false; 13313 return false;
13311 } 13314 }
13312 } 13315 }
13313 13316
13314 if (object->IsJSGlobalProxy()) { 13317 if (object->IsJSGlobalProxy()) {
13315 HandleScope scope(isolate); 13318 HandleScope scope(isolate);
13316 Handle<Object> proto(object->GetPrototype(), isolate); 13319 Handle<Object> proto(object->GetPrototype(), isolate);
13317 if (proto->IsNull()) return false; 13320 if (proto->IsNull()) return false;
13318 ASSERT(proto->IsJSGlobalObject()); 13321 ASSERT(proto->IsJSGlobalObject());
13319 return HasRealElementProperty(Handle<JSObject>::cast(proto), index); 13322 return HasRealElementProperty(Handle<JSObject>::cast(proto), index);
13320 } 13323 }
13321 13324
13322 return GetElementAttributeWithoutInterceptor( 13325 return GetElementAttributeWithoutInterceptor(
13323 object, object, index, false) != ABSENT; 13326 object, object, index, false) != ABSENT;
13324 } 13327 }
13325 13328
13326 13329
13327 bool JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object, 13330 bool JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object,
13328 Handle<Name> key) { 13331 Handle<Name> key) {
13329 Isolate* isolate = object->GetIsolate(); 13332 Isolate* isolate = object->GetIsolate();
13330 SealHandleScope shs(isolate); 13333 SealHandleScope shs(isolate);
13331 // Check access rights if needed. 13334 // Check access rights if needed.
13332 if (object->IsAccessCheckNeeded()) { 13335 if (object->IsAccessCheckNeeded()) {
13333 if (!isolate->MayNamedAccessWrapper(object, key, v8::ACCESS_HAS)) { 13336 if (!isolate->MayNamedAccess(object, key, v8::ACCESS_HAS)) {
13334 isolate->ReportFailedAccessCheckWrapper(object, v8::ACCESS_HAS); 13337 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
13338 // TODO(yangguo): Issue 3269, check for scheduled exception missing?
13335 return false; 13339 return false;
13336 } 13340 }
13337 } 13341 }
13338 13342
13339 LookupResult result(isolate); 13343 LookupResult result(isolate);
13340 object->LocalLookupRealNamedProperty(*key, &result); 13344 object->LocalLookupRealNamedProperty(*key, &result);
13341 return result.IsPropertyCallbacks(); 13345 return result.IsPropertyCallbacks();
13342 } 13346 }
13343 13347
13344 13348
(...skipping 3134 matching lines...) Expand 10 before | Expand all | Expand 10 after
16479 #define ERROR_MESSAGES_TEXTS(C, T) T, 16483 #define ERROR_MESSAGES_TEXTS(C, T) T,
16480 static const char* error_messages_[] = { 16484 static const char* error_messages_[] = {
16481 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16485 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16482 }; 16486 };
16483 #undef ERROR_MESSAGES_TEXTS 16487 #undef ERROR_MESSAGES_TEXTS
16484 return error_messages_[reason]; 16488 return error_messages_[reason];
16485 } 16489 }
16486 16490
16487 16491
16488 } } // namespace v8::internal 16492 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/isolate.cc ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698