Chromium Code Reviews| 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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 } else { | 122 } else { |
| 123 result->isolate()->PushStackTraceAndDie( | 123 result->isolate()->PushStackTraceAndDie( |
| 124 0xDEAD0000, this, JSReceiver::cast(this)->map(), 0xDEAD0001); | 124 0xDEAD0000, this, JSReceiver::cast(this)->map(), 0xDEAD0001); |
| 125 } | 125 } |
| 126 } | 126 } |
| 127 ASSERT(holder != NULL); // Cannot handle null or undefined. | 127 ASSERT(holder != NULL); // Cannot handle null or undefined. |
| 128 JSReceiver::cast(holder)->Lookup(name, result); | 128 JSReceiver::cast(holder)->Lookup(name, result); |
| 129 } | 129 } |
| 130 | 130 |
| 131 | 131 |
| 132 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { | 132 MaybeHandle<Object> Object::GetPropertyHelper( |
| 133 LookupIterator* it, bool force_holder_as_receiver_for_accessor_callback) { | |
| 133 for (; it->IsFound(); it->Next()) { | 134 for (; it->IsFound(); it->Next()) { |
| 134 switch (it->state()) { | 135 switch (it->state()) { |
| 135 case LookupIterator::NOT_FOUND: | 136 case LookupIterator::NOT_FOUND: |
| 136 UNREACHABLE(); | 137 UNREACHABLE(); |
| 137 case LookupIterator::JSPROXY: | 138 case LookupIterator::JSPROXY: |
| 138 return JSProxy::GetPropertyWithHandler( | 139 return JSProxy::GetPropertyWithHandler( |
| 139 it->GetJSProxy(), it->GetReceiver(), it->name()); | 140 it->GetJSProxy(), it->GetReceiver(), it->name()); |
| 140 case LookupIterator::INTERCEPTOR: { | 141 case LookupIterator::INTERCEPTOR: { |
| 141 MaybeHandle<Object> maybe_result = JSObject::GetPropertyWithInterceptor( | 142 MaybeHandle<Object> maybe_result = JSObject::GetPropertyWithInterceptor( |
| 142 it->GetHolder(), it->GetReceiver(), it->name()); | 143 it->GetHolder(), it->GetReceiver(), it->name()); |
| 143 if (!maybe_result.is_null()) return maybe_result; | 144 if (!maybe_result.is_null()) return maybe_result; |
| 144 if (it->isolate()->has_pending_exception()) return maybe_result; | 145 if (it->isolate()->has_pending_exception()) return maybe_result; |
| 145 break; | 146 break; |
| 146 } | 147 } |
| 147 case LookupIterator::ACCESS_CHECK: | 148 case LookupIterator::ACCESS_CHECK: |
| 148 if (it->HasAccess(v8::ACCESS_GET)) break; | 149 if (it->HasAccess(v8::ACCESS_GET)) break; |
| 149 return JSObject::GetPropertyWithFailedAccessCheck(it); | 150 return JSObject::GetPropertyWithFailedAccessCheck(it); |
| 150 case LookupIterator::PROPERTY: | 151 case LookupIterator::PROPERTY: |
| 151 if (it->HasProperty()) { | 152 if (it->HasProperty()) { |
| 152 switch (it->property_kind()) { | 153 switch (it->property_kind()) { |
| 153 case LookupIterator::ACCESSOR: | 154 case LookupIterator::ACCESSOR: { |
| 154 return GetPropertyWithAccessor( | 155 Handle<Object> accessors = it->GetAccessors(); |
| 155 it->GetReceiver(), it->name(), | 156 Handle<Object> receiver; |
| 156 it->GetHolder(), it->GetAccessors()); | 157 if (force_holder_as_receiver_for_accessor_callback && |
| 158 !accessors->IsAccessorPair()) { | |
| 159 receiver = it->GetHolder(); | |
| 160 } else { | |
| 161 receiver = it->GetReceiver(); | |
| 162 } | |
| 163 return GetPropertyWithAccessor(receiver, it->name(), | |
| 164 it->GetHolder(), accessors); | |
| 165 } | |
|
Toon Verwaest
2014/07/23 12:08:38
Euh, no.
What you want to do is fix a bug in Arra
| |
| 157 case LookupIterator::DATA: | 166 case LookupIterator::DATA: |
| 158 return it->GetDataValue(); | 167 return it->GetDataValue(); |
| 159 } | 168 } |
| 160 } | 169 } |
| 161 break; | 170 break; |
| 162 } | 171 } |
| 163 } | 172 } |
| 164 return it->factory()->undefined_value(); | 173 return it->factory()->undefined_value(); |
| 165 } | 174 } |
| 166 | 175 |
| 167 | 176 |
| 177 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { | |
| 178 return GetPropertyHelper(it, false); | |
| 179 } | |
| 180 | |
| 181 | |
| 182 MaybeHandle<Object> Object::GetPropertyForUnscopables(LookupIterator* it) { | |
| 183 // TODO(arv): For unscopables we need to make sure that we use the holder as | |
| 184 // the receiver for data properties that are implemented as callbacks | |
| 185 // (ACCESSER && !IsAccessorPair). | |
| 186 return GetPropertyHelper(it, true); | |
| 187 } | |
| 188 | |
| 189 | |
| 168 bool Object::ToInt32(int32_t* value) { | 190 bool Object::ToInt32(int32_t* value) { |
| 169 if (IsSmi()) { | 191 if (IsSmi()) { |
| 170 *value = Smi::cast(this)->value(); | 192 *value = Smi::cast(this)->value(); |
| 171 return true; | 193 return true; |
| 172 } | 194 } |
| 173 if (IsHeapNumber()) { | 195 if (IsHeapNumber()) { |
| 174 double num = HeapNumber::cast(this)->value(); | 196 double num = HeapNumber::cast(this)->value(); |
| 175 if (FastI2D(FastD2I(num)) == num) { | 197 if (FastI2D(FastD2I(num)) == num) { |
| 176 *value = FastD2I(num); | 198 *value = FastD2I(num); |
| 177 return true; | 199 return true; |
| (...skipping 16760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16938 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16960 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16939 static const char* error_messages_[] = { | 16961 static const char* error_messages_[] = { |
| 16940 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16962 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16941 }; | 16963 }; |
| 16942 #undef ERROR_MESSAGES_TEXTS | 16964 #undef ERROR_MESSAGES_TEXTS |
| 16943 return error_messages_[reason]; | 16965 return error_messages_[reason]; |
| 16944 } | 16966 } |
| 16945 | 16967 |
| 16946 | 16968 |
| 16947 } } // namespace v8::internal | 16969 } } // namespace v8::internal |
| OLD | NEW |