| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 return CreateJSValue(global_context->boolean_function(), this); | 68 return CreateJSValue(global_context->boolean_function(), this); |
| 69 } else if (IsString()) { | 69 } else if (IsString()) { |
| 70 return CreateJSValue(global_context->string_function(), this); | 70 return CreateJSValue(global_context->string_function(), this); |
| 71 } | 71 } |
| 72 ASSERT(IsJSObject()); | 72 ASSERT(IsJSObject()); |
| 73 return this; | 73 return this; |
| 74 } | 74 } |
| 75 | 75 |
| 76 | 76 |
| 77 Object* Object::ToObject() { | 77 Object* Object::ToObject() { |
| 78 Context* global_context = Top::context()->global_context(); | 78 Context* global_context = Isolate::Current()->context()->global_context(); |
| 79 if (IsJSObject()) { | 79 if (IsJSObject()) { |
| 80 return this; | 80 return this; |
| 81 } else if (IsNumber()) { | 81 } else if (IsNumber()) { |
| 82 return CreateJSValue(global_context->number_function(), this); | 82 return CreateJSValue(global_context->number_function(), this); |
| 83 } else if (IsBoolean()) { | 83 } else if (IsBoolean()) { |
| 84 return CreateJSValue(global_context->boolean_function(), this); | 84 return CreateJSValue(global_context->boolean_function(), this); |
| 85 } else if (IsString()) { | 85 } else if (IsString()) { |
| 86 return CreateJSValue(global_context->string_function(), this); | 86 return CreateJSValue(global_context->string_function(), this); |
| 87 } | 87 } |
| 88 | 88 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 108 if (IsHeapNumber()) { | 108 if (IsHeapNumber()) { |
| 109 return HeapNumber::cast(this)->HeapNumberToBoolean(); | 109 return HeapNumber::cast(this)->HeapNumberToBoolean(); |
| 110 } | 110 } |
| 111 return HEAP->true_value(); | 111 return HEAP->true_value(); |
| 112 } | 112 } |
| 113 | 113 |
| 114 | 114 |
| 115 void Object::Lookup(String* name, LookupResult* result) { | 115 void Object::Lookup(String* name, LookupResult* result) { |
| 116 if (IsJSObject()) return JSObject::cast(this)->Lookup(name, result); | 116 if (IsJSObject()) return JSObject::cast(this)->Lookup(name, result); |
| 117 Object* holder = NULL; | 117 Object* holder = NULL; |
| 118 Context* global_context = Top::context()->global_context(); | 118 Context* global_context = Isolate::Current()->context()->global_context(); |
| 119 if (IsString()) { | 119 if (IsString()) { |
| 120 holder = global_context->string_function()->instance_prototype(); | 120 holder = global_context->string_function()->instance_prototype(); |
| 121 } else if (IsNumber()) { | 121 } else if (IsNumber()) { |
| 122 holder = global_context->number_function()->instance_prototype(); | 122 holder = global_context->number_function()->instance_prototype(); |
| 123 } else if (IsBoolean()) { | 123 } else if (IsBoolean()) { |
| 124 holder = global_context->boolean_function()->instance_prototype(); | 124 holder = global_context->boolean_function()->instance_prototype(); |
| 125 } | 125 } |
| 126 ASSERT(holder != NULL); // Cannot handle null or undefined. | 126 ASSERT(holder != NULL); // Cannot handle null or undefined. |
| 127 JSObject::cast(holder)->Lookup(name, result); | 127 JSObject::cast(holder)->Lookup(name, result); |
| 128 } | 128 } |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 } | 263 } |
| 264 break; | 264 break; |
| 265 } | 265 } |
| 266 default: | 266 default: |
| 267 UNREACHABLE(); | 267 UNREACHABLE(); |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 | 270 |
| 271 // No accessible property found. | 271 // No accessible property found. |
| 272 *attributes = ABSENT; | 272 *attributes = ABSENT; |
| 273 Top::ReportFailedAccessCheck(this, v8::ACCESS_GET); | 273 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_GET); |
| 274 return HEAP->undefined_value(); | 274 return HEAP->undefined_value(); |
| 275 } | 275 } |
| 276 | 276 |
| 277 | 277 |
| 278 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( | 278 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( |
| 279 Object* receiver, | 279 Object* receiver, |
| 280 LookupResult* result, | 280 LookupResult* result, |
| 281 String* name, | 281 String* name, |
| 282 bool continue_search) { | 282 bool continue_search) { |
| 283 if (result->IsProperty()) { | 283 if (result->IsProperty()) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 continue_search); | 326 continue_search); |
| 327 } | 327 } |
| 328 break; | 328 break; |
| 329 } | 329 } |
| 330 | 330 |
| 331 default: | 331 default: |
| 332 UNREACHABLE(); | 332 UNREACHABLE(); |
| 333 } | 333 } |
| 334 } | 334 } |
| 335 | 335 |
| 336 Top::ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 336 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
| 337 return ABSENT; | 337 return ABSENT; |
| 338 } | 338 } |
| 339 | 339 |
| 340 | 340 |
| 341 Object* JSObject::GetNormalizedProperty(LookupResult* result) { | 341 Object* JSObject::GetNormalizedProperty(LookupResult* result) { |
| 342 ASSERT(!HasFastProperties()); | 342 ASSERT(!HasFastProperties()); |
| 343 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry()); | 343 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry()); |
| 344 if (IsGlobalObject()) { | 344 if (IsGlobalObject()) { |
| 345 value = JSGlobalPropertyCell::cast(value)->value(); | 345 value = JSGlobalPropertyCell::cast(value)->value(); |
| 346 } | 346 } |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 // only continue with a current object just after the interceptor | 456 // only continue with a current object just after the interceptor |
| 457 // holder in the prototype chain. | 457 // holder in the prototype chain. |
| 458 Object* last = result->IsProperty() ? result->holder() : HEAP->null_value(); | 458 Object* last = result->IsProperty() ? result->holder() : HEAP->null_value(); |
| 459 for (Object* current = this; true; current = current->GetPrototype()) { | 459 for (Object* current = this; true; current = current->GetPrototype()) { |
| 460 if (current->IsAccessCheckNeeded()) { | 460 if (current->IsAccessCheckNeeded()) { |
| 461 // Check if we're allowed to read from the current object. Note | 461 // Check if we're allowed to read from the current object. Note |
| 462 // that even though we may not actually end up loading the named | 462 // that even though we may not actually end up loading the named |
| 463 // property from the current object, we still check that we have | 463 // property from the current object, we still check that we have |
| 464 // access to it. | 464 // access to it. |
| 465 JSObject* checked = JSObject::cast(current); | 465 JSObject* checked = JSObject::cast(current); |
| 466 if (!Top::MayNamedAccess(checked, name, v8::ACCESS_GET)) { | 466 if (!Isolate::Current()->MayNamedAccess(checked, name, v8::ACCESS_GET)) { |
| 467 return checked->GetPropertyWithFailedAccessCheck(receiver, | 467 return checked->GetPropertyWithFailedAccessCheck(receiver, |
| 468 result, | 468 result, |
| 469 name, | 469 name, |
| 470 attributes); | 470 attributes); |
| 471 } | 471 } |
| 472 } | 472 } |
| 473 // Stop traversing the chain once we reach the last object in the | 473 // Stop traversing the chain once we reach the last object in the |
| 474 // chain; either the holder of the result or null in case of an | 474 // chain; either the holder of the result or null in case of an |
| 475 // absent property. | 475 // absent property. |
| 476 if (current == last) break; | 476 if (current == last) break; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 // Non-JS objects do not have integer indexed properties. | 514 // Non-JS objects do not have integer indexed properties. |
| 515 if (!IsJSObject()) return HEAP->undefined_value(); | 515 if (!IsJSObject()) return HEAP->undefined_value(); |
| 516 return JSObject::cast(this)->GetElementWithReceiver(JSObject::cast(receiver), | 516 return JSObject::cast(this)->GetElementWithReceiver(JSObject::cast(receiver), |
| 517 index); | 517 index); |
| 518 } | 518 } |
| 519 | 519 |
| 520 | 520 |
| 521 Object* Object::GetPrototype() { | 521 Object* Object::GetPrototype() { |
| 522 // The object is either a number, a string, a boolean, or a real JS object. | 522 // The object is either a number, a string, a boolean, or a real JS object. |
| 523 if (IsJSObject()) return JSObject::cast(this)->map()->prototype(); | 523 if (IsJSObject()) return JSObject::cast(this)->map()->prototype(); |
| 524 Context* context = Top::context()->global_context(); | 524 Context* context = Isolate::Current()->context()->global_context(); |
| 525 | 525 |
| 526 if (IsNumber()) return context->number_function()->instance_prototype(); | 526 if (IsNumber()) return context->number_function()->instance_prototype(); |
| 527 if (IsString()) return context->string_function()->instance_prototype(); | 527 if (IsString()) return context->string_function()->instance_prototype(); |
| 528 if (IsBoolean()) { | 528 if (IsBoolean()) { |
| 529 return context->boolean_function()->instance_prototype(); | 529 return context->boolean_function()->instance_prototype(); |
| 530 } else { | 530 } else { |
| 531 return HEAP->null_value(); | 531 return HEAP->null_value(); |
| 532 } | 532 } |
| 533 } | 533 } |
| 534 | 534 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 int requested = requested_bytes >> kObjectAlignmentBits; | 580 int requested = requested_bytes >> kObjectAlignmentBits; |
| 581 int value = (requested << kSpaceTagSize) | space; | 581 int value = (requested << kSpaceTagSize) | space; |
| 582 // We can't very well allocate a heap number in this situation, and if the | 582 // We can't very well allocate a heap number in this situation, and if the |
| 583 // requested memory is so large it seems reasonable to say that this is an | 583 // requested memory is so large it seems reasonable to say that this is an |
| 584 // out of memory situation. This fixes a crash in | 584 // out of memory situation. This fixes a crash in |
| 585 // js1_5/Regress/regress-303213.js. | 585 // js1_5/Regress/regress-303213.js. |
| 586 if (value >> kSpaceTagSize != requested || | 586 if (value >> kSpaceTagSize != requested || |
| 587 !Smi::IsValid(value) || | 587 !Smi::IsValid(value) || |
| 588 value != ((value << kFailureTypeTagSize) >> kFailureTypeTagSize) || | 588 value != ((value << kFailureTypeTagSize) >> kFailureTypeTagSize) || |
| 589 !Smi::IsValid(value << kFailureTypeTagSize)) { | 589 !Smi::IsValid(value << kFailureTypeTagSize)) { |
| 590 Top::context()->mark_out_of_memory(); | 590 Isolate::Current()->context()->mark_out_of_memory(); |
| 591 return Failure::OutOfMemoryException(); | 591 return Failure::OutOfMemoryException(); |
| 592 } | 592 } |
| 593 return Construct(RETRY_AFTER_GC, value); | 593 return Construct(RETRY_AFTER_GC, value); |
| 594 } | 594 } |
| 595 | 595 |
| 596 | 596 |
| 597 // Should a word be prefixed by 'a' or 'an' in order to read naturally in | 597 // Should a word be prefixed by 'a' or 'an' in order to read naturally in |
| 598 // English? Returns false for non-ASCII or words that don't start with | 598 // English? Returns false for non-ASCII or words that don't start with |
| 599 // a capital letter. The a/an rule follows pronunciation in English. | 599 // a capital letter. The a/an rule follows pronunciation in English. |
| 600 // We don't use the BBC's overcorrect "an historic occasion" though if | 600 // We don't use the BBC's overcorrect "an historic occasion" though if |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1245 // Allocate new instance descriptors with (name, index) added | 1245 // Allocate new instance descriptors with (name, index) added |
| 1246 FieldDescriptor new_field(name, index, attributes); | 1246 FieldDescriptor new_field(name, index, attributes); |
| 1247 Object* new_descriptors = | 1247 Object* new_descriptors = |
| 1248 old_descriptors->CopyInsert(&new_field, REMOVE_TRANSITIONS); | 1248 old_descriptors->CopyInsert(&new_field, REMOVE_TRANSITIONS); |
| 1249 if (new_descriptors->IsFailure()) return new_descriptors; | 1249 if (new_descriptors->IsFailure()) return new_descriptors; |
| 1250 | 1250 |
| 1251 // Only allow map transition if the object's map is NOT equal to the | 1251 // Only allow map transition if the object's map is NOT equal to the |
| 1252 // global object_function's map and there is not a transition for name. | 1252 // global object_function's map and there is not a transition for name. |
| 1253 bool allow_map_transition = | 1253 bool allow_map_transition = |
| 1254 !old_descriptors->Contains(name) && | 1254 !old_descriptors->Contains(name) && |
| 1255 (Top::context()->global_context()->object_function()->map() != map()); | 1255 (Isolate::Current()->context()->global_context()->object_function()-> |
| 1256 map() != map()); |
| 1256 | 1257 |
| 1257 ASSERT(index < map()->inobject_properties() || | 1258 ASSERT(index < map()->inobject_properties() || |
| 1258 (index - map()->inobject_properties()) < properties()->length() || | 1259 (index - map()->inobject_properties()) < properties()->length() || |
| 1259 map()->unused_property_fields() == 0); | 1260 map()->unused_property_fields() == 0); |
| 1260 // Allocate a new map for the object. | 1261 // Allocate a new map for the object. |
| 1261 Object* r = map()->CopyDropDescriptors(); | 1262 Object* r = map()->CopyDropDescriptors(); |
| 1262 if (r->IsFailure()) return r; | 1263 if (r->IsFailure()) return r; |
| 1263 Map* new_map = Map::cast(r); | 1264 Map* new_map = Map::cast(r); |
| 1264 if (allow_map_transition) { | 1265 if (allow_map_transition) { |
| 1265 // Allocate new instance descriptors for the old map with map transition. | 1266 // Allocate new instance descriptors for the old map with map transition. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1308 Object* new_map = map()->CopyDropDescriptors(); | 1309 Object* new_map = map()->CopyDropDescriptors(); |
| 1309 if (new_map->IsFailure()) return new_map; | 1310 if (new_map->IsFailure()) return new_map; |
| 1310 | 1311 |
| 1311 DescriptorArray* descriptors = DescriptorArray::cast(new_descriptors); | 1312 DescriptorArray* descriptors = DescriptorArray::cast(new_descriptors); |
| 1312 Map::cast(new_map)->set_instance_descriptors(descriptors); | 1313 Map::cast(new_map)->set_instance_descriptors(descriptors); |
| 1313 Map* old_map = map(); | 1314 Map* old_map = map(); |
| 1314 set_map(Map::cast(new_map)); | 1315 set_map(Map::cast(new_map)); |
| 1315 | 1316 |
| 1316 // If the old map is the global object map (from new Object()), | 1317 // If the old map is the global object map (from new Object()), |
| 1317 // then transitions are not added to it, so we are done. | 1318 // then transitions are not added to it, so we are done. |
| 1318 if (old_map == Top::context()->global_context()->object_function()->map()) { | 1319 if (old_map == Isolate::Current()->context()->global_context()-> |
| 1320 object_function()->map()) { |
| 1319 return function; | 1321 return function; |
| 1320 } | 1322 } |
| 1321 | 1323 |
| 1322 // Do not add CONSTANT_TRANSITIONS to global objects | 1324 // Do not add CONSTANT_TRANSITIONS to global objects |
| 1323 if (IsGlobalObject()) { | 1325 if (IsGlobalObject()) { |
| 1324 return function; | 1326 return function; |
| 1325 } | 1327 } |
| 1326 | 1328 |
| 1327 // Add a CONSTANT_TRANSITION descriptor to the old map, | 1329 // Add a CONSTANT_TRANSITION descriptor to the old map, |
| 1328 // so future assignments to this property on other objects | 1330 // so future assignments to this property on other objects |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 PropertyAttributes attributes) { | 1443 PropertyAttributes attributes) { |
| 1442 Map* old_map = map(); | 1444 Map* old_map = map(); |
| 1443 Object* result = ConvertDescriptorToField(name, new_value, attributes); | 1445 Object* result = ConvertDescriptorToField(name, new_value, attributes); |
| 1444 if (result->IsFailure()) return result; | 1446 if (result->IsFailure()) return result; |
| 1445 // If we get to this point we have succeeded - do not return failure | 1447 // If we get to this point we have succeeded - do not return failure |
| 1446 // after this point. Later stuff is optional. | 1448 // after this point. Later stuff is optional. |
| 1447 if (!HasFastProperties()) { | 1449 if (!HasFastProperties()) { |
| 1448 return result; | 1450 return result; |
| 1449 } | 1451 } |
| 1450 // Do not add transitions to the map of "new Object()". | 1452 // Do not add transitions to the map of "new Object()". |
| 1451 if (map() == Top::context()->global_context()->object_function()->map()) { | 1453 if (map() == Isolate::Current()->context()->global_context()-> |
| 1454 object_function()->map()) { |
| 1452 return result; | 1455 return result; |
| 1453 } | 1456 } |
| 1454 | 1457 |
| 1455 MapTransitionDescriptor transition(name, | 1458 MapTransitionDescriptor transition(name, |
| 1456 map(), | 1459 map(), |
| 1457 attributes); | 1460 attributes); |
| 1458 Object* new_descriptors = | 1461 Object* new_descriptors = |
| 1459 old_map->instance_descriptors()-> | 1462 old_map->instance_descriptors()-> |
| 1460 CopyInsert(&transition, KEEP_TRANSITIONS); | 1463 CopyInsert(&transition, KEEP_TRANSITIONS); |
| 1461 if (new_descriptors->IsFailure()) return result; // Yes, return _result_. | 1464 if (new_descriptors->IsFailure()) return result; // Yes, return _result_. |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1602 } | 1605 } |
| 1603 | 1606 |
| 1604 if (structure->IsFixedArray()) { | 1607 if (structure->IsFixedArray()) { |
| 1605 Object* setter = FixedArray::cast(structure)->get(kSetterIndex); | 1608 Object* setter = FixedArray::cast(structure)->get(kSetterIndex); |
| 1606 if (setter->IsJSFunction()) { | 1609 if (setter->IsJSFunction()) { |
| 1607 return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value); | 1610 return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value); |
| 1608 } else { | 1611 } else { |
| 1609 Handle<String> key(name); | 1612 Handle<String> key(name); |
| 1610 Handle<Object> holder_handle(holder); | 1613 Handle<Object> holder_handle(holder); |
| 1611 Handle<Object> args[2] = { key, holder_handle }; | 1614 Handle<Object> args[2] = { key, holder_handle }; |
| 1612 return Top::Throw(*Factory::NewTypeError("no_setter_in_callback", | 1615 return Isolate::Current()->Throw( |
| 1613 HandleVector(args, 2))); | 1616 *Factory::NewTypeError("no_setter_in_callback", |
| 1617 HandleVector(args, 2))); |
| 1614 } | 1618 } |
| 1615 } | 1619 } |
| 1616 | 1620 |
| 1617 UNREACHABLE(); | 1621 UNREACHABLE(); |
| 1618 return NULL; | 1622 return NULL; |
| 1619 } | 1623 } |
| 1620 | 1624 |
| 1621 | 1625 |
| 1622 Object* JSObject::SetPropertyWithDefinedSetter(JSFunction* setter, | 1626 Object* JSObject::SetPropertyWithDefinedSetter(JSFunction* setter, |
| 1623 Object* value) { | 1627 Object* value) { |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1804 } | 1808 } |
| 1805 break; | 1809 break; |
| 1806 } | 1810 } |
| 1807 default: { | 1811 default: { |
| 1808 break; | 1812 break; |
| 1809 } | 1813 } |
| 1810 } | 1814 } |
| 1811 } | 1815 } |
| 1812 } | 1816 } |
| 1813 | 1817 |
| 1814 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); | 1818 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 1815 return value; | 1819 return value; |
| 1816 } | 1820 } |
| 1817 | 1821 |
| 1818 | 1822 |
| 1819 Object* JSObject::SetProperty(LookupResult* result, | 1823 Object* JSObject::SetProperty(LookupResult* result, |
| 1820 String* name, | 1824 String* name, |
| 1821 Object* value, | 1825 Object* value, |
| 1822 PropertyAttributes attributes) { | 1826 PropertyAttributes attributes) { |
| 1823 // Make sure that the top context does not change when doing callbacks or | 1827 // Make sure that the top context does not change when doing callbacks or |
| 1824 // interceptor calls. | 1828 // interceptor calls. |
| 1825 AssertNoContextChange ncc; | 1829 AssertNoContextChange ncc; |
| 1826 | 1830 |
| 1827 // Optimization for 2-byte strings often used as keys in a decompression | 1831 // Optimization for 2-byte strings often used as keys in a decompression |
| 1828 // dictionary. We make these short keys into symbols to avoid constantly | 1832 // dictionary. We make these short keys into symbols to avoid constantly |
| 1829 // reallocating them. | 1833 // reallocating them. |
| 1830 if (!name->IsSymbol() && name->length() <= 2) { | 1834 if (!name->IsSymbol() && name->length() <= 2) { |
| 1831 Object* symbol_version = HEAP->LookupSymbol(name); | 1835 Object* symbol_version = HEAP->LookupSymbol(name); |
| 1832 if (!symbol_version->IsFailure()) name = String::cast(symbol_version); | 1836 if (!symbol_version->IsFailure()) name = String::cast(symbol_version); |
| 1833 } | 1837 } |
| 1834 | 1838 |
| 1835 // Check access rights if needed. | 1839 // Check access rights if needed. |
| 1836 if (IsAccessCheckNeeded() | 1840 if (IsAccessCheckNeeded() |
| 1837 && !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { | 1841 && !Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_SET)) { |
| 1838 return SetPropertyWithFailedAccessCheck(result, name, value); | 1842 return SetPropertyWithFailedAccessCheck(result, name, value); |
| 1839 } | 1843 } |
| 1840 | 1844 |
| 1841 if (IsJSGlobalProxy()) { | 1845 if (IsJSGlobalProxy()) { |
| 1842 Object* proto = GetPrototype(); | 1846 Object* proto = GetPrototype(); |
| 1843 if (proto->IsNull()) return value; | 1847 if (proto->IsNull()) return value; |
| 1844 ASSERT(proto->IsJSGlobalObject()); | 1848 ASSERT(proto->IsJSGlobalObject()); |
| 1845 return JSObject::cast(proto)->SetProperty(result, name, value, attributes); | 1849 return JSObject::cast(proto)->SetProperty(result, name, value, attributes); |
| 1846 } | 1850 } |
| 1847 | 1851 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1914 String* name, | 1918 String* name, |
| 1915 Object* value, | 1919 Object* value, |
| 1916 PropertyAttributes attributes) { | 1920 PropertyAttributes attributes) { |
| 1917 // Make sure that the top context does not change when doing callbacks or | 1921 // Make sure that the top context does not change when doing callbacks or |
| 1918 // interceptor calls. | 1922 // interceptor calls. |
| 1919 AssertNoContextChange ncc; | 1923 AssertNoContextChange ncc; |
| 1920 LookupResult result; | 1924 LookupResult result; |
| 1921 LocalLookup(name, &result); | 1925 LocalLookup(name, &result); |
| 1922 // Check access rights if needed. | 1926 // Check access rights if needed. |
| 1923 if (IsAccessCheckNeeded() | 1927 if (IsAccessCheckNeeded() |
| 1924 && !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { | 1928 && !Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_SET)) { |
| 1925 return SetPropertyWithFailedAccessCheck(&result, name, value); | 1929 return SetPropertyWithFailedAccessCheck(&result, name, value); |
| 1926 } | 1930 } |
| 1927 | 1931 |
| 1928 if (IsJSGlobalProxy()) { | 1932 if (IsJSGlobalProxy()) { |
| 1929 Object* proto = GetPrototype(); | 1933 Object* proto = GetPrototype(); |
| 1930 if (proto->IsNull()) return value; | 1934 if (proto->IsNull()) return value; |
| 1931 ASSERT(proto->IsJSGlobalObject()); | 1935 ASSERT(proto->IsJSGlobalObject()); |
| 1932 return JSObject::cast(proto)->IgnoreAttributesAndSetLocalProperty( | 1936 return JSObject::cast(proto)->IgnoreAttributesAndSetLocalProperty( |
| 1933 name, | 1937 name, |
| 1934 value, | 1938 value, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2063 return GetPropertyAttribute(receiver, &result, key, true); | 2067 return GetPropertyAttribute(receiver, &result, key, true); |
| 2064 } | 2068 } |
| 2065 | 2069 |
| 2066 | 2070 |
| 2067 PropertyAttributes JSObject::GetPropertyAttribute(JSObject* receiver, | 2071 PropertyAttributes JSObject::GetPropertyAttribute(JSObject* receiver, |
| 2068 LookupResult* result, | 2072 LookupResult* result, |
| 2069 String* name, | 2073 String* name, |
| 2070 bool continue_search) { | 2074 bool continue_search) { |
| 2071 // Check access rights if needed. | 2075 // Check access rights if needed. |
| 2072 if (IsAccessCheckNeeded() && | 2076 if (IsAccessCheckNeeded() && |
| 2073 !Top::MayNamedAccess(this, name, v8::ACCESS_HAS)) { | 2077 !Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_HAS)) { |
| 2074 return GetPropertyAttributeWithFailedAccessCheck(receiver, | 2078 return GetPropertyAttributeWithFailedAccessCheck(receiver, |
| 2075 result, | 2079 result, |
| 2076 name, | 2080 name, |
| 2077 continue_search); | 2081 continue_search); |
| 2078 } | 2082 } |
| 2079 if (result->IsProperty()) { | 2083 if (result->IsProperty()) { |
| 2080 switch (result->type()) { | 2084 switch (result->type()) { |
| 2081 case NORMAL: // fall through | 2085 case NORMAL: // fall through |
| 2082 case FIELD: | 2086 case FIELD: |
| 2083 case CONSTANT_FUNCTION: | 2087 case CONSTANT_FUNCTION: |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2356 Object* raw_result = | 2360 Object* raw_result = |
| 2357 this_handle->DeleteElementPostInterceptor(index, NORMAL_DELETION); | 2361 this_handle->DeleteElementPostInterceptor(index, NORMAL_DELETION); |
| 2358 RETURN_IF_SCHEDULED_EXCEPTION(); | 2362 RETURN_IF_SCHEDULED_EXCEPTION(); |
| 2359 return raw_result; | 2363 return raw_result; |
| 2360 } | 2364 } |
| 2361 | 2365 |
| 2362 | 2366 |
| 2363 Object* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { | 2367 Object* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { |
| 2364 // Check access rights if needed. | 2368 // Check access rights if needed. |
| 2365 if (IsAccessCheckNeeded() && | 2369 if (IsAccessCheckNeeded() && |
| 2366 !Top::MayIndexedAccess(this, index, v8::ACCESS_DELETE)) { | 2370 !Isolate::Current()->MayIndexedAccess(this, index, v8::ACCESS_DELETE)) { |
| 2367 Top::ReportFailedAccessCheck(this, v8::ACCESS_DELETE); | 2371 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); |
| 2368 return HEAP->false_value(); | 2372 return HEAP->false_value(); |
| 2369 } | 2373 } |
| 2370 | 2374 |
| 2371 if (IsJSGlobalProxy()) { | 2375 if (IsJSGlobalProxy()) { |
| 2372 Object* proto = GetPrototype(); | 2376 Object* proto = GetPrototype(); |
| 2373 if (proto->IsNull()) return HEAP->false_value(); | 2377 if (proto->IsNull()) return HEAP->false_value(); |
| 2374 ASSERT(proto->IsJSGlobalObject()); | 2378 ASSERT(proto->IsJSGlobalObject()); |
| 2375 return JSGlobalObject::cast(proto)->DeleteElement(index, mode); | 2379 return JSGlobalObject::cast(proto)->DeleteElement(index, mode); |
| 2376 } | 2380 } |
| 2377 | 2381 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2419 return HEAP->true_value(); | 2423 return HEAP->true_value(); |
| 2420 } | 2424 } |
| 2421 | 2425 |
| 2422 | 2426 |
| 2423 Object* JSObject::DeleteProperty(String* name, DeleteMode mode) { | 2427 Object* JSObject::DeleteProperty(String* name, DeleteMode mode) { |
| 2424 // ECMA-262, 3rd, 8.6.2.5 | 2428 // ECMA-262, 3rd, 8.6.2.5 |
| 2425 ASSERT(name->IsString()); | 2429 ASSERT(name->IsString()); |
| 2426 | 2430 |
| 2427 // Check access rights if needed. | 2431 // Check access rights if needed. |
| 2428 if (IsAccessCheckNeeded() && | 2432 if (IsAccessCheckNeeded() && |
| 2429 !Top::MayNamedAccess(this, name, v8::ACCESS_DELETE)) { | 2433 !Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_DELETE)) { |
| 2430 Top::ReportFailedAccessCheck(this, v8::ACCESS_DELETE); | 2434 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); |
| 2431 return HEAP->false_value(); | 2435 return HEAP->false_value(); |
| 2432 } | 2436 } |
| 2433 | 2437 |
| 2434 if (IsJSGlobalProxy()) { | 2438 if (IsJSGlobalProxy()) { |
| 2435 Object* proto = GetPrototype(); | 2439 Object* proto = GetPrototype(); |
| 2436 if (proto->IsNull()) return HEAP->false_value(); | 2440 if (proto->IsNull()) return HEAP->false_value(); |
| 2437 ASSERT(proto->IsJSGlobalObject()); | 2441 ASSERT(proto->IsJSGlobalObject()); |
| 2438 return JSGlobalObject::cast(proto)->DeleteProperty(name, mode); | 2442 return JSGlobalObject::cast(proto)->DeleteProperty(name, mode); |
| 2439 } | 2443 } |
| 2440 | 2444 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2520 } | 2524 } |
| 2521 default: | 2525 default: |
| 2522 UNREACHABLE(); | 2526 UNREACHABLE(); |
| 2523 break; | 2527 break; |
| 2524 } | 2528 } |
| 2525 | 2529 |
| 2526 // For functions check the context. | 2530 // For functions check the context. |
| 2527 if (IsJSFunction()) { | 2531 if (IsJSFunction()) { |
| 2528 // Get the constructor function for arguments array. | 2532 // Get the constructor function for arguments array. |
| 2529 JSObject* arguments_boilerplate = | 2533 JSObject* arguments_boilerplate = |
| 2530 Top::context()->global_context()->arguments_boilerplate(); | 2534 Isolate::Current()->context()->global_context()-> |
| 2535 arguments_boilerplate(); |
| 2531 JSFunction* arguments_function = | 2536 JSFunction* arguments_function = |
| 2532 JSFunction::cast(arguments_boilerplate->map()->constructor()); | 2537 JSFunction::cast(arguments_boilerplate->map()->constructor()); |
| 2533 | 2538 |
| 2534 // Get the context and don't check if it is the global context. | 2539 // Get the context and don't check if it is the global context. |
| 2535 JSFunction* f = JSFunction::cast(this); | 2540 JSFunction* f = JSFunction::cast(this); |
| 2536 Context* context = f->context(); | 2541 Context* context = f->context(); |
| 2537 if (context->IsGlobalContext()) { | 2542 if (context->IsGlobalContext()) { |
| 2538 return false; | 2543 return false; |
| 2539 } | 2544 } |
| 2540 | 2545 |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2768 if (is_element) { | 2773 if (is_element) { |
| 2769 return SetElementCallback(index, structure, attributes); | 2774 return SetElementCallback(index, structure, attributes); |
| 2770 } else { | 2775 } else { |
| 2771 return SetPropertyCallback(name, structure, attributes); | 2776 return SetPropertyCallback(name, structure, attributes); |
| 2772 } | 2777 } |
| 2773 } | 2778 } |
| 2774 | 2779 |
| 2775 | 2780 |
| 2776 bool JSObject::CanSetCallback(String* name) { | 2781 bool JSObject::CanSetCallback(String* name) { |
| 2777 ASSERT(!IsAccessCheckNeeded() | 2782 ASSERT(!IsAccessCheckNeeded() |
| 2778 || Top::MayNamedAccess(this, name, v8::ACCESS_SET)); | 2783 || Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_SET)); |
| 2779 | 2784 |
| 2780 // Check if there is an API defined callback object which prohibits | 2785 // Check if there is an API defined callback object which prohibits |
| 2781 // callback overwriting in this object or it's prototype chain. | 2786 // callback overwriting in this object or it's prototype chain. |
| 2782 // This mechanism is needed for instance in a browser setting, where | 2787 // This mechanism is needed for instance in a browser setting, where |
| 2783 // certain accessors such as window.location should not be allowed | 2788 // certain accessors such as window.location should not be allowed |
| 2784 // to be overwritten because allowing overwriting could potentially | 2789 // to be overwritten because allowing overwriting could potentially |
| 2785 // cause security problems. | 2790 // cause security problems. |
| 2786 LookupResult callback_result; | 2791 LookupResult callback_result; |
| 2787 LookupCallback(name, &callback_result); | 2792 LookupCallback(name, &callback_result); |
| 2788 if (callback_result.IsProperty()) { | 2793 if (callback_result.IsProperty()) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2849 ok = TransformToFastProperties(0); | 2854 ok = TransformToFastProperties(0); |
| 2850 if (ok->IsFailure()) return ok; | 2855 if (ok->IsFailure()) return ok; |
| 2851 } | 2856 } |
| 2852 return result; | 2857 return result; |
| 2853 } | 2858 } |
| 2854 | 2859 |
| 2855 Object* JSObject::DefineAccessor(String* name, bool is_getter, JSFunction* fun, | 2860 Object* JSObject::DefineAccessor(String* name, bool is_getter, JSFunction* fun, |
| 2856 PropertyAttributes attributes) { | 2861 PropertyAttributes attributes) { |
| 2857 // Check access rights if needed. | 2862 // Check access rights if needed. |
| 2858 if (IsAccessCheckNeeded() && | 2863 if (IsAccessCheckNeeded() && |
| 2859 !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { | 2864 !Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_SET)) { |
| 2860 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); | 2865 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 2861 return HEAP->undefined_value(); | 2866 return HEAP->undefined_value(); |
| 2862 } | 2867 } |
| 2863 | 2868 |
| 2864 if (IsJSGlobalProxy()) { | 2869 if (IsJSGlobalProxy()) { |
| 2865 Object* proto = GetPrototype(); | 2870 Object* proto = GetPrototype(); |
| 2866 if (proto->IsNull()) return this; | 2871 if (proto->IsNull()) return this; |
| 2867 ASSERT(proto->IsJSGlobalObject()); | 2872 ASSERT(proto->IsJSGlobalObject()); |
| 2868 return JSObject::cast(proto)->DefineAccessor(name, is_getter, | 2873 return JSObject::cast(proto)->DefineAccessor(name, is_getter, |
| 2869 fun, attributes); | 2874 fun, attributes); |
| 2870 } | 2875 } |
| 2871 | 2876 |
| 2872 Object* array = DefineGetterSetter(name, attributes); | 2877 Object* array = DefineGetterSetter(name, attributes); |
| 2873 if (array->IsFailure() || array->IsUndefined()) return array; | 2878 if (array->IsFailure() || array->IsUndefined()) return array; |
| 2874 FixedArray::cast(array)->set(is_getter ? 0 : 1, fun); | 2879 FixedArray::cast(array)->set(is_getter ? 0 : 1, fun); |
| 2875 return this; | 2880 return this; |
| 2876 } | 2881 } |
| 2877 | 2882 |
| 2878 | 2883 |
| 2879 Object* JSObject::DefineAccessor(AccessorInfo* info) { | 2884 Object* JSObject::DefineAccessor(AccessorInfo* info) { |
| 2880 String* name = String::cast(info->name()); | 2885 String* name = String::cast(info->name()); |
| 2881 // Check access rights if needed. | 2886 // Check access rights if needed. |
| 2882 if (IsAccessCheckNeeded() && | 2887 if (IsAccessCheckNeeded() && |
| 2883 !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { | 2888 !Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_SET)) { |
| 2884 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); | 2889 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 2885 return HEAP->undefined_value(); | 2890 return HEAP->undefined_value(); |
| 2886 } | 2891 } |
| 2887 | 2892 |
| 2888 if (IsJSGlobalProxy()) { | 2893 if (IsJSGlobalProxy()) { |
| 2889 Object* proto = GetPrototype(); | 2894 Object* proto = GetPrototype(); |
| 2890 if (proto->IsNull()) return this; | 2895 if (proto->IsNull()) return this; |
| 2891 ASSERT(proto->IsJSGlobalObject()); | 2896 ASSERT(proto->IsJSGlobalObject()); |
| 2892 return JSObject::cast(proto)->DefineAccessor(info); | 2897 return JSObject::cast(proto)->DefineAccessor(info); |
| 2893 } | 2898 } |
| 2894 | 2899 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2948 } | 2953 } |
| 2949 | 2954 |
| 2950 | 2955 |
| 2951 Object* JSObject::LookupAccessor(String* name, bool is_getter) { | 2956 Object* JSObject::LookupAccessor(String* name, bool is_getter) { |
| 2952 // Make sure that the top context does not change when doing callbacks or | 2957 // Make sure that the top context does not change when doing callbacks or |
| 2953 // interceptor calls. | 2958 // interceptor calls. |
| 2954 AssertNoContextChange ncc; | 2959 AssertNoContextChange ncc; |
| 2955 | 2960 |
| 2956 // Check access rights if needed. | 2961 // Check access rights if needed. |
| 2957 if (IsAccessCheckNeeded() && | 2962 if (IsAccessCheckNeeded() && |
| 2958 !Top::MayNamedAccess(this, name, v8::ACCESS_HAS)) { | 2963 !Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_HAS)) { |
| 2959 Top::ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 2964 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
| 2960 return HEAP->undefined_value(); | 2965 return HEAP->undefined_value(); |
| 2961 } | 2966 } |
| 2962 | 2967 |
| 2963 // Make the lookup and include prototypes. | 2968 // Make the lookup and include prototypes. |
| 2964 int accessor_index = is_getter ? kGetterIndex : kSetterIndex; | 2969 int accessor_index = is_getter ? kGetterIndex : kSetterIndex; |
| 2965 uint32_t index = 0; | 2970 uint32_t index = 0; |
| 2966 if (name->AsArrayIndex(&index)) { | 2971 if (name->AsArrayIndex(&index)) { |
| 2967 for (Object* obj = this; | 2972 for (Object* obj = this; |
| 2968 obj != HEAP->null_value(); | 2973 obj != HEAP->null_value(); |
| 2969 obj = JSObject::cast(obj)->GetPrototype()) { | 2974 obj = JSObject::cast(obj)->GetPrototype()) { |
| (...skipping 2063 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5033 if (!value->IsJSObject()) { | 5038 if (!value->IsJSObject()) { |
| 5034 // Copy the map so this does not affect unrelated functions. | 5039 // Copy the map so this does not affect unrelated functions. |
| 5035 // Remove map transitions because they point to maps with a | 5040 // Remove map transitions because they point to maps with a |
| 5036 // different prototype. | 5041 // different prototype. |
| 5037 Object* new_map = map()->CopyDropTransitions(); | 5042 Object* new_map = map()->CopyDropTransitions(); |
| 5038 if (new_map->IsFailure()) return new_map; | 5043 if (new_map->IsFailure()) return new_map; |
| 5039 set_map(Map::cast(new_map)); | 5044 set_map(Map::cast(new_map)); |
| 5040 map()->set_constructor(value); | 5045 map()->set_constructor(value); |
| 5041 map()->set_non_instance_prototype(true); | 5046 map()->set_non_instance_prototype(true); |
| 5042 construct_prototype = | 5047 construct_prototype = |
| 5043 Top::context()->global_context()->initial_object_prototype(); | 5048 Isolate::Current()->context()->global_context()-> |
| 5049 initial_object_prototype(); |
| 5044 } else { | 5050 } else { |
| 5045 map()->set_non_instance_prototype(false); | 5051 map()->set_non_instance_prototype(false); |
| 5046 } | 5052 } |
| 5047 | 5053 |
| 5048 return SetInstancePrototype(construct_prototype); | 5054 return SetInstancePrototype(construct_prototype); |
| 5049 } | 5055 } |
| 5050 | 5056 |
| 5051 | 5057 |
| 5052 Object* JSFunction::RemovePrototype() { | 5058 Object* JSFunction::RemovePrototype() { |
| 5053 ASSERT(map() == context()->global_context()->function_map()); | 5059 ASSERT(map() == context()->global_context()->function_map()); |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5575 | 5581 |
| 5576 // Computes the new capacity when expanding the elements of a JSObject. | 5582 // Computes the new capacity when expanding the elements of a JSObject. |
| 5577 static int NewElementsCapacity(int old_capacity) { | 5583 static int NewElementsCapacity(int old_capacity) { |
| 5578 // (old_capacity + 50%) + 16 | 5584 // (old_capacity + 50%) + 16 |
| 5579 return old_capacity + (old_capacity >> 1) + 16; | 5585 return old_capacity + (old_capacity >> 1) + 16; |
| 5580 } | 5586 } |
| 5581 | 5587 |
| 5582 | 5588 |
| 5583 static Object* ArrayLengthRangeError() { | 5589 static Object* ArrayLengthRangeError() { |
| 5584 HandleScope scope; | 5590 HandleScope scope; |
| 5585 return Top::Throw(*Factory::NewRangeError("invalid_array_length", | 5591 return Isolate::Current()->Throw( |
| 5586 HandleVector<Object>(NULL, 0))); | 5592 *Factory::NewRangeError("invalid_array_length", |
| 5593 HandleVector<Object>(NULL, 0))); |
| 5587 } | 5594 } |
| 5588 | 5595 |
| 5589 | 5596 |
| 5590 Object* JSObject::SetElementsLength(Object* len) { | 5597 Object* JSObject::SetElementsLength(Object* len) { |
| 5591 // We should never end in here with a pixel or external array. | 5598 // We should never end in here with a pixel or external array. |
| 5592 ASSERT(AllowsSetElementsLength()); | 5599 ASSERT(AllowsSetElementsLength()); |
| 5593 | 5600 |
| 5594 Object* smi_length = len->ToSmi(); | 5601 Object* smi_length = len->ToSmi(); |
| 5595 if (smi_length->IsSmi()) { | 5602 if (smi_length->IsSmi()) { |
| 5596 int value = Smi::cast(smi_length)->value(); | 5603 int value = Smi::cast(smi_length)->value(); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5676 if (!value->IsJSObject() && !value->IsNull()) return value; | 5683 if (!value->IsJSObject() && !value->IsNull()) return value; |
| 5677 | 5684 |
| 5678 // Before we can set the prototype we need to be sure | 5685 // Before we can set the prototype we need to be sure |
| 5679 // prototype cycles are prevented. | 5686 // prototype cycles are prevented. |
| 5680 // It is sufficient to validate that the receiver is not in the new prototype | 5687 // It is sufficient to validate that the receiver is not in the new prototype |
| 5681 // chain. | 5688 // chain. |
| 5682 for (Object* pt = value; pt != HEAP->null_value(); pt = pt->GetPrototype()) { | 5689 for (Object* pt = value; pt != HEAP->null_value(); pt = pt->GetPrototype()) { |
| 5683 if (JSObject::cast(pt) == this) { | 5690 if (JSObject::cast(pt) == this) { |
| 5684 // Cycle detected. | 5691 // Cycle detected. |
| 5685 HandleScope scope; | 5692 HandleScope scope; |
| 5686 return Top::Throw(*Factory::NewError("cyclic_proto", | 5693 return Isolate::Current()->Throw( |
| 5687 HandleVector<Object>(NULL, 0))); | 5694 *Factory::NewError("cyclic_proto", HandleVector<Object>(NULL, 0))); |
| 5688 } | 5695 } |
| 5689 } | 5696 } |
| 5690 | 5697 |
| 5691 JSObject* real_receiver = this; | 5698 JSObject* real_receiver = this; |
| 5692 | 5699 |
| 5693 if (skip_hidden_prototypes) { | 5700 if (skip_hidden_prototypes) { |
| 5694 // Find the first object in the chain whose prototype object is not | 5701 // Find the first object in the chain whose prototype object is not |
| 5695 // hidden and set the new prototype on that object. | 5702 // hidden and set the new prototype on that object. |
| 5696 Object* current_proto = real_receiver->GetPrototype(); | 5703 Object* current_proto = real_receiver->GetPrototype(); |
| 5697 while (current_proto->IsJSObject() && | 5704 while (current_proto->IsJSObject() && |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5802 } | 5809 } |
| 5803 if (!result.IsEmpty()) return true; | 5810 if (!result.IsEmpty()) return true; |
| 5804 } | 5811 } |
| 5805 return holder_handle->HasElementPostInterceptor(*receiver_handle, index); | 5812 return holder_handle->HasElementPostInterceptor(*receiver_handle, index); |
| 5806 } | 5813 } |
| 5807 | 5814 |
| 5808 | 5815 |
| 5809 bool JSObject::HasLocalElement(uint32_t index) { | 5816 bool JSObject::HasLocalElement(uint32_t index) { |
| 5810 // Check access rights if needed. | 5817 // Check access rights if needed. |
| 5811 if (IsAccessCheckNeeded() && | 5818 if (IsAccessCheckNeeded() && |
| 5812 !Top::MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 5819 !Isolate::Current()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { |
| 5813 Top::ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 5820 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
| 5814 return false; | 5821 return false; |
| 5815 } | 5822 } |
| 5816 | 5823 |
| 5817 // Check for lookup interceptor | 5824 // Check for lookup interceptor |
| 5818 if (HasIndexedInterceptor()) { | 5825 if (HasIndexedInterceptor()) { |
| 5819 return HasElementWithInterceptor(this, index); | 5826 return HasElementWithInterceptor(this, index); |
| 5820 } | 5827 } |
| 5821 | 5828 |
| 5822 // Handle [] on String objects. | 5829 // Handle [] on String objects. |
| 5823 if (this->IsStringObjectWithCharacterAt(index)) return true; | 5830 if (this->IsStringObjectWithCharacterAt(index)) return true; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 5854 break; | 5861 break; |
| 5855 } | 5862 } |
| 5856 UNREACHABLE(); | 5863 UNREACHABLE(); |
| 5857 return HEAP->null_value(); | 5864 return HEAP->null_value(); |
| 5858 } | 5865 } |
| 5859 | 5866 |
| 5860 | 5867 |
| 5861 bool JSObject::HasElementWithReceiver(JSObject* receiver, uint32_t index) { | 5868 bool JSObject::HasElementWithReceiver(JSObject* receiver, uint32_t index) { |
| 5862 // Check access rights if needed. | 5869 // Check access rights if needed. |
| 5863 if (IsAccessCheckNeeded() && | 5870 if (IsAccessCheckNeeded() && |
| 5864 !Top::MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 5871 !Isolate::Current()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { |
| 5865 Top::ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 5872 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
| 5866 return false; | 5873 return false; |
| 5867 } | 5874 } |
| 5868 | 5875 |
| 5869 // Check for lookup interceptor | 5876 // Check for lookup interceptor |
| 5870 if (HasIndexedInterceptor()) { | 5877 if (HasIndexedInterceptor()) { |
| 5871 return HasElementWithInterceptor(receiver, index); | 5878 return HasElementWithInterceptor(receiver, index); |
| 5872 } | 5879 } |
| 5873 | 5880 |
| 5874 switch (GetElementsKind()) { | 5881 switch (GetElementsKind()) { |
| 5875 case FAST_ELEMENTS: { | 5882 case FAST_ELEMENTS: { |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6037 } | 6044 } |
| 6038 | 6045 |
| 6039 if (structure->IsFixedArray()) { | 6046 if (structure->IsFixedArray()) { |
| 6040 Object* setter = FixedArray::cast(structure)->get(kSetterIndex); | 6047 Object* setter = FixedArray::cast(structure)->get(kSetterIndex); |
| 6041 if (setter->IsJSFunction()) { | 6048 if (setter->IsJSFunction()) { |
| 6042 return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value); | 6049 return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value); |
| 6043 } else { | 6050 } else { |
| 6044 Handle<Object> holder_handle(holder); | 6051 Handle<Object> holder_handle(holder); |
| 6045 Handle<Object> key(Factory::NewNumberFromUint(index)); | 6052 Handle<Object> key(Factory::NewNumberFromUint(index)); |
| 6046 Handle<Object> args[2] = { key, holder_handle }; | 6053 Handle<Object> args[2] = { key, holder_handle }; |
| 6047 return Top::Throw(*Factory::NewTypeError("no_setter_in_callback", | 6054 return Isolate::Current()->Throw( |
| 6048 HandleVector(args, 2))); | 6055 *Factory::NewTypeError("no_setter_in_callback", |
| 6056 HandleVector(args, 2))); |
| 6049 } | 6057 } |
| 6050 } | 6058 } |
| 6051 | 6059 |
| 6052 UNREACHABLE(); | 6060 UNREACHABLE(); |
| 6053 return NULL; | 6061 return NULL; |
| 6054 } | 6062 } |
| 6055 | 6063 |
| 6056 | 6064 |
| 6057 // Adding n elements in fast case is O(n*n). | 6065 // Adding n elements in fast case is O(n*n). |
| 6058 // Note: revisit design to have dual undefined values to capture absent | 6066 // Note: revisit design to have dual undefined values to capture absent |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6104 // Otherwise default to slow case. | 6112 // Otherwise default to slow case. |
| 6105 Object* obj = NormalizeElements(); | 6113 Object* obj = NormalizeElements(); |
| 6106 if (obj->IsFailure()) return obj; | 6114 if (obj->IsFailure()) return obj; |
| 6107 ASSERT(HasDictionaryElements()); | 6115 ASSERT(HasDictionaryElements()); |
| 6108 return SetElement(index, value); | 6116 return SetElement(index, value); |
| 6109 } | 6117 } |
| 6110 | 6118 |
| 6111 Object* JSObject::SetElement(uint32_t index, Object* value) { | 6119 Object* JSObject::SetElement(uint32_t index, Object* value) { |
| 6112 // Check access rights if needed. | 6120 // Check access rights if needed. |
| 6113 if (IsAccessCheckNeeded() && | 6121 if (IsAccessCheckNeeded() && |
| 6114 !Top::MayIndexedAccess(this, index, v8::ACCESS_SET)) { | 6122 !Isolate::Current()->MayIndexedAccess(this, index, v8::ACCESS_SET)) { |
| 6115 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); | 6123 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 6116 return value; | 6124 return value; |
| 6117 } | 6125 } |
| 6118 | 6126 |
| 6119 if (IsJSGlobalProxy()) { | 6127 if (IsJSGlobalProxy()) { |
| 6120 Object* proto = GetPrototype(); | 6128 Object* proto = GetPrototype(); |
| 6121 if (proto->IsNull()) return value; | 6129 if (proto->IsNull()) return value; |
| 6122 ASSERT(proto->IsJSGlobalObject()); | 6130 ASSERT(proto->IsJSGlobalObject()); |
| 6123 return JSObject::cast(proto)->SetElement(index, value); | 6131 return JSObject::cast(proto)->SetElement(index, value); |
| 6124 } | 6132 } |
| 6125 | 6133 |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6343 Object* raw_result = | 6351 Object* raw_result = |
| 6344 holder_handle->GetElementPostInterceptor(*this_handle, index); | 6352 holder_handle->GetElementPostInterceptor(*this_handle, index); |
| 6345 RETURN_IF_SCHEDULED_EXCEPTION(); | 6353 RETURN_IF_SCHEDULED_EXCEPTION(); |
| 6346 return raw_result; | 6354 return raw_result; |
| 6347 } | 6355 } |
| 6348 | 6356 |
| 6349 | 6357 |
| 6350 Object* JSObject::GetElementWithReceiver(JSObject* receiver, uint32_t index) { | 6358 Object* JSObject::GetElementWithReceiver(JSObject* receiver, uint32_t index) { |
| 6351 // Check access rights if needed. | 6359 // Check access rights if needed. |
| 6352 if (IsAccessCheckNeeded() && | 6360 if (IsAccessCheckNeeded() && |
| 6353 !Top::MayIndexedAccess(this, index, v8::ACCESS_GET)) { | 6361 !Isolate::Current()->MayIndexedAccess(this, index, v8::ACCESS_GET)) { |
| 6354 Top::ReportFailedAccessCheck(this, v8::ACCESS_GET); | 6362 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_GET); |
| 6355 return HEAP->undefined_value(); | 6363 return HEAP->undefined_value(); |
| 6356 } | 6364 } |
| 6357 | 6365 |
| 6358 if (HasIndexedInterceptor()) { | 6366 if (HasIndexedInterceptor()) { |
| 6359 return GetElementWithInterceptor(receiver, index); | 6367 return GetElementWithInterceptor(receiver, index); |
| 6360 } | 6368 } |
| 6361 | 6369 |
| 6362 // Get element works for both JSObject and JSArray since | 6370 // Get element works for both JSObject and JSArray since |
| 6363 // JSArray::length cannot change. | 6371 // JSArray::length cannot change. |
| 6364 switch (GetElementsKind()) { | 6372 switch (GetElementsKind()) { |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6663 *name_handle, | 6671 *name_handle, |
| 6664 attributes); | 6672 attributes); |
| 6665 RETURN_IF_SCHEDULED_EXCEPTION(); | 6673 RETURN_IF_SCHEDULED_EXCEPTION(); |
| 6666 return result; | 6674 return result; |
| 6667 } | 6675 } |
| 6668 | 6676 |
| 6669 | 6677 |
| 6670 bool JSObject::HasRealNamedProperty(String* key) { | 6678 bool JSObject::HasRealNamedProperty(String* key) { |
| 6671 // Check access rights if needed. | 6679 // Check access rights if needed. |
| 6672 if (IsAccessCheckNeeded() && | 6680 if (IsAccessCheckNeeded() && |
| 6673 !Top::MayNamedAccess(this, key, v8::ACCESS_HAS)) { | 6681 !Isolate::Current()->MayNamedAccess(this, key, v8::ACCESS_HAS)) { |
| 6674 Top::ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 6682 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
| 6675 return false; | 6683 return false; |
| 6676 } | 6684 } |
| 6677 | 6685 |
| 6678 LookupResult result; | 6686 LookupResult result; |
| 6679 LocalLookupRealNamedProperty(key, &result); | 6687 LocalLookupRealNamedProperty(key, &result); |
| 6680 return result.IsProperty() && (result.type() != INTERCEPTOR); | 6688 return result.IsProperty() && (result.type() != INTERCEPTOR); |
| 6681 } | 6689 } |
| 6682 | 6690 |
| 6683 | 6691 |
| 6684 bool JSObject::HasRealElementProperty(uint32_t index) { | 6692 bool JSObject::HasRealElementProperty(uint32_t index) { |
| 6685 // Check access rights if needed. | 6693 // Check access rights if needed. |
| 6686 if (IsAccessCheckNeeded() && | 6694 if (IsAccessCheckNeeded() && |
| 6687 !Top::MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 6695 !Isolate::Current()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { |
| 6688 Top::ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 6696 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
| 6689 return false; | 6697 return false; |
| 6690 } | 6698 } |
| 6691 | 6699 |
| 6692 // Handle [] on String objects. | 6700 // Handle [] on String objects. |
| 6693 if (this->IsStringObjectWithCharacterAt(index)) return true; | 6701 if (this->IsStringObjectWithCharacterAt(index)) return true; |
| 6694 | 6702 |
| 6695 switch (GetElementsKind()) { | 6703 switch (GetElementsKind()) { |
| 6696 case FAST_ELEMENTS: { | 6704 case FAST_ELEMENTS: { |
| 6697 uint32_t length = IsJSArray() ? | 6705 uint32_t length = IsJSArray() ? |
| 6698 static_cast<uint32_t>( | 6706 static_cast<uint32_t>( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 6725 } | 6733 } |
| 6726 // All possibilities have been handled above already. | 6734 // All possibilities have been handled above already. |
| 6727 UNREACHABLE(); | 6735 UNREACHABLE(); |
| 6728 return HEAP->null_value(); | 6736 return HEAP->null_value(); |
| 6729 } | 6737 } |
| 6730 | 6738 |
| 6731 | 6739 |
| 6732 bool JSObject::HasRealNamedCallbackProperty(String* key) { | 6740 bool JSObject::HasRealNamedCallbackProperty(String* key) { |
| 6733 // Check access rights if needed. | 6741 // Check access rights if needed. |
| 6734 if (IsAccessCheckNeeded() && | 6742 if (IsAccessCheckNeeded() && |
| 6735 !Top::MayNamedAccess(this, key, v8::ACCESS_HAS)) { | 6743 !Isolate::Current()->MayNamedAccess(this, key, v8::ACCESS_HAS)) { |
| 6736 Top::ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 6744 Isolate::Current()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
| 6737 return false; | 6745 return false; |
| 6738 } | 6746 } |
| 6739 | 6747 |
| 6740 LookupResult result; | 6748 LookupResult result; |
| 6741 LocalLookupRealNamedProperty(key, &result); | 6749 LocalLookupRealNamedProperty(key, &result); |
| 6742 return result.IsProperty() && (result.type() == CALLBACKS); | 6750 return result.IsProperty() && (result.type() == CALLBACKS); |
| 6743 } | 6751 } |
| 6744 | 6752 |
| 6745 | 6753 |
| 6746 int JSObject::NumberOfLocalProperties(PropertyAttributes filter) { | 6754 int JSObject::NumberOfLocalProperties(PropertyAttributes filter) { |
| (...skipping 1974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8721 if (break_point_objects()->IsUndefined()) return 0; | 8729 if (break_point_objects()->IsUndefined()) return 0; |
| 8722 // Single beak point. | 8730 // Single beak point. |
| 8723 if (!break_point_objects()->IsFixedArray()) return 1; | 8731 if (!break_point_objects()->IsFixedArray()) return 1; |
| 8724 // Multiple break points. | 8732 // Multiple break points. |
| 8725 return FixedArray::cast(break_point_objects())->length(); | 8733 return FixedArray::cast(break_point_objects())->length(); |
| 8726 } | 8734 } |
| 8727 #endif | 8735 #endif |
| 8728 | 8736 |
| 8729 | 8737 |
| 8730 } } // namespace v8::internal | 8738 } } // namespace v8::internal |
| OLD | NEW |