OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 // objects more than once in case of interceptors, because the | 326 // objects more than once in case of interceptors, because the |
327 // holder will always be the interceptor holder and the search may | 327 // holder will always be the interceptor holder and the search may |
328 // only continue with a current object just after the interceptor | 328 // only continue with a current object just after the interceptor |
329 // holder in the prototype chain. | 329 // holder in the prototype chain. |
330 Object* last = result->IsValid() ? result->holder() : Heap::null_value(); | 330 Object* last = result->IsValid() ? result->holder() : Heap::null_value(); |
331 for (Object* current = this; true; current = current->GetPrototype()) { | 331 for (Object* current = this; true; current = current->GetPrototype()) { |
332 if (current->IsAccessCheckNeeded()) { | 332 if (current->IsAccessCheckNeeded()) { |
333 // Check if we're allowed to read from the current object. Note | 333 // Check if we're allowed to read from the current object. Note |
334 // that even though we may not actually end up loading the named | 334 // that even though we may not actually end up loading the named |
335 // property from the current object, we still check that we have | 335 // property from the current object, we still check that we have |
336 // access to the it. | 336 // access to it. |
337 JSObject* checked = JSObject::cast(current); | 337 JSObject* checked = JSObject::cast(current); |
338 if (!Top::MayNamedAccess(checked, name, v8::ACCESS_GET)) { | 338 if (!Top::MayNamedAccess(checked, name, v8::ACCESS_GET)) { |
339 return checked->GetPropertyWithFailedAccessCheck(receiver, | 339 return checked->GetPropertyWithFailedAccessCheck(receiver, |
340 result, | 340 result, |
341 name); | 341 name); |
342 } | 342 } |
343 } | 343 } |
344 // Stop traversing the chain once we reach the last object in the | 344 // Stop traversing the chain once we reach the last object in the |
345 // chain; either the holder of the result or null in case of an | 345 // chain; either the holder of the result or null in case of an |
346 // absent property. | 346 // absent property. |
(...skipping 3696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4043 | 4043 |
4044 | 4044 |
4045 void String::PrintOn(FILE* file) { | 4045 void String::PrintOn(FILE* file) { |
4046 int length = this->length(); | 4046 int length = this->length(); |
4047 for (int i = 0; i < length; i++) { | 4047 for (int i = 0; i < length; i++) { |
4048 fprintf(file, "%c", Get(i)); | 4048 fprintf(file, "%c", Get(i)); |
4049 } | 4049 } |
4050 } | 4050 } |
4051 | 4051 |
4052 | 4052 |
| 4053 void Map::CreateBackPointers() { |
| 4054 DescriptorArray* descriptors = instance_descriptors(); |
| 4055 for (DescriptorReader r(descriptors); !r.eos(); r.advance()) { |
| 4056 if (r.type() == MAP_TRANSITION) { |
| 4057 // Get target. |
| 4058 Map* target = Map::cast(r.GetValue()); |
| 4059 #ifdef DEBUG |
| 4060 // Verify target. |
| 4061 Object* source_prototype = prototype(); |
| 4062 Object* target_prototype = target->prototype(); |
| 4063 ASSERT(source_prototype->IsJSObject() || |
| 4064 source_prototype->IsMap() || |
| 4065 source_prototype->IsNull()); |
| 4066 ASSERT(target_prototype->IsJSObject() || |
| 4067 target_prototype->IsNull()); |
| 4068 ASSERT(source_prototype->IsMap() || |
| 4069 source_prototype == target_prototype); |
| 4070 #endif |
| 4071 // Point target back to source. set_prototype() will not let us set |
| 4072 // the prototype to a map, as we do here. |
| 4073 RawField(target, kPrototypeOffset) = this; |
| 4074 } |
| 4075 } |
| 4076 } |
| 4077 |
| 4078 |
| 4079 void Map::ClearNonLiveTransitions(Object* real_prototype) { |
| 4080 // Live DescriptorArray objects will be marked, so we must use |
| 4081 // low-level accessors to get and modify their data. |
| 4082 DescriptorArray* d = reinterpret_cast<DescriptorArray*>( |
| 4083 RawField(this, Map::kInstanceDescriptorsOffset)); |
| 4084 if (d == Heap::empty_descriptor_array()) return; |
| 4085 Smi* NullDescriptorDetails = |
| 4086 PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi(); |
| 4087 FixedArray* contents = reinterpret_cast<FixedArray*>( |
| 4088 d->get(DescriptorArray::kContentArrayIndex)); |
| 4089 ASSERT(contents->length() >= 2); |
| 4090 for (int i = 0; i < contents->length(); i += 2) { |
| 4091 // If the pair (value, details) is a map transition, |
| 4092 // check if the target is live. If not, null the descriptor. |
| 4093 // Also drop the back pointer for that map transition, so that this |
| 4094 // map is not reached again by following a back pointer from a |
| 4095 // non-live object. |
| 4096 PropertyDetails details(Smi::cast(contents->get(i + 1))); |
| 4097 if (details.type() == MAP_TRANSITION) { |
| 4098 Map* target = reinterpret_cast<Map*>(contents->get(i)); |
| 4099 ASSERT(target->IsHeapObject()); |
| 4100 if (!target->IsMarked()) { |
| 4101 ASSERT(target->IsMap()); |
| 4102 contents->set(i + 1, NullDescriptorDetails, SKIP_WRITE_BARRIER); |
| 4103 contents->set(i, Heap::null_value(), SKIP_WRITE_BARRIER); |
| 4104 ASSERT(target->prototype() == this || |
| 4105 target->prototype() == real_prototype); |
| 4106 // Getter prototype() is read-only, set_prototype() has side effects. |
| 4107 RawField(target, Map::kPrototypeOffset) = real_prototype; |
| 4108 } |
| 4109 } |
| 4110 } |
| 4111 } |
| 4112 |
| 4113 |
4053 void Map::MapIterateBody(ObjectVisitor* v) { | 4114 void Map::MapIterateBody(ObjectVisitor* v) { |
4054 // Assumes all Object* members are contiguously allocated! | 4115 // Assumes all Object* members are contiguously allocated! |
4055 IteratePointers(v, kPrototypeOffset, kCodeCacheOffset + kPointerSize); | 4116 IteratePointers(v, kPrototypeOffset, kCodeCacheOffset + kPointerSize); |
4056 } | 4117 } |
4057 | 4118 |
4058 | 4119 |
4059 Object* JSFunction::SetInstancePrototype(Object* value) { | 4120 Object* JSFunction::SetInstancePrototype(Object* value) { |
4060 ASSERT(value->IsJSObject()); | 4121 ASSERT(value->IsJSObject()); |
4061 | 4122 |
4062 if (has_initial_map()) { | 4123 if (has_initial_map()) { |
(...skipping 2658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6721 int BreakPointInfo::GetBreakPointCount() { | 6782 int BreakPointInfo::GetBreakPointCount() { |
6722 // No break point. | 6783 // No break point. |
6723 if (break_point_objects()->IsUndefined()) return 0; | 6784 if (break_point_objects()->IsUndefined()) return 0; |
6724 // Single beak point. | 6785 // Single beak point. |
6725 if (!break_point_objects()->IsFixedArray()) return 1; | 6786 if (!break_point_objects()->IsFixedArray()) return 1; |
6726 // Multiple break points. | 6787 // Multiple break points. |
6727 return FixedArray::cast(break_point_objects())->length(); | 6788 return FixedArray::cast(break_point_objects())->length(); |
6728 } | 6789 } |
6729 | 6790 |
6730 | 6791 |
| 6792 const int FunctionTemplateInfo::kSize; |
| 6793 const int ObjectTemplateInfo::kSize; |
6731 } } // namespace v8::internal | 6794 } } // namespace v8::internal |
OLD | NEW |