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 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 ASSERT(holder != NULL); // cannot handle null or undefined. | 140 ASSERT(holder != NULL); // cannot handle null or undefined. |
141 JSObject::cast(holder)->Lookup(name, result); | 141 JSObject::cast(holder)->Lookup(name, result); |
142 } | 142 } |
143 | 143 |
144 | 144 |
145 Object* Object::GetPropertyWithReceiver(Object* receiver, | 145 Object* Object::GetPropertyWithReceiver(Object* receiver, |
146 String* name, | 146 String* name, |
147 PropertyAttributes* attributes) { | 147 PropertyAttributes* attributes) { |
148 LookupResult result; | 148 LookupResult result; |
149 Lookup(name, &result); | 149 Lookup(name, &result); |
150 return GetProperty(receiver, &result, name, attributes); | 150 Object* value = GetProperty(receiver, &result, name, attributes); |
| 151 ASSERT(*attributes <= ABSENT); |
| 152 return value; |
151 } | 153 } |
152 | 154 |
153 | 155 |
154 Object* Object::GetPropertyWithCallback(Object* receiver, | 156 Object* Object::GetPropertyWithCallback(Object* receiver, |
155 Object* structure, | 157 Object* structure, |
156 String* name, | 158 String* name, |
157 Object* holder) { | 159 Object* holder) { |
158 // To accommodate both the old and the new api we switch on the | 160 // To accommodate both the old and the new api we switch on the |
159 // data structure used to store the callbacks. Eventually proxy | 161 // data structure used to store the callbacks. Eventually proxy |
160 // callbacks should be phased out. | 162 // callbacks should be phased out. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 // Getter is not a function. | 210 // Getter is not a function. |
209 return Heap::undefined_value(); | 211 return Heap::undefined_value(); |
210 } | 212 } |
211 | 213 |
212 UNREACHABLE(); | 214 UNREACHABLE(); |
213 return 0; | 215 return 0; |
214 } | 216 } |
215 | 217 |
216 | 218 |
217 // Only deal with CALLBACKS and INTERCEPTOR | 219 // Only deal with CALLBACKS and INTERCEPTOR |
218 Object* JSObject::GetPropertyWithFailedAccessCheck(Object* receiver, | 220 Object* JSObject::GetPropertyWithFailedAccessCheck( |
219 LookupResult* result, | 221 Object* receiver, |
220 String* name) { | 222 LookupResult* result, |
| 223 String* name, |
| 224 PropertyAttributes* attributes) { |
221 if (result->IsValid()) { | 225 if (result->IsValid()) { |
222 switch (result->type()) { | 226 switch (result->type()) { |
223 case CALLBACKS: { | 227 case CALLBACKS: { |
224 // Only allow API accessors. | 228 // Only allow API accessors. |
225 Object* obj = result->GetCallbackObject(); | 229 Object* obj = result->GetCallbackObject(); |
226 if (obj->IsAccessorInfo()) { | 230 if (obj->IsAccessorInfo()) { |
227 AccessorInfo* info = AccessorInfo::cast(obj); | 231 AccessorInfo* info = AccessorInfo::cast(obj); |
228 if (info->all_can_read()) { | 232 if (info->all_can_read()) { |
| 233 *attributes = result->GetAttributes(); |
229 return GetPropertyWithCallback(receiver, | 234 return GetPropertyWithCallback(receiver, |
230 result->GetCallbackObject(), | 235 result->GetCallbackObject(), |
231 name, | 236 name, |
232 result->holder()); | 237 result->holder()); |
233 } | 238 } |
234 } | 239 } |
235 break; | 240 break; |
236 } | 241 } |
237 case NORMAL: | 242 case NORMAL: |
238 case FIELD: | 243 case FIELD: |
239 case CONSTANT_FUNCTION: { | 244 case CONSTANT_FUNCTION: { |
240 // Search ALL_CAN_READ accessors in prototype chain. | 245 // Search ALL_CAN_READ accessors in prototype chain. |
241 LookupResult r; | 246 LookupResult r; |
242 result->holder()->LookupRealNamedPropertyInPrototypes(name, &r); | 247 result->holder()->LookupRealNamedPropertyInPrototypes(name, &r); |
243 if (r.IsValid()) { | 248 if (r.IsValid()) { |
244 return GetPropertyWithFailedAccessCheck(receiver, &r, name); | 249 return GetPropertyWithFailedAccessCheck(receiver, |
| 250 &r, |
| 251 name, |
| 252 attributes); |
245 } | 253 } |
246 break; | 254 break; |
247 } | 255 } |
248 case INTERCEPTOR: { | 256 case INTERCEPTOR: { |
249 // If the object has an interceptor, try real named properties. | 257 // If the object has an interceptor, try real named properties. |
250 // No access check in GetPropertyAttributeWithInterceptor. | 258 // No access check in GetPropertyAttributeWithInterceptor. |
251 LookupResult r; | 259 LookupResult r; |
252 result->holder()->LookupRealNamedProperty(name, &r); | 260 result->holder()->LookupRealNamedProperty(name, &r); |
253 if (r.IsValid()) { | 261 if (r.IsValid()) { |
254 return GetPropertyWithFailedAccessCheck(receiver, &r, name); | 262 return GetPropertyWithFailedAccessCheck(receiver, |
| 263 &r, |
| 264 name, |
| 265 attributes); |
255 } | 266 } |
256 break; | |
257 } | 267 } |
258 default: { | 268 default: { |
259 break; | 269 break; |
260 } | 270 } |
261 } | 271 } |
262 } | 272 } |
263 | 273 |
| 274 // No accessible property found. |
| 275 *attributes = ABSENT; |
264 Top::ReportFailedAccessCheck(this, v8::ACCESS_GET); | 276 Top::ReportFailedAccessCheck(this, v8::ACCESS_GET); |
265 return Heap::undefined_value(); | 277 return Heap::undefined_value(); |
266 } | 278 } |
267 | 279 |
268 | 280 |
269 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( | 281 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( |
270 Object* receiver, | 282 Object* receiver, |
271 LookupResult* result, | 283 LookupResult* result, |
272 String* name, | 284 String* name, |
273 bool continue_search) { | 285 bool continue_search) { |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 for (Object* current = this; true; current = current->GetPrototype()) { | 407 for (Object* current = this; true; current = current->GetPrototype()) { |
396 if (current->IsAccessCheckNeeded()) { | 408 if (current->IsAccessCheckNeeded()) { |
397 // Check if we're allowed to read from the current object. Note | 409 // Check if we're allowed to read from the current object. Note |
398 // that even though we may not actually end up loading the named | 410 // that even though we may not actually end up loading the named |
399 // property from the current object, we still check that we have | 411 // property from the current object, we still check that we have |
400 // access to it. | 412 // access to it. |
401 JSObject* checked = JSObject::cast(current); | 413 JSObject* checked = JSObject::cast(current); |
402 if (!Top::MayNamedAccess(checked, name, v8::ACCESS_GET)) { | 414 if (!Top::MayNamedAccess(checked, name, v8::ACCESS_GET)) { |
403 return checked->GetPropertyWithFailedAccessCheck(receiver, | 415 return checked->GetPropertyWithFailedAccessCheck(receiver, |
404 result, | 416 result, |
405 name); | 417 name, |
| 418 attributes); |
406 } | 419 } |
407 } | 420 } |
408 // Stop traversing the chain once we reach the last object in the | 421 // Stop traversing the chain once we reach the last object in the |
409 // chain; either the holder of the result or null in case of an | 422 // chain; either the holder of the result or null in case of an |
410 // absent property. | 423 // absent property. |
411 if (current == last) break; | 424 if (current == last) break; |
412 } | 425 } |
413 | 426 |
414 if (!result->IsProperty()) { | 427 if (!result->IsProperty()) { |
415 *attributes = ABSENT; | 428 *attributes = ABSENT; |
(...skipping 6538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6954 // No break point. | 6967 // No break point. |
6955 if (break_point_objects()->IsUndefined()) return 0; | 6968 if (break_point_objects()->IsUndefined()) return 0; |
6956 // Single beak point. | 6969 // Single beak point. |
6957 if (!break_point_objects()->IsFixedArray()) return 1; | 6970 if (!break_point_objects()->IsFixedArray()) return 1; |
6958 // Multiple break points. | 6971 // Multiple break points. |
6959 return FixedArray::cast(break_point_objects())->length(); | 6972 return FixedArray::cast(break_point_objects())->length(); |
6960 } | 6973 } |
6961 | 6974 |
6962 | 6975 |
6963 } } // namespace v8::internal | 6976 } } // namespace v8::internal |
OLD | NEW |