| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/isolate.h" | 5 #include "src/isolate.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 | 8 |
| 9 #include <fstream> // NOLINT(readability/streams) | 9 #include <fstream> // NOLINT(readability/streams) |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 2804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2815 } | 2815 } |
| 2816 context = current_context->next_context_link(); | 2816 context = current_context->next_context_link(); |
| 2817 } | 2817 } |
| 2818 return false; | 2818 return false; |
| 2819 } | 2819 } |
| 2820 | 2820 |
| 2821 bool Isolate::IsFastArrayConstructorPrototypeChainIntact() { | 2821 bool Isolate::IsFastArrayConstructorPrototypeChainIntact() { |
| 2822 PropertyCell* no_elements_cell = heap()->array_protector(); | 2822 PropertyCell* no_elements_cell = heap()->array_protector(); |
| 2823 bool cell_reports_intact = | 2823 bool cell_reports_intact = |
| 2824 no_elements_cell->value()->IsSmi() && | 2824 no_elements_cell->value()->IsSmi() && |
| 2825 Smi::cast(no_elements_cell->value())->value() == kArrayProtectorValid; | 2825 Smi::cast(no_elements_cell->value())->value() == kProtectorValid; |
| 2826 | 2826 |
| 2827 #ifdef DEBUG | 2827 #ifdef DEBUG |
| 2828 Map* root_array_map = | 2828 Map* root_array_map = |
| 2829 get_initial_js_array_map(GetInitialFastElementsKind()); | 2829 get_initial_js_array_map(GetInitialFastElementsKind()); |
| 2830 Context* native_context = context()->native_context(); | 2830 Context* native_context = context()->native_context(); |
| 2831 JSObject* initial_array_proto = JSObject::cast( | 2831 JSObject* initial_array_proto = JSObject::cast( |
| 2832 native_context->get(Context::INITIAL_ARRAY_PROTOTYPE_INDEX)); | 2832 native_context->get(Context::INITIAL_ARRAY_PROTOTYPE_INDEX)); |
| 2833 JSObject* initial_object_proto = JSObject::cast( | 2833 JSObject* initial_object_proto = JSObject::cast( |
| 2834 native_context->get(Context::INITIAL_OBJECT_PROTOTYPE_INDEX)); | 2834 native_context->get(Context::INITIAL_OBJECT_PROTOTYPE_INDEX)); |
| 2835 | 2835 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2874 | 2874 |
| 2875 #endif | 2875 #endif |
| 2876 | 2876 |
| 2877 return cell_reports_intact; | 2877 return cell_reports_intact; |
| 2878 } | 2878 } |
| 2879 | 2879 |
| 2880 bool Isolate::IsIsConcatSpreadableLookupChainIntact() { | 2880 bool Isolate::IsIsConcatSpreadableLookupChainIntact() { |
| 2881 Cell* is_concat_spreadable_cell = heap()->is_concat_spreadable_protector(); | 2881 Cell* is_concat_spreadable_cell = heap()->is_concat_spreadable_protector(); |
| 2882 bool is_is_concat_spreadable_set = | 2882 bool is_is_concat_spreadable_set = |
| 2883 Smi::cast(is_concat_spreadable_cell->value())->value() == | 2883 Smi::cast(is_concat_spreadable_cell->value())->value() == |
| 2884 kArrayProtectorInvalid; | 2884 kProtectorInvalid; |
| 2885 #ifdef DEBUG | 2885 #ifdef DEBUG |
| 2886 Map* root_array_map = get_initial_js_array_map(GetInitialFastElementsKind()); | 2886 Map* root_array_map = get_initial_js_array_map(GetInitialFastElementsKind()); |
| 2887 if (root_array_map == NULL) { | 2887 if (root_array_map == NULL) { |
| 2888 // Ignore the value of is_concat_spreadable during bootstrap. | 2888 // Ignore the value of is_concat_spreadable during bootstrap. |
| 2889 return !is_is_concat_spreadable_set; | 2889 return !is_is_concat_spreadable_set; |
| 2890 } | 2890 } |
| 2891 Handle<Object> array_prototype(array_function()->prototype(), this); | 2891 Handle<Object> array_prototype(array_function()->prototype(), this); |
| 2892 Handle<Symbol> key = factory()->is_concat_spreadable_symbol(); | 2892 Handle<Symbol> key = factory()->is_concat_spreadable_symbol(); |
| 2893 Handle<Object> value; | 2893 Handle<Object> value; |
| 2894 LookupIterator it(array_prototype, key); | 2894 LookupIterator it(array_prototype, key); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2909 return !receiver->HasProxyInPrototype(this); | 2909 return !receiver->HasProxyInPrototype(this); |
| 2910 } | 2910 } |
| 2911 | 2911 |
| 2912 void Isolate::UpdateArrayProtectorOnSetElement(Handle<JSObject> object) { | 2912 void Isolate::UpdateArrayProtectorOnSetElement(Handle<JSObject> object) { |
| 2913 DisallowHeapAllocation no_gc; | 2913 DisallowHeapAllocation no_gc; |
| 2914 if (!object->map()->is_prototype_map()) return; | 2914 if (!object->map()->is_prototype_map()) return; |
| 2915 if (!IsFastArrayConstructorPrototypeChainIntact()) return; | 2915 if (!IsFastArrayConstructorPrototypeChainIntact()) return; |
| 2916 if (!IsArrayOrObjectPrototype(*object)) return; | 2916 if (!IsArrayOrObjectPrototype(*object)) return; |
| 2917 PropertyCell::SetValueWithInvalidation( | 2917 PropertyCell::SetValueWithInvalidation( |
| 2918 factory()->array_protector(), | 2918 factory()->array_protector(), |
| 2919 handle(Smi::FromInt(kArrayProtectorInvalid), this)); | 2919 handle(Smi::FromInt(kProtectorInvalid), this)); |
| 2920 } | 2920 } |
| 2921 | 2921 |
| 2922 void Isolate::InvalidateHasInstanceProtector() { | 2922 void Isolate::InvalidateHasInstanceProtector() { |
| 2923 DCHECK(factory()->has_instance_protector()->value()->IsSmi()); | 2923 DCHECK(factory()->has_instance_protector()->value()->IsSmi()); |
| 2924 DCHECK(IsHasInstanceLookupChainIntact()); | 2924 DCHECK(IsHasInstanceLookupChainIntact()); |
| 2925 PropertyCell::SetValueWithInvalidation( | 2925 PropertyCell::SetValueWithInvalidation( |
| 2926 factory()->has_instance_protector(), | 2926 factory()->has_instance_protector(), |
| 2927 handle(Smi::FromInt(kArrayProtectorInvalid), this)); | 2927 handle(Smi::FromInt(kProtectorInvalid), this)); |
| 2928 DCHECK(!IsHasInstanceLookupChainIntact()); | 2928 DCHECK(!IsHasInstanceLookupChainIntact()); |
| 2929 } | 2929 } |
| 2930 | 2930 |
| 2931 void Isolate::InvalidateIsConcatSpreadableProtector() { | 2931 void Isolate::InvalidateIsConcatSpreadableProtector() { |
| 2932 DCHECK(factory()->is_concat_spreadable_protector()->value()->IsSmi()); | 2932 DCHECK(factory()->is_concat_spreadable_protector()->value()->IsSmi()); |
| 2933 DCHECK(IsIsConcatSpreadableLookupChainIntact()); | 2933 DCHECK(IsIsConcatSpreadableLookupChainIntact()); |
| 2934 factory()->is_concat_spreadable_protector()->set_value( | 2934 factory()->is_concat_spreadable_protector()->set_value( |
| 2935 Smi::FromInt(kArrayProtectorInvalid)); | 2935 Smi::FromInt(kProtectorInvalid)); |
| 2936 DCHECK(!IsIsConcatSpreadableLookupChainIntact()); | 2936 DCHECK(!IsIsConcatSpreadableLookupChainIntact()); |
| 2937 } | 2937 } |
| 2938 | 2938 |
| 2939 void Isolate::InvalidateArraySpeciesProtector() { | 2939 void Isolate::InvalidateArraySpeciesProtector() { |
| 2940 DCHECK(factory()->species_protector()->value()->IsSmi()); | 2940 DCHECK(factory()->species_protector()->value()->IsSmi()); |
| 2941 DCHECK(IsArraySpeciesLookupChainIntact()); | 2941 DCHECK(IsArraySpeciesLookupChainIntact()); |
| 2942 factory()->species_protector()->set_value( | 2942 factory()->species_protector()->set_value(Smi::FromInt(kProtectorInvalid)); |
| 2943 Smi::FromInt(kArrayProtectorInvalid)); | |
| 2944 DCHECK(!IsArraySpeciesLookupChainIntact()); | 2943 DCHECK(!IsArraySpeciesLookupChainIntact()); |
| 2945 } | 2944 } |
| 2946 | 2945 |
| 2947 void Isolate::InvalidateStringLengthOverflowProtector() { | 2946 void Isolate::InvalidateStringLengthOverflowProtector() { |
| 2948 DCHECK(factory()->string_length_protector()->value()->IsSmi()); | 2947 DCHECK(factory()->string_length_protector()->value()->IsSmi()); |
| 2949 DCHECK(IsStringLengthOverflowIntact()); | 2948 DCHECK(IsStringLengthOverflowIntact()); |
| 2950 PropertyCell::SetValueWithInvalidation( | 2949 PropertyCell::SetValueWithInvalidation( |
| 2951 factory()->string_length_protector(), | 2950 factory()->string_length_protector(), |
| 2952 handle(Smi::FromInt(kArrayProtectorInvalid), this)); | 2951 handle(Smi::FromInt(kProtectorInvalid), this)); |
| 2953 DCHECK(!IsStringLengthOverflowIntact()); | 2952 DCHECK(!IsStringLengthOverflowIntact()); |
| 2954 } | 2953 } |
| 2955 | 2954 |
| 2955 void Isolate::InvalidateArrayIteratorProtector() { |
| 2956 DCHECK(factory()->array_iterator_protector()->value()->IsSmi()); |
| 2957 DCHECK(IsArrayIteratorLookupChainIntact()); |
| 2958 factory()->array_iterator_protector()->set_value( |
| 2959 Smi::FromInt(kProtectorInvalid)); |
| 2960 DCHECK(!IsArrayIteratorLookupChainIntact()); |
| 2961 } |
| 2962 |
| 2956 bool Isolate::IsAnyInitialArrayPrototype(Handle<JSArray> array) { | 2963 bool Isolate::IsAnyInitialArrayPrototype(Handle<JSArray> array) { |
| 2957 DisallowHeapAllocation no_gc; | 2964 DisallowHeapAllocation no_gc; |
| 2958 return IsInAnyContext(*array, Context::INITIAL_ARRAY_PROTOTYPE_INDEX); | 2965 return IsInAnyContext(*array, Context::INITIAL_ARRAY_PROTOTYPE_INDEX); |
| 2959 } | 2966 } |
| 2960 | 2967 |
| 2961 | 2968 |
| 2962 CallInterfaceDescriptorData* Isolate::call_descriptor_data(int index) { | 2969 CallInterfaceDescriptorData* Isolate::call_descriptor_data(int index) { |
| 2963 DCHECK(0 <= index && index < CallDescriptors::NUMBER_OF_DESCRIPTORS); | 2970 DCHECK(0 <= index && index < CallDescriptors::NUMBER_OF_DESCRIPTORS); |
| 2964 return &call_descriptor_data_[index]; | 2971 return &call_descriptor_data_[index]; |
| 2965 } | 2972 } |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3488 // Then check whether this scope intercepts. | 3495 // Then check whether this scope intercepts. |
| 3489 if ((flag & intercept_mask_)) { | 3496 if ((flag & intercept_mask_)) { |
| 3490 intercepted_flags_ |= flag; | 3497 intercepted_flags_ |= flag; |
| 3491 return true; | 3498 return true; |
| 3492 } | 3499 } |
| 3493 return false; | 3500 return false; |
| 3494 } | 3501 } |
| 3495 | 3502 |
| 3496 } // namespace internal | 3503 } // namespace internal |
| 3497 } // namespace v8 | 3504 } // namespace v8 |
| OLD | NEW |