Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(679)

Side by Side Diff: src/objects.cc

Issue 2521043005: [elements] Add CreateFromArrayLike fast-path for JS_ARRAY_TYPE (Closed)
Patch Set: merge with master Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/elements.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 840 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 return isolate->factory()->undefined_value(); 851 return isolate->factory()->undefined_value();
852 } 852 }
853 if (!func->IsCallable()) { 853 if (!func->IsCallable()) {
854 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kPropertyNotFunction, 854 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kPropertyNotFunction,
855 func, name, receiver), 855 func, name, receiver),
856 Object); 856 Object);
857 } 857 }
858 return func; 858 return func;
859 } 859 }
860 860
861 namespace {
862 MaybeHandle<FixedArray> CreateListFromArrayLikeFastPath(
863 Isolate* isolate, Handle<Object> object, ElementTypes element_types) {
864 if (element_types != ElementTypes::kAll || !object->IsJSArray()) {
865 return MaybeHandle<FixedArray>();
866 }
867 Handle<JSArray> array = Handle<JSArray>::cast(object);
868 uint32_t length;
869 if (!array->HasArrayPrototype(isolate) ||
870 !array->length()->ToUint32(&length) || !array->HasFastElements() ||
871 !JSObject::PrototypeHasNoElements(isolate, *array)) {
872 return MaybeHandle<FixedArray>();
873 }
874 return array->GetElementsAccessor()->CreateListFromArray(isolate, array);
875 }
876 } // namespace
861 877
862 // static 878 // static
863 MaybeHandle<FixedArray> Object::CreateListFromArrayLike( 879 MaybeHandle<FixedArray> Object::CreateListFromArrayLike(
864 Isolate* isolate, Handle<Object> object, ElementTypes element_types) { 880 Isolate* isolate, Handle<Object> object, ElementTypes element_types) {
881 // Fast-path for JS_ARRAY_TYPE.
882 MaybeHandle<FixedArray> fast_result =
883 CreateListFromArrayLikeFastPath(isolate, object, element_types);
884 if (!fast_result.is_null()) return fast_result;
865 // 1. ReturnIfAbrupt(object). 885 // 1. ReturnIfAbrupt(object).
866 // 2. (default elementTypes -- not applicable.) 886 // 2. (default elementTypes -- not applicable.)
867 // 3. If Type(obj) is not Object, throw a TypeError exception. 887 // 3. If Type(obj) is not Object, throw a TypeError exception.
868 if (!object->IsJSReceiver()) { 888 if (!object->IsJSReceiver()) {
869 THROW_NEW_ERROR(isolate, 889 THROW_NEW_ERROR(isolate,
870 NewTypeError(MessageTemplate::kCalledOnNonObject, 890 NewTypeError(MessageTemplate::kCalledOnNonObject,
871 isolate->factory()->NewStringFromAsciiChecked( 891 isolate->factory()->NewStringFromAsciiChecked(
872 "CreateListFromArrayLike")), 892 "CreateListFromArrayLike")),
873 FixedArray); 893 FixedArray);
874 } 894 }
895
875 // 4. Let len be ? ToLength(? Get(obj, "length")). 896 // 4. Let len be ? ToLength(? Get(obj, "length")).
876 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object); 897 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
877 Handle<Object> raw_length_number; 898 Handle<Object> raw_length_number;
878 ASSIGN_RETURN_ON_EXCEPTION(isolate, raw_length_number, 899 ASSIGN_RETURN_ON_EXCEPTION(isolate, raw_length_number,
879 Object::GetLengthFromArrayLike(isolate, receiver), 900 Object::GetLengthFromArrayLike(isolate, receiver),
880 FixedArray); 901 FixedArray);
881 uint32_t len; 902 uint32_t len;
882 if (!raw_length_number->ToUint32(&len) || 903 if (!raw_length_number->ToUint32(&len) ||
883 len > static_cast<uint32_t>(FixedArray::kMaxLength)) { 904 len > static_cast<uint32_t>(FixedArray::kMaxLength)) {
884 THROW_NEW_ERROR(isolate, 905 THROW_NEW_ERROR(isolate,
(...skipping 19533 matching lines...) Expand 10 before | Expand all | Expand 10 after
20418 // depend on this. 20439 // depend on this.
20419 return DICTIONARY_ELEMENTS; 20440 return DICTIONARY_ELEMENTS;
20420 } 20441 }
20421 DCHECK_LE(kind, LAST_ELEMENTS_KIND); 20442 DCHECK_LE(kind, LAST_ELEMENTS_KIND);
20422 return kind; 20443 return kind;
20423 } 20444 }
20424 } 20445 }
20425 20446
20426 } // namespace internal 20447 } // namespace internal
20427 } // namespace v8 20448 } // namespace v8
OLDNEW
« no previous file with comments | « src/elements.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698