OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 2159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2170 if (!constructor->IsConstructor()) { | 2170 if (!constructor->IsConstructor()) { |
2171 THROW_NEW_ERROR(isolate, | 2171 THROW_NEW_ERROR(isolate, |
2172 NewTypeError(MessageTemplate::kSpeciesNotConstructor), | 2172 NewTypeError(MessageTemplate::kSpeciesNotConstructor), |
2173 Object); | 2173 Object); |
2174 } | 2174 } |
2175 return constructor; | 2175 return constructor; |
2176 } | 2176 } |
2177 } | 2177 } |
2178 | 2178 |
2179 bool Object::IterationHasObservableEffects() { | 2179 bool Object::IterationHasObservableEffects() { |
2180 if (IsJSArray()) { | 2180 // Check that this object is an array. |
2181 // Check that the spread arg has fast elements | 2181 if (!IsJSArray()) return true; |
2182 JSArray* spread_array = JSArray::cast(this); | 2182 JSArray* spread_array = JSArray::cast(this); |
2183 ElementsKind array_kind = spread_array->GetElementsKind(); | 2183 Isolate* isolate = spread_array->GetIsolate(); |
2184 Isolate* isolate = spread_array->GetIsolate(); | |
2185 | 2184 |
2186 // And that it has the orignal ArrayPrototype | 2185 // Check that we have the original ArrayPrototype. |
2187 JSObject* array_proto = JSObject::cast(spread_array->map()->prototype()); | 2186 JSObject* array_proto = JSObject::cast(spread_array->map()->prototype()); |
2188 Map* iterator_map = isolate->initial_array_iterator_prototype()->map(); | 2187 if (!isolate->is_initial_array_prototype(array_proto)) return true; |
2189 | 2188 |
2190 // Check that the iterator acts as expected. | 2189 // Check that the ArrayPrototype hasn't been modified in a way that would |
2191 // If IsArrayIteratorLookupChainIntact(), then we know that the initial | 2190 // affect iteration. |
2192 // ArrayIterator is being used. If the map of the prototype has changed, | 2191 if (!isolate->IsArrayIteratorLookupChainIntact()) return true; |
2193 // then take the slow path. | 2192 |
2194 if (isolate->is_initial_array_prototype(array_proto) && | 2193 // Check that the map of the initial array iterator hasn't changed. |
2195 isolate->IsArrayIteratorLookupChainIntact() && | 2194 Map* iterator_map = isolate->initial_array_iterator_prototype()->map(); |
2196 isolate->is_initial_array_iterator_prototype_map(iterator_map)) { | 2195 if (!isolate->is_initial_array_iterator_prototype_map(iterator_map)) { |
2197 if (IsFastPackedElementsKind(array_kind)) { | 2196 return true; |
2198 return false; | 2197 } |
2199 } | 2198 |
2200 if (IsFastHoleyElementsKind(array_kind) && | 2199 // For FastPacked kinds, iteration will have the same effect as simply |
2201 isolate->IsFastArrayConstructorPrototypeChainIntact()) { | 2200 // accessing each property in order. |
2202 return false; | 2201 ElementsKind array_kind = spread_array->GetElementsKind(); |
2203 } | 2202 if (IsFastPackedElementsKind(array_kind)) return false; |
2204 } | 2203 |
| 2204 // For FastHoley kinds, an element access on a hole would cause a lookup on |
| 2205 // the prototype. This could have different results if the prototype has been |
| 2206 // changed. |
| 2207 if (IsFastHoleyElementsKind(array_kind) && |
| 2208 isolate->IsFastArrayConstructorPrototypeChainIntact()) { |
| 2209 return false; |
2205 } | 2210 } |
2206 return true; | 2211 return true; |
2207 } | 2212 } |
2208 | 2213 |
2209 void Object::ShortPrint(FILE* out) { | 2214 void Object::ShortPrint(FILE* out) { |
2210 OFStream os(out); | 2215 OFStream os(out); |
2211 os << Brief(this); | 2216 os << Brief(this); |
2212 } | 2217 } |
2213 | 2218 |
2214 | 2219 |
(...skipping 18196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20411 // depend on this. | 20416 // depend on this. |
20412 return DICTIONARY_ELEMENTS; | 20417 return DICTIONARY_ELEMENTS; |
20413 } | 20418 } |
20414 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 20419 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
20415 return kind; | 20420 return kind; |
20416 } | 20421 } |
20417 } | 20422 } |
20418 | 20423 |
20419 } // namespace internal | 20424 } // namespace internal |
20420 } // namespace v8 | 20425 } // namespace v8 |
OLD | NEW |