OLD | NEW |
---|---|
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 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
478 JSGlobalPropertyCell::cast( | 478 JSGlobalPropertyCell::cast( |
479 property_dictionary()->ValueAt(result->GetDictionaryEntry())); | 479 property_dictionary()->ValueAt(result->GetDictionaryEntry())); |
480 cell->set_value(value); | 480 cell->set_value(value); |
481 } else { | 481 } else { |
482 property_dictionary()->ValueAtPut(result->GetDictionaryEntry(), value); | 482 property_dictionary()->ValueAtPut(result->GetDictionaryEntry(), value); |
483 } | 483 } |
484 return value; | 484 return value; |
485 } | 485 } |
486 | 486 |
487 | 487 |
488 Handle<Object> JSObject::SetNormalizedProperty(Handle<JSObject> object, | |
489 Handle<String> key, | |
490 Handle<Object> value, | |
491 PropertyDetails details) { | |
492 CALL_HEAP_FUNCTION(object->GetIsolate(), | |
493 object->SetNormalizedProperty(*key, *value, details), | |
494 Object); | |
495 } | |
496 | |
497 | |
488 MaybeObject* JSObject::SetNormalizedProperty(String* name, | 498 MaybeObject* JSObject::SetNormalizedProperty(String* name, |
489 Object* value, | 499 Object* value, |
490 PropertyDetails details) { | 500 PropertyDetails details) { |
491 ASSERT(!HasFastProperties()); | 501 ASSERT(!HasFastProperties()); |
492 int entry = property_dictionary()->FindEntry(name); | 502 int entry = property_dictionary()->FindEntry(name); |
493 if (entry == StringDictionary::kNotFound) { | 503 if (entry == StringDictionary::kNotFound) { |
494 Object* store_value = value; | 504 Object* store_value = value; |
495 if (IsGlobalObject()) { | 505 if (IsGlobalObject()) { |
496 Heap* heap = name->GetHeap(); | 506 Heap* heap = name->GetHeap(); |
497 MaybeObject* maybe_store_value = | 507 MaybeObject* maybe_store_value = |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
728 js_object, | 738 js_object, |
729 receiver); | 739 receiver); |
730 if (result != heap->the_hole_value()) return result; | 740 if (result != heap->the_hole_value()) return result; |
731 } | 741 } |
732 } | 742 } |
733 | 743 |
734 return heap->undefined_value(); | 744 return heap->undefined_value(); |
735 } | 745 } |
736 | 746 |
737 | 747 |
748 Handle<Object> Object::GetPrototype(Handle<Object> obj) { | |
Kevin Millikin (Chromium)
2012/01/04 13:00:32
This seems like a pointless function. It's not mu
ulan
2012/01/05 11:16:35
Done.
| |
749 Handle<Object> result(obj->GetPrototype()); | |
750 return result; | |
751 } | |
752 | |
753 | |
738 Object* Object::GetPrototype() { | 754 Object* Object::GetPrototype() { |
739 if (IsSmi()) { | 755 if (IsSmi()) { |
740 Heap* heap = Isolate::Current()->heap(); | 756 Heap* heap = Isolate::Current()->heap(); |
741 Context* context = heap->isolate()->context()->global_context(); | 757 Context* context = heap->isolate()->context()->global_context(); |
742 return context->number_function()->instance_prototype(); | 758 return context->number_function()->instance_prototype(); |
743 } | 759 } |
744 | 760 |
745 HeapObject* heap_object = HeapObject::cast(this); | 761 HeapObject* heap_object = HeapObject::cast(this); |
746 | 762 |
747 // The object is either a number, a string, a boolean, | 763 // The object is either a number, a string, a boolean, |
(...skipping 1206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1954 MaybeObject* raw_result = | 1970 MaybeObject* raw_result = |
1955 this_handle->SetPropertyPostInterceptor(*name_handle, | 1971 this_handle->SetPropertyPostInterceptor(*name_handle, |
1956 *value_handle, | 1972 *value_handle, |
1957 attributes, | 1973 attributes, |
1958 strict_mode); | 1974 strict_mode); |
1959 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 1975 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1960 return raw_result; | 1976 return raw_result; |
1961 } | 1977 } |
1962 | 1978 |
1963 | 1979 |
1980 Handle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object, | |
1981 Handle<String> key, | |
1982 Handle<Object> value, | |
1983 PropertyAttributes attributes, | |
1984 StrictModeFlag strict_mode) { | |
1985 CALL_HEAP_FUNCTION(object->GetIsolate(), | |
1986 object->SetProperty(*key, *value, attributes, strict_mode), | |
1987 Object); | |
1988 } | |
1989 | |
1990 | |
1964 MaybeObject* JSReceiver::SetProperty(String* name, | 1991 MaybeObject* JSReceiver::SetProperty(String* name, |
1965 Object* value, | 1992 Object* value, |
1966 PropertyAttributes attributes, | 1993 PropertyAttributes attributes, |
1967 StrictModeFlag strict_mode) { | 1994 StrictModeFlag strict_mode) { |
1968 LookupResult result(GetIsolate()); | 1995 LookupResult result(GetIsolate()); |
1969 LocalLookup(name, &result); | 1996 LocalLookup(name, &result); |
1970 return SetProperty(&result, name, value, attributes, strict_mode); | 1997 return SetProperty(&result, name, value, attributes, strict_mode); |
1971 } | 1998 } |
1972 | 1999 |
1973 | 2000 |
(...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3017 | 3044 |
3018 // Set a real local property, even if it is READ_ONLY. If the property is not | 3045 // Set a real local property, even if it is READ_ONLY. If the property is not |
3019 // present, add it with attributes NONE. This code is an exact clone of | 3046 // present, add it with attributes NONE. This code is an exact clone of |
3020 // SetProperty, with the check for IsReadOnly and the check for a | 3047 // SetProperty, with the check for IsReadOnly and the check for a |
3021 // callback setter removed. The two lines looking up the LookupResult | 3048 // callback setter removed. The two lines looking up the LookupResult |
3022 // result are also added. If one of the functions is changed, the other | 3049 // result are also added. If one of the functions is changed, the other |
3023 // should be. | 3050 // should be. |
3024 // Note that this method cannot be used to set the prototype of a function | 3051 // Note that this method cannot be used to set the prototype of a function |
3025 // because ConvertDescriptorToField() which is called in "case CALLBACKS:" | 3052 // because ConvertDescriptorToField() which is called in "case CALLBACKS:" |
3026 // doesn't handle function prototypes correctly. | 3053 // doesn't handle function prototypes correctly. |
3054 Handle<Object> JSObject::SetLocalPropertyIgnoreAttributes( | |
3055 Handle<JSObject> object, | |
3056 Handle<String> key, | |
3057 Handle<Object> value, | |
3058 PropertyAttributes attributes) { | |
3059 CALL_HEAP_FUNCTION( | |
3060 object->GetIsolate(), | |
3061 object->SetLocalPropertyIgnoreAttributes(*key, *value, attributes), | |
3062 Object); | |
3063 } | |
3064 | |
3065 | |
3027 MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes( | 3066 MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes( |
3028 String* name, | 3067 String* name, |
3029 Object* value, | 3068 Object* value, |
3030 PropertyAttributes attributes) { | 3069 PropertyAttributes attributes) { |
3031 | 3070 |
3032 // Make sure that the top context does not change when doing callbacks or | 3071 // Make sure that the top context does not change when doing callbacks or |
3033 // interceptor calls. | 3072 // interceptor calls. |
3034 AssertNoContextChange ncc; | 3073 AssertNoContextChange ncc; |
3035 Isolate* isolate = GetIsolate(); | 3074 Isolate* isolate = GetIsolate(); |
3036 LookupResult result(isolate); | 3075 LookupResult result(isolate); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3097 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); | 3136 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); |
3098 case HANDLER: | 3137 case HANDLER: |
3099 UNREACHABLE(); | 3138 UNREACHABLE(); |
3100 return value; | 3139 return value; |
3101 } | 3140 } |
3102 UNREACHABLE(); // keep the compiler happy | 3141 UNREACHABLE(); // keep the compiler happy |
3103 return value; | 3142 return value; |
3104 } | 3143 } |
3105 | 3144 |
3106 | 3145 |
3146 void JSObject::SetLocalPropertyNoThrow(Handle<JSObject> object, | |
Kevin Millikin (Chromium)
2012/01/04 13:00:32
Indentation is wrong.
I don't really like this fu
ulan
2012/01/05 11:16:35
Done.
| |
3147 Handle<String> key, | |
3148 Handle<Object> value, | |
3149 PropertyAttributes attributes) { | |
3150 Isolate* isolate = object->GetIsolate(); | |
3151 ASSERT(!isolate->has_pending_exception()); | |
3152 CHECK(!SetLocalPropertyIgnoreAttributes( | |
3153 object, key, value, attributes).is_null()); | |
3154 CHECK(!isolate->has_pending_exception()); | |
3155 } | |
3156 | |
3157 | |
3107 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( | 3158 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( |
3108 JSObject* receiver, | 3159 JSObject* receiver, |
3109 String* name, | 3160 String* name, |
3110 bool continue_search) { | 3161 bool continue_search) { |
3111 // Check local property, ignore interceptor. | 3162 // Check local property, ignore interceptor. |
3112 LookupResult result(GetIsolate()); | 3163 LookupResult result(GetIsolate()); |
3113 LocalLookupRealNamedProperty(name, &result); | 3164 LocalLookupRealNamedProperty(name, &result); |
3114 if (result.IsProperty()) return result.GetAttributes(); | 3165 if (result.IsProperty()) return result.GetAttributes(); |
3115 | 3166 |
3116 if (continue_search) { | 3167 if (continue_search) { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3307 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 3358 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
3308 } | 3359 } |
3309 GetIsolate()->counters()->normalized_maps()->Increment(); | 3360 GetIsolate()->counters()->normalized_maps()->Increment(); |
3310 | 3361 |
3311 set_map(Map::cast(obj)); | 3362 set_map(Map::cast(obj)); |
3312 } | 3363 } |
3313 return map()->UpdateCodeCache(name, code); | 3364 return map()->UpdateCodeCache(name, code); |
3314 } | 3365 } |
3315 | 3366 |
3316 | 3367 |
3368 void JSObject::NormalizeProperties(Handle<JSObject> object, | |
3369 PropertyNormalizationMode mode, | |
3370 int expected_additional_properties) { | |
3371 CALL_HEAP_FUNCTION_VOID(object->GetIsolate(), | |
3372 object->NormalizeProperties( | |
3373 mode, expected_additional_properties)); | |
3374 } | |
3375 | |
3376 | |
3317 MaybeObject* JSObject::NormalizeProperties(PropertyNormalizationMode mode, | 3377 MaybeObject* JSObject::NormalizeProperties(PropertyNormalizationMode mode, |
3318 int expected_additional_properties) { | 3378 int expected_additional_properties) { |
3319 if (!HasFastProperties()) return this; | 3379 if (!HasFastProperties()) return this; |
3320 | 3380 |
3321 // The global object is always normalized. | 3381 // The global object is always normalized. |
3322 ASSERT(!IsGlobalObject()); | 3382 ASSERT(!IsGlobalObject()); |
3323 // JSGlobalProxy must never be normalized | 3383 // JSGlobalProxy must never be normalized |
3324 ASSERT(!IsJSGlobalProxy()); | 3384 ASSERT(!IsJSGlobalProxy()); |
3325 | 3385 |
3326 Map* map_of_this = map(); | 3386 Map* map_of_this = map(); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3429 #ifdef DEBUG | 3489 #ifdef DEBUG |
3430 if (FLAG_trace_normalization) { | 3490 if (FLAG_trace_normalization) { |
3431 PrintF("Object properties have been normalized:\n"); | 3491 PrintF("Object properties have been normalized:\n"); |
3432 Print(); | 3492 Print(); |
3433 } | 3493 } |
3434 #endif | 3494 #endif |
3435 return this; | 3495 return this; |
3436 } | 3496 } |
3437 | 3497 |
3438 | 3498 |
3499 void JSObject::TransformToFastProperties(Handle<JSObject> object, | |
3500 int unused_property_fields) { | |
3501 CALL_HEAP_FUNCTION_VOID( | |
3502 object->GetIsolate(), | |
3503 object->TransformToFastProperties(unused_property_fields)); | |
3504 } | |
3505 | |
3506 | |
3439 MaybeObject* JSObject::TransformToFastProperties(int unused_property_fields) { | 3507 MaybeObject* JSObject::TransformToFastProperties(int unused_property_fields) { |
3440 if (HasFastProperties()) return this; | 3508 if (HasFastProperties()) return this; |
3441 ASSERT(!IsGlobalObject()); | 3509 ASSERT(!IsGlobalObject()); |
3442 return property_dictionary()-> | 3510 return property_dictionary()-> |
3443 TransformPropertiesToFastFor(this, unused_property_fields); | 3511 TransformPropertiesToFastFor(this, unused_property_fields); |
3444 } | 3512 } |
3445 | 3513 |
3446 | 3514 |
3515 Handle<NumberDictionary> JSObject::NormalizeElements(Handle<JSObject> object) { | |
3516 CALL_HEAP_FUNCTION( | |
3517 object->GetIsolate(), object->NormalizeElements(), NumberDictionary); | |
3518 } | |
3519 | |
3520 | |
3447 MaybeObject* JSObject::NormalizeElements() { | 3521 MaybeObject* JSObject::NormalizeElements() { |
3448 ASSERT(!HasExternalArrayElements()); | 3522 ASSERT(!HasExternalArrayElements()); |
3449 | 3523 |
3450 // Find the backing store. | 3524 // Find the backing store. |
3451 FixedArrayBase* array = FixedArrayBase::cast(elements()); | 3525 FixedArrayBase* array = FixedArrayBase::cast(elements()); |
3452 Map* old_map = array->map(); | 3526 Map* old_map = array->map(); |
3453 bool is_arguments = | 3527 bool is_arguments = |
3454 (old_map == old_map->GetHeap()->non_strict_arguments_elements_map()); | 3528 (old_map == old_map->GetHeap()->non_strict_arguments_elements_map()); |
3455 if (is_arguments) { | 3529 if (is_arguments) { |
3456 array = FixedArrayBase::cast(FixedArray::cast(array)->get(1)); | 3530 array = FixedArrayBase::cast(FixedArray::cast(array)->get(1)); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3553 | 3627 |
3554 | 3628 |
3555 MaybeObject* JSObject::SetIdentityHash(Object* hash, CreationFlag flag) { | 3629 MaybeObject* JSObject::SetIdentityHash(Object* hash, CreationFlag flag) { |
3556 MaybeObject* maybe = SetHiddenProperty(GetHeap()->identity_hash_symbol(), | 3630 MaybeObject* maybe = SetHiddenProperty(GetHeap()->identity_hash_symbol(), |
3557 hash); | 3631 hash); |
3558 if (maybe->IsFailure()) return maybe; | 3632 if (maybe->IsFailure()) return maybe; |
3559 return this; | 3633 return this; |
3560 } | 3634 } |
3561 | 3635 |
3562 | 3636 |
3637 int JSObject::GetIdentityHash(Handle<JSObject> obj) { | |
3638 CALL_AND_RETRY(obj->GetIsolate(), | |
3639 obj->GetIdentityHash(ALLOW_CREATION), | |
3640 return Smi::cast(__object__)->value(), | |
3641 return 0); | |
3642 } | |
3643 | |
3644 | |
3563 MaybeObject* JSObject::GetIdentityHash(CreationFlag flag) { | 3645 MaybeObject* JSObject::GetIdentityHash(CreationFlag flag) { |
3564 Object* stored_value = GetHiddenProperty(GetHeap()->identity_hash_symbol()); | 3646 Object* stored_value = GetHiddenProperty(GetHeap()->identity_hash_symbol()); |
3565 if (stored_value->IsSmi()) return stored_value; | 3647 if (stored_value->IsSmi()) return stored_value; |
3566 | 3648 |
3567 // Do not generate permanent identity hash code if not requested. | 3649 // Do not generate permanent identity hash code if not requested. |
3568 if (flag == OMIT_CREATION) return GetHeap()->undefined_value(); | 3650 if (flag == OMIT_CREATION) return GetHeap()->undefined_value(); |
3569 | 3651 |
3570 Smi* hash = GenerateIdentityHash(); | 3652 Smi* hash = GenerateIdentityHash(); |
3571 MaybeObject* result = SetHiddenProperty(GetHeap()->identity_hash_symbol(), | 3653 MaybeObject* result = SetHiddenProperty(GetHeap()->identity_hash_symbol(), |
3572 hash); | 3654 hash); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3605 return GetHeap()->undefined_value(); | 3687 return GetHeap()->undefined_value(); |
3606 } | 3688 } |
3607 StringDictionary* dictionary = | 3689 StringDictionary* dictionary = |
3608 StringDictionary::cast(hidden_lookup->ToObjectUnchecked()); | 3690 StringDictionary::cast(hidden_lookup->ToObjectUnchecked()); |
3609 int entry = dictionary->FindEntry(key); | 3691 int entry = dictionary->FindEntry(key); |
3610 if (entry == StringDictionary::kNotFound) return GetHeap()->undefined_value(); | 3692 if (entry == StringDictionary::kNotFound) return GetHeap()->undefined_value(); |
3611 return dictionary->ValueAt(entry); | 3693 return dictionary->ValueAt(entry); |
3612 } | 3694 } |
3613 | 3695 |
3614 | 3696 |
3697 Handle<Object> JSObject::SetHiddenProperty(Handle<JSObject> obj, | |
3698 Handle<String> key, | |
3699 Handle<Object> value) { | |
3700 CALL_HEAP_FUNCTION(obj->GetIsolate(), | |
3701 obj->SetHiddenProperty(*key, *value), | |
3702 Object); | |
3703 } | |
3704 | |
3705 | |
3615 MaybeObject* JSObject::SetHiddenProperty(String* key, Object* value) { | 3706 MaybeObject* JSObject::SetHiddenProperty(String* key, Object* value) { |
3616 if (IsJSGlobalProxy()) { | 3707 if (IsJSGlobalProxy()) { |
3617 // For a proxy, use the prototype as target object. | 3708 // For a proxy, use the prototype as target object. |
3618 Object* proxy_parent = GetPrototype(); | 3709 Object* proxy_parent = GetPrototype(); |
3619 // If the proxy is detached, return undefined. | 3710 // If the proxy is detached, return undefined. |
3620 if (proxy_parent->IsNull()) return GetHeap()->undefined_value(); | 3711 if (proxy_parent->IsNull()) return GetHeap()->undefined_value(); |
3621 ASSERT(proxy_parent->IsJSGlobalObject()); | 3712 ASSERT(proxy_parent->IsJSGlobalObject()); |
3622 return JSObject::cast(proxy_parent)->SetHiddenProperty(key, value); | 3713 return JSObject::cast(proxy_parent)->SetHiddenProperty(key, value); |
3623 } | 3714 } |
3624 ASSERT(!IsJSGlobalProxy()); | 3715 ASSERT(!IsJSGlobalProxy()); |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3832 } | 3923 } |
3833 MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete( | 3924 MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete( |
3834 *this_handle, | 3925 *this_handle, |
3835 index, | 3926 index, |
3836 NORMAL_DELETION); | 3927 NORMAL_DELETION); |
3837 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 3928 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
3838 return raw_result; | 3929 return raw_result; |
3839 } | 3930 } |
3840 | 3931 |
3841 | 3932 |
3933 Handle<Object> JSObject::DeleteElement(Handle<JSObject> obj, | |
3934 uint32_t index) { | |
3935 CALL_HEAP_FUNCTION(obj->GetIsolate(), | |
3936 obj->DeleteElement(index, JSObject::NORMAL_DELETION), | |
3937 Object); | |
3938 } | |
3939 | |
3940 | |
3842 MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { | 3941 MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { |
3843 Isolate* isolate = GetIsolate(); | 3942 Isolate* isolate = GetIsolate(); |
3844 // Check access rights if needed. | 3943 // Check access rights if needed. |
3845 if (IsAccessCheckNeeded() && | 3944 if (IsAccessCheckNeeded() && |
3846 !isolate->MayIndexedAccess(this, index, v8::ACCESS_DELETE)) { | 3945 !isolate->MayIndexedAccess(this, index, v8::ACCESS_DELETE)) { |
3847 isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); | 3946 isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); |
3848 return isolate->heap()->false_value(); | 3947 return isolate->heap()->false_value(); |
3849 } | 3948 } |
3850 | 3949 |
3851 if (IsJSGlobalProxy()) { | 3950 if (IsJSGlobalProxy()) { |
3852 Object* proto = GetPrototype(); | 3951 Object* proto = GetPrototype(); |
3853 if (proto->IsNull()) return isolate->heap()->false_value(); | 3952 if (proto->IsNull()) return isolate->heap()->false_value(); |
3854 ASSERT(proto->IsJSGlobalObject()); | 3953 ASSERT(proto->IsJSGlobalObject()); |
3855 return JSGlobalObject::cast(proto)->DeleteElement(index, mode); | 3954 return JSGlobalObject::cast(proto)->DeleteElement(index, mode); |
3856 } | 3955 } |
3857 | 3956 |
3858 if (HasIndexedInterceptor()) { | 3957 if (HasIndexedInterceptor()) { |
3859 // Skip interceptor if forcing deletion. | 3958 // Skip interceptor if forcing deletion. |
3860 if (mode != FORCE_DELETION) { | 3959 if (mode != FORCE_DELETION) { |
3861 return DeleteElementWithInterceptor(index); | 3960 return DeleteElementWithInterceptor(index); |
3862 } | 3961 } |
3863 mode = JSReceiver::FORCE_DELETION; | 3962 mode = JSReceiver::FORCE_DELETION; |
3864 } | 3963 } |
3865 | 3964 |
3866 return GetElementsAccessor()->Delete(this, index, mode); | 3965 return GetElementsAccessor()->Delete(this, index, mode); |
3867 } | 3966 } |
3868 | 3967 |
3869 | 3968 |
3870 MaybeObject* JSReceiver::DeleteProperty(String* name, DeleteMode mode) { | 3969 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> obj, |
ulan
2012/01/03 11:11:30
Placed JSReceiver::DeleteProperty and JSReceiver::
| |
3871 if (IsJSProxy()) { | 3970 Handle<String> prop) { |
3872 return JSProxy::cast(this)->DeletePropertyWithHandler(name, mode); | 3971 CALL_HEAP_FUNCTION(obj->GetIsolate(), |
3873 } | 3972 obj->DeleteProperty(*prop, JSObject::NORMAL_DELETION), |
3874 return JSObject::cast(this)->DeleteProperty(name, mode); | 3973 Object); |
3875 } | 3974 } |
3876 | 3975 |
3877 | 3976 |
3878 MaybeObject* JSReceiver::DeleteElement(uint32_t index, DeleteMode mode) { | |
3879 if (IsJSProxy()) { | |
3880 return JSProxy::cast(this)->DeleteElementWithHandler(index, mode); | |
3881 } | |
3882 return JSObject::cast(this)->DeleteElement(index, mode); | |
3883 } | |
3884 | |
3885 | |
3886 MaybeObject* JSObject::DeleteProperty(String* name, DeleteMode mode) { | 3977 MaybeObject* JSObject::DeleteProperty(String* name, DeleteMode mode) { |
3887 Isolate* isolate = GetIsolate(); | 3978 Isolate* isolate = GetIsolate(); |
3888 // ECMA-262, 3rd, 8.6.2.5 | 3979 // ECMA-262, 3rd, 8.6.2.5 |
3889 ASSERT(name->IsString()); | 3980 ASSERT(name->IsString()); |
3890 | 3981 |
3891 // Check access rights if needed. | 3982 // Check access rights if needed. |
3892 if (IsAccessCheckNeeded() && | 3983 if (IsAccessCheckNeeded() && |
3893 !isolate->MayNamedAccess(this, name, v8::ACCESS_DELETE)) { | 3984 !isolate->MayNamedAccess(this, name, v8::ACCESS_DELETE)) { |
3894 isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); | 3985 isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); |
3895 return isolate->heap()->false_value(); | 3986 return isolate->heap()->false_value(); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3933 { MaybeObject* maybe_obj = | 4024 { MaybeObject* maybe_obj = |
3934 NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); | 4025 NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); |
3935 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 4026 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
3936 } | 4027 } |
3937 // Make sure the properties are normalized before removing the entry. | 4028 // Make sure the properties are normalized before removing the entry. |
3938 return DeleteNormalizedProperty(name, mode); | 4029 return DeleteNormalizedProperty(name, mode); |
3939 } | 4030 } |
3940 } | 4031 } |
3941 | 4032 |
3942 | 4033 |
4034 MaybeObject* JSReceiver::DeleteElement(uint32_t index, DeleteMode mode) { | |
4035 if (IsJSProxy()) { | |
4036 return JSProxy::cast(this)->DeleteElementWithHandler(index, mode); | |
4037 } | |
4038 return JSObject::cast(this)->DeleteElement(index, mode); | |
4039 } | |
4040 | |
4041 | |
4042 MaybeObject* JSReceiver::DeleteProperty(String* name, DeleteMode mode) { | |
4043 if (IsJSProxy()) { | |
4044 return JSProxy::cast(this)->DeletePropertyWithHandler(name, mode); | |
4045 } | |
4046 return JSObject::cast(this)->DeleteProperty(name, mode); | |
4047 } | |
4048 | |
4049 | |
3943 bool JSObject::ReferencesObjectFromElements(FixedArray* elements, | 4050 bool JSObject::ReferencesObjectFromElements(FixedArray* elements, |
3944 ElementsKind kind, | 4051 ElementsKind kind, |
3945 Object* object) { | 4052 Object* object) { |
3946 ASSERT(kind == FAST_ELEMENTS || | 4053 ASSERT(kind == FAST_ELEMENTS || |
3947 kind == DICTIONARY_ELEMENTS); | 4054 kind == DICTIONARY_ELEMENTS); |
3948 if (kind == FAST_ELEMENTS) { | 4055 if (kind == FAST_ELEMENTS) { |
3949 int length = IsJSArray() | 4056 int length = IsJSArray() |
3950 ? Smi::cast(JSArray::cast(this)->length())->value() | 4057 ? Smi::cast(JSArray::cast(this)->length())->value() |
3951 : elements->length(); | 4058 : elements->length(); |
3952 for (int i = 0; i < length; ++i) { | 4059 for (int i = 0; i < length; ++i) { |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4059 if (context->has_extension() && !context->IsCatchContext()) { | 4166 if (context->has_extension() && !context->IsCatchContext()) { |
4060 return JSObject::cast(context->extension())->ReferencesObject(obj); | 4167 return JSObject::cast(context->extension())->ReferencesObject(obj); |
4061 } | 4168 } |
4062 } | 4169 } |
4063 | 4170 |
4064 // No references to object. | 4171 // No references to object. |
4065 return false; | 4172 return false; |
4066 } | 4173 } |
4067 | 4174 |
4068 | 4175 |
4176 Handle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { | |
4177 CALL_HEAP_FUNCTION(object->GetIsolate(), object->PreventExtensions(), Object); | |
4178 } | |
4179 | |
4180 | |
4069 MaybeObject* JSObject::PreventExtensions() { | 4181 MaybeObject* JSObject::PreventExtensions() { |
4070 Isolate* isolate = GetIsolate(); | 4182 Isolate* isolate = GetIsolate(); |
4071 if (IsAccessCheckNeeded() && | 4183 if (IsAccessCheckNeeded() && |
4072 !isolate->MayNamedAccess(this, | 4184 !isolate->MayNamedAccess(this, |
4073 isolate->heap()->undefined_value(), | 4185 isolate->heap()->undefined_value(), |
4074 v8::ACCESS_KEYS)) { | 4186 v8::ACCESS_KEYS)) { |
4075 isolate->ReportFailedAccessCheck(this, v8::ACCESS_KEYS); | 4187 isolate->ReportFailedAccessCheck(this, v8::ACCESS_KEYS); |
4076 return isolate->heap()->false_value(); | 4188 return isolate->heap()->false_value(); |
4077 } | 4189 } |
4078 | 4190 |
(...skipping 5273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9352 Object* value, | 9464 Object* value, |
9353 StrictModeFlag strict_mode, | 9465 StrictModeFlag strict_mode, |
9354 bool check_proto) { | 9466 bool check_proto) { |
9355 return IsJSProxy() | 9467 return IsJSProxy() |
9356 ? JSProxy::cast(this)->SetElementWithHandler(index, value, strict_mode) | 9468 ? JSProxy::cast(this)->SetElementWithHandler(index, value, strict_mode) |
9357 : JSObject::cast(this)->SetElement(index, value, strict_mode, check_proto) | 9469 : JSObject::cast(this)->SetElement(index, value, strict_mode, check_proto) |
9358 ; | 9470 ; |
9359 } | 9471 } |
9360 | 9472 |
9361 | 9473 |
9474 Handle<Object> JSObject::SetOwnElement(Handle<JSObject> object, | |
9475 uint32_t index, | |
9476 Handle<Object> value, | |
9477 StrictModeFlag strict_mode) { | |
9478 ASSERT(!object->HasExternalArrayElements()); | |
9479 CALL_HEAP_FUNCTION(object->GetIsolate(), | |
9480 object->SetElement(index, *value, strict_mode, false), | |
9481 Object); | |
9482 } | |
9483 | |
9484 | |
9485 Handle<Object> JSObject::SetElement(Handle<JSObject> object, | |
9486 uint32_t index, | |
Kevin Millikin (Chromium)
2012/01/04 13:00:32
Indentation is off here.
ulan
2012/01/05 11:16:35
Done.
| |
9487 Handle<Object> value, | |
9488 StrictModeFlag strict_mode) { | |
9489 if (object->HasExternalArrayElements()) { | |
9490 if (!value->IsSmi() && !value->IsHeapNumber() && !value->IsUndefined()) { | |
9491 bool has_exception; | |
9492 Handle<Object> number = Execution::ToNumber(value, &has_exception); | |
9493 if (has_exception) return Handle<Object>(); | |
9494 value = number; | |
9495 } | |
9496 } | |
9497 CALL_HEAP_FUNCTION(object->GetIsolate(), | |
9498 object->SetElement(index, *value, strict_mode, true), | |
9499 Object); | |
9500 } | |
9501 | |
9502 | |
9362 MaybeObject* JSObject::SetElement(uint32_t index, | 9503 MaybeObject* JSObject::SetElement(uint32_t index, |
9363 Object* value, | 9504 Object* value, |
9364 StrictModeFlag strict_mode, | 9505 StrictModeFlag strict_mode, |
9365 bool check_prototype) { | 9506 bool check_prototype) { |
9366 // Check access rights if needed. | 9507 // Check access rights if needed. |
9367 if (IsAccessCheckNeeded()) { | 9508 if (IsAccessCheckNeeded()) { |
9368 Heap* heap = GetHeap(); | 9509 Heap* heap = GetHeap(); |
9369 if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_SET)) { | 9510 if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_SET)) { |
9370 HandleScope scope(heap->isolate()); | 9511 HandleScope scope(heap->isolate()); |
9371 Handle<Object> value_handle(value); | 9512 Handle<Object> value_handle(value); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9474 } | 9615 } |
9475 } | 9616 } |
9476 } | 9617 } |
9477 // All possible cases have been handled above. Add a return to avoid the | 9618 // All possible cases have been handled above. Add a return to avoid the |
9478 // complaints from the compiler. | 9619 // complaints from the compiler. |
9479 UNREACHABLE(); | 9620 UNREACHABLE(); |
9480 return isolate->heap()->null_value(); | 9621 return isolate->heap()->null_value(); |
9481 } | 9622 } |
9482 | 9623 |
9483 | 9624 |
9625 Handle<Object> JSObject::TransitionElementsKind(Handle<JSObject> object, | |
9626 ElementsKind to_kind) { | |
9627 CALL_HEAP_FUNCTION(object->GetIsolate(), | |
9628 object->TransitionElementsKind(to_kind), | |
9629 Object); | |
9630 } | |
9631 | |
9632 | |
9484 MUST_USE_RESULT MaybeObject* JSObject::TransitionElementsKind( | 9633 MUST_USE_RESULT MaybeObject* JSObject::TransitionElementsKind( |
9485 ElementsKind to_kind) { | 9634 ElementsKind to_kind) { |
9486 ElementsKind from_kind = map()->elements_kind(); | 9635 ElementsKind from_kind = map()->elements_kind(); |
9487 FixedArrayBase* elms = FixedArrayBase::cast(elements()); | 9636 FixedArrayBase* elms = FixedArrayBase::cast(elements()); |
9488 uint32_t capacity = static_cast<uint32_t>(elms->length()); | 9637 uint32_t capacity = static_cast<uint32_t>(elms->length()); |
9489 uint32_t length = capacity; | 9638 uint32_t length = capacity; |
9490 | 9639 |
9491 if (IsJSArray()) { | 9640 if (IsJSArray()) { |
9492 Object* raw_length = JSArray::cast(this)->length(); | 9641 Object* raw_length = JSArray::cast(this)->length(); |
9493 if (raw_length->IsUndefined()) { | 9642 if (raw_length->IsUndefined()) { |
(...skipping 2419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11913 return Add(key, value, details); | 12062 return Add(key, value, details); |
11914 } | 12063 } |
11915 | 12064 |
11916 | 12065 |
11917 MaybeObject* NumberDictionary::AtNumberPut(uint32_t key, Object* value) { | 12066 MaybeObject* NumberDictionary::AtNumberPut(uint32_t key, Object* value) { |
11918 UpdateMaxNumberKey(key); | 12067 UpdateMaxNumberKey(key); |
11919 return AtPut(key, value); | 12068 return AtPut(key, value); |
11920 } | 12069 } |
11921 | 12070 |
11922 | 12071 |
12072 Handle<NumberDictionary> NumberDictionary::Set( | |
12073 Handle<NumberDictionary> dictionary, | |
12074 uint32_t index, | |
12075 Handle<Object> value, | |
12076 PropertyDetails details) { | |
12077 CALL_HEAP_FUNCTION(dictionary->GetIsolate(), | |
12078 dictionary->Set(index, *value, details), | |
12079 NumberDictionary); | |
12080 } | |
12081 | |
12082 | |
11923 MaybeObject* NumberDictionary::Set(uint32_t key, | 12083 MaybeObject* NumberDictionary::Set(uint32_t key, |
11924 Object* value, | 12084 Object* value, |
11925 PropertyDetails details) { | 12085 PropertyDetails details) { |
11926 int entry = FindEntry(key); | 12086 int entry = FindEntry(key); |
11927 if (entry == kNotFound) return AddNumberEntry(key, value, details); | 12087 if (entry == kNotFound) return AddNumberEntry(key, value, details); |
11928 // Preserve enumeration index. | 12088 // Preserve enumeration index. |
11929 details = PropertyDetails(details.attributes(), | 12089 details = PropertyDetails(details.attributes(), |
11930 details.type(), | 12090 details.type(), |
11931 DetailsAt(entry).index()); | 12091 DetailsAt(entry).index()); |
11932 MaybeObject* maybe_object_key = NumberDictionaryShape::AsObject(key); | 12092 MaybeObject* maybe_object_key = NumberDictionaryShape::AsObject(key); |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12554 if (break_point_objects()->IsUndefined()) return 0; | 12714 if (break_point_objects()->IsUndefined()) return 0; |
12555 // Single break point. | 12715 // Single break point. |
12556 if (!break_point_objects()->IsFixedArray()) return 1; | 12716 if (!break_point_objects()->IsFixedArray()) return 1; |
12557 // Multiple break points. | 12717 // Multiple break points. |
12558 return FixedArray::cast(break_point_objects())->length(); | 12718 return FixedArray::cast(break_point_objects())->length(); |
12559 } | 12719 } |
12560 #endif // ENABLE_DEBUGGER_SUPPORT | 12720 #endif // ENABLE_DEBUGGER_SUPPORT |
12561 | 12721 |
12562 | 12722 |
12563 } } // namespace v8::internal | 12723 } } // namespace v8::internal |
OLD | NEW |