| 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 8154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8165 return true; | 8165 return true; |
| 8166 } | 8166 } |
| 8167 return object->elements()->length() > 0; | 8167 return object->elements()->length() > 0; |
| 8168 case NO_ELEMENTS: | 8168 case NO_ELEMENTS: |
| 8169 return false; | 8169 return false; |
| 8170 } | 8170 } |
| 8171 UNREACHABLE(); | 8171 UNREACHABLE(); |
| 8172 return true; | 8172 return true; |
| 8173 } | 8173 } |
| 8174 | 8174 |
| 8175 // Tests for the fast common case for property enumeration: | |
| 8176 // - This object and all prototypes has an enum cache (which means that | |
| 8177 // it is no proxy, has no interceptors and needs no access checks). | |
| 8178 // - This object has no elements. | |
| 8179 // - No prototype has enumerable properties/elements. | |
| 8180 bool JSReceiver::IsSimpleEnum() { | |
| 8181 for (PrototypeIterator iter(GetIsolate(), this, | |
| 8182 PrototypeIterator::START_AT_RECEIVER); | |
| 8183 !iter.IsAtEnd(); iter.Advance()) { | |
| 8184 if (!iter.GetCurrent()->IsJSObject()) return false; | |
| 8185 JSObject* current = iter.GetCurrent<JSObject>(); | |
| 8186 int enum_length = current->map()->EnumLength(); | |
| 8187 if (enum_length == kInvalidEnumCacheSentinel) return false; | |
| 8188 if (current->IsAccessCheckNeeded()) return false; | |
| 8189 DCHECK(!current->HasNamedInterceptor()); | |
| 8190 DCHECK(!current->HasIndexedInterceptor()); | |
| 8191 if (current->HasEnumerableElements()) return false; | |
| 8192 if (current != this && enum_length != 0) return false; | |
| 8193 } | |
| 8194 return true; | |
| 8195 } | |
| 8196 | |
| 8197 | 8175 |
| 8198 int Map::NumberOfDescribedProperties(DescriptorFlag which, | 8176 int Map::NumberOfDescribedProperties(DescriptorFlag which, |
| 8199 PropertyFilter filter) { | 8177 PropertyFilter filter) { |
| 8200 int result = 0; | 8178 int result = 0; |
| 8201 DescriptorArray* descs = instance_descriptors(); | 8179 DescriptorArray* descs = instance_descriptors(); |
| 8202 int limit = which == ALL_DESCRIPTORS | 8180 int limit = which == ALL_DESCRIPTORS |
| 8203 ? descs->number_of_descriptors() | 8181 ? descs->number_of_descriptors() |
| 8204 : NumberOfOwnDescriptors(); | 8182 : NumberOfOwnDescriptors(); |
| 8205 for (int i = 0; i < limit; i++) { | 8183 for (int i = 0; i < limit; i++) { |
| 8206 if ((descs->GetDetails(i).attributes() & filter) == 0 && | 8184 if ((descs->GetDetails(i).attributes() & filter) == 0 && |
| (...skipping 2478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10685 } | 10663 } |
| 10686 case kConsStringTag: | 10664 case kConsStringTag: |
| 10687 UNREACHABLE(); | 10665 UNREACHABLE(); |
| 10688 return NULL; | 10666 return NULL; |
| 10689 } | 10667 } |
| 10690 UNREACHABLE(); | 10668 UNREACHABLE(); |
| 10691 return NULL; | 10669 return NULL; |
| 10692 } | 10670 } |
| 10693 | 10671 |
| 10694 | 10672 |
| 10695 base::SmartArrayPointer<uc16> String::ToWideCString( | |
| 10696 RobustnessFlag robust_flag) { | |
| 10697 if (robust_flag == ROBUST_STRING_TRAVERSAL && !LooksValid()) { | |
| 10698 return base::SmartArrayPointer<uc16>(); | |
| 10699 } | |
| 10700 StringCharacterStream stream(this); | |
| 10701 | |
| 10702 uc16* result = NewArray<uc16>(length() + 1); | |
| 10703 | |
| 10704 int i = 0; | |
| 10705 while (stream.HasMore()) { | |
| 10706 uint16_t character = stream.GetNext(); | |
| 10707 result[i++] = character; | |
| 10708 } | |
| 10709 result[i] = 0; | |
| 10710 return base::SmartArrayPointer<uc16>(result); | |
| 10711 } | |
| 10712 | |
| 10713 | |
| 10714 const uc16* SeqTwoByteString::SeqTwoByteStringGetData(unsigned start) { | 10673 const uc16* SeqTwoByteString::SeqTwoByteStringGetData(unsigned start) { |
| 10715 return reinterpret_cast<uc16*>( | 10674 return reinterpret_cast<uc16*>( |
| 10716 reinterpret_cast<char*>(this) - kHeapObjectTag + kHeaderSize) + start; | 10675 reinterpret_cast<char*>(this) - kHeapObjectTag + kHeaderSize) + start; |
| 10717 } | 10676 } |
| 10718 | 10677 |
| 10719 | 10678 |
| 10720 void Relocatable::PostGarbageCollectionProcessing(Isolate* isolate) { | 10679 void Relocatable::PostGarbageCollectionProcessing(Isolate* isolate) { |
| 10721 Relocatable* current = isolate->relocatable_top(); | 10680 Relocatable* current = isolate->relocatable_top(); |
| 10722 while (current != NULL) { | 10681 while (current != NULL) { |
| 10723 current->PostGarbageCollection(); | 10682 current->PostGarbageCollection(); |
| (...skipping 5226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15950 Isolate* isolate = pattern->GetIsolate(); | 15909 Isolate* isolate = pattern->GetIsolate(); |
| 15951 Handle<JSFunction> constructor = isolate->regexp_function(); | 15910 Handle<JSFunction> constructor = isolate->regexp_function(); |
| 15952 Handle<JSRegExp> regexp = | 15911 Handle<JSRegExp> regexp = |
| 15953 Handle<JSRegExp>::cast(isolate->factory()->NewJSObject(constructor)); | 15912 Handle<JSRegExp>::cast(isolate->factory()->NewJSObject(constructor)); |
| 15954 | 15913 |
| 15955 return JSRegExp::Initialize(regexp, pattern, flags); | 15914 return JSRegExp::Initialize(regexp, pattern, flags); |
| 15956 } | 15915 } |
| 15957 | 15916 |
| 15958 | 15917 |
| 15959 // static | 15918 // static |
| 15960 MaybeHandle<JSRegExp> JSRegExp::New(Handle<String> pattern, | |
| 15961 Handle<String> flags_string) { | |
| 15962 Isolate* isolate = pattern->GetIsolate(); | |
| 15963 bool success = false; | |
| 15964 Flags flags = RegExpFlagsFromString(flags_string, &success); | |
| 15965 if (!success) { | |
| 15966 THROW_NEW_ERROR( | |
| 15967 isolate, | |
| 15968 NewSyntaxError(MessageTemplate::kInvalidRegExpFlags, flags_string), | |
| 15969 JSRegExp); | |
| 15970 } | |
| 15971 return New(pattern, flags); | |
| 15972 } | |
| 15973 | |
| 15974 | |
| 15975 // static | |
| 15976 Handle<JSRegExp> JSRegExp::Copy(Handle<JSRegExp> regexp) { | 15919 Handle<JSRegExp> JSRegExp::Copy(Handle<JSRegExp> regexp) { |
| 15977 Isolate* const isolate = regexp->GetIsolate(); | 15920 Isolate* const isolate = regexp->GetIsolate(); |
| 15978 return Handle<JSRegExp>::cast(isolate->factory()->CopyJSObject(regexp)); | 15921 return Handle<JSRegExp>::cast(isolate->factory()->CopyJSObject(regexp)); |
| 15979 } | 15922 } |
| 15980 | 15923 |
| 15981 | 15924 |
| 15982 template <typename Char> | 15925 template <typename Char> |
| 15983 inline int CountRequiredEscapes(Handle<String> source) { | 15926 inline int CountRequiredEscapes(Handle<String> source) { |
| 15984 DisallowHeapAllocation no_gc; | 15927 DisallowHeapAllocation no_gc; |
| 15985 int escapes = 0; | 15928 int escapes = 0; |
| (...skipping 2903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18889 if (cell->value() != *new_value) { | 18832 if (cell->value() != *new_value) { |
| 18890 cell->set_value(*new_value); | 18833 cell->set_value(*new_value); |
| 18891 Isolate* isolate = cell->GetIsolate(); | 18834 Isolate* isolate = cell->GetIsolate(); |
| 18892 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18835 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 18893 isolate, DependentCode::kPropertyCellChangedGroup); | 18836 isolate, DependentCode::kPropertyCellChangedGroup); |
| 18894 } | 18837 } |
| 18895 } | 18838 } |
| 18896 | 18839 |
| 18897 } // namespace internal | 18840 } // namespace internal |
| 18898 } // namespace v8 | 18841 } // namespace v8 |
| OLD | NEW |