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

Side by Side Diff: src/objects.cc

Issue 8341009: Make the GC aware of JSReceiver pointers in LookupResults. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Inlined LookupResult constructor and destructor. Created 9 years, 2 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/mips/stub-cache-mips.cc ('k') | src/profile-generator.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 } 147 }
148 } 148 }
149 ASSERT(holder != NULL); // Cannot handle null or undefined. 149 ASSERT(holder != NULL); // Cannot handle null or undefined.
150 JSReceiver::cast(holder)->Lookup(name, result); 150 JSReceiver::cast(holder)->Lookup(name, result);
151 } 151 }
152 152
153 153
154 MaybeObject* Object::GetPropertyWithReceiver(Object* receiver, 154 MaybeObject* Object::GetPropertyWithReceiver(Object* receiver,
155 String* name, 155 String* name,
156 PropertyAttributes* attributes) { 156 PropertyAttributes* attributes) {
157 LookupResult result; 157 LookupResult result(name->GetIsolate());
158 Lookup(name, &result); 158 Lookup(name, &result);
159 MaybeObject* value = GetProperty(receiver, &result, name, attributes); 159 MaybeObject* value = GetProperty(receiver, &result, name, attributes);
160 ASSERT(*attributes <= ABSENT); 160 ASSERT(*attributes <= ABSENT);
161 return value; 161 return value;
162 } 162 }
163 163
164 164
165 MaybeObject* JSObject::GetPropertyWithCallback(Object* receiver, 165 MaybeObject* JSObject::GetPropertyWithCallback(Object* receiver,
166 Object* structure, 166 Object* structure,
167 String* name) { 167 String* name) {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 return result->holder()->GetPropertyWithCallback( 303 return result->holder()->GetPropertyWithCallback(
304 receiver, result->GetCallbackObject(), name); 304 receiver, result->GetCallbackObject(), name);
305 } 305 }
306 } 306 }
307 break; 307 break;
308 } 308 }
309 case NORMAL: 309 case NORMAL:
310 case FIELD: 310 case FIELD:
311 case CONSTANT_FUNCTION: { 311 case CONSTANT_FUNCTION: {
312 // Search ALL_CAN_READ accessors in prototype chain. 312 // Search ALL_CAN_READ accessors in prototype chain.
313 LookupResult r; 313 LookupResult r(GetIsolate());
314 result->holder()->LookupRealNamedPropertyInPrototypes(name, &r); 314 result->holder()->LookupRealNamedPropertyInPrototypes(name, &r);
315 if (r.IsProperty()) { 315 if (r.IsProperty()) {
316 return GetPropertyWithFailedAccessCheck(receiver, 316 return GetPropertyWithFailedAccessCheck(receiver,
317 &r, 317 &r,
318 name, 318 name,
319 attributes); 319 attributes);
320 } 320 }
321 break; 321 break;
322 } 322 }
323 case INTERCEPTOR: { 323 case INTERCEPTOR: {
324 // If the object has an interceptor, try real named properties. 324 // If the object has an interceptor, try real named properties.
325 // No access check in GetPropertyAttributeWithInterceptor. 325 // No access check in GetPropertyAttributeWithInterceptor.
326 LookupResult r; 326 LookupResult r(GetIsolate());
327 result->holder()->LookupRealNamedProperty(name, &r); 327 result->holder()->LookupRealNamedProperty(name, &r);
328 if (r.IsProperty()) { 328 if (r.IsProperty()) {
329 return GetPropertyWithFailedAccessCheck(receiver, 329 return GetPropertyWithFailedAccessCheck(receiver,
330 &r, 330 &r,
331 name, 331 name,
332 attributes); 332 attributes);
333 } 333 }
334 break; 334 break;
335 } 335 }
336 default: 336 default:
(...skipping 26 matching lines...) Expand all
363 } 363 }
364 } 364 }
365 break; 365 break;
366 } 366 }
367 367
368 case NORMAL: 368 case NORMAL:
369 case FIELD: 369 case FIELD:
370 case CONSTANT_FUNCTION: { 370 case CONSTANT_FUNCTION: {
371 if (!continue_search) break; 371 if (!continue_search) break;
372 // Search ALL_CAN_READ accessors in prototype chain. 372 // Search ALL_CAN_READ accessors in prototype chain.
373 LookupResult r; 373 LookupResult r(GetIsolate());
374 result->holder()->LookupRealNamedPropertyInPrototypes(name, &r); 374 result->holder()->LookupRealNamedPropertyInPrototypes(name, &r);
375 if (r.IsProperty()) { 375 if (r.IsProperty()) {
376 return GetPropertyAttributeWithFailedAccessCheck(receiver, 376 return GetPropertyAttributeWithFailedAccessCheck(receiver,
377 &r, 377 &r,
378 name, 378 name,
379 continue_search); 379 continue_search);
380 } 380 }
381 break; 381 break;
382 } 382 }
383 383
384 case INTERCEPTOR: { 384 case INTERCEPTOR: {
385 // If the object has an interceptor, try real named properties. 385 // If the object has an interceptor, try real named properties.
386 // No access check in GetPropertyAttributeWithInterceptor. 386 // No access check in GetPropertyAttributeWithInterceptor.
387 LookupResult r; 387 LookupResult r(GetIsolate());
388 if (continue_search) { 388 if (continue_search) {
389 result->holder()->LookupRealNamedProperty(name, &r); 389 result->holder()->LookupRealNamedProperty(name, &r);
390 } else { 390 } else {
391 result->holder()->LocalLookupRealNamedProperty(name, &r); 391 result->holder()->LocalLookupRealNamedProperty(name, &r);
392 } 392 }
393 if (r.IsProperty()) { 393 if (r.IsProperty()) {
394 return GetPropertyAttributeWithFailedAccessCheck(receiver, 394 return GetPropertyAttributeWithFailedAccessCheck(receiver,
395 &r, 395 &r,
396 name, 396 name,
397 continue_search); 397 continue_search);
398 } 398 }
399 break; 399 break;
400 } 400 }
401 401
402 default: 402 default:
403 UNREACHABLE(); 403 UNREACHABLE();
404 } 404 }
405 } 405 }
406 406
407 GetHeap()->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); 407 GetIsolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS);
408 return ABSENT; 408 return ABSENT;
409 } 409 }
410 410
411 411
412 Object* JSObject::GetNormalizedProperty(LookupResult* result) { 412 Object* JSObject::GetNormalizedProperty(LookupResult* result) {
413 ASSERT(!HasFastProperties()); 413 ASSERT(!HasFastProperties());
414 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry()); 414 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry());
415 if (IsGlobalObject()) { 415 if (IsGlobalObject()) {
416 value = JSGlobalPropertyCell::cast(value)->value(); 416 value = JSGlobalPropertyCell::cast(value)->value();
417 } 417 }
(...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1651 return AddSlowProperty(name, value, attributes); 1651 return AddSlowProperty(name, value, attributes);
1652 } 1652 }
1653 1653
1654 1654
1655 MaybeObject* JSObject::SetPropertyPostInterceptor( 1655 MaybeObject* JSObject::SetPropertyPostInterceptor(
1656 String* name, 1656 String* name,
1657 Object* value, 1657 Object* value,
1658 PropertyAttributes attributes, 1658 PropertyAttributes attributes,
1659 StrictModeFlag strict_mode) { 1659 StrictModeFlag strict_mode) {
1660 // Check local property, ignore interceptor. 1660 // Check local property, ignore interceptor.
1661 LookupResult result; 1661 LookupResult result(GetIsolate());
1662 LocalLookupRealNamedProperty(name, &result); 1662 LocalLookupRealNamedProperty(name, &result);
1663 if (result.IsFound()) { 1663 if (result.IsFound()) {
1664 // An existing property, a map transition or a null descriptor was 1664 // An existing property, a map transition or a null descriptor was
1665 // found. Use set property to handle all these cases. 1665 // found. Use set property to handle all these cases.
1666 return SetProperty(&result, name, value, attributes, strict_mode); 1666 return SetProperty(&result, name, value, attributes, strict_mode);
1667 } 1667 }
1668 bool found = false; 1668 bool found = false;
1669 MaybeObject* result_object; 1669 MaybeObject* result_object;
1670 result_object = SetPropertyWithCallbackSetterInPrototypes(name, 1670 result_object = SetPropertyWithCallbackSetterInPrototypes(name,
1671 value, 1671 value,
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
1833 strict_mode); 1833 strict_mode);
1834 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 1834 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
1835 return raw_result; 1835 return raw_result;
1836 } 1836 }
1837 1837
1838 1838
1839 MaybeObject* JSReceiver::SetProperty(String* name, 1839 MaybeObject* JSReceiver::SetProperty(String* name,
1840 Object* value, 1840 Object* value,
1841 PropertyAttributes attributes, 1841 PropertyAttributes attributes,
1842 StrictModeFlag strict_mode) { 1842 StrictModeFlag strict_mode) {
1843 LookupResult result; 1843 LookupResult result(GetIsolate());
1844 LocalLookup(name, &result); 1844 LocalLookup(name, &result);
1845 return SetProperty(&result, name, value, attributes, strict_mode); 1845 return SetProperty(&result, name, value, attributes, strict_mode);
1846 } 1846 }
1847 1847
1848 1848
1849 MaybeObject* JSObject::SetPropertyWithCallback(Object* structure, 1849 MaybeObject* JSObject::SetPropertyWithCallback(Object* structure,
1850 String* name, 1850 String* name,
1851 Object* value, 1851 Object* value,
1852 JSObject* holder, 1852 JSObject* holder,
1853 StrictModeFlag strict_mode) { 1853 StrictModeFlag strict_mode) {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1999 *found = false; 1999 *found = false;
2000 return heap->the_hole_value(); 2000 return heap->the_hole_value();
2001 } 2001 }
2002 2002
2003 MaybeObject* JSObject::SetPropertyWithCallbackSetterInPrototypes( 2003 MaybeObject* JSObject::SetPropertyWithCallbackSetterInPrototypes(
2004 String* name, 2004 String* name,
2005 Object* value, 2005 Object* value,
2006 PropertyAttributes attributes, 2006 PropertyAttributes attributes,
2007 bool* found, 2007 bool* found,
2008 StrictModeFlag strict_mode) { 2008 StrictModeFlag strict_mode) {
2009 LookupResult result; 2009 Heap* heap = GetHeap();
2010 LookupResult result(heap->isolate());
2010 LookupCallbackSetterInPrototypes(name, &result); 2011 LookupCallbackSetterInPrototypes(name, &result);
2011 Heap* heap = GetHeap();
2012 if (result.IsFound()) { 2012 if (result.IsFound()) {
2013 *found = true; 2013 *found = true;
2014 if (result.type() == CALLBACKS) { 2014 if (result.type() == CALLBACKS) {
2015 return SetPropertyWithCallback(result.GetCallbackObject(), 2015 return SetPropertyWithCallback(result.GetCallbackObject(),
2016 name, 2016 name,
2017 value, 2017 value,
2018 result.holder(), 2018 result.holder(),
2019 strict_mode); 2019 strict_mode);
2020 } else if (result.type() == HANDLER) { 2020 } else if (result.type() == HANDLER) {
2021 // We could not find a local property so let's check whether there is an 2021 // We could not find a local property so let's check whether there is an
2022 // accessor that wants to handle the property. 2022 // accessor that wants to handle the property.
2023 LookupResult accessor_result; 2023 LookupResult accessor_result(heap->isolate());
2024 LookupCallbackSetterInPrototypes(name, &accessor_result); 2024 LookupCallbackSetterInPrototypes(name, &accessor_result);
2025 if (accessor_result.IsFound()) { 2025 if (accessor_result.IsFound()) {
2026 if (accessor_result.type() == CALLBACKS) { 2026 if (accessor_result.type() == CALLBACKS) {
2027 return SetPropertyWithCallback(accessor_result.GetCallbackObject(), 2027 return SetPropertyWithCallback(accessor_result.GetCallbackObject(),
2028 name, 2028 name,
2029 value, 2029 value,
2030 accessor_result.holder(), 2030 accessor_result.holder(),
2031 strict_mode); 2031 strict_mode);
2032 } else if (accessor_result.type() == HANDLER) { 2032 } else if (accessor_result.type() == HANDLER) {
2033 // There is a proxy in the prototype chain. Invoke its 2033 // There is a proxy in the prototype chain. Invoke its
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
2416 value, 2416 value,
2417 result->holder(), 2417 result->holder(),
2418 strict_mode); 2418 strict_mode);
2419 } 2419 }
2420 } 2420 }
2421 break; 2421 break;
2422 } 2422 }
2423 case INTERCEPTOR: { 2423 case INTERCEPTOR: {
2424 // Try lookup real named properties. Note that only property can be 2424 // Try lookup real named properties. Note that only property can be
2425 // set is callbacks marked as ALL_CAN_WRITE on the prototype chain. 2425 // set is callbacks marked as ALL_CAN_WRITE on the prototype chain.
2426 LookupResult r; 2426 LookupResult r(GetIsolate());
2427 LookupRealNamedProperty(name, &r); 2427 LookupRealNamedProperty(name, &r);
2428 if (r.IsProperty()) { 2428 if (r.IsProperty()) {
2429 return SetPropertyWithFailedAccessCheck(&r, 2429 return SetPropertyWithFailedAccessCheck(&r,
2430 name, 2430 name,
2431 value, 2431 value,
2432 check_prototype, 2432 check_prototype,
2433 strict_mode); 2433 strict_mode);
2434 } 2434 }
2435 break; 2435 break;
2436 } 2436 }
2437 default: { 2437 default: {
2438 break; 2438 break;
2439 } 2439 }
2440 } 2440 }
2441 } 2441 }
2442 } 2442 }
2443 2443
2444 Heap* heap = GetHeap(); 2444 Isolate* isolate = GetIsolate();
2445 HandleScope scope(heap->isolate()); 2445 HandleScope scope(isolate);
2446 Handle<Object> value_handle(value); 2446 Handle<Object> value_handle(value);
2447 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_SET); 2447 isolate->ReportFailedAccessCheck(this, v8::ACCESS_SET);
2448 return *value_handle; 2448 return *value_handle;
2449 } 2449 }
2450 2450
2451 2451
2452 MaybeObject* JSReceiver::SetProperty(LookupResult* result, 2452 MaybeObject* JSReceiver::SetProperty(LookupResult* result,
2453 String* key, 2453 String* key,
2454 Object* value, 2454 Object* value,
2455 PropertyAttributes attributes, 2455 PropertyAttributes attributes,
2456 StrictModeFlag strict_mode) { 2456 StrictModeFlag strict_mode) {
2457 if (result->IsFound() && result->type() == HANDLER) { 2457 if (result->IsFound() && result->type() == HANDLER) {
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
2858 // because ConvertDescriptorToField() which is called in "case CALLBACKS:" 2858 // because ConvertDescriptorToField() which is called in "case CALLBACKS:"
2859 // doesn't handle function prototypes correctly. 2859 // doesn't handle function prototypes correctly.
2860 MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes( 2860 MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes(
2861 String* name, 2861 String* name,
2862 Object* value, 2862 Object* value,
2863 PropertyAttributes attributes) { 2863 PropertyAttributes attributes) {
2864 2864
2865 // Make sure that the top context does not change when doing callbacks or 2865 // Make sure that the top context does not change when doing callbacks or
2866 // interceptor calls. 2866 // interceptor calls.
2867 AssertNoContextChange ncc; 2867 AssertNoContextChange ncc;
2868 LookupResult result; 2868 Isolate* isolate = GetIsolate();
2869 LookupResult result(isolate);
2869 LocalLookup(name, &result); 2870 LocalLookup(name, &result);
2870 // Check access rights if needed. 2871 // Check access rights if needed.
2871 if (IsAccessCheckNeeded()) { 2872 if (IsAccessCheckNeeded()) {
2872 Heap* heap = GetHeap(); 2873 if (!isolate->MayNamedAccess(this, name, v8::ACCESS_SET)) {
2873 if (!heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_SET)) {
2874 return SetPropertyWithFailedAccessCheck(&result, 2874 return SetPropertyWithFailedAccessCheck(&result,
2875 name, 2875 name,
2876 value, 2876 value,
2877 false, 2877 false,
2878 kNonStrictMode); 2878 kNonStrictMode);
2879 } 2879 }
2880 } 2880 }
2881 2881
2882 if (IsJSGlobalProxy()) { 2882 if (IsJSGlobalProxy()) {
2883 Object* proto = GetPrototype(); 2883 Object* proto = GetPrototype();
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2934 UNREACHABLE(); 2934 UNREACHABLE();
2935 return value; 2935 return value;
2936 } 2936 }
2937 2937
2938 2938
2939 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( 2939 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor(
2940 JSObject* receiver, 2940 JSObject* receiver,
2941 String* name, 2941 String* name,
2942 bool continue_search) { 2942 bool continue_search) {
2943 // Check local property, ignore interceptor. 2943 // Check local property, ignore interceptor.
2944 LookupResult result; 2944 LookupResult result(GetIsolate());
2945 LocalLookupRealNamedProperty(name, &result); 2945 LocalLookupRealNamedProperty(name, &result);
2946 if (result.IsProperty()) return result.GetAttributes(); 2946 if (result.IsProperty()) return result.GetAttributes();
2947 2947
2948 if (continue_search) { 2948 if (continue_search) {
2949 // Continue searching via the prototype chain. 2949 // Continue searching via the prototype chain.
2950 Object* pt = GetPrototype(); 2950 Object* pt = GetPrototype();
2951 if (!pt->IsNull()) { 2951 if (!pt->IsNull()) {
2952 return JSObject::cast(pt)-> 2952 return JSObject::cast(pt)->
2953 GetPropertyAttributeWithReceiver(receiver, name); 2953 GetPropertyAttributeWithReceiver(receiver, name);
2954 } 2954 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3010 3010
3011 PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver( 3011 PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver(
3012 JSReceiver* receiver, 3012 JSReceiver* receiver,
3013 String* key) { 3013 String* key) {
3014 uint32_t index = 0; 3014 uint32_t index = 0;
3015 if (IsJSObject() && key->AsArrayIndex(&index)) { 3015 if (IsJSObject() && key->AsArrayIndex(&index)) {
3016 return JSObject::cast(this)->HasElementWithReceiver(receiver, index) 3016 return JSObject::cast(this)->HasElementWithReceiver(receiver, index)
3017 ? NONE : ABSENT; 3017 ? NONE : ABSENT;
3018 } 3018 }
3019 // Named property. 3019 // Named property.
3020 LookupResult result; 3020 LookupResult result(GetIsolate());
3021 Lookup(key, &result); 3021 Lookup(key, &result);
3022 return GetPropertyAttribute(receiver, &result, key, true); 3022 return GetPropertyAttribute(receiver, &result, key, true);
3023 } 3023 }
3024 3024
3025 3025
3026 PropertyAttributes JSReceiver::GetPropertyAttribute(JSReceiver* receiver, 3026 PropertyAttributes JSReceiver::GetPropertyAttribute(JSReceiver* receiver,
3027 LookupResult* result, 3027 LookupResult* result,
3028 String* name, 3028 String* name,
3029 bool continue_search) { 3029 bool continue_search) {
3030 // Check access rights if needed. 3030 // Check access rights if needed.
(...skipping 28 matching lines...) Expand all
3059 3059
3060 3060
3061 PropertyAttributes JSReceiver::GetLocalPropertyAttribute(String* name) { 3061 PropertyAttributes JSReceiver::GetLocalPropertyAttribute(String* name) {
3062 // Check whether the name is an array index. 3062 // Check whether the name is an array index.
3063 uint32_t index = 0; 3063 uint32_t index = 0;
3064 if (IsJSObject() && name->AsArrayIndex(&index)) { 3064 if (IsJSObject() && name->AsArrayIndex(&index)) {
3065 if (JSObject::cast(this)->HasLocalElement(index)) return NONE; 3065 if (JSObject::cast(this)->HasLocalElement(index)) return NONE;
3066 return ABSENT; 3066 return ABSENT;
3067 } 3067 }
3068 // Named property. 3068 // Named property.
3069 LookupResult result; 3069 LookupResult result(GetIsolate());
3070 LocalLookup(name, &result); 3070 LocalLookup(name, &result);
3071 return GetPropertyAttribute(this, &result, name, false); 3071 return GetPropertyAttribute(this, &result, name, false);
3072 } 3072 }
3073 3073
3074 3074
3075 MaybeObject* NormalizedMapCache::Get(JSObject* obj, 3075 MaybeObject* NormalizedMapCache::Get(JSObject* obj,
3076 PropertyNormalizationMode mode) { 3076 PropertyNormalizationMode mode) {
3077 Isolate* isolate = obj->GetIsolate(); 3077 Isolate* isolate = obj->GetIsolate();
3078 Map* fast = obj->map(); 3078 Map* fast = obj->map();
3079 int index = fast->Hash() % kEntries; 3079 int index = fast->Hash() % kEntries;
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
3566 DONT_ENUM, 3566 DONT_ENUM,
3567 kNonStrictMode); 3567 kNonStrictMode);
3568 if (store_result->IsFailure()) return store_result; 3568 if (store_result->IsFailure()) return store_result;
3569 return this; 3569 return this;
3570 } 3570 }
3571 3571
3572 3572
3573 MaybeObject* JSObject::DeletePropertyPostInterceptor(String* name, 3573 MaybeObject* JSObject::DeletePropertyPostInterceptor(String* name,
3574 DeleteMode mode) { 3574 DeleteMode mode) {
3575 // Check local property, ignore interceptor. 3575 // Check local property, ignore interceptor.
3576 LookupResult result; 3576 LookupResult result(GetIsolate());
3577 LocalLookupRealNamedProperty(name, &result); 3577 LocalLookupRealNamedProperty(name, &result);
3578 if (!result.IsProperty()) return GetHeap()->true_value(); 3578 if (!result.IsProperty()) return GetHeap()->true_value();
3579 3579
3580 // Normalize object if needed. 3580 // Normalize object if needed.
3581 Object* obj; 3581 Object* obj;
3582 { MaybeObject* maybe_obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); 3582 { MaybeObject* maybe_obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
3583 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 3583 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
3584 } 3584 }
3585 3585
3586 return DeleteNormalizedProperty(name, mode); 3586 return DeleteNormalizedProperty(name, mode);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
3715 Object* proto = GetPrototype(); 3715 Object* proto = GetPrototype();
3716 if (proto->IsNull()) return isolate->heap()->false_value(); 3716 if (proto->IsNull()) return isolate->heap()->false_value();
3717 ASSERT(proto->IsJSGlobalObject()); 3717 ASSERT(proto->IsJSGlobalObject());
3718 return JSGlobalObject::cast(proto)->DeleteProperty(name, mode); 3718 return JSGlobalObject::cast(proto)->DeleteProperty(name, mode);
3719 } 3719 }
3720 3720
3721 uint32_t index = 0; 3721 uint32_t index = 0;
3722 if (name->AsArrayIndex(&index)) { 3722 if (name->AsArrayIndex(&index)) {
3723 return DeleteElement(index, mode); 3723 return DeleteElement(index, mode);
3724 } else { 3724 } else {
3725 LookupResult result; 3725 LookupResult result(isolate);
3726 LocalLookup(name, &result); 3726 LocalLookup(name, &result);
3727 if (!result.IsProperty()) return isolate->heap()->true_value(); 3727 if (!result.IsProperty()) return isolate->heap()->true_value();
3728 // Ignore attributes if forcing a deletion. 3728 // Ignore attributes if forcing a deletion.
3729 if (result.IsDontDelete() && mode != FORCE_DELETION) { 3729 if (result.IsDontDelete() && mode != FORCE_DELETION) {
3730 if (mode == STRICT_DELETION) { 3730 if (mode == STRICT_DELETION) {
3731 // Deleting a non-configurable property in strict mode. 3731 // Deleting a non-configurable property in strict mode.
3732 HandleScope scope(isolate); 3732 HandleScope scope(isolate);
3733 Handle<Object> args[2] = { Handle<Object>(name), Handle<Object>(this) }; 3733 Handle<Object> args[2] = { Handle<Object>(name), Handle<Object>(this) };
3734 return isolate->Throw(*isolate->factory()->NewTypeError( 3734 return isolate->Throw(*isolate->factory()->NewTypeError(
3735 "strict_delete_property", HandleVector(args, 2))); 3735 "strict_delete_property", HandleVector(args, 2)));
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
4145 NumberDictionary* dictionary = NumberDictionary::cast(arguments); 4145 NumberDictionary* dictionary = NumberDictionary::cast(arguments);
4146 probe = FindGetterSetterInDictionary(dictionary, index, heap); 4146 probe = FindGetterSetterInDictionary(dictionary, index, heap);
4147 if (!probe->IsTheHole()) return probe; 4147 if (!probe->IsTheHole()) return probe;
4148 } 4148 }
4149 } 4149 }
4150 break; 4150 break;
4151 } 4151 }
4152 } 4152 }
4153 } else { 4153 } else {
4154 // Lookup the name. 4154 // Lookup the name.
4155 LookupResult result; 4155 LookupResult result(heap->isolate());
4156 LocalLookup(name, &result); 4156 LocalLookup(name, &result);
4157 if (result.IsProperty()) { 4157 if (result.IsProperty()) {
4158 if (result.IsReadOnly()) return heap->undefined_value(); 4158 if (result.IsReadOnly()) return heap->undefined_value();
4159 if (result.type() == CALLBACKS) { 4159 if (result.type() == CALLBACKS) {
4160 Object* obj = result.GetCallbackObject(); 4160 Object* obj = result.GetCallbackObject();
4161 // Need to preserve old getters/setters. 4161 // Need to preserve old getters/setters.
4162 if (obj->IsFixedArray()) { 4162 if (obj->IsFixedArray()) {
4163 // Use set to update attributes. 4163 // Use set to update attributes.
4164 return SetPropertyCallback(name, obj, attributes); 4164 return SetPropertyCallback(name, obj, attributes);
4165 } 4165 }
4166 } 4166 }
4167 } 4167 }
4168 } 4168 }
4169 4169
4170 // Allocate the fixed array to hold getter and setter. 4170 // Allocate the fixed array to hold getter and setter.
4171 Object* structure; 4171 Object* structure;
4172 { MaybeObject* maybe_structure = heap->AllocateFixedArray(2, TENURED); 4172 { MaybeObject* maybe_structure = heap->AllocateFixedArray(2, TENURED);
4173 if (!maybe_structure->ToObject(&structure)) return maybe_structure; 4173 if (!maybe_structure->ToObject(&structure)) return maybe_structure;
4174 } 4174 }
4175 4175
4176 if (is_element) { 4176 if (is_element) {
4177 return SetElementCallback(index, structure, attributes); 4177 return SetElementCallback(index, structure, attributes);
4178 } else { 4178 } else {
4179 return SetPropertyCallback(name, structure, attributes); 4179 return SetPropertyCallback(name, structure, attributes);
4180 } 4180 }
4181 } 4181 }
4182 4182
4183 4183
4184 bool JSObject::CanSetCallback(String* name) { 4184 bool JSObject::CanSetCallback(String* name) {
4185 ASSERT(!IsAccessCheckNeeded() 4185 ASSERT(!IsAccessCheckNeeded() ||
4186 || Isolate::Current()->MayNamedAccess(this, name, v8::ACCESS_SET)); 4186 GetIsolate()->MayNamedAccess(this, name, v8::ACCESS_SET));
4187 4187
4188 // Check if there is an API defined callback object which prohibits 4188 // Check if there is an API defined callback object which prohibits
4189 // callback overwriting in this object or it's prototype chain. 4189 // callback overwriting in this object or it's prototype chain.
4190 // This mechanism is needed for instance in a browser setting, where 4190 // This mechanism is needed for instance in a browser setting, where
4191 // certain accessors such as window.location should not be allowed 4191 // certain accessors such as window.location should not be allowed
4192 // to be overwritten because allowing overwriting could potentially 4192 // to be overwritten because allowing overwriting could potentially
4193 // cause security problems. 4193 // cause security problems.
4194 LookupResult callback_result; 4194 LookupResult callback_result(GetIsolate());
4195 LookupCallback(name, &callback_result); 4195 LookupCallback(name, &callback_result);
4196 if (callback_result.IsProperty()) { 4196 if (callback_result.IsProperty()) {
4197 Object* obj = callback_result.GetCallbackObject(); 4197 Object* obj = callback_result.GetCallbackObject();
4198 if (obj->IsAccessorInfo() && 4198 if (obj->IsAccessorInfo() &&
4199 AccessorInfo::cast(obj)->prohibits_overwriting()) { 4199 AccessorInfo::cast(obj)->prohibits_overwriting()) {
4200 return false; 4200 return false;
4201 } 4201 }
4202 } 4202 }
4203 4203
4204 return true; 4204 return true;
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
4381 break; 4381 break;
4382 } 4382 }
4383 4383
4384 Object* ok; 4384 Object* ok;
4385 { MaybeObject* maybe_ok = 4385 { MaybeObject* maybe_ok =
4386 SetElementCallback(index, info, info->property_attributes()); 4386 SetElementCallback(index, info, info->property_attributes());
4387 if (!maybe_ok->ToObject(&ok)) return maybe_ok; 4387 if (!maybe_ok->ToObject(&ok)) return maybe_ok;
4388 } 4388 }
4389 } else { 4389 } else {
4390 // Lookup the name. 4390 // Lookup the name.
4391 LookupResult result; 4391 LookupResult result(isolate);
4392 LocalLookup(name, &result); 4392 LocalLookup(name, &result);
4393 // ES5 forbids turning a property into an accessor if it's not 4393 // ES5 forbids turning a property into an accessor if it's not
4394 // configurable (that is IsDontDelete in ES3 and v8), see 8.6.1 (Table 5). 4394 // configurable (that is IsDontDelete in ES3 and v8), see 8.6.1 (Table 5).
4395 if (result.IsProperty() && (result.IsReadOnly() || result.IsDontDelete())) { 4395 if (result.IsProperty() && (result.IsReadOnly() || result.IsDontDelete())) {
4396 return isolate->heap()->undefined_value(); 4396 return isolate->heap()->undefined_value();
4397 } 4397 }
4398 Object* ok; 4398 Object* ok;
4399 { MaybeObject* maybe_ok = 4399 { MaybeObject* maybe_ok =
4400 SetPropertyCallback(name, info, info->property_attributes()); 4400 SetPropertyCallback(name, info, info->property_attributes());
4401 if (!maybe_ok->ToObject(&ok)) return maybe_ok; 4401 if (!maybe_ok->ToObject(&ok)) return maybe_ok;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
4439 return FixedArray::cast(element)->get(accessor_index); 4439 return FixedArray::cast(element)->get(accessor_index);
4440 } 4440 }
4441 } 4441 }
4442 } 4442 }
4443 } 4443 }
4444 } 4444 }
4445 } else { 4445 } else {
4446 for (Object* obj = this; 4446 for (Object* obj = this;
4447 obj != heap->null_value(); 4447 obj != heap->null_value();
4448 obj = JSObject::cast(obj)->GetPrototype()) { 4448 obj = JSObject::cast(obj)->GetPrototype()) {
4449 LookupResult result; 4449 LookupResult result(heap->isolate());
4450 JSObject::cast(obj)->LocalLookup(name, &result); 4450 JSObject::cast(obj)->LocalLookup(name, &result);
4451 if (result.IsProperty()) { 4451 if (result.IsProperty()) {
4452 if (result.IsReadOnly()) return heap->undefined_value(); 4452 if (result.IsReadOnly()) return heap->undefined_value();
4453 if (result.type() == CALLBACKS) { 4453 if (result.type() == CALLBACKS) {
4454 Object* obj = result.GetCallbackObject(); 4454 Object* obj = result.GetCallbackObject();
4455 if (obj->IsFixedArray()) { 4455 if (obj->IsFixedArray()) {
4456 return FixedArray::cast(obj)->get(accessor_index); 4456 return FixedArray::cast(obj)->get(accessor_index);
4457 } 4457 }
4458 } 4458 }
4459 } 4459 }
(...skipping 2621 matching lines...) Expand 10 before | Expand all | Expand 10 after
7081 7081
7082 Heap* heap = GetHeap(); 7082 Heap* heap = GetHeap();
7083 7083
7084 // Traverse the proposed prototype chain looking for setters for properties of 7084 // Traverse the proposed prototype chain looking for setters for properties of
7085 // the same names as are set by the inline constructor. 7085 // the same names as are set by the inline constructor.
7086 for (Object* obj = prototype; 7086 for (Object* obj = prototype;
7087 obj != heap->null_value(); 7087 obj != heap->null_value();
7088 obj = obj->GetPrototype()) { 7088 obj = obj->GetPrototype()) {
7089 JSObject* js_object = JSObject::cast(obj); 7089 JSObject* js_object = JSObject::cast(obj);
7090 for (int i = 0; i < this_property_assignments_count(); i++) { 7090 for (int i = 0; i < this_property_assignments_count(); i++) {
7091 LookupResult result; 7091 LookupResult result(heap->isolate());
7092 String* name = GetThisPropertyAssignmentName(i); 7092 String* name = GetThisPropertyAssignmentName(i);
7093 js_object->LocalLookupRealNamedProperty(name, &result); 7093 js_object->LocalLookupRealNamedProperty(name, &result);
7094 if (result.IsProperty() && result.type() == CALLBACKS) { 7094 if (result.IsProperty() && result.type() == CALLBACKS) {
7095 return false; 7095 return false;
7096 } 7096 }
7097 } 7097 }
7098 } 7098 }
7099 7099
7100 return true; 7100 return true;
7101 } 7101 }
(...skipping 2525 matching lines...) Expand 10 before | Expand all | Expand 10 after
9627 constructor->shared()->get_api_func_data()->indexed_property_handler(); 9627 constructor->shared()->get_api_func_data()->indexed_property_handler();
9628 return InterceptorInfo::cast(result); 9628 return InterceptorInfo::cast(result);
9629 } 9629 }
9630 9630
9631 9631
9632 MaybeObject* JSObject::GetPropertyPostInterceptor( 9632 MaybeObject* JSObject::GetPropertyPostInterceptor(
9633 JSReceiver* receiver, 9633 JSReceiver* receiver,
9634 String* name, 9634 String* name,
9635 PropertyAttributes* attributes) { 9635 PropertyAttributes* attributes) {
9636 // Check local property in holder, ignore interceptor. 9636 // Check local property in holder, ignore interceptor.
9637 LookupResult result; 9637 LookupResult result(GetIsolate());
9638 LocalLookupRealNamedProperty(name, &result); 9638 LocalLookupRealNamedProperty(name, &result);
9639 if (result.IsProperty()) { 9639 if (result.IsProperty()) {
9640 return GetProperty(receiver, &result, name, attributes); 9640 return GetProperty(receiver, &result, name, attributes);
9641 } 9641 }
9642 // Continue searching via the prototype chain. 9642 // Continue searching via the prototype chain.
9643 Object* pt = GetPrototype(); 9643 Object* pt = GetPrototype();
9644 *attributes = ABSENT; 9644 *attributes = ABSENT;
9645 if (pt->IsNull()) return GetHeap()->undefined_value(); 9645 if (pt->IsNull()) return GetHeap()->undefined_value();
9646 return pt->GetPropertyWithReceiver(receiver, name, attributes); 9646 return pt->GetPropertyWithReceiver(receiver, name, attributes);
9647 } 9647 }
9648 9648
9649 9649
9650 MaybeObject* JSObject::GetLocalPropertyPostInterceptor( 9650 MaybeObject* JSObject::GetLocalPropertyPostInterceptor(
9651 JSReceiver* receiver, 9651 JSReceiver* receiver,
9652 String* name, 9652 String* name,
9653 PropertyAttributes* attributes) { 9653 PropertyAttributes* attributes) {
9654 // Check local property in holder, ignore interceptor. 9654 // Check local property in holder, ignore interceptor.
9655 LookupResult result; 9655 LookupResult result(GetIsolate());
9656 LocalLookupRealNamedProperty(name, &result); 9656 LocalLookupRealNamedProperty(name, &result);
9657 if (result.IsProperty()) { 9657 if (result.IsProperty()) {
9658 return GetProperty(receiver, &result, name, attributes); 9658 return GetProperty(receiver, &result, name, attributes);
9659 } 9659 }
9660 return GetHeap()->undefined_value(); 9660 return GetHeap()->undefined_value();
9661 } 9661 }
9662 9662
9663 9663
9664 MaybeObject* JSObject::GetPropertyWithInterceptor( 9664 MaybeObject* JSObject::GetPropertyWithInterceptor(
9665 JSReceiver* receiver, 9665 JSReceiver* receiver,
(...skipping 30 matching lines...) Expand all
9696 *receiver_handle, 9696 *receiver_handle,
9697 *name_handle, 9697 *name_handle,
9698 attributes); 9698 attributes);
9699 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 9699 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
9700 return result; 9700 return result;
9701 } 9701 }
9702 9702
9703 9703
9704 bool JSObject::HasRealNamedProperty(String* key) { 9704 bool JSObject::HasRealNamedProperty(String* key) {
9705 // Check access rights if needed. 9705 // Check access rights if needed.
9706 Isolate* isolate = GetIsolate();
9706 if (IsAccessCheckNeeded()) { 9707 if (IsAccessCheckNeeded()) {
9707 Heap* heap = GetHeap(); 9708 if (!isolate->MayNamedAccess(this, key, v8::ACCESS_HAS)) {
9708 if (!heap->isolate()->MayNamedAccess(this, key, v8::ACCESS_HAS)) { 9709 isolate->ReportFailedAccessCheck(this, v8::ACCESS_HAS);
9709 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS);
9710 return false; 9710 return false;
9711 } 9711 }
9712 } 9712 }
9713 9713
9714 LookupResult result; 9714 LookupResult result(isolate);
9715 LocalLookupRealNamedProperty(key, &result); 9715 LocalLookupRealNamedProperty(key, &result);
9716 return result.IsProperty() && (result.type() != INTERCEPTOR); 9716 return result.IsProperty() && (result.type() != INTERCEPTOR);
9717 } 9717 }
9718 9718
9719 9719
9720 bool JSObject::HasRealElementProperty(uint32_t index) { 9720 bool JSObject::HasRealElementProperty(uint32_t index) {
9721 // Check access rights if needed. 9721 // Check access rights if needed.
9722 if (IsAccessCheckNeeded()) { 9722 if (IsAccessCheckNeeded()) {
9723 Heap* heap = GetHeap(); 9723 Heap* heap = GetHeap();
9724 if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { 9724 if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
9773 break; 9773 break;
9774 } 9774 }
9775 // All possibilities have been handled above already. 9775 // All possibilities have been handled above already.
9776 UNREACHABLE(); 9776 UNREACHABLE();
9777 return GetHeap()->null_value(); 9777 return GetHeap()->null_value();
9778 } 9778 }
9779 9779
9780 9780
9781 bool JSObject::HasRealNamedCallbackProperty(String* key) { 9781 bool JSObject::HasRealNamedCallbackProperty(String* key) {
9782 // Check access rights if needed. 9782 // Check access rights if needed.
9783 Isolate* isolate = GetIsolate();
9783 if (IsAccessCheckNeeded()) { 9784 if (IsAccessCheckNeeded()) {
9784 Heap* heap = GetHeap(); 9785 if (!isolate->MayNamedAccess(this, key, v8::ACCESS_HAS)) {
9785 if (!heap->isolate()->MayNamedAccess(this, key, v8::ACCESS_HAS)) { 9786 isolate->ReportFailedAccessCheck(this, v8::ACCESS_HAS);
9786 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS);
9787 return false; 9787 return false;
9788 } 9788 }
9789 } 9789 }
9790 9790
9791 LookupResult result; 9791 LookupResult result(isolate);
9792 LocalLookupRealNamedProperty(key, &result); 9792 LocalLookupRealNamedProperty(key, &result);
9793 return result.IsProperty() && (result.type() == CALLBACKS); 9793 return result.IsProperty() && (result.type() == CALLBACKS);
9794 } 9794 }
9795 9795
9796 9796
9797 int JSObject::NumberOfLocalProperties(PropertyAttributes filter) { 9797 int JSObject::NumberOfLocalProperties(PropertyAttributes filter) {
9798 if (HasFastProperties()) { 9798 if (HasFastProperties()) {
9799 DescriptorArray* descs = map()->instance_descriptors(); 9799 DescriptorArray* descs = map()->instance_descriptors();
9800 int result = 0; 9800 int result = 0;
9801 for (int i = 0; i < descs->number_of_descriptors(); i++) { 9801 for (int i = 0; i < descs->number_of_descriptors(); i++) {
(...skipping 2501 matching lines...) Expand 10 before | Expand all | Expand 10 after
12303 if (break_point_objects()->IsUndefined()) return 0; 12303 if (break_point_objects()->IsUndefined()) return 0;
12304 // Single break point. 12304 // Single break point.
12305 if (!break_point_objects()->IsFixedArray()) return 1; 12305 if (!break_point_objects()->IsFixedArray()) return 1;
12306 // Multiple break points. 12306 // Multiple break points.
12307 return FixedArray::cast(break_point_objects())->length(); 12307 return FixedArray::cast(break_point_objects())->length();
12308 } 12308 }
12309 #endif // ENABLE_DEBUGGER_SUPPORT 12309 #endif // ENABLE_DEBUGGER_SUPPORT
12310 12310
12311 12311
12312 } } // namespace v8::internal 12312 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/mips/stub-cache-mips.cc ('k') | src/profile-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698