Commit db5affec authored by Dan Elphick's avatar Dan Elphick Committed by Commit Bot

[builtins] Add typing to o() and len() in array builtins

Make BuiltinsArrayAssembler::o() and len() into TNode<JSReceiver> and
TNode<Number> respectively.

Also adds typing to CodeStubAssembler::ToLength_Inline.

Fixes a type error in ArraySpeciesCreate which needs to take a Number rather
than a Smi.

Bug: v8:7310
Change-Id: Ie01d58ba195bddfe58ac7e4a31272c8f1a14c6ce
Reviewed-on: https://chromium-review.googlesource.com/934821
Commit-Queue: Dan Elphick <delphick@chromium.org>
Reviewed-by: 's avatarPeter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#51761}
parent 4f18484b
...@@ -214,8 +214,9 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -214,8 +214,9 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
CSA_ASSERT(this, CSA_ASSERT(this,
SmiLessThanOrEqual( SmiLessThanOrEqual(
len_, LoadObjectField(a, JSTypedArray::kLengthOffset))); len_, LoadObjectField(a, JSTypedArray::kLengthOffset)));
fast_typed_array_target_ = Word32Equal(LoadInstanceType(LoadElements(o_)), fast_typed_array_target_ =
LoadInstanceType(LoadElements(a))); Word32Equal(LoadInstanceType(LoadElements(original_array)),
LoadInstanceType(LoadElements(a)));
a_.Bind(a); a_.Bind(a);
} }
...@@ -413,15 +414,15 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -413,15 +414,15 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
// 3. Let len be ToLength(Get(O, "length")). // 3. Let len be ToLength(Get(O, "length")).
// 4. ReturnIfAbrupt(len). // 4. ReturnIfAbrupt(len).
VARIABLE(merged_length, MachineRepresentation::kTagged); TVARIABLE(Number, merged_length);
Label has_length(this, &merged_length), not_js_array(this); Label has_length(this, &merged_length), not_js_array(this);
GotoIf(DoesntHaveInstanceType(o(), JS_ARRAY_TYPE), &not_js_array); GotoIf(DoesntHaveInstanceType(o(), JS_ARRAY_TYPE), &not_js_array);
merged_length.Bind(LoadJSArrayLength(o())); merged_length = LoadJSArrayLength(CAST(o()));
Goto(&has_length); Goto(&has_length);
BIND(&not_js_array); BIND(&not_js_array);
Node* len_property = Node* len_property =
GetProperty(context(), o(), isolate()->factory()->length_string()); GetProperty(context(), o(), isolate()->factory()->length_string());
merged_length.Bind(ToLength_Inline(context(), len_property)); merged_length = ToLength_Inline(context(), len_property);
Goto(&has_length); Goto(&has_length);
BIND(&has_length); BIND(&has_length);
len_ = merged_length.value(); len_ = merged_length.value();
...@@ -466,7 +467,8 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -466,7 +467,8 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
void ArrayBuiltinsAssembler::InitIteratingArrayBuiltinLoopContinuation( void ArrayBuiltinsAssembler::InitIteratingArrayBuiltinLoopContinuation(
TNode<Context> context, TNode<Object> receiver, Node* callbackfn, TNode<Context> context, TNode<Object> receiver, Node* callbackfn,
Node* this_arg, Node* a, Node* o, Node* initial_k, Node* len, Node* to) { Node* this_arg, Node* a, TNode<JSReceiver> o, Node* initial_k,
TNode<Number> len, Node* to) {
context_ = context; context_ = context;
this_arg_ = this_arg; this_arg_ = this_arg;
callbackfn_ = callbackfn; callbackfn_ = callbackfn;
...@@ -492,11 +494,14 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -492,11 +494,14 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
GotoIfNot(HasInstanceType(CAST(receiver_), JS_TYPED_ARRAY_TYPE), GotoIfNot(HasInstanceType(CAST(receiver_), JS_TYPED_ARRAY_TYPE),
&throw_not_typed_array); &throw_not_typed_array);
o_ = receiver_; TNode<JSTypedArray> typed_array = CAST(receiver_);
Node* array_buffer = LoadObjectField(o_, JSTypedArray::kBufferOffset); o_ = typed_array;
Node* array_buffer =
LoadObjectField(typed_array, JSTypedArray::kBufferOffset);
GotoIf(IsDetachedBuffer(array_buffer), &throw_detached); GotoIf(IsDetachedBuffer(array_buffer), &throw_detached);
len_ = LoadObjectField(o_, JSTypedArray::kLengthOffset); len_ = LoadObjectField<Smi>(typed_array, JSTypedArray::kLengthOffset);
Label throw_not_callable(this, Label::kDeferred); Label throw_not_callable(this, Label::kDeferred);
Label distinguish_types(this); Label distinguish_types(this);
...@@ -540,7 +545,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -540,7 +545,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
} else { } else {
k_.Bind(NumberDec(len())); k_.Bind(NumberDec(len()));
} }
Node* instance_type = LoadInstanceType(LoadElements(o_)); Node* instance_type = LoadInstanceType(LoadElements(typed_array));
Switch(instance_type, &unexpected_instance_type, instance_types.data(), Switch(instance_type, &unexpected_instance_type, instance_types.data(),
label_ptrs.data(), labels.size()); label_ptrs.data(), labels.size());
...@@ -552,7 +557,8 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -552,7 +557,8 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
// TODO(tebbi): Silently cancelling the loop on buffer detachment is a // TODO(tebbi): Silently cancelling the loop on buffer detachment is a
// spec violation. Should go to &throw_detached and throw a TypeError // spec violation. Should go to &throw_detached and throw a TypeError
// instead. // instead.
VisitAllTypedArrayElements(array_buffer, processor, &done, direction); VisitAllTypedArrayElements(array_buffer, processor, &done, direction,
typed_array);
Goto(&done); Goto(&done);
// No exception, return success // No exception, return success
BIND(&done); BIND(&done);
...@@ -638,12 +644,12 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -638,12 +644,12 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
void ArrayBuiltinsAssembler::VisitAllTypedArrayElements( void ArrayBuiltinsAssembler::VisitAllTypedArrayElements(
Node* array_buffer, const CallResultProcessor& processor, Label* detached, Node* array_buffer, const CallResultProcessor& processor, Label* detached,
ForEachDirection direction) { ForEachDirection direction, TNode<JSTypedArray> typed_array) {
VariableList list({&a_, &k_, &to_}, zone()); VariableList list({&a_, &k_, &to_}, zone());
FastLoopBody body = [&](Node* index) { FastLoopBody body = [&](Node* index) {
GotoIf(IsDetachedBuffer(array_buffer), detached); GotoIf(IsDetachedBuffer(array_buffer), detached);
Node* elements = LoadElements(o_); Node* elements = LoadElements(typed_array);
Node* base_ptr = Node* base_ptr =
LoadObjectField(elements, FixedTypedArrayBase::kBasePointerOffset); LoadObjectField(elements, FixedTypedArrayBase::kBasePointerOffset);
Node* external_ptr = Node* external_ptr =
...@@ -671,13 +677,13 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -671,13 +677,13 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
void ArrayBuiltinsAssembler::VisitAllFastElementsOneKind( void ArrayBuiltinsAssembler::VisitAllFastElementsOneKind(
ElementsKind kind, const CallResultProcessor& processor, ElementsKind kind, const CallResultProcessor& processor,
Label* array_changed, ParameterMode mode, ForEachDirection direction, Label* array_changed, ParameterMode mode, ForEachDirection direction,
MissingPropertyMode missing_property_mode) { MissingPropertyMode missing_property_mode, TNode<Smi> length) {
Comment("begin VisitAllFastElementsOneKind"); Comment("begin VisitAllFastElementsOneKind");
VARIABLE(original_map, MachineRepresentation::kTagged); VARIABLE(original_map, MachineRepresentation::kTagged);
original_map.Bind(LoadMap(o())); original_map.Bind(LoadMap(o()));
VariableList list({&original_map, &a_, &k_, &to_}, zone()); VariableList list({&original_map, &a_, &k_, &to_}, zone());
Node* start = IntPtrOrSmiConstant(0, mode); Node* start = IntPtrOrSmiConstant(0, mode);
Node* end = TaggedToParameter(len(), mode); Node* end = TaggedToParameter(length, mode);
IndexAdvanceMode advance_mode = direction == ForEachDirection::kReverse IndexAdvanceMode advance_mode = direction == ForEachDirection::kReverse
? IndexAdvanceMode::kPre ? IndexAdvanceMode::kPre
: IndexAdvanceMode::kPost; : IndexAdvanceMode::kPost;
...@@ -695,13 +701,14 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -695,13 +701,14 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
Node* o_map = LoadMap(o()); Node* o_map = LoadMap(o());
GotoIf(WordNotEqual(o_map, original_map.value()), array_changed); GotoIf(WordNotEqual(o_map, original_map.value()), array_changed);
TNode<JSArray> o_array = CAST(o());
// Check if o's length has changed during the callback and if the // Check if o's length has changed during the callback and if the
// index is now out of range of the new length. // index is now out of range of the new length.
GotoIf(SmiGreaterThanOrEqual(k_.value(), LoadJSArrayLength(o())), GotoIf(SmiGreaterThanOrEqual(k_.value(), LoadJSArrayLength(o_array)),
array_changed); array_changed);
// Re-load the elements array. If may have been resized. // Re-load the elements array. If may have been resized.
Node* elements = LoadElements(o()); Node* elements = LoadElements(o_array);
// Fast case: load the element directly from the elements FixedArray // Fast case: load the element directly from the elements FixedArray
// and call the callback if the element is not the hole. // and call the callback if the element is not the hole.
...@@ -757,6 +764,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -757,6 +764,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
&switch_on_elements_kind, slow); &switch_on_elements_kind, slow);
BIND(&switch_on_elements_kind); BIND(&switch_on_elements_kind);
TNode<Smi> smi_len = CAST(len());
// Select by ElementsKind // Select by ElementsKind
Node* o_map = LoadMap(o()); Node* o_map = LoadMap(o());
Node* bit_field2 = LoadMapBitField2(o_map); Node* bit_field2 = LoadMapBitField2(o_map);
...@@ -768,7 +776,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -768,7 +776,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
BIND(&fast_elements); BIND(&fast_elements);
{ {
VisitAllFastElementsOneKind(PACKED_ELEMENTS, processor, slow, mode, VisitAllFastElementsOneKind(PACKED_ELEMENTS, processor, slow, mode,
direction, missing_property_mode); direction, missing_property_mode, smi_len);
action(this); action(this);
...@@ -783,7 +791,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -783,7 +791,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
BIND(&fast_double_elements); BIND(&fast_double_elements);
{ {
VisitAllFastElementsOneKind(PACKED_DOUBLE_ELEMENTS, processor, slow, mode, VisitAllFastElementsOneKind(PACKED_DOUBLE_ELEMENTS, processor, slow, mode,
direction, missing_property_mode); direction, missing_property_mode, smi_len);
action(this); action(this);
...@@ -841,8 +849,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { ...@@ -841,8 +849,7 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) {
} }
// Perform ArraySpeciesCreate (ES6 #sec-arrayspeciescreate). // Perform ArraySpeciesCreate (ES6 #sec-arrayspeciescreate).
void ArrayBuiltinsAssembler::GenerateArraySpeciesCreate( void ArrayBuiltinsAssembler::GenerateArraySpeciesCreate(TNode<Number> len) {
SloppyTNode<Smi> len) {
Label runtime(this, Label::kDeferred), done(this); Label runtime(this, Label::kDeferred), done(this);
Node* const original_map = LoadMap(o()); Node* const original_map = LoadMap(o());
...@@ -1647,9 +1654,9 @@ TF_BUILTIN(ArrayFindLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -1647,9 +1654,9 @@ TF_BUILTIN(ArrayFindLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -1670,7 +1677,7 @@ TF_BUILTIN(ArrayFindLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -1670,7 +1677,7 @@ TF_BUILTIN(ArrayFindLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayFindLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayFindLoopContinuation, context, receiver,
callbackfn, this_arg, UndefinedConstant(), receiver, callbackfn, this_arg, UndefinedConstant(), receiver,
...@@ -1685,7 +1692,7 @@ TF_BUILTIN(ArrayFindLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -1685,7 +1692,7 @@ TF_BUILTIN(ArrayFindLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayFindLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayFindLoopContinuation, context, receiver,
callbackfn, this_arg, UndefinedConstant(), receiver, callbackfn, this_arg, UndefinedConstant(), receiver,
...@@ -1702,7 +1709,7 @@ TF_BUILTIN(ArrayFindLoopAfterCallbackLazyDeoptContinuation, ...@@ -1702,7 +1709,7 @@ TF_BUILTIN(ArrayFindLoopAfterCallbackLazyDeoptContinuation,
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* found_value = Parameter(Descriptor::kFoundValue); Node* found_value = Parameter(Descriptor::kFoundValue);
Node* is_found = Parameter(Descriptor::kIsFound); Node* is_found = Parameter(Descriptor::kIsFound);
...@@ -1748,9 +1755,9 @@ TF_BUILTIN(ArrayFindIndexLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -1748,9 +1755,9 @@ TF_BUILTIN(ArrayFindIndexLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -1769,7 +1776,7 @@ TF_BUILTIN(ArrayFindIndexLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -1769,7 +1776,7 @@ TF_BUILTIN(ArrayFindIndexLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayFindIndexLoopContinuation, context, Return(CallBuiltin(Builtins::kArrayFindIndexLoopContinuation, context,
receiver, callbackfn, this_arg, SmiConstant(-1), receiver, receiver, callbackfn, this_arg, SmiConstant(-1), receiver,
...@@ -1782,7 +1789,7 @@ TF_BUILTIN(ArrayFindIndexLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -1782,7 +1789,7 @@ TF_BUILTIN(ArrayFindIndexLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayFindIndexLoopContinuation, context, Return(CallBuiltin(Builtins::kArrayFindIndexLoopContinuation, context,
receiver, callbackfn, this_arg, SmiConstant(-1), receiver, receiver, callbackfn, this_arg, SmiConstant(-1), receiver,
...@@ -1796,7 +1803,7 @@ TF_BUILTIN(ArrayFindIndexLoopAfterCallbackLazyDeoptContinuation, ...@@ -1796,7 +1803,7 @@ TF_BUILTIN(ArrayFindIndexLoopAfterCallbackLazyDeoptContinuation,
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* found_value = Parameter(Descriptor::kFoundValue); Node* found_value = Parameter(Descriptor::kFoundValue);
Node* is_found = Parameter(Descriptor::kIsFound); Node* is_found = Parameter(Descriptor::kIsFound);
...@@ -2131,8 +2138,8 @@ TF_BUILTIN(ArrayFrom, ArrayPopulatorAssembler) { ...@@ -2131,8 +2138,8 @@ TF_BUILTIN(ArrayFrom, ArrayPopulatorAssembler) {
CSA_ASSERT(this, Word32BinaryNot(IsFastJSArray(array_like, context))); CSA_ASSERT(this, Word32BinaryNot(IsFastJSArray(array_like, context)));
// Treat array_like as an array and try to get its length. // Treat array_like as an array and try to get its length.
length = CAST(ToLength_Inline( length = ToLength_Inline(
context, GetProperty(context, array_like, factory()->length_string()))); context, GetProperty(context, array_like, factory()->length_string()));
// Construct an array using the receiver as constructor with the same length // Construct an array using the receiver as constructor with the same length
// as the input array. // as the input array.
...@@ -2254,9 +2261,9 @@ TF_BUILTIN(ArrayForEachLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -2254,9 +2261,9 @@ TF_BUILTIN(ArrayForEachLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -2274,7 +2281,7 @@ TF_BUILTIN(ArrayForEachLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2274,7 +2281,7 @@ TF_BUILTIN(ArrayForEachLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayForEachLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayForEachLoopContinuation, context, receiver,
callbackfn, this_arg, UndefinedConstant(), receiver, callbackfn, this_arg, UndefinedConstant(), receiver,
...@@ -2287,7 +2294,7 @@ TF_BUILTIN(ArrayForEachLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2287,7 +2294,7 @@ TF_BUILTIN(ArrayForEachLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayForEachLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayForEachLoopContinuation, context, receiver,
callbackfn, this_arg, UndefinedConstant(), receiver, callbackfn, this_arg, UndefinedConstant(), receiver,
...@@ -2342,7 +2349,7 @@ TF_BUILTIN(ArraySomeLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2342,7 +2349,7 @@ TF_BUILTIN(ArraySomeLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* result = Parameter(Descriptor::kResult); Node* result = Parameter(Descriptor::kResult);
// This custom lazy deopt point is right after the callback. every() needs // This custom lazy deopt point is right after the callback. every() needs
...@@ -2371,7 +2378,7 @@ TF_BUILTIN(ArraySomeLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2371,7 +2378,7 @@ TF_BUILTIN(ArraySomeLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArraySomeLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArraySomeLoopContinuation, context, receiver,
callbackfn, this_arg, FalseConstant(), receiver, initial_k, callbackfn, this_arg, FalseConstant(), receiver, initial_k,
...@@ -2384,9 +2391,9 @@ TF_BUILTIN(ArraySomeLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -2384,9 +2391,9 @@ TF_BUILTIN(ArraySomeLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -2445,7 +2452,7 @@ TF_BUILTIN(ArrayEveryLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2445,7 +2452,7 @@ TF_BUILTIN(ArrayEveryLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* result = Parameter(Descriptor::kResult); Node* result = Parameter(Descriptor::kResult);
// This custom lazy deopt point is right after the callback. every() needs // This custom lazy deopt point is right after the callback. every() needs
...@@ -2474,7 +2481,7 @@ TF_BUILTIN(ArrayEveryLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2474,7 +2481,7 @@ TF_BUILTIN(ArrayEveryLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayEveryLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayEveryLoopContinuation, context, receiver,
callbackfn, this_arg, TrueConstant(), receiver, initial_k, callbackfn, this_arg, TrueConstant(), receiver, initial_k,
...@@ -2487,9 +2494,9 @@ TF_BUILTIN(ArrayEveryLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -2487,9 +2494,9 @@ TF_BUILTIN(ArrayEveryLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -2548,9 +2555,9 @@ TF_BUILTIN(ArrayReduceLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -2548,9 +2555,9 @@ TF_BUILTIN(ArrayReduceLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* accumulator = Parameter(Descriptor::kAccumulator); Node* accumulator = Parameter(Descriptor::kAccumulator);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -2567,7 +2574,7 @@ TF_BUILTIN(ArrayReducePreLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2567,7 +2574,7 @@ TF_BUILTIN(ArrayReducePreLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
TNode<Context> context = CAST(Parameter(Descriptor::kContext)); TNode<Context> context = CAST(Parameter(Descriptor::kContext));
TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver)); TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver));
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
// Simulate starting the loop at 0, but ensuring that the accumulator is // Simulate starting the loop at 0, but ensuring that the accumulator is
// the hole. The continuation stub will search for the initial non-hole // the hole. The continuation stub will search for the initial non-hole
...@@ -2583,7 +2590,7 @@ TF_BUILTIN(ArrayReduceLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2583,7 +2590,7 @@ TF_BUILTIN(ArrayReduceLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* accumulator = Parameter(Descriptor::kAccumulator); Node* accumulator = Parameter(Descriptor::kAccumulator);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayReduceLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayReduceLoopContinuation, context, receiver,
callbackfn, UndefinedConstant(), accumulator, receiver, callbackfn, UndefinedConstant(), accumulator, receiver,
...@@ -2595,7 +2602,7 @@ TF_BUILTIN(ArrayReduceLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2595,7 +2602,7 @@ TF_BUILTIN(ArrayReduceLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver)); TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver));
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* result = Parameter(Descriptor::kResult); Node* result = Parameter(Descriptor::kResult);
Return(CallBuiltin(Builtins::kArrayReduceLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayReduceLoopContinuation, context, receiver,
...@@ -2650,9 +2657,9 @@ TF_BUILTIN(ArrayReduceRightLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -2650,9 +2657,9 @@ TF_BUILTIN(ArrayReduceRightLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* accumulator = Parameter(Descriptor::kAccumulator); Node* accumulator = Parameter(Descriptor::kAccumulator);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -2670,7 +2677,7 @@ TF_BUILTIN(ArrayReduceRightPreLoopEagerDeoptContinuation, ...@@ -2670,7 +2677,7 @@ TF_BUILTIN(ArrayReduceRightPreLoopEagerDeoptContinuation,
TNode<Context> context = CAST(Parameter(Descriptor::kContext)); TNode<Context> context = CAST(Parameter(Descriptor::kContext));
TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver)); TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver));
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* len = Parameter(Descriptor::kLength); TNode<Smi> len = CAST(Parameter(Descriptor::kLength));
// Simulate starting the loop at 0, but ensuring that the accumulator is // Simulate starting the loop at 0, but ensuring that the accumulator is
// the hole. The continuation stub will search for the initial non-hole // the hole. The continuation stub will search for the initial non-hole
...@@ -2687,7 +2694,7 @@ TF_BUILTIN(ArrayReduceRightLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2687,7 +2694,7 @@ TF_BUILTIN(ArrayReduceRightLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* accumulator = Parameter(Descriptor::kAccumulator); Node* accumulator = Parameter(Descriptor::kAccumulator);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayReduceRightLoopContinuation, context, Return(CallBuiltin(Builtins::kArrayReduceRightLoopContinuation, context,
receiver, callbackfn, UndefinedConstant(), accumulator, receiver, callbackfn, UndefinedConstant(), accumulator,
...@@ -2699,7 +2706,7 @@ TF_BUILTIN(ArrayReduceRightLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2699,7 +2706,7 @@ TF_BUILTIN(ArrayReduceRightLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver)); TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver));
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* result = Parameter(Descriptor::kResult); Node* result = Parameter(Descriptor::kResult);
Return(CallBuiltin(Builtins::kArrayReduceRightLoopContinuation, context, Return(CallBuiltin(Builtins::kArrayReduceRightLoopContinuation, context,
...@@ -2757,9 +2764,9 @@ TF_BUILTIN(ArrayFilterLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -2757,9 +2764,9 @@ TF_BUILTIN(ArrayFilterLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -2778,7 +2785,7 @@ TF_BUILTIN(ArrayFilterLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2778,7 +2785,7 @@ TF_BUILTIN(ArrayFilterLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
Return(CallBuiltin(Builtins::kArrayFilterLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayFilterLoopContinuation, context, receiver,
...@@ -2793,7 +2800,7 @@ TF_BUILTIN(ArrayFilterLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2793,7 +2800,7 @@ TF_BUILTIN(ArrayFilterLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* value_k = Parameter(Descriptor::kValueK); Node* value_k = Parameter(Descriptor::kValueK);
Node* result = Parameter(Descriptor::kResult); Node* result = Parameter(Descriptor::kResult);
...@@ -2854,9 +2861,9 @@ TF_BUILTIN(ArrayMapLoopContinuation, ArrayBuiltinsAssembler) { ...@@ -2854,9 +2861,9 @@ TF_BUILTIN(ArrayMapLoopContinuation, ArrayBuiltinsAssembler) {
Node* callbackfn = Parameter(Descriptor::kCallbackFn); Node* callbackfn = Parameter(Descriptor::kCallbackFn);
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* object = Parameter(Descriptor::kObject); TNode<JSReceiver> object = CAST(Parameter(Descriptor::kObject));
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* to = Parameter(Descriptor::kTo); Node* to = Parameter(Descriptor::kTo);
InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn,
...@@ -2875,7 +2882,7 @@ TF_BUILTIN(ArrayMapLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2875,7 +2882,7 @@ TF_BUILTIN(ArrayMapLoopEagerDeoptContinuation, ArrayBuiltinsAssembler) {
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Return(CallBuiltin(Builtins::kArrayMapLoopContinuation, context, receiver, Return(CallBuiltin(Builtins::kArrayMapLoopContinuation, context, receiver,
callbackfn, this_arg, array, receiver, initial_k, len, callbackfn, this_arg, array, receiver, initial_k, len,
...@@ -2889,7 +2896,7 @@ TF_BUILTIN(ArrayMapLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) { ...@@ -2889,7 +2896,7 @@ TF_BUILTIN(ArrayMapLoopLazyDeoptContinuation, ArrayBuiltinsAssembler) {
Node* this_arg = Parameter(Descriptor::kThisArg); Node* this_arg = Parameter(Descriptor::kThisArg);
Node* array = Parameter(Descriptor::kArray); Node* array = Parameter(Descriptor::kArray);
Node* initial_k = Parameter(Descriptor::kInitialK); Node* initial_k = Parameter(Descriptor::kInitialK);
Node* len = Parameter(Descriptor::kLength); TNode<Number> len = CAST(Parameter(Descriptor::kLength));
Node* result = Parameter(Descriptor::kResult); Node* result = Parameter(Descriptor::kResult);
// This custom lazy deopt point is right after the callback. map() needs // This custom lazy deopt point is right after the callback. map() needs
......
...@@ -73,8 +73,8 @@ class ArrayBuiltinsAssembler : public CodeStubAssembler { ...@@ -73,8 +73,8 @@ class ArrayBuiltinsAssembler : public CodeStubAssembler {
TNode<Object> receiver() { return receiver_; } TNode<Object> receiver() { return receiver_; }
Node* new_target() { return new_target_; } Node* new_target() { return new_target_; }
TNode<IntPtrT> argc() { return argc_; } TNode<IntPtrT> argc() { return argc_; }
Node* o() { return o_; } TNode<JSReceiver> o() { return o_; }
Node* len() { return len_; } TNode<Number> len() { return len_; }
Node* callbackfn() { return callbackfn_; } Node* callbackfn() { return callbackfn_; }
Node* this_arg() { return this_arg_; } Node* this_arg() { return this_arg_; }
Node* k() { return k_.value(); } Node* k() { return k_.value(); }
...@@ -95,7 +95,8 @@ class ArrayBuiltinsAssembler : public CodeStubAssembler { ...@@ -95,7 +95,8 @@ class ArrayBuiltinsAssembler : public CodeStubAssembler {
ForEachDirection direction = ForEachDirection::kForward); ForEachDirection direction = ForEachDirection::kForward);
void InitIteratingArrayBuiltinLoopContinuation( void InitIteratingArrayBuiltinLoopContinuation(
TNode<Context> context, TNode<Object> receiver, Node* callbackfn, TNode<Context> context, TNode<Object> receiver, Node* callbackfn,
Node* this_arg, Node* a, Node* o, Node* initial_k, Node* len, Node* to); Node* this_arg, Node* a, TNode<JSReceiver> o, Node* initial_k,
TNode<Number> len, Node* to);
void GenerateIteratingTypedArrayBuiltinBody( void GenerateIteratingTypedArrayBuiltinBody(
const char* name, const BuiltinResultGenerator& generator, const char* name, const BuiltinResultGenerator& generator,
...@@ -112,13 +113,15 @@ class ArrayBuiltinsAssembler : public CodeStubAssembler { ...@@ -112,13 +113,15 @@ class ArrayBuiltinsAssembler : public CodeStubAssembler {
void VisitAllTypedArrayElements(Node* array_buffer, void VisitAllTypedArrayElements(Node* array_buffer,
const CallResultProcessor& processor, const CallResultProcessor& processor,
Label* detached, ForEachDirection direction); Label* detached, ForEachDirection direction,
TNode<JSTypedArray> typed_array);
void VisitAllFastElementsOneKind(ElementsKind kind, void VisitAllFastElementsOneKind(ElementsKind kind,
const CallResultProcessor& processor, const CallResultProcessor& processor,
Label* array_changed, ParameterMode mode, Label* array_changed, ParameterMode mode,
ForEachDirection direction, ForEachDirection direction,
MissingPropertyMode missing_property_mode); MissingPropertyMode missing_property_mode,
TNode<Smi> length);
void HandleFastElements(const CallResultProcessor& processor, void HandleFastElements(const CallResultProcessor& processor,
const PostLoopAction& action, Label* slow, const PostLoopAction& action, Label* slow,
...@@ -131,12 +134,12 @@ class ArrayBuiltinsAssembler : public CodeStubAssembler { ...@@ -131,12 +134,12 @@ class ArrayBuiltinsAssembler : public CodeStubAssembler {
void GenerateArraySpeciesCreate(); void GenerateArraySpeciesCreate();
// Perform ArraySpeciesCreate (ES6 #sec-arrayspeciescreate). // Perform ArraySpeciesCreate (ES6 #sec-arrayspeciescreate).
void GenerateArraySpeciesCreate(SloppyTNode<Smi> len); void GenerateArraySpeciesCreate(TNode<Number> len);
Node* callbackfn_ = nullptr; Node* callbackfn_ = nullptr;
Node* o_ = nullptr; TNode<JSReceiver> o_;
Node* this_arg_ = nullptr; Node* this_arg_ = nullptr;
Node* len_ = nullptr; TNode<Number> len_;
TNode<Context> context_; TNode<Context> context_;
TNode<Object> receiver_; TNode<Object> receiver_;
Node* new_target_ = nullptr; Node* new_target_ = nullptr;
......
...@@ -1426,9 +1426,9 @@ TNode<FixedArrayBase> CodeStubAssembler::LoadElements( ...@@ -1426,9 +1426,9 @@ TNode<FixedArrayBase> CodeStubAssembler::LoadElements(
return CAST(LoadObjectField(object, JSObject::kElementsOffset)); return CAST(LoadObjectField(object, JSObject::kElementsOffset));
} }
TNode<Object> CodeStubAssembler::LoadJSArrayLength(SloppyTNode<JSArray> array) { TNode<Number> CodeStubAssembler::LoadJSArrayLength(SloppyTNode<JSArray> array) {
CSA_ASSERT(this, IsJSArray(array)); CSA_ASSERT(this, IsJSArray(array));
return LoadObjectField(array, JSArray::kLengthOffset); return CAST(LoadObjectField(array, JSArray::kLengthOffset));
} }
TNode<Smi> CodeStubAssembler::LoadFastJSArrayLength( TNode<Smi> CodeStubAssembler::LoadFastJSArrayLength(
...@@ -6158,12 +6158,12 @@ TNode<Smi> CodeStubAssembler::ToSmiLength(TNode<Object> input, ...@@ -6158,12 +6158,12 @@ TNode<Smi> CodeStubAssembler::ToSmiLength(TNode<Object> input,
return result.value(); return result.value();
} }
Node* CodeStubAssembler::ToLength_Inline(Node* const context, TNode<Number> CodeStubAssembler::ToLength_Inline(SloppyTNode<Context> context,
Node* const input) { SloppyTNode<Object> input) {
Node* const smi_zero = SmiConstant(0); TNode<Smi> smi_zero = SmiConstant(0);
return Select( return Select<Number>(
TaggedIsSmi(input), [=] { return SmiMax(input, smi_zero); }, TaggedIsSmi(input), [=] { return SmiMax(CAST(input), smi_zero); },
[=] { return CallBuiltin(Builtins::kToLength, context, input); }, [=] { return CAST(CallBuiltin(Builtins::kToLength, context, input)); },
MachineRepresentation::kTagged); MachineRepresentation::kTagged);
} }
......
...@@ -526,7 +526,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler { ...@@ -526,7 +526,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// Load the elements backing store of a JSObject. // Load the elements backing store of a JSObject.
TNode<FixedArrayBase> LoadElements(SloppyTNode<JSObject> object); TNode<FixedArrayBase> LoadElements(SloppyTNode<JSObject> object);
// Load the length of a JSArray instance. // Load the length of a JSArray instance.
TNode<Object> LoadJSArrayLength(SloppyTNode<JSArray> array); TNode<Number> LoadJSArrayLength(SloppyTNode<JSArray> array);
// Load the length of a fast JSArray instance. Returns a positive Smi. // Load the length of a fast JSArray instance. Returns a positive Smi.
TNode<Smi> LoadFastJSArrayLength(SloppyTNode<JSArray> array); TNode<Smi> LoadFastJSArrayLength(SloppyTNode<JSArray> array);
// Load the length of a fixed array base instance. // Load the length of a fixed array base instance.
...@@ -1309,7 +1309,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler { ...@@ -1309,7 +1309,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Label* range_error); Label* range_error);
// ES6 7.1.15 ToLength, but with inlined fast path. // ES6 7.1.15 ToLength, but with inlined fast path.
Node* ToLength_Inline(Node* const context, Node* const input); TNode<Number> ToLength_Inline(SloppyTNode<Context> context,
SloppyTNode<Object> input);
// ES6 7.1.4 ToInteger ( argument ) // ES6 7.1.4 ToInteger ( argument )
TNode<Number> ToInteger_Inline(TNode<Context> context, TNode<Object> input, TNode<Number> ToInteger_Inline(TNode<Context> context, TNode<Object> input,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment