| 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 <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 8134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8145 PropertyDetails details = descs->GetDetails(i); | 8145 PropertyDetails details = descs->GetDetails(i); |
| 8146 if (details.location() == kField) { | 8146 if (details.location() == kField) { |
| 8147 int candidate = details.field_index() + details.field_width_in_words(); | 8147 int candidate = details.field_index() + details.field_width_in_words(); |
| 8148 if (candidate > free_index) free_index = candidate; | 8148 if (candidate > free_index) free_index = candidate; |
| 8149 } | 8149 } |
| 8150 } | 8150 } |
| 8151 return free_index; | 8151 return free_index; |
| 8152 } | 8152 } |
| 8153 | 8153 |
| 8154 | 8154 |
| 8155 static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { | |
| 8156 int len = array->length(); | |
| 8157 for (int i = 0; i < len; i++) { | |
| 8158 Object* e = array->get(i); | |
| 8159 if (!(e->IsName() || e->IsNumber())) return false; | |
| 8160 } | |
| 8161 return true; | |
| 8162 } | |
| 8163 | |
| 8164 | |
| 8165 bool Map::OnlyHasSimpleProperties() { | 8155 bool Map::OnlyHasSimpleProperties() { |
| 8166 // Wrapped string elements aren't explicitly stored in the elements backing | 8156 // Wrapped string elements aren't explicitly stored in the elements backing |
| 8167 // store, but are loaded indirectly from the underlying string. | 8157 // store, but are loaded indirectly from the underlying string. |
| 8168 return !IsStringWrapperElementsKind(elements_kind()) && | 8158 return !IsStringWrapperElementsKind(elements_kind()) && |
| 8169 instance_type() > LAST_SPECIAL_RECEIVER_TYPE && | 8159 instance_type() > LAST_SPECIAL_RECEIVER_TYPE && |
| 8170 !has_hidden_prototype() && !is_dictionary_map(); | 8160 !has_hidden_prototype() && !is_dictionary_map(); |
| 8171 } | 8161 } |
| 8172 | 8162 |
| 8173 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | 8163 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, |
| 8174 KeyCollectionType type, | 8164 KeyCollectionType type, |
| 8175 PropertyFilter filter, | 8165 PropertyFilter filter, |
| 8176 GetKeysConversion keys_conversion, | 8166 GetKeysConversion keys_conversion, |
| 8177 bool filter_proxy_keys) { | 8167 bool filter_proxy_keys) { |
| 8178 USE(ContainsOnlyValidKeys); | 8168 return KeyAccumulator::GetKeys(object, type, filter, keys_conversion, |
| 8179 Isolate* isolate = object->GetIsolate(); | 8169 filter_proxy_keys); |
| 8180 KeyAccumulator accumulator(isolate, type, filter); | |
| 8181 accumulator.set_filter_proxy_keys(filter_proxy_keys); | |
| 8182 MAYBE_RETURN(accumulator.CollectKeys(object, object), | |
| 8183 MaybeHandle<FixedArray>()); | |
| 8184 Handle<FixedArray> keys = accumulator.GetKeys(keys_conversion); | |
| 8185 DCHECK(ContainsOnlyValidKeys(keys)); | |
| 8186 return keys; | |
| 8187 } | 8170 } |
| 8188 | 8171 |
| 8189 MUST_USE_RESULT Maybe<bool> FastGetOwnValuesOrEntries( | 8172 MUST_USE_RESULT Maybe<bool> FastGetOwnValuesOrEntries( |
| 8190 Isolate* isolate, Handle<JSReceiver> receiver, bool get_entries, | 8173 Isolate* isolate, Handle<JSReceiver> receiver, bool get_entries, |
| 8191 Handle<FixedArray>* result) { | 8174 Handle<FixedArray>* result) { |
| 8192 Handle<Map> map(JSReceiver::cast(*receiver)->map(), isolate); | 8175 Handle<Map> map(JSReceiver::cast(*receiver)->map(), isolate); |
| 8193 | 8176 |
| 8194 if (!map->IsJSObjectMap()) return Just(false); | 8177 if (!map->IsJSObjectMap()) return Just(false); |
| 8195 if (!map->OnlyHasSimpleProperties()) return Just(false); | 8178 if (!map->OnlyHasSimpleProperties()) return Just(false); |
| 8196 | 8179 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8273 if (fast_values_or_entries.IsNothing()) return MaybeHandle<FixedArray>(); | 8256 if (fast_values_or_entries.IsNothing()) return MaybeHandle<FixedArray>(); |
| 8274 if (fast_values_or_entries.FromJust()) return values_or_entries; | 8257 if (fast_values_or_entries.FromJust()) return values_or_entries; |
| 8275 } | 8258 } |
| 8276 | 8259 |
| 8277 PropertyFilter key_filter = | 8260 PropertyFilter key_filter = |
| 8278 static_cast<PropertyFilter>(filter & ~ONLY_ENUMERABLE); | 8261 static_cast<PropertyFilter>(filter & ~ONLY_ENUMERABLE); |
| 8279 KeyAccumulator accumulator(isolate, OWN_ONLY, key_filter); | 8262 KeyAccumulator accumulator(isolate, OWN_ONLY, key_filter); |
| 8280 MAYBE_RETURN(accumulator.CollectKeys(object, object), | 8263 MAYBE_RETURN(accumulator.CollectKeys(object, object), |
| 8281 MaybeHandle<FixedArray>()); | 8264 MaybeHandle<FixedArray>()); |
| 8282 Handle<FixedArray> keys = accumulator.GetKeys(CONVERT_TO_STRING); | 8265 Handle<FixedArray> keys = accumulator.GetKeys(CONVERT_TO_STRING); |
| 8283 DCHECK(ContainsOnlyValidKeys(keys)); | |
| 8284 | 8266 |
| 8285 values_or_entries = isolate->factory()->NewFixedArray(keys->length()); | 8267 values_or_entries = isolate->factory()->NewFixedArray(keys->length()); |
| 8286 int length = 0; | 8268 int length = 0; |
| 8287 | 8269 |
| 8288 for (int i = 0; i < keys->length(); ++i) { | 8270 for (int i = 0; i < keys->length(); ++i) { |
| 8289 Handle<Name> key = Handle<Name>::cast(handle(keys->get(i), isolate)); | 8271 Handle<Name> key = Handle<Name>::cast(handle(keys->get(i), isolate)); |
| 8290 | 8272 |
| 8291 if (filter & ONLY_ENUMERABLE) { | 8273 if (filter & ONLY_ENUMERABLE) { |
| 8292 PropertyDescriptor descriptor; | 8274 PropertyDescriptor descriptor; |
| 8293 Maybe<bool> did_get_descriptor = JSReceiver::GetOwnPropertyDescriptor( | 8275 Maybe<bool> did_get_descriptor = JSReceiver::GetOwnPropertyDescriptor( |
| (...skipping 10087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18381 if (cell->value() != *new_value) { | 18363 if (cell->value() != *new_value) { |
| 18382 cell->set_value(*new_value); | 18364 cell->set_value(*new_value); |
| 18383 Isolate* isolate = cell->GetIsolate(); | 18365 Isolate* isolate = cell->GetIsolate(); |
| 18384 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18366 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 18385 isolate, DependentCode::kPropertyCellChangedGroup); | 18367 isolate, DependentCode::kPropertyCellChangedGroup); |
| 18386 } | 18368 } |
| 18387 } | 18369 } |
| 18388 | 18370 |
| 18389 } // namespace internal | 18371 } // namespace internal |
| 18390 } // namespace v8 | 18372 } // namespace v8 |
| OLD | NEW |