| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 (fun->IsHeapObject() && | 103 (fun->IsHeapObject() && |
| 104 HeapObject::cast(fun)->map()->has_instance_call_handler()); | 104 HeapObject::cast(fun)->map()->has_instance_call_handler()); |
| 105 } | 105 } |
| 106 | 106 |
| 107 | 107 |
| 108 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { | 108 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { |
| 109 for (; it->IsFound(); it->Next()) { | 109 for (; it->IsFound(); it->Next()) { |
| 110 switch (it->state()) { | 110 switch (it->state()) { |
| 111 case LookupIterator::NOT_FOUND: | 111 case LookupIterator::NOT_FOUND: |
| 112 case LookupIterator::TRANSITION: | 112 case LookupIterator::TRANSITION: |
| 113 case LookupIterator::UNKNOWN: | |
| 114 UNREACHABLE(); | 113 UNREACHABLE(); |
| 115 case LookupIterator::JSPROXY: | 114 case LookupIterator::JSPROXY: |
| 116 return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(), | 115 return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(), |
| 117 it->GetReceiver(), it->name()); | 116 it->GetReceiver(), it->name()); |
| 118 case LookupIterator::INTERCEPTOR: { | 117 case LookupIterator::INTERCEPTOR: { |
| 119 MaybeHandle<Object> maybe_result = JSObject::GetPropertyWithInterceptor( | 118 MaybeHandle<Object> maybe_result = JSObject::GetPropertyWithInterceptor( |
| 120 it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); | 119 it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); |
| 121 if (!maybe_result.is_null()) return maybe_result; | 120 if (!maybe_result.is_null()) return maybe_result; |
| 122 if (it->isolate()->has_pending_exception()) return maybe_result; | 121 if (it->isolate()->has_pending_exception()) return maybe_result; |
| 123 break; | 122 break; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 144 return GetDataProperty(&it); | 143 return GetDataProperty(&it); |
| 145 } | 144 } |
| 146 | 145 |
| 147 | 146 |
| 148 Handle<Object> JSObject::GetDataProperty(LookupIterator* it) { | 147 Handle<Object> JSObject::GetDataProperty(LookupIterator* it) { |
| 149 for (; it->IsFound(); it->Next()) { | 148 for (; it->IsFound(); it->Next()) { |
| 150 switch (it->state()) { | 149 switch (it->state()) { |
| 151 case LookupIterator::INTERCEPTOR: | 150 case LookupIterator::INTERCEPTOR: |
| 152 case LookupIterator::NOT_FOUND: | 151 case LookupIterator::NOT_FOUND: |
| 153 case LookupIterator::TRANSITION: | 152 case LookupIterator::TRANSITION: |
| 154 case LookupIterator::UNKNOWN: | |
| 155 UNREACHABLE(); | 153 UNREACHABLE(); |
| 156 case LookupIterator::ACCESS_CHECK: | 154 case LookupIterator::ACCESS_CHECK: |
| 157 if (it->HasAccess(v8::ACCESS_GET)) continue; | 155 if (it->HasAccess(v8::ACCESS_GET)) continue; |
| 158 // Fall through. | 156 // Fall through. |
| 159 case LookupIterator::JSPROXY: | 157 case LookupIterator::JSPROXY: |
| 160 it->NotFound(); | 158 it->NotFound(); |
| 161 return it->isolate()->factory()->undefined_value(); | 159 return it->isolate()->factory()->undefined_value(); |
| 162 case LookupIterator::ACCESSOR: | 160 case LookupIterator::ACCESSOR: |
| 163 // TODO(verwaest): For now this doesn't call into | 161 // TODO(verwaest): For now this doesn't call into |
| 164 // ExecutableAccessorInfo, since clients don't need it. Update once | 162 // ExecutableAccessorInfo, since clients don't need it. Update once |
| (...skipping 2634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2799 StrictMode strict_mode, | 2797 StrictMode strict_mode, |
| 2800 StoreFromKeyed store_mode) { | 2798 StoreFromKeyed store_mode) { |
| 2801 // Make sure that the top context does not change when doing callbacks or | 2799 // Make sure that the top context does not change when doing callbacks or |
| 2802 // interceptor calls. | 2800 // interceptor calls. |
| 2803 AssertNoContextChange ncc(it->isolate()); | 2801 AssertNoContextChange ncc(it->isolate()); |
| 2804 | 2802 |
| 2805 bool done = false; | 2803 bool done = false; |
| 2806 for (; it->IsFound(); it->Next()) { | 2804 for (; it->IsFound(); it->Next()) { |
| 2807 switch (it->state()) { | 2805 switch (it->state()) { |
| 2808 case LookupIterator::NOT_FOUND: | 2806 case LookupIterator::NOT_FOUND: |
| 2809 case LookupIterator::UNKNOWN: | |
| 2810 UNREACHABLE(); | 2807 UNREACHABLE(); |
| 2811 | 2808 |
| 2812 case LookupIterator::ACCESS_CHECK: | 2809 case LookupIterator::ACCESS_CHECK: |
| 2813 // TODO(verwaest): Remove the distinction. This is mostly bogus since we | 2810 // TODO(verwaest): Remove the distinction. This is mostly bogus since we |
| 2814 // don't know whether we'll want to fetch attributes or call a setter | 2811 // don't know whether we'll want to fetch attributes or call a setter |
| 2815 // until we find the property. | 2812 // until we find the property. |
| 2816 if (it->HasAccess(v8::ACCESS_SET)) break; | 2813 if (it->HasAccess(v8::ACCESS_SET)) break; |
| 2817 return JSObject::SetPropertyWithFailedAccessCheck(it, value, | 2814 return JSObject::SetPropertyWithFailedAccessCheck(it, value, |
| 2818 strict_mode); | 2815 strict_mode); |
| 2819 | 2816 |
| (...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3794 DCHECK(!value->IsTheHole()); | 3791 DCHECK(!value->IsTheHole()); |
| 3795 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); | 3792 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
| 3796 bool is_observed = object->map()->is_observed() && | 3793 bool is_observed = object->map()->is_observed() && |
| 3797 *name != it.isolate()->heap()->hidden_string(); | 3794 *name != it.isolate()->heap()->hidden_string(); |
| 3798 for (; it.IsFound(); it.Next()) { | 3795 for (; it.IsFound(); it.Next()) { |
| 3799 switch (it.state()) { | 3796 switch (it.state()) { |
| 3800 case LookupIterator::INTERCEPTOR: | 3797 case LookupIterator::INTERCEPTOR: |
| 3801 case LookupIterator::JSPROXY: | 3798 case LookupIterator::JSPROXY: |
| 3802 case LookupIterator::NOT_FOUND: | 3799 case LookupIterator::NOT_FOUND: |
| 3803 case LookupIterator::TRANSITION: | 3800 case LookupIterator::TRANSITION: |
| 3804 case LookupIterator::UNKNOWN: | |
| 3805 UNREACHABLE(); | 3801 UNREACHABLE(); |
| 3806 | 3802 |
| 3807 case LookupIterator::ACCESS_CHECK: | 3803 case LookupIterator::ACCESS_CHECK: |
| 3808 if (!it.isolate()->MayNamedAccess(object, name, v8::ACCESS_SET)) { | 3804 if (!it.isolate()->MayNamedAccess(object, name, v8::ACCESS_SET)) { |
| 3809 return SetPropertyWithFailedAccessCheck(&it, value, SLOPPY); | 3805 return SetPropertyWithFailedAccessCheck(&it, value, SLOPPY); |
| 3810 } | 3806 } |
| 3811 break; | 3807 break; |
| 3812 | 3808 |
| 3813 case LookupIterator::ACCESSOR: { | 3809 case LookupIterator::ACCESSOR: { |
| 3814 PropertyDetails details = it.property_details(); | 3810 PropertyDetails details = it.property_details(); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3971 LookupIterator it(object, name, LookupIterator::HIDDEN); | 3967 LookupIterator it(object, name, LookupIterator::HIDDEN); |
| 3972 return GetPropertyAttributes(&it); | 3968 return GetPropertyAttributes(&it); |
| 3973 } | 3969 } |
| 3974 | 3970 |
| 3975 | 3971 |
| 3976 Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes( | 3972 Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes( |
| 3977 LookupIterator* it) { | 3973 LookupIterator* it) { |
| 3978 for (; it->IsFound(); it->Next()) { | 3974 for (; it->IsFound(); it->Next()) { |
| 3979 switch (it->state()) { | 3975 switch (it->state()) { |
| 3980 case LookupIterator::NOT_FOUND: | 3976 case LookupIterator::NOT_FOUND: |
| 3981 case LookupIterator::UNKNOWN: | |
| 3982 case LookupIterator::TRANSITION: | 3977 case LookupIterator::TRANSITION: |
| 3983 UNREACHABLE(); | 3978 UNREACHABLE(); |
| 3984 case LookupIterator::JSPROXY: | 3979 case LookupIterator::JSPROXY: |
| 3985 return JSProxy::GetPropertyAttributesWithHandler( | 3980 return JSProxy::GetPropertyAttributesWithHandler( |
| 3986 it->GetHolder<JSProxy>(), it->GetReceiver(), it->name()); | 3981 it->GetHolder<JSProxy>(), it->GetReceiver(), it->name()); |
| 3987 case LookupIterator::INTERCEPTOR: { | 3982 case LookupIterator::INTERCEPTOR: { |
| 3988 Maybe<PropertyAttributes> result = | 3983 Maybe<PropertyAttributes> result = |
| 3989 JSObject::GetPropertyAttributesWithInterceptor( | 3984 JSObject::GetPropertyAttributesWithInterceptor( |
| 3990 it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); | 3985 it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); |
| 3991 if (!result.has_value) return result; | 3986 if (!result.has_value) return result; |
| (...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4911 | 4906 |
| 4912 bool is_observed = object->map()->is_observed() && | 4907 bool is_observed = object->map()->is_observed() && |
| 4913 *name != it.isolate()->heap()->hidden_string(); | 4908 *name != it.isolate()->heap()->hidden_string(); |
| 4914 Handle<Object> old_value = it.isolate()->factory()->the_hole_value(); | 4909 Handle<Object> old_value = it.isolate()->factory()->the_hole_value(); |
| 4915 | 4910 |
| 4916 for (; it.IsFound(); it.Next()) { | 4911 for (; it.IsFound(); it.Next()) { |
| 4917 switch (it.state()) { | 4912 switch (it.state()) { |
| 4918 case LookupIterator::JSPROXY: | 4913 case LookupIterator::JSPROXY: |
| 4919 case LookupIterator::NOT_FOUND: | 4914 case LookupIterator::NOT_FOUND: |
| 4920 case LookupIterator::TRANSITION: | 4915 case LookupIterator::TRANSITION: |
| 4921 case LookupIterator::UNKNOWN: | |
| 4922 UNREACHABLE(); | 4916 UNREACHABLE(); |
| 4923 case LookupIterator::ACCESS_CHECK: | 4917 case LookupIterator::ACCESS_CHECK: |
| 4924 if (it.HasAccess(v8::ACCESS_DELETE)) break; | 4918 if (it.HasAccess(v8::ACCESS_DELETE)) break; |
| 4925 it.isolate()->ReportFailedAccessCheck(it.GetHolder<JSObject>(), | 4919 it.isolate()->ReportFailedAccessCheck(it.GetHolder<JSObject>(), |
| 4926 v8::ACCESS_DELETE); | 4920 v8::ACCESS_DELETE); |
| 4927 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it.isolate(), Object); | 4921 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it.isolate(), Object); |
| 4928 return it.isolate()->factory()->false_value(); | 4922 return it.isolate()->factory()->false_value(); |
| 4929 case LookupIterator::INTERCEPTOR: { | 4923 case LookupIterator::INTERCEPTOR: { |
| 4930 MaybeHandle<Object> maybe_result = | 4924 MaybeHandle<Object> maybe_result = |
| 4931 JSObject::DeletePropertyWithInterceptor(it.GetHolder<JSObject>(), | 4925 JSObject::DeletePropertyWithInterceptor(it.GetHolder<JSObject>(), |
| (...skipping 1358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6290 } | 6284 } |
| 6291 } | 6285 } |
| 6292 } else { | 6286 } else { |
| 6293 LookupIterator it(object, name, | 6287 LookupIterator it(object, name, |
| 6294 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); | 6288 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); |
| 6295 for (; it.IsFound(); it.Next()) { | 6289 for (; it.IsFound(); it.Next()) { |
| 6296 switch (it.state()) { | 6290 switch (it.state()) { |
| 6297 case LookupIterator::INTERCEPTOR: | 6291 case LookupIterator::INTERCEPTOR: |
| 6298 case LookupIterator::NOT_FOUND: | 6292 case LookupIterator::NOT_FOUND: |
| 6299 case LookupIterator::TRANSITION: | 6293 case LookupIterator::TRANSITION: |
| 6300 case LookupIterator::UNKNOWN: | |
| 6301 UNREACHABLE(); | 6294 UNREACHABLE(); |
| 6302 | 6295 |
| 6303 case LookupIterator::ACCESS_CHECK: | 6296 case LookupIterator::ACCESS_CHECK: |
| 6304 if (it.HasAccess(v8::ACCESS_HAS)) continue; | 6297 if (it.HasAccess(v8::ACCESS_HAS)) continue; |
| 6305 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>(), | 6298 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>(), |
| 6306 v8::ACCESS_HAS); | 6299 v8::ACCESS_HAS); |
| 6307 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 6300 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 6308 return isolate->factory()->undefined_value(); | 6301 return isolate->factory()->undefined_value(); |
| 6309 | 6302 |
| 6310 case LookupIterator::JSPROXY: | 6303 case LookupIterator::JSPROXY: |
| (...skipping 10054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16365 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16358 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16366 static const char* error_messages_[] = { | 16359 static const char* error_messages_[] = { |
| 16367 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16360 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16368 }; | 16361 }; |
| 16369 #undef ERROR_MESSAGES_TEXTS | 16362 #undef ERROR_MESSAGES_TEXTS |
| 16370 return error_messages_[reason]; | 16363 return error_messages_[reason]; |
| 16371 } | 16364 } |
| 16372 | 16365 |
| 16373 | 16366 |
| 16374 } } // namespace v8::internal | 16367 } } // namespace v8::internal |
| OLD | NEW |