43 BIND(&if_not_callable);
44 CallRuntime(Runtime::kThrowIteratorError, context,
object);
56 CallRuntime(Runtime::kThrowSymbolIteratorInvalid, context);
68 std::optional<
TNode<Map>> fast_iterator_result_map) {
83 fast_iterator_result_map);
91 return CAST(heap_object_result);
96 std::optional<
TNode<Map>> fast_iterator_result_map) {
99 Label return_result(
this);
103 if (fast_iterator_result_map) {
105 Label if_generic(
this);
126 BIND(&return_result);
131 std::optional<
TNode<Map>> fast_iterator_result_map) {
134 if (fast_iterator_result_map) {
136 Label if_generic(
this);
150 return var_value.value();
156 std::initializer_list<compiler::CodeAssemblerVariable*> merged_variables) {
164 std::initializer_list<compiler::CodeAssemblerVariable*> merged_variables) {
172 Label loop_start(
this, merged_variables);
193 IteratorCloseOnException(context, iterator_record.object);
194 CallRuntime(Runtime::kReThrowWithMessage, context, var_exception.value(),
206 return values.ToJSArray(context);
229 Iterate(context, iterable, iterator_fn,
239 {values->var_array(), values->var_capacity(), values->var_length()});
243 auto context = Parameter<Context>(Descriptor::kContext);
244 auto iterable = Parameter<JSAny>(Descriptor::kIterable);
245 auto iterator_fn = Parameter<Object>(Descriptor::kIteratorFn);
247 Return(IterableToList(context, iterable, iterator_fn));
251 auto context = Parameter<Context>(Descriptor::kContext);
252 auto iterable = Parameter<JSAny>(Descriptor::kIterable);
253 auto iterator_fn = Parameter<Object>(Descriptor::kIteratorFn);
255 Return(IterableToFixedArray(context, iterable, iterator_fn));
258#if V8_ENABLE_WEBASSEMBLY
259TF_BUILTIN(IterableToFixedArrayForWasm, IteratorBuiltinsAssembler) {
260 auto context = Parameter<Context>(Descriptor::kContext);
261 auto iterable = Parameter<JSAny>(Descriptor::kIterable);
262 auto expected_length = Parameter<Smi>(Descriptor::kExpectedLength);
264 TNode<Object> iterator_fn = GetIteratorMethod(context, iterable);
265 GrowableFixedArray values(
state());
269 FillFixedArrayFromIterable(context, iterable, iterator_fn, &values);
271 GotoIf(WordEqual(PositiveSmiUntag(expected_length),
272 values.var_length()->value()),
275 Runtime::kThrowTypeError, context,
276 SmiConstant(MessageTemplate::kWasmTrapMultiReturnLengthMismatch)));
279 Return(values.var_array()->value());
289 GotoIf(IsUndefined(iterable), &done);
312 list.
Push(next_value);
314 Goto(&loop_body_end);
317 BIND(&if_isnotstringtype);
322 SmiConstant(MessageTemplate::kIterableYieldedNonString),
329 BIND(&loop_body_end);
340 auto context = Parameter<Context>(Descriptor::kContext);
341 auto iterable = Parameter<JSAny>(Descriptor::kIterable);
343 Return(StringListFromIterable(context, iterable));
347 auto context = Parameter<Context>(Descriptor::kContext);
348 auto iterable = Parameter<JSAny>(Descriptor::kIterable);
350 Return(StringListFromIterable(context, iterable));
364 auto context = Parameter<Context>(Descriptor::kContext);
365 auto iterable = Parameter<Object>(Descriptor::kIterable);
366 auto iterator_fn = Parameter<Object>(Descriptor::kIteratorFn);
368 Label slow_path(
this);
370 GotoIfNot(IsFastJSArrayWithNoCustomIteration(context, iterable), &slow_path);
373 TailCallBuiltin(Builtin::kCloneFastJSArray, context, iterable);
376 TailCallBuiltin(Builtin::kIterableToList, context, iterable, iterator_fn);
387 auto context = Parameter<Context>(Descriptor::kContext);
388 auto iterable = Parameter<Object>(Descriptor::kIterable);
389 auto iterator_fn = Parameter<Object>(Descriptor::kIteratorFn);
391 Label slow_path(
this);
393 GotoIfNot(IsFastJSArrayWithNoCustomIteration(context, iterable), &slow_path);
396 TailCallBuiltin(Builtin::kCloneFastJSArrayFillingHoles, context, iterable);
399 TailCallBuiltin(Builtin::kIterableToList, context, iterable, iterator_fn);
405 Label done(
this), check_string(
this), check_map(
this), check_set(
this);
412 Word32Or(IsFastJSArrayWithNoCustomIteration(context, iterable),
413 IsFastJSArrayForReadWithNoCustomIteration(context, iterable)),
418 CallBuiltin(Builtin::kCloneFastJSArrayFillingHoles, context, iterable));
423 Label string_maybe_fast_call(
this);
426 iterable, context, &string_maybe_fast_call, &check_map);
428 BIND(&string_maybe_fast_call);
434 *var_result =
CAST(
CallBuiltin(Builtin::kStringToList, context, iterable));
440 Label map_fast_call(
this);
442 state(), iterable, context, &map_fast_call, &check_set);
444 BIND(&map_fast_call);
452 Label set_fast_call(
this);
454 &set_fast_call, slow);
456 BIND(&set_fast_call);
458 CAST(
CallBuiltin(Builtin::kSetOrSetIteratorToList, context, iterable));
469 return var_fast_result.value();
484 auto context = Parameter<Context>(Descriptor::kContext);
485 auto iterable = Parameter<JSAny>(Descriptor::kIterable);
487 Label slow_path(
this);
489 GotoIfForceSlowPath(&slow_path);
492 FastIterableToList(context, iterable, &var_result, &slow_path);
493 Return(var_result.value());
497 TNode<Object> iterator_fn = GetIteratorMethod(context, iterable);
498 TailCallBuiltin(Builtin::kIterableToList, context, iterable, iterator_fn);
504 auto context = Parameter<Context>(Descriptor::kContext);
505 auto receiver = Parameter<Object>(Descriptor::kReceiver);
507 auto call_slot_smi = Parameter<Smi>(Descriptor::kCallSlot);
508 auto feedback = Parameter<FeedbackVector>(Descriptor::kFeedback);
509 auto iterator_method = Parameter<Object>(Descriptor::kResult);
513 CallBuiltin(Builtin::kCallIteratorWithFeedback, context,
receiver,
514 iterator_method, call_slot_smi, feedback);
520 TNode<Context> context = Parameter<Context>(Descriptor::kContext);
521 TNode<Object> iterator = Parameter<Object>(Descriptor::kArgument);
523 ThrowIfNotJSReceiver(context, iterator,
524 MessageTemplate::kSymbolIteratorInvalid,
"");
532 auto context = Parameter<Context>(Descriptor::kContext);
533 auto iterable = Parameter<JSAny>(Descriptor::kIterable);
535 TNode<Object> iterator_fn = GetIteratorMethod(context, iterable);
536 TailCallBuiltin(Builtin::kIterableToFixedArray, context, iterable,
#define TF_BUILTIN(Name, AssemblerBase)
void SetPendingMessage(TNode< Union< Hole, JSMessageObject > > message)
TNode< BoolT > IsDebugActive()
TNode< JSAny > GetProperty(TNode< Context > context, TNode< JSAny > receiver, Handle< Name > name)
TNode< BoolT > TaggedEqual(TNode< AnyTaggedT > a, TNode< AnyTaggedT > b)
TNode< T > LoadObjectField(TNode< HeapObject > object, int offset)
TNode< BoolT > JSAnyIsNotPrimitiveMap(TNode< Map > map)
TNode< JSAny > Call(TNode< Context > context, TNode< TCallable > callable, ConvertReceiverMode mode, TNode< JSAny > receiver, TArgs... args)
TNode< Uint16T > LoadInstanceType(TNode< HeapObject > object)
TNode< BoolT > TaggedIsSmi(TNode< MaybeObject > a)
TNode< Map > LoadMap(TNode< HeapObject > object)
TNode< Uint32T > LoadStringLengthAsWord32(TNode< String > string)
TNode< Union< Hole, JSMessageObject > > GetPendingMessage()
void BranchIfToBooleanIsTrue(TNode< Object > value, Label *if_true, Label *if_false)
TNode< BoolT > IsStringInstanceType(TNode< Int32T > instance_type)
TNode< BoolT > IsCallable(TNode< HeapObject > object)
TNode< BoolT > JSAnyIsNotPrimitive(TNode< HeapObject > object)
TNode< FixedArray > ToFixedArray()
TVariable< IntPtrT > * var_length()
TVariable< FixedArray > * var_array()
TVariable< IntPtrT > * var_capacity()
void Push(const TNode< Object > value)
TNode< JSReceiver > IteratorStep(TNode< Context > context, const IteratorRecord &iterator, Label *if_done, std::optional< TNode< Map > > fast_iterator_result_map=std::nullopt)
void Iterate(TNode< Context > context, TNode< JSAny > iterable, std::function< void(TNode< Object >)> func, std::initializer_list< compiler::CodeAssemblerVariable * > merged_variables={})
TNode< JSArray > IterableToList(TNode< Context > context, TNode< JSAny > iterable, TNode< Object > iterator_fn)
void FastIterableToList(TNode< Context > context, TNode< JSAny > iterable, TVariable< JSArray > *var_result, Label *slow)
TorqueStructIteratorRecord IteratorRecord
TNode< FixedArray > IterableToFixedArray(TNode< Context > context, TNode< JSAny > iterable, TNode< Object > iterator_fn)
void IteratorComplete(TNode< Context > context, const TNode< JSAnyNotSmi > iterator, Label *if_done, std::optional< TNode< Map > > fast_iterator_result_map=std::nullopt)
TNode< JSAny > IteratorValue(TNode< Context > context, TNode< JSReceiver > result, std::optional< TNode< Map > > fast_iterator_result_map=std::nullopt)
void FillFixedArrayFromIterable(TNode< Context > context, TNode< JSAny > iterable, TNode< Object > iterator_fn, GrowableFixedArray *values)
TNode< JSAny > GetIteratorMethod(TNode< Context > context, TNode< JSAny >)
TNode< FixedArray > StringListFromIterable(TNode< Context > context, TNode< JSAny > iterable)
IteratorRecord GetIterator(TNode< Context > context, TNode< JSAny > object)
static constexpr uint32_t kMaxFastArrayLength
void BranchIfStringPrimitiveWithNoCustomIteration(TNode< Object > object, TNode< Context > context, Label *if_true, Label *if_false)
static TNode UncheckedCast(compiler::Node *node)
CodeAssemblerState * state()
void GotoIfNot(TNode< IntegralT > condition, Label *false_label, GotoHint goto_hint=GotoHint::kNone)
Factory * factory() const
TNode< Smi > SmiConstant(Tagged< Smi > value)
void GotoIf(TNode< IntegralT > condition, Label *true_label, GotoHint goto_hint=GotoHint::kNone)
TNode< Int32T > Word32Or(TNode< Int32T > left, TNode< Int32T > right)
TNode< Uint32T > Uint32Constant(uint32_t value)
TNode< T > CallRuntime(Runtime::FunctionId function, TNode< Object > context, TArgs... args)
TNode< T > CallBuiltin(Builtin id, TNode< Object > context, TArgs... args)
void Branch(TNode< IntegralT > condition, Label *true_label, Label *false_label, BranchHint branch_hint=BranchHint::kNone)
ZoneVector< RpoNumber > & result
LiftoffAssembler::CacheState state
void BranchIfIterableWithOriginalKeyOrValueMapIterator(compiler::CodeAssemblerState *state, TNode< Object > iterable, TNode< Context > context, compiler::CodeAssemblerLabel *if_true, compiler::CodeAssemblerLabel *if_false)
void BranchIfIterableWithOriginalValueSetIterator(compiler::CodeAssemblerState *state, TNode< Object > iterable, TNode< Context > context, compiler::CodeAssemblerLabel *if_true, compiler::CodeAssemblerLabel *if_false)
TorqueStructIteratorRecord IteratorRecord
#define DCHECK_NOT_NULL(val)