Chromium Code Reviews| 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 2239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2250 LocalLookupRealNamedProperty(name, result); | 2250 LocalLookupRealNamedProperty(name, result); |
| 2251 } | 2251 } |
| 2252 | 2252 |
| 2253 | 2253 |
| 2254 void JSObject::Lookup(String* name, LookupResult* result) { | 2254 void JSObject::Lookup(String* name, LookupResult* result) { |
| 2255 // Ecma-262 3rd 8.6.2.4 | 2255 // Ecma-262 3rd 8.6.2.4 |
| 2256 for (Object* current = this; | 2256 for (Object* current = this; |
| 2257 current != Heap::null_value(); | 2257 current != Heap::null_value(); |
| 2258 current = JSObject::cast(current)->GetPrototype()) { | 2258 current = JSObject::cast(current)->GetPrototype()) { |
| 2259 JSObject::cast(current)->LocalLookup(name, result); | 2259 JSObject::cast(current)->LocalLookup(name, result); |
| 2260 if (result->IsValid() && !result->IsTransitionType()) { | 2260 if (result->IsValid() && !result->IsTransitionType()) return; |
| 2261 return; | 2261 } |
| 2262 } | 2262 result->NotFound(); |
| 2263 } | |
| 2264 | |
| 2265 | |
| 2266 // Search object and it's prototype chain for callback properties. | |
| 2267 void JSObject::LookupCallback(String* name, LookupResult* result) { | |
| 2268 for (Object* current = this; | |
| 2269 current != Heap::null_value(); | |
| 2270 current = JSObject::cast(current)->GetPrototype()) { | |
| 2271 JSObject::cast(current)->LocalLookupRealNamedProperty(name, result); | |
| 2272 if (result->IsValid() && result->type() == CALLBACKS) return; | |
| 2263 } | 2273 } |
| 2264 result->NotFound(); | 2274 result->NotFound(); |
| 2265 } | 2275 } |
| 2266 | 2276 |
| 2267 | 2277 |
| 2268 Object* JSObject::DefineGetterSetter(String* name, | 2278 Object* JSObject::DefineGetterSetter(String* name, |
| 2269 PropertyAttributes attributes) { | 2279 PropertyAttributes attributes) { |
| 2270 // Make sure that the top context does not change when doing callbacks or | 2280 // Make sure that the top context does not change when doing callbacks or |
| 2271 // interceptor calls. | 2281 // interceptor calls. |
| 2272 AssertNoContextChange ncc; | 2282 AssertNoContextChange ncc; |
| 2273 | 2283 |
| 2274 // Check access rights if needed. | 2284 // Check access rights if needed. |
| 2275 if (IsAccessCheckNeeded() && | 2285 if (IsAccessCheckNeeded() && |
| 2276 !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { | 2286 !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { |
| 2277 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); | 2287 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 2278 return Heap::undefined_value(); | 2288 return Heap::undefined_value(); |
| 2279 } | 2289 } |
| 2280 | 2290 |
| 2281 // TryFlatten before operating on the string. | 2291 // TryFlatten before operating on the string. |
| 2282 name->TryFlatten(); | 2292 name->TryFlatten(); |
| 2283 | 2293 |
| 2284 // Make sure name is not an index. | 2294 // Make sure name is not an index. |
| 2285 uint32_t index; | 2295 uint32_t index; |
| 2286 if (name->AsArrayIndex(&index)) return Heap::undefined_value(); | 2296 if (name->AsArrayIndex(&index)) return Heap::undefined_value(); |
| 2287 | 2297 |
| 2298 // Check if there is an API defined callback object which prohibits | |
| 2299 // callback overwriting in this object or it's prototype chain. | |
| 2300 // This mechanism is needed for instance in a browser setting, where | |
| 2301 // certain accessors such as window.location should not be allowed | |
| 2302 // to be overwriten because allowing overwriting could potentially | |
|
Kasper Lund
2008/10/30 12:32:27
overwritten
| |
| 2303 // cause security problems. | |
| 2304 LookupResult callback_result; | |
| 2305 LookupCallback(name, &callback_result); | |
| 2306 if (callback_result.IsValid()) { | |
| 2307 Object* obj = callback_result.GetCallbackObject(); | |
| 2308 if (obj->IsAccessorInfo() && | |
| 2309 AccessorInfo::cast(obj)->prohibits_overwriting()) { | |
| 2310 return Heap::undefined_value(); | |
| 2311 } | |
| 2312 } | |
| 2313 | |
| 2288 // Lookup the name. | 2314 // Lookup the name. |
| 2289 LookupResult result; | 2315 LookupResult result; |
| 2290 LocalLookup(name, &result); | 2316 LocalLookup(name, &result); |
| 2291 if (result.IsValid()) { | 2317 if (result.IsValid()) { |
| 2292 if (result.IsReadOnly()) return Heap::undefined_value(); | 2318 if (result.IsReadOnly()) return Heap::undefined_value(); |
| 2293 if (result.type() == CALLBACKS) { | 2319 if (result.type() == CALLBACKS) { |
| 2294 Object* obj = result.GetCallbackObject(); | 2320 Object* obj = result.GetCallbackObject(); |
| 2295 if (obj->IsFixedArray()) return obj; | 2321 if (obj->IsFixedArray()) return obj; |
| 2296 } | 2322 } |
| 2297 } | 2323 } |
| (...skipping 4487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6785 // No break point. | 6811 // No break point. |
| 6786 if (break_point_objects()->IsUndefined()) return 0; | 6812 if (break_point_objects()->IsUndefined()) return 0; |
| 6787 // Single beak point. | 6813 // Single beak point. |
| 6788 if (!break_point_objects()->IsFixedArray()) return 1; | 6814 if (!break_point_objects()->IsFixedArray()) return 1; |
| 6789 // Multiple break points. | 6815 // Multiple break points. |
| 6790 return FixedArray::cast(break_point_objects())->length(); | 6816 return FixedArray::cast(break_point_objects())->length(); |
| 6791 } | 6817 } |
| 6792 | 6818 |
| 6793 | 6819 |
| 6794 } } // namespace v8::internal | 6820 } } // namespace v8::internal |
| OLD | NEW |