| 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 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1192 } | 1192 } |
| 1193 // Didn't find the required type in the inheritance chain. | 1193 // Didn't find the required type in the inheritance chain. |
| 1194 return false; | 1194 return false; |
| 1195 } | 1195 } |
| 1196 | 1196 |
| 1197 | 1197 |
| 1198 // static | 1198 // static |
| 1199 Handle<TemplateList> TemplateList::New(Isolate* isolate, int size) { | 1199 Handle<TemplateList> TemplateList::New(Isolate* isolate, int size) { |
| 1200 Handle<FixedArray> list = | 1200 Handle<FixedArray> list = |
| 1201 isolate->factory()->NewFixedArray(kLengthIndex + size); | 1201 isolate->factory()->NewFixedArray(kLengthIndex + size); |
| 1202 list->set(kLengthIndex, Smi::FromInt(0)); | 1202 list->set(kLengthIndex, Smi::kZero); |
| 1203 return Handle<TemplateList>::cast(list); | 1203 return Handle<TemplateList>::cast(list); |
| 1204 } | 1204 } |
| 1205 | 1205 |
| 1206 // static | 1206 // static |
| 1207 Handle<TemplateList> TemplateList::Add(Isolate* isolate, | 1207 Handle<TemplateList> TemplateList::Add(Isolate* isolate, |
| 1208 Handle<TemplateList> list, | 1208 Handle<TemplateList> list, |
| 1209 Handle<i::Object> value) { | 1209 Handle<i::Object> value) { |
| 1210 STATIC_ASSERT(kFirstElementIndex == 1); | 1210 STATIC_ASSERT(kFirstElementIndex == 1); |
| 1211 int index = list->length() + 1; | 1211 int index = list->length() + 1; |
| 1212 Handle<i::FixedArray> fixed_array = Handle<FixedArray>::cast(list); | 1212 Handle<i::FixedArray> fixed_array = Handle<FixedArray>::cast(list); |
| (...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2145 if (v.value->IsSmi()) { | 2145 if (v.value->IsSmi()) { |
| 2146 Smi::cast(v.value)->SmiPrint(os); | 2146 Smi::cast(v.value)->SmiPrint(os); |
| 2147 } else { | 2147 } else { |
| 2148 // TODO(svenpanne) Const-correct HeapObjectShortPrint! | 2148 // TODO(svenpanne) Const-correct HeapObjectShortPrint! |
| 2149 HeapObject* obj = const_cast<HeapObject*>(HeapObject::cast(v.value)); | 2149 HeapObject* obj = const_cast<HeapObject*>(HeapObject::cast(v.value)); |
| 2150 obj->HeapObjectShortPrint(os); | 2150 obj->HeapObjectShortPrint(os); |
| 2151 } | 2151 } |
| 2152 return os; | 2152 return os; |
| 2153 } | 2153 } |
| 2154 | 2154 |
| 2155 // Declaration of the static Smi::kZero constant. |
| 2156 Smi* const Smi::kZero(nullptr); |
| 2155 | 2157 |
| 2156 void Smi::SmiPrint(std::ostream& os) const { // NOLINT | 2158 void Smi::SmiPrint(std::ostream& os) const { // NOLINT |
| 2157 os << value(); | 2159 os << value(); |
| 2158 } | 2160 } |
| 2159 | 2161 |
| 2160 | 2162 |
| 2161 // Should a word be prefixed by 'a' or 'an' in order to read naturally in | 2163 // Should a word be prefixed by 'a' or 'an' in order to read naturally in |
| 2162 // English? Returns false for non-ASCII or words that don't start with | 2164 // English? Returns false for non-ASCII or words that don't start with |
| 2163 // a capital letter. The a/an rule follows pronunciation in English. | 2165 // a capital letter. The a/an rule follows pronunciation in English. |
| 2164 // We don't use the BBC's overcorrect "an historic occasion" though if | 2166 // We don't use the BBC's overcorrect "an historic occasion" though if |
| (...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3168 | 3170 |
| 3169 | 3171 |
| 3170 // static | 3172 // static |
| 3171 void JSObject::UpdatePrototypeUserRegistration(Handle<Map> old_map, | 3173 void JSObject::UpdatePrototypeUserRegistration(Handle<Map> old_map, |
| 3172 Handle<Map> new_map, | 3174 Handle<Map> new_map, |
| 3173 Isolate* isolate) { | 3175 Isolate* isolate) { |
| 3174 if (!old_map->is_prototype_map()) return; | 3176 if (!old_map->is_prototype_map()) return; |
| 3175 DCHECK(new_map->is_prototype_map()); | 3177 DCHECK(new_map->is_prototype_map()); |
| 3176 bool was_registered = JSObject::UnregisterPrototypeUser(old_map, isolate); | 3178 bool was_registered = JSObject::UnregisterPrototypeUser(old_map, isolate); |
| 3177 new_map->set_prototype_info(old_map->prototype_info()); | 3179 new_map->set_prototype_info(old_map->prototype_info()); |
| 3178 old_map->set_prototype_info(Smi::FromInt(0)); | 3180 old_map->set_prototype_info(Smi::kZero); |
| 3179 if (FLAG_trace_prototype_users) { | 3181 if (FLAG_trace_prototype_users) { |
| 3180 PrintF("Moving prototype_info %p from map %p to map %p.\n", | 3182 PrintF("Moving prototype_info %p from map %p to map %p.\n", |
| 3181 reinterpret_cast<void*>(new_map->prototype_info()), | 3183 reinterpret_cast<void*>(new_map->prototype_info()), |
| 3182 reinterpret_cast<void*>(*old_map), | 3184 reinterpret_cast<void*>(*old_map), |
| 3183 reinterpret_cast<void*>(*new_map)); | 3185 reinterpret_cast<void*>(*new_map)); |
| 3184 } | 3186 } |
| 3185 if (was_registered) { | 3187 if (was_registered) { |
| 3186 if (new_map->prototype_info()->IsPrototypeInfo()) { | 3188 if (new_map->prototype_info()->IsPrototypeInfo()) { |
| 3187 // The new map isn't registered with its prototype yet; reflect this fact | 3189 // The new map isn't registered with its prototype yet; reflect this fact |
| 3188 // in the PrototypeInfo it just inherited from the old map. | 3190 // in the PrototypeInfo it just inherited from the old map. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3324 FieldIndex index = FieldIndex::ForDescriptor(*old_map, i); | 3326 FieldIndex index = FieldIndex::ForDescriptor(*old_map, i); |
| 3325 if (object->IsUnboxedDoubleField(index)) { | 3327 if (object->IsUnboxedDoubleField(index)) { |
| 3326 double old = object->RawFastDoublePropertyAt(index); | 3328 double old = object->RawFastDoublePropertyAt(index); |
| 3327 value = isolate->factory()->NewHeapNumber( | 3329 value = isolate->factory()->NewHeapNumber( |
| 3328 old, representation.IsDouble() ? MUTABLE : IMMUTABLE); | 3330 old, representation.IsDouble() ? MUTABLE : IMMUTABLE); |
| 3329 | 3331 |
| 3330 } else { | 3332 } else { |
| 3331 value = handle(object->RawFastPropertyAt(index), isolate); | 3333 value = handle(object->RawFastPropertyAt(index), isolate); |
| 3332 if (!old_representation.IsDouble() && representation.IsDouble()) { | 3334 if (!old_representation.IsDouble() && representation.IsDouble()) { |
| 3333 if (old_representation.IsNone()) { | 3335 if (old_representation.IsNone()) { |
| 3334 value = handle(Smi::FromInt(0), isolate); | 3336 value = handle(Smi::kZero, isolate); |
| 3335 } | 3337 } |
| 3336 value = Object::NewStorageFor(isolate, value, representation); | 3338 value = Object::NewStorageFor(isolate, value, representation); |
| 3337 } else if (old_representation.IsDouble() && | 3339 } else if (old_representation.IsDouble() && |
| 3338 !representation.IsDouble()) { | 3340 !representation.IsDouble()) { |
| 3339 value = Object::WrapForRead(isolate, value, old_representation); | 3341 value = Object::WrapForRead(isolate, value, old_representation); |
| 3340 } | 3342 } |
| 3341 } | 3343 } |
| 3342 } | 3344 } |
| 3343 DCHECK(!(representation.IsDouble() && value->IsSmi())); | 3345 DCHECK(!(representation.IsDouble() && value->IsSmi())); |
| 3344 int target_index = new_descriptors->GetFieldIndex(i) - inobject; | 3346 int target_index = new_descriptors->GetFieldIndex(i) - inobject; |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3507 // the left-over space to avoid races with the sweeper thread. | 3509 // the left-over space to avoid races with the sweeper thread. |
| 3508 object->synchronized_set_map(*new_map); | 3510 object->synchronized_set_map(*new_map); |
| 3509 | 3511 |
| 3510 object->set_properties(*dictionary); | 3512 object->set_properties(*dictionary); |
| 3511 | 3513 |
| 3512 // Ensure that in-object space of slow-mode object does not contain random | 3514 // Ensure that in-object space of slow-mode object does not contain random |
| 3513 // garbage. | 3515 // garbage. |
| 3514 int inobject_properties = new_map->GetInObjectProperties(); | 3516 int inobject_properties = new_map->GetInObjectProperties(); |
| 3515 for (int i = 0; i < inobject_properties; i++) { | 3517 for (int i = 0; i < inobject_properties; i++) { |
| 3516 FieldIndex index = FieldIndex::ForPropertyIndex(*new_map, i); | 3518 FieldIndex index = FieldIndex::ForPropertyIndex(*new_map, i); |
| 3517 object->RawFastPropertyAtPut(index, Smi::FromInt(0)); | 3519 object->RawFastPropertyAtPut(index, Smi::kZero); |
| 3518 } | 3520 } |
| 3519 | 3521 |
| 3520 isolate->counters()->props_to_dictionary()->Increment(); | 3522 isolate->counters()->props_to_dictionary()->Increment(); |
| 3521 | 3523 |
| 3522 #ifdef DEBUG | 3524 #ifdef DEBUG |
| 3523 if (FLAG_trace_normalization) { | 3525 if (FLAG_trace_normalization) { |
| 3524 OFStream os(stdout); | 3526 OFStream os(stdout); |
| 3525 os << "Object properties have been normalized:\n"; | 3527 os << "Object properties have been normalized:\n"; |
| 3526 object->Print(os); | 3528 object->Print(os); |
| 3527 } | 3529 } |
| (...skipping 5365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8893 if (FLAG_enable_slow_asserts) { | 8895 if (FLAG_enable_slow_asserts) { |
| 8894 // The cached map should match newly created normalized map bit-by-bit, | 8896 // The cached map should match newly created normalized map bit-by-bit, |
| 8895 // except for the code cache, which can contain some ics which can be | 8897 // except for the code cache, which can contain some ics which can be |
| 8896 // applied to the shared map, dependent code and weak cell cache. | 8898 // applied to the shared map, dependent code and weak cell cache. |
| 8897 Handle<Map> fresh = Map::CopyNormalized(fast_map, mode); | 8899 Handle<Map> fresh = Map::CopyNormalized(fast_map, mode); |
| 8898 | 8900 |
| 8899 if (new_map->is_prototype_map()) { | 8901 if (new_map->is_prototype_map()) { |
| 8900 // For prototype maps, the PrototypeInfo is not copied. | 8902 // For prototype maps, the PrototypeInfo is not copied. |
| 8901 DCHECK(memcmp(fresh->address(), new_map->address(), | 8903 DCHECK(memcmp(fresh->address(), new_map->address(), |
| 8902 kTransitionsOrPrototypeInfoOffset) == 0); | 8904 kTransitionsOrPrototypeInfoOffset) == 0); |
| 8903 DCHECK(fresh->raw_transitions() == Smi::FromInt(0)); | 8905 DCHECK(fresh->raw_transitions() == Smi::kZero); |
| 8904 STATIC_ASSERT(kDescriptorsOffset == | 8906 STATIC_ASSERT(kDescriptorsOffset == |
| 8905 kTransitionsOrPrototypeInfoOffset + kPointerSize); | 8907 kTransitionsOrPrototypeInfoOffset + kPointerSize); |
| 8906 DCHECK(memcmp(HeapObject::RawField(*fresh, kDescriptorsOffset), | 8908 DCHECK(memcmp(HeapObject::RawField(*fresh, kDescriptorsOffset), |
| 8907 HeapObject::RawField(*new_map, kDescriptorsOffset), | 8909 HeapObject::RawField(*new_map, kDescriptorsOffset), |
| 8908 kCodeCacheOffset - kDescriptorsOffset) == 0); | 8910 kCodeCacheOffset - kDescriptorsOffset) == 0); |
| 8909 } else { | 8911 } else { |
| 8910 DCHECK(memcmp(fresh->address(), new_map->address(), | 8912 DCHECK(memcmp(fresh->address(), new_map->address(), |
| 8911 Map::kCodeCacheOffset) == 0); | 8913 Map::kCodeCacheOffset) == 0); |
| 8912 } | 8914 } |
| 8913 STATIC_ASSERT(Map::kDependentCodeOffset == | 8915 STATIC_ASSERT(Map::kDependentCodeOffset == |
| (...skipping 1336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10250 DCHECK(initialize_from->Length() <= size); | 10252 DCHECK(initialize_from->Length() <= size); |
| 10251 Handle<FixedArray> raw_source = Handle<FixedArray>::cast(initialize_from); | 10253 Handle<FixedArray> raw_source = Handle<FixedArray>::cast(initialize_from); |
| 10252 // Copy the entries without compacting, since the PrototypeInfo relies on | 10254 // Copy the entries without compacting, since the PrototypeInfo relies on |
| 10253 // the index of the entries not to change. | 10255 // the index of the entries not to change. |
| 10254 while (index < raw_source->length()) { | 10256 while (index < raw_source->length()) { |
| 10255 result->set(index, raw_source->get(index)); | 10257 result->set(index, raw_source->get(index)); |
| 10256 index++; | 10258 index++; |
| 10257 } | 10259 } |
| 10258 } | 10260 } |
| 10259 while (index < result->length()) { | 10261 while (index < result->length()) { |
| 10260 result->set(index, Smi::FromInt(0)); | 10262 result->set(index, Smi::kZero); |
| 10261 index++; | 10263 index++; |
| 10262 } | 10264 } |
| 10263 return Handle<WeakFixedArray>::cast(result); | 10265 return Handle<WeakFixedArray>::cast(result); |
| 10264 } | 10266 } |
| 10265 | 10267 |
| 10266 | 10268 |
| 10267 Handle<ArrayList> ArrayList::Add(Handle<ArrayList> array, Handle<Object> obj, | 10269 Handle<ArrayList> ArrayList::Add(Handle<ArrayList> array, Handle<Object> obj, |
| 10268 AddMode mode) { | 10270 AddMode mode) { |
| 10269 int length = array->Length(); | 10271 int length = array->Length(); |
| 10270 array = EnsureSpace(array, length + 1); | 10272 array = EnsureSpace(array, length + 1); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10373 DCHECK(0 <= number_of_descriptors); | 10375 DCHECK(0 <= number_of_descriptors); |
| 10374 Factory* factory = isolate->factory(); | 10376 Factory* factory = isolate->factory(); |
| 10375 // Do not use DescriptorArray::cast on incomplete object. | 10377 // Do not use DescriptorArray::cast on incomplete object. |
| 10376 int size = number_of_descriptors + slack; | 10378 int size = number_of_descriptors + slack; |
| 10377 if (size == 0) return factory->empty_descriptor_array(); | 10379 if (size == 0) return factory->empty_descriptor_array(); |
| 10378 // Allocate the array of keys. | 10380 // Allocate the array of keys. |
| 10379 Handle<FixedArray> result = | 10381 Handle<FixedArray> result = |
| 10380 factory->NewFixedArray(LengthFor(size), pretenure); | 10382 factory->NewFixedArray(LengthFor(size), pretenure); |
| 10381 | 10383 |
| 10382 result->set(kDescriptorLengthIndex, Smi::FromInt(number_of_descriptors)); | 10384 result->set(kDescriptorLengthIndex, Smi::FromInt(number_of_descriptors)); |
| 10383 result->set(kEnumCacheIndex, Smi::FromInt(0)); | 10385 result->set(kEnumCacheIndex, Smi::kZero); |
| 10384 return Handle<DescriptorArray>::cast(result); | 10386 return Handle<DescriptorArray>::cast(result); |
| 10385 } | 10387 } |
| 10386 | 10388 |
| 10387 | 10389 void DescriptorArray::ClearEnumCache() { set(kEnumCacheIndex, Smi::kZero); } |
| 10388 void DescriptorArray::ClearEnumCache() { | |
| 10389 set(kEnumCacheIndex, Smi::FromInt(0)); | |
| 10390 } | |
| 10391 | |
| 10392 | 10390 |
| 10393 void DescriptorArray::Replace(int index, Descriptor* descriptor) { | 10391 void DescriptorArray::Replace(int index, Descriptor* descriptor) { |
| 10394 descriptor->SetSortedKeyIndex(GetSortedKeyIndex(index)); | 10392 descriptor->SetSortedKeyIndex(GetSortedKeyIndex(index)); |
| 10395 Set(index, descriptor); | 10393 Set(index, descriptor); |
| 10396 } | 10394 } |
| 10397 | 10395 |
| 10398 | 10396 |
| 10399 // static | 10397 // static |
| 10400 void DescriptorArray::SetEnumCache(Handle<DescriptorArray> descriptors, | 10398 void DescriptorArray::SetEnumCache(Handle<DescriptorArray> descriptors, |
| 10401 Isolate* isolate, | 10399 Isolate* isolate, |
| 10402 Handle<FixedArray> new_cache, | 10400 Handle<FixedArray> new_cache, |
| 10403 Handle<FixedArray> new_index_cache) { | 10401 Handle<FixedArray> new_index_cache) { |
| 10404 DCHECK(!descriptors->IsEmpty()); | 10402 DCHECK(!descriptors->IsEmpty()); |
| 10405 FixedArray* bridge_storage; | 10403 FixedArray* bridge_storage; |
| 10406 bool needs_new_enum_cache = !descriptors->HasEnumCache(); | 10404 bool needs_new_enum_cache = !descriptors->HasEnumCache(); |
| 10407 if (needs_new_enum_cache) { | 10405 if (needs_new_enum_cache) { |
| 10408 bridge_storage = *isolate->factory()->NewFixedArray( | 10406 bridge_storage = *isolate->factory()->NewFixedArray( |
| 10409 DescriptorArray::kEnumCacheBridgeLength); | 10407 DescriptorArray::kEnumCacheBridgeLength); |
| 10410 } else { | 10408 } else { |
| 10411 bridge_storage = FixedArray::cast(descriptors->get(kEnumCacheIndex)); | 10409 bridge_storage = FixedArray::cast(descriptors->get(kEnumCacheIndex)); |
| 10412 } | 10410 } |
| 10413 bridge_storage->set(kEnumCacheBridgeCacheIndex, *new_cache); | 10411 bridge_storage->set(kEnumCacheBridgeCacheIndex, *new_cache); |
| 10414 bridge_storage->set(kEnumCacheBridgeIndicesCacheIndex, | 10412 bridge_storage->set( |
| 10415 new_index_cache.is_null() ? Object::cast(Smi::FromInt(0)) | 10413 kEnumCacheBridgeIndicesCacheIndex, |
| 10416 : *new_index_cache); | 10414 new_index_cache.is_null() ? Object::cast(Smi::kZero) : *new_index_cache); |
| 10417 if (needs_new_enum_cache) { | 10415 if (needs_new_enum_cache) { |
| 10418 descriptors->set(kEnumCacheIndex, bridge_storage); | 10416 descriptors->set(kEnumCacheIndex, bridge_storage); |
| 10419 } | 10417 } |
| 10420 } | 10418 } |
| 10421 | 10419 |
| 10422 | 10420 |
| 10423 void DescriptorArray::CopyFrom(int index, DescriptorArray* src) { | 10421 void DescriptorArray::CopyFrom(int index, DescriptorArray* src) { |
| 10424 Object* value = src->GetValue(index); | 10422 Object* value = src->GetValue(index); |
| 10425 PropertyDetails details = src->GetDetails(index); | 10423 PropertyDetails details = src->GetDetails(index); |
| 10426 Descriptor desc(handle(src->GetKey(index)), | 10424 Descriptor desc(handle(src->GetKey(index)), |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10708 | 10706 |
| 10709 // Fast array index case. | 10707 // Fast array index case. |
| 10710 uint32_t index; | 10708 uint32_t index; |
| 10711 if (subject->AsArrayIndex(&index)) { | 10709 if (subject->AsArrayIndex(&index)) { |
| 10712 return isolate->factory()->NewNumberFromUint(index); | 10710 return isolate->factory()->NewNumberFromUint(index); |
| 10713 } | 10711 } |
| 10714 | 10712 |
| 10715 // Fast case: short integer or some sorts of junk values. | 10713 // Fast case: short integer or some sorts of junk values. |
| 10716 if (subject->IsSeqOneByteString()) { | 10714 if (subject->IsSeqOneByteString()) { |
| 10717 int len = subject->length(); | 10715 int len = subject->length(); |
| 10718 if (len == 0) return handle(Smi::FromInt(0), isolate); | 10716 if (len == 0) return handle(Smi::kZero, isolate); |
| 10719 | 10717 |
| 10720 DisallowHeapAllocation no_gc; | 10718 DisallowHeapAllocation no_gc; |
| 10721 uint8_t const* data = Handle<SeqOneByteString>::cast(subject)->GetChars(); | 10719 uint8_t const* data = Handle<SeqOneByteString>::cast(subject)->GetChars(); |
| 10722 bool minus = (data[0] == '-'); | 10720 bool minus = (data[0] == '-'); |
| 10723 int start_pos = (minus ? 1 : 0); | 10721 int start_pos = (minus ? 1 : 0); |
| 10724 | 10722 |
| 10725 if (start_pos == len) { | 10723 if (start_pos == len) { |
| 10726 return isolate->factory()->nan_value(); | 10724 return isolate->factory()->nan_value(); |
| 10727 } else if (data[start_pos] > '9') { | 10725 } else if (data[start_pos] > '9') { |
| 10728 // Fast check for a junk value. A valid string may start from a | 10726 // Fast check for a junk value. A valid string may start from a |
| (...skipping 5797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16526 JSRegExp); | 16524 JSRegExp); |
| 16527 | 16525 |
| 16528 regexp->set_source(*escaped_source); | 16526 regexp->set_source(*escaped_source); |
| 16529 regexp->set_flags(Smi::FromInt(flags)); | 16527 regexp->set_flags(Smi::FromInt(flags)); |
| 16530 | 16528 |
| 16531 Map* map = regexp->map(); | 16529 Map* map = regexp->map(); |
| 16532 Object* constructor = map->GetConstructor(); | 16530 Object* constructor = map->GetConstructor(); |
| 16533 if (constructor->IsJSFunction() && | 16531 if (constructor->IsJSFunction() && |
| 16534 JSFunction::cast(constructor)->initial_map() == map) { | 16532 JSFunction::cast(constructor)->initial_map() == map) { |
| 16535 // If we still have the original map, set in-object properties directly. | 16533 // If we still have the original map, set in-object properties directly. |
| 16536 regexp->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, | 16534 regexp->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, Smi::kZero, |
| 16537 Smi::FromInt(0), SKIP_WRITE_BARRIER); | 16535 SKIP_WRITE_BARRIER); |
| 16538 } else { | 16536 } else { |
| 16539 // Map has changed, so use generic, but slower, method. | 16537 // Map has changed, so use generic, but slower, method. |
| 16540 RETURN_ON_EXCEPTION( | 16538 RETURN_ON_EXCEPTION(isolate, JSReceiver::SetProperty( |
| 16541 isolate, | 16539 regexp, factory->last_index_string(), |
| 16542 JSReceiver::SetProperty(regexp, factory->last_index_string(), | 16540 Handle<Smi>(Smi::kZero, isolate), STRICT), |
| 16543 Handle<Smi>(Smi::FromInt(0), isolate), STRICT), | 16541 JSRegExp); |
| 16544 JSRegExp); | |
| 16545 } | 16542 } |
| 16546 | 16543 |
| 16547 return regexp; | 16544 return regexp; |
| 16548 } | 16545 } |
| 16549 | 16546 |
| 16550 | 16547 |
| 16551 // RegExpKey carries the source and flags of a regular expression as key. | 16548 // RegExpKey carries the source and flags of a regular expression as key. |
| 16552 class RegExpKey : public HashTableKey { | 16549 class RegExpKey : public HashTableKey { |
| 16553 public: | 16550 public: |
| 16554 RegExpKey(Handle<String> string, JSRegExp::Flags flags) | 16551 RegExpKey(Handle<String> string, JSRegExp::Flags flags) |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17250 | 17247 |
| 17251 // Collect holes at the end, undefined before that and the rest at the | 17248 // Collect holes at the end, undefined before that and the rest at the |
| 17252 // start, and return the number of non-hole, non-undefined values. | 17249 // start, and return the number of non-hole, non-undefined values. |
| 17253 | 17250 |
| 17254 Handle<FixedArrayBase> elements_base(object->elements()); | 17251 Handle<FixedArrayBase> elements_base(object->elements()); |
| 17255 uint32_t elements_length = static_cast<uint32_t>(elements_base->length()); | 17252 uint32_t elements_length = static_cast<uint32_t>(elements_base->length()); |
| 17256 if (limit > elements_length) { | 17253 if (limit > elements_length) { |
| 17257 limit = elements_length; | 17254 limit = elements_length; |
| 17258 } | 17255 } |
| 17259 if (limit == 0) { | 17256 if (limit == 0) { |
| 17260 return handle(Smi::FromInt(0), isolate); | 17257 return handle(Smi::kZero, isolate); |
| 17261 } | 17258 } |
| 17262 | 17259 |
| 17263 uint32_t result = 0; | 17260 uint32_t result = 0; |
| 17264 if (elements_base->map() == isolate->heap()->fixed_double_array_map()) { | 17261 if (elements_base->map() == isolate->heap()->fixed_double_array_map()) { |
| 17265 FixedDoubleArray* elements = FixedDoubleArray::cast(*elements_base); | 17262 FixedDoubleArray* elements = FixedDoubleArray::cast(*elements_base); |
| 17266 // Split elements into defined and the_hole, in that order. | 17263 // Split elements into defined and the_hole, in that order. |
| 17267 unsigned int holes = limit; | 17264 unsigned int holes = limit; |
| 17268 // Assume most arrays contain no holes and undefined values, so minimize the | 17265 // Assume most arrays contain no holes and undefined values, so minimize the |
| 17269 // number of stores of non-undefined, non-the-hole values. | 17266 // number of stores of non-undefined, non-the-hole values. |
| 17270 for (unsigned int i = 0; i < holes; i++) { | 17267 for (unsigned int i = 0; i < holes; i++) { |
| (...skipping 1402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18673 | 18670 |
| 18674 template<class Derived, class TableType> | 18671 template<class Derived, class TableType> |
| 18675 Smi* OrderedHashTableIterator<Derived, TableType>::Next(JSArray* value_array) { | 18672 Smi* OrderedHashTableIterator<Derived, TableType>::Next(JSArray* value_array) { |
| 18676 DisallowHeapAllocation no_allocation; | 18673 DisallowHeapAllocation no_allocation; |
| 18677 if (HasMore()) { | 18674 if (HasMore()) { |
| 18678 FixedArray* array = FixedArray::cast(value_array->elements()); | 18675 FixedArray* array = FixedArray::cast(value_array->elements()); |
| 18679 static_cast<Derived*>(this)->PopulateValueArray(array); | 18676 static_cast<Derived*>(this)->PopulateValueArray(array); |
| 18680 MoveNext(); | 18677 MoveNext(); |
| 18681 return Smi::cast(kind()); | 18678 return Smi::cast(kind()); |
| 18682 } | 18679 } |
| 18683 return Smi::FromInt(0); | 18680 return Smi::kZero; |
| 18684 } | 18681 } |
| 18685 | 18682 |
| 18686 | 18683 |
| 18687 template Smi* | 18684 template Smi* |
| 18688 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next( | 18685 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next( |
| 18689 JSArray* value_array); | 18686 JSArray* value_array); |
| 18690 | 18687 |
| 18691 template bool | 18688 template bool |
| 18692 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::HasMore(); | 18689 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::HasMore(); |
| 18693 | 18690 |
| (...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19279 } | 19276 } |
| 19280 | 19277 |
| 19281 Handle<String> src = handle(String::cast(the_script->source()), isolate); | 19278 Handle<String> src = handle(String::cast(the_script->source()), isolate); |
| 19282 return isolate->factory()->NewSubString(src, info.line_start, info.line_end); | 19279 return isolate->factory()->NewSubString(src, info.line_start, info.line_end); |
| 19283 } | 19280 } |
| 19284 | 19281 |
| 19285 void JSArrayBuffer::Neuter() { | 19282 void JSArrayBuffer::Neuter() { |
| 19286 CHECK(is_neuterable()); | 19283 CHECK(is_neuterable()); |
| 19287 CHECK(is_external()); | 19284 CHECK(is_external()); |
| 19288 set_backing_store(NULL); | 19285 set_backing_store(NULL); |
| 19289 set_byte_length(Smi::FromInt(0)); | 19286 set_byte_length(Smi::kZero); |
| 19290 set_was_neutered(true); | 19287 set_was_neutered(true); |
| 19291 } | 19288 } |
| 19292 | 19289 |
| 19293 | 19290 |
| 19294 void JSArrayBuffer::Setup(Handle<JSArrayBuffer> array_buffer, Isolate* isolate, | 19291 void JSArrayBuffer::Setup(Handle<JSArrayBuffer> array_buffer, Isolate* isolate, |
| 19295 bool is_external, void* data, size_t allocated_length, | 19292 bool is_external, void* data, size_t allocated_length, |
| 19296 SharedFlag shared) { | 19293 SharedFlag shared) { |
| 19297 DCHECK(array_buffer->GetInternalFieldCount() == | 19294 DCHECK(array_buffer->GetInternalFieldCount() == |
| 19298 v8::ArrayBuffer::kInternalFieldCount); | 19295 v8::ArrayBuffer::kInternalFieldCount); |
| 19299 for (int i = 0; i < v8::ArrayBuffer::kInternalFieldCount; i++) { | 19296 for (int i = 0; i < v8::ArrayBuffer::kInternalFieldCount; i++) { |
| 19300 array_buffer->SetInternalField(i, Smi::FromInt(0)); | 19297 array_buffer->SetInternalField(i, Smi::kZero); |
| 19301 } | 19298 } |
| 19302 array_buffer->set_bit_field(0); | 19299 array_buffer->set_bit_field(0); |
| 19303 array_buffer->set_is_external(is_external); | 19300 array_buffer->set_is_external(is_external); |
| 19304 array_buffer->set_is_neuterable(shared == SharedFlag::kNotShared); | 19301 array_buffer->set_is_neuterable(shared == SharedFlag::kNotShared); |
| 19305 array_buffer->set_is_shared(shared == SharedFlag::kShared); | 19302 array_buffer->set_is_shared(shared == SharedFlag::kShared); |
| 19306 | 19303 |
| 19307 Handle<Object> byte_length = | 19304 Handle<Object> byte_length = |
| 19308 isolate->factory()->NewNumberFromSize(allocated_length); | 19305 isolate->factory()->NewNumberFromSize(allocated_length); |
| 19309 CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber()); | 19306 CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber()); |
| 19310 array_buffer->set_byte_length(*byte_length); | 19307 array_buffer->set_byte_length(*byte_length); |
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19933 } | 19930 } |
| 19934 | 19931 |
| 19935 // Evaluation of module body. | 19932 // Evaluation of module body. |
| 19936 Handle<JSFunction> resume( | 19933 Handle<JSFunction> resume( |
| 19937 isolate->native_context()->generator_next_internal(), isolate); | 19934 isolate->native_context()->generator_next_internal(), isolate); |
| 19938 return Execution::Call(isolate, resume, generator, 0, nullptr); | 19935 return Execution::Call(isolate, resume, generator, 0, nullptr); |
| 19939 } | 19936 } |
| 19940 | 19937 |
| 19941 } // namespace internal | 19938 } // namespace internal |
| 19942 } // namespace v8 | 19939 } // namespace v8 |
| OLD | NEW |