| Index: src/builtins/builtins-array.cc
|
| diff --git a/src/builtins/builtins-array.cc b/src/builtins/builtins-array.cc
|
| index 5d3d4c1c7305051e48ee83c6652c66bd2fee9595..85a49284b72953e4cace97be637c92fb54e98058 100644
|
| --- a/src/builtins/builtins-array.cc
|
| +++ b/src/builtins/builtins-array.cc
|
| @@ -188,76 +188,63 @@ BUILTIN(ArrayPush) {
|
| return Smi::FromInt(new_length);
|
| }
|
|
|
| -void Builtins::Generate_FastArrayPush(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef CodeStubAssembler::Variable Variable;
|
| - CodeStubAssembler assembler(state);
|
| - Variable arg_index(&assembler, MachineType::PointerRepresentation());
|
| - Label default_label(&assembler, &arg_index);
|
| - Label smi_transition(&assembler);
|
| - Label object_push_pre(&assembler);
|
| - Label object_push(&assembler, &arg_index);
|
| - Label double_push(&assembler, &arg_index);
|
| - Label double_transition(&assembler);
|
| - Label runtime(&assembler, Label::kDeferred);
|
| -
|
| - Node* argc = assembler.Parameter(BuiltinDescriptor::kArgumentsCount);
|
| - Node* context = assembler.Parameter(BuiltinDescriptor::kContext);
|
| - Node* new_target = assembler.Parameter(BuiltinDescriptor::kNewTarget);
|
| -
|
| - CodeStubArguments args(&assembler, assembler.ChangeInt32ToIntPtr(argc));
|
| +TF_BUILTIN(FastArrayPush, CodeStubAssembler) {
|
| + Variable arg_index(this, MachineType::PointerRepresentation());
|
| + Label default_label(this, &arg_index);
|
| + Label smi_transition(this);
|
| + Label object_push_pre(this);
|
| + Label object_push(this, &arg_index);
|
| + Label double_push(this, &arg_index);
|
| + Label double_transition(this);
|
| + Label runtime(this, Label::kDeferred);
|
| +
|
| + Node* argc = Parameter(BuiltinDescriptor::kArgumentsCount);
|
| + Node* context = Parameter(BuiltinDescriptor::kContext);
|
| + Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
|
| +
|
| + CodeStubArguments args(this, ChangeInt32ToIntPtr(argc));
|
| Node* receiver = args.GetReceiver();
|
| Node* kind = nullptr;
|
|
|
| - Label fast(&assembler);
|
| - {
|
| - assembler.BranchIfFastJSArray(
|
| - receiver, context, CodeStubAssembler::FastJSArrayAccessMode::ANY_ACCESS,
|
| - &fast, &runtime);
|
| - }
|
| + Label fast(this);
|
| + BranchIfFastJSArray(receiver, context, FastJSArrayAccessMode::ANY_ACCESS,
|
| + &fast, &runtime);
|
|
|
| - assembler.Bind(&fast);
|
| + Bind(&fast);
|
| {
|
| // Disallow pushing onto prototypes. It might be the JSArray prototype.
|
| // Disallow pushing onto non-extensible objects.
|
| - assembler.Comment("Disallow pushing onto prototypes");
|
| - Node* map = assembler.LoadMap(receiver);
|
| - Node* bit_field2 = assembler.LoadMapBitField2(map);
|
| + Comment("Disallow pushing onto prototypes");
|
| + Node* map = LoadMap(receiver);
|
| + Node* bit_field2 = LoadMapBitField2(map);
|
| int mask = static_cast<int>(Map::IsPrototypeMapBits::kMask) |
|
| (1 << Map::kIsExtensible);
|
| - Node* test = assembler.Word32And(bit_field2, assembler.Int32Constant(mask));
|
| - assembler.GotoIf(
|
| - assembler.Word32NotEqual(
|
| - test, assembler.Int32Constant(1 << Map::kIsExtensible)),
|
| - &runtime);
|
| + Node* test = Word32And(bit_field2, Int32Constant(mask));
|
| + GotoIf(Word32NotEqual(test, Int32Constant(1 << Map::kIsExtensible)),
|
| + &runtime);
|
|
|
| // Disallow pushing onto arrays in dictionary named property mode. We need
|
| // to figure out whether the length property is still writable.
|
| - assembler.Comment(
|
| - "Disallow pushing onto arrays in dictionary named property mode");
|
| - assembler.GotoIf(assembler.IsDictionaryMap(map), &runtime);
|
| + Comment("Disallow pushing onto arrays in dictionary named property mode");
|
| + GotoIf(IsDictionaryMap(map), &runtime);
|
|
|
| // Check whether the length property is writable. The length property is the
|
| // only default named property on arrays. It's nonconfigurable, hence is
|
| // guaranteed to stay the first property.
|
| - Node* descriptors = assembler.LoadMapDescriptors(map);
|
| - Node* details = assembler.LoadFixedArrayElement(
|
| - descriptors, DescriptorArray::ToDetailsIndex(0));
|
| - assembler.GotoIf(
|
| - assembler.IsSetSmi(details, PropertyDetails::kAttributesReadOnlyMask),
|
| - &runtime);
|
| -
|
| - arg_index.Bind(assembler.IntPtrConstant(0));
|
| - kind = assembler.DecodeWord32<Map::ElementsKindBits>(bit_field2);
|
| -
|
| - assembler.GotoIf(
|
| - assembler.Int32GreaterThan(
|
| - kind, assembler.Int32Constant(FAST_HOLEY_SMI_ELEMENTS)),
|
| - &object_push_pre);
|
| -
|
| - Node* new_length = assembler.BuildAppendJSArray(
|
| - FAST_SMI_ELEMENTS, context, receiver, args, arg_index, &smi_transition);
|
| + Node* descriptors = LoadMapDescriptors(map);
|
| + Node* details =
|
| + LoadFixedArrayElement(descriptors, DescriptorArray::ToDetailsIndex(0));
|
| + GotoIf(IsSetSmi(details, PropertyDetails::kAttributesReadOnlyMask),
|
| + &runtime);
|
| +
|
| + arg_index.Bind(IntPtrConstant(0));
|
| + kind = DecodeWord32<Map::ElementsKindBits>(bit_field2);
|
| +
|
| + GotoIf(Int32GreaterThan(kind, Int32Constant(FAST_HOLEY_SMI_ELEMENTS)),
|
| + &object_push_pre);
|
| +
|
| + Node* new_length = BuildAppendJSArray(FAST_SMI_ELEMENTS, context, receiver,
|
| + args, arg_index, &smi_transition);
|
| args.PopAndReturn(new_length);
|
| }
|
|
|
| @@ -265,48 +252,46 @@ void Builtins::Generate_FastArrayPush(compiler::CodeAssemblerState* state) {
|
| // transition the array for only the single next element. If the argument is
|
| // a smi, the failure is due to some other reason and we should fall back on
|
| // the most generic implementation for the rest of the array.
|
| - assembler.Bind(&smi_transition);
|
| + Bind(&smi_transition);
|
| {
|
| Node* arg = args.AtIndex(arg_index.value());
|
| - assembler.GotoIf(assembler.TaggedIsSmi(arg), &default_label);
|
| - Node* length = assembler.LoadJSArrayLength(receiver);
|
| + GotoIf(TaggedIsSmi(arg), &default_label);
|
| + Node* length = LoadJSArrayLength(receiver);
|
| // TODO(danno): Use the KeyedStoreGeneric stub here when possible,
|
| // calling into the runtime to do the elements transition is overkill.
|
| - assembler.CallRuntime(Runtime::kSetProperty, context, receiver, length, arg,
|
| - assembler.SmiConstant(STRICT));
|
| - assembler.Increment(arg_index);
|
| + CallRuntime(Runtime::kSetProperty, context, receiver, length, arg,
|
| + SmiConstant(STRICT));
|
| + Increment(arg_index);
|
| // The runtime SetProperty call could have converted the array to dictionary
|
| // mode, which must be detected to abort the fast-path.
|
| - Node* map = assembler.LoadMap(receiver);
|
| - Node* bit_field2 = assembler.LoadMapBitField2(map);
|
| - Node* kind = assembler.DecodeWord32<Map::ElementsKindBits>(bit_field2);
|
| - assembler.GotoIf(assembler.Word32Equal(
|
| - kind, assembler.Int32Constant(DICTIONARY_ELEMENTS)),
|
| - &default_label);
|
| + Node* map = LoadMap(receiver);
|
| + Node* bit_field2 = LoadMapBitField2(map);
|
| + Node* kind = DecodeWord32<Map::ElementsKindBits>(bit_field2);
|
| + GotoIf(Word32Equal(kind, Int32Constant(DICTIONARY_ELEMENTS)),
|
| + &default_label);
|
|
|
| - assembler.GotoIfNotNumber(arg, &object_push);
|
| - assembler.Goto(&double_push);
|
| + GotoIfNotNumber(arg, &object_push);
|
| + Goto(&double_push);
|
| }
|
|
|
| - assembler.Bind(&object_push_pre);
|
| + Bind(&object_push_pre);
|
| {
|
| - assembler.Branch(assembler.Int32GreaterThan(
|
| - kind, assembler.Int32Constant(FAST_HOLEY_ELEMENTS)),
|
| - &double_push, &object_push);
|
| + Branch(Int32GreaterThan(kind, Int32Constant(FAST_HOLEY_ELEMENTS)),
|
| + &double_push, &object_push);
|
| }
|
|
|
| - assembler.Bind(&object_push);
|
| + Bind(&object_push);
|
| {
|
| - Node* new_length = assembler.BuildAppendJSArray(
|
| - FAST_ELEMENTS, context, receiver, args, arg_index, &default_label);
|
| + Node* new_length = BuildAppendJSArray(FAST_ELEMENTS, context, receiver,
|
| + args, arg_index, &default_label);
|
| args.PopAndReturn(new_length);
|
| }
|
|
|
| - assembler.Bind(&double_push);
|
| + Bind(&double_push);
|
| {
|
| Node* new_length =
|
| - assembler.BuildAppendJSArray(FAST_DOUBLE_ELEMENTS, context, receiver,
|
| - args, arg_index, &double_transition);
|
| + BuildAppendJSArray(FAST_DOUBLE_ELEMENTS, context, receiver, args,
|
| + arg_index, &double_transition);
|
| args.PopAndReturn(new_length);
|
| }
|
|
|
| @@ -314,47 +299,46 @@ void Builtins::Generate_FastArrayPush(compiler::CodeAssemblerState* state) {
|
| // transition the array for only the single next element. If the argument is
|
| // a double, the failure is due to some other reason and we should fall back
|
| // on the most generic implementation for the rest of the array.
|
| - assembler.Bind(&double_transition);
|
| + Bind(&double_transition);
|
| {
|
| Node* arg = args.AtIndex(arg_index.value());
|
| - assembler.GotoIfNumber(arg, &default_label);
|
| - Node* length = assembler.LoadJSArrayLength(receiver);
|
| + GotoIfNumber(arg, &default_label);
|
| + Node* length = LoadJSArrayLength(receiver);
|
| // TODO(danno): Use the KeyedStoreGeneric stub here when possible,
|
| // calling into the runtime to do the elements transition is overkill.
|
| - assembler.CallRuntime(Runtime::kSetProperty, context, receiver, length, arg,
|
| - assembler.SmiConstant(STRICT));
|
| - assembler.Increment(arg_index);
|
| + CallRuntime(Runtime::kSetProperty, context, receiver, length, arg,
|
| + SmiConstant(STRICT));
|
| + Increment(arg_index);
|
| // The runtime SetProperty call could have converted the array to dictionary
|
| // mode, which must be detected to abort the fast-path.
|
| - Node* map = assembler.LoadMap(receiver);
|
| - Node* bit_field2 = assembler.LoadMapBitField2(map);
|
| - Node* kind = assembler.DecodeWord32<Map::ElementsKindBits>(bit_field2);
|
| - assembler.GotoIf(assembler.Word32Equal(
|
| - kind, assembler.Int32Constant(DICTIONARY_ELEMENTS)),
|
| - &default_label);
|
| - assembler.Goto(&object_push);
|
| + Node* map = LoadMap(receiver);
|
| + Node* bit_field2 = LoadMapBitField2(map);
|
| + Node* kind = DecodeWord32<Map::ElementsKindBits>(bit_field2);
|
| + GotoIf(Word32Equal(kind, Int32Constant(DICTIONARY_ELEMENTS)),
|
| + &default_label);
|
| + Goto(&object_push);
|
| }
|
|
|
| // Fallback that stores un-processed arguments using the full, heavyweight
|
| // SetProperty machinery.
|
| - assembler.Bind(&default_label);
|
| + Bind(&default_label);
|
| {
|
| args.ForEach(
|
| - [&assembler, receiver, context](Node* arg) {
|
| - Node* length = assembler.LoadJSArrayLength(receiver);
|
| - assembler.CallRuntime(Runtime::kSetProperty, context, receiver,
|
| - length, arg, assembler.SmiConstant(STRICT));
|
| + [this, receiver, context](Node* arg) {
|
| + Node* length = LoadJSArrayLength(receiver);
|
| + CallRuntime(Runtime::kSetProperty, context, receiver, length, arg,
|
| + SmiConstant(STRICT));
|
| },
|
| arg_index.value());
|
| - args.PopAndReturn(assembler.LoadJSArrayLength(receiver));
|
| + args.PopAndReturn(LoadJSArrayLength(receiver));
|
| }
|
|
|
| - assembler.Bind(&runtime);
|
| + Bind(&runtime);
|
| {
|
| - Node* target = assembler.LoadFromFrame(
|
| - StandardFrameConstants::kFunctionOffset, MachineType::TaggedPointer());
|
| - assembler.TailCallStub(CodeFactory::ArrayPush(assembler.isolate()), context,
|
| - target, new_target, argc);
|
| + Node* target = LoadFromFrame(StandardFrameConstants::kFunctionOffset,
|
| + MachineType::TaggedPointer());
|
| + TailCallStub(CodeFactory::ArrayPush(isolate()), context, target, new_target,
|
| + argc);
|
| }
|
| }
|
|
|
| @@ -1645,38 +1629,30 @@ BUILTIN(ArrayConcat) {
|
| return Slow_ArrayConcat(&args, species, isolate);
|
| }
|
|
|
| -void Builtins::Generate_ArrayIsArray(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Label Label;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Node* object = assembler.Parameter(1);
|
| - Node* context = assembler.Parameter(4);
|
| +TF_BUILTIN(ArrayIsArray, CodeStubAssembler) {
|
| + Node* object = Parameter(1);
|
| + Node* context = Parameter(4);
|
|
|
| - Label call_runtime(&assembler), return_true(&assembler),
|
| - return_false(&assembler);
|
| + Label call_runtime(this), return_true(this), return_false(this);
|
|
|
| - assembler.GotoIf(assembler.TaggedIsSmi(object), &return_false);
|
| - Node* instance_type = assembler.LoadInstanceType(object);
|
| + GotoIf(TaggedIsSmi(object), &return_false);
|
| + Node* instance_type = LoadInstanceType(object);
|
|
|
| - assembler.GotoIf(assembler.Word32Equal(
|
| - instance_type, assembler.Int32Constant(JS_ARRAY_TYPE)),
|
| - &return_true);
|
| + GotoIf(Word32Equal(instance_type, Int32Constant(JS_ARRAY_TYPE)),
|
| + &return_true);
|
|
|
| // TODO(verwaest): Handle proxies in-place.
|
| - assembler.Branch(assembler.Word32Equal(
|
| - instance_type, assembler.Int32Constant(JS_PROXY_TYPE)),
|
| - &call_runtime, &return_false);
|
| + Branch(Word32Equal(instance_type, Int32Constant(JS_PROXY_TYPE)),
|
| + &call_runtime, &return_false);
|
|
|
| - assembler.Bind(&return_true);
|
| - assembler.Return(assembler.BooleanConstant(true));
|
| + Bind(&return_true);
|
| + Return(BooleanConstant(true));
|
|
|
| - assembler.Bind(&return_false);
|
| - assembler.Return(assembler.BooleanConstant(false));
|
| + Bind(&return_false);
|
| + Return(BooleanConstant(false));
|
|
|
| - assembler.Bind(&call_runtime);
|
| - assembler.Return(
|
| - assembler.CallRuntime(Runtime::kArrayIsArray, context, object));
|
| + Bind(&call_runtime);
|
| + Return(CallRuntime(Runtime::kArrayIsArray, context, object));
|
| }
|
|
|
| TF_BUILTIN(ArrayIncludes, CodeStubAssembler) {
|
| @@ -1694,8 +1670,7 @@ TF_BUILTIN(ArrayIncludes, CodeStubAssembler) {
|
|
|
| // Take slow path if not a JSArray, if retrieving elements requires
|
| // traversing prototype, or if access checks are required.
|
| - BranchIfFastJSArray(array, context,
|
| - CodeStubAssembler::FastJSArrayAccessMode::INBOUNDS_READ,
|
| + BranchIfFastJSArray(array, context, FastJSArrayAccessMode::INBOUNDS_READ,
|
| &init_len, &call_runtime);
|
|
|
| Bind(&init_len);
|
| @@ -1917,7 +1892,7 @@ TF_BUILTIN(ArrayIncludes, CodeStubAssembler) {
|
| // Load double value or continue if it contains a double hole.
|
| Node* element_k = LoadFixedDoubleArrayElement(
|
| elements, index_var.value(), MachineType::Float64(), 0,
|
| - CodeStubAssembler::INTPTR_PARAMETERS, &continue_loop);
|
| + INTPTR_PARAMETERS, &continue_loop);
|
|
|
| Branch(Float64Equal(element_k, search_num.value()), &return_true,
|
| &continue_loop);
|
| @@ -1935,7 +1910,7 @@ TF_BUILTIN(ArrayIncludes, CodeStubAssembler) {
|
| // Load double value or continue if it contains a double hole.
|
| Node* element_k = LoadFixedDoubleArrayElement(
|
| elements, index_var.value(), MachineType::Float64(), 0,
|
| - CodeStubAssembler::INTPTR_PARAMETERS, &continue_loop);
|
| + INTPTR_PARAMETERS, &continue_loop);
|
|
|
| BranchIfFloat64IsNaN(element_k, &return_true, &continue_loop);
|
| Bind(&continue_loop);
|
| @@ -1949,9 +1924,9 @@ TF_BUILTIN(ArrayIncludes, CodeStubAssembler) {
|
| GotoIfNot(UintPtrLessThan(index_var.value(), len), &return_false);
|
|
|
| // Check if the element is a double hole, but don't load it.
|
| - LoadFixedDoubleArrayElement(
|
| - elements, index_var.value(), MachineType::None(), 0,
|
| - CodeStubAssembler::INTPTR_PARAMETERS, &return_true);
|
| + LoadFixedDoubleArrayElement(elements, index_var.value(),
|
| + MachineType::None(), 0, INTPTR_PARAMETERS,
|
| + &return_true);
|
|
|
| index_var.Bind(IntPtrAdd(index_var.value(), IntPtrConstant(1)));
|
| Goto(&hole_loop);
|
| @@ -1969,116 +1944,100 @@ TF_BUILTIN(ArrayIncludes, CodeStubAssembler) {
|
| search_element, start_from));
|
| }
|
|
|
| -void Builtins::Generate_ArrayIndexOf(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef CodeStubAssembler::Variable Variable;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Node* array = assembler.Parameter(0);
|
| - Node* search_element = assembler.Parameter(1);
|
| - Node* start_from = assembler.Parameter(2);
|
| - Node* context = assembler.Parameter(3 + 2);
|
| -
|
| - Node* intptr_zero = assembler.IntPtrConstant(0);
|
| - Node* intptr_one = assembler.IntPtrConstant(1);
|
| +TF_BUILTIN(ArrayIndexOf, CodeStubAssembler) {
|
| + Node* array = Parameter(0);
|
| + Node* search_element = Parameter(1);
|
| + Node* start_from = Parameter(2);
|
| + Node* context = Parameter(3 + 2);
|
|
|
| - Node* undefined = assembler.UndefinedConstant();
|
| + Node* intptr_zero = IntPtrConstant(0);
|
| + Node* intptr_one = IntPtrConstant(1);
|
|
|
| - Variable len_var(&assembler, MachineType::PointerRepresentation()),
|
| - index_var(&assembler, MachineType::PointerRepresentation()),
|
| - start_from_var(&assembler, MachineType::PointerRepresentation());
|
| + Variable len_var(this, MachineType::PointerRepresentation()),
|
| + index_var(this, MachineType::PointerRepresentation()),
|
| + start_from_var(this, MachineType::PointerRepresentation());
|
|
|
| - Label init_k(&assembler), return_found(&assembler),
|
| - return_not_found(&assembler), call_runtime(&assembler);
|
| + Label init_k(this), return_found(this), return_not_found(this),
|
| + call_runtime(this);
|
|
|
| - Label init_len(&assembler);
|
| + Label init_len(this);
|
|
|
| index_var.Bind(intptr_zero);
|
| len_var.Bind(intptr_zero);
|
|
|
| // Take slow path if not a JSArray, if retrieving elements requires
|
| // traversing prototype, or if access checks are required.
|
| - assembler.BranchIfFastJSArray(
|
| - array, context, CodeStubAssembler::FastJSArrayAccessMode::INBOUNDS_READ,
|
| - &init_len, &call_runtime);
|
| + BranchIfFastJSArray(array, context, FastJSArrayAccessMode::INBOUNDS_READ,
|
| + &init_len, &call_runtime);
|
|
|
| - assembler.Bind(&init_len);
|
| + Bind(&init_len);
|
| {
|
| // JSArray length is always an Smi for fast arrays.
|
| - CSA_ASSERT(&assembler, assembler.TaggedIsSmi(assembler.LoadObjectField(
|
| - array, JSArray::kLengthOffset)));
|
| - Node* len =
|
| - assembler.LoadAndUntagObjectField(array, JSArray::kLengthOffset);
|
| + CSA_ASSERT(this,
|
| + TaggedIsSmi(LoadObjectField(array, JSArray::kLengthOffset)));
|
| + Node* len = LoadAndUntagObjectField(array, JSArray::kLengthOffset);
|
|
|
| len_var.Bind(len);
|
| - assembler.Branch(assembler.WordEqual(len_var.value(), intptr_zero),
|
| - &return_not_found, &init_k);
|
| + Branch(WordEqual(len_var.value(), intptr_zero), &return_not_found, &init_k);
|
| }
|
|
|
| - assembler.Bind(&init_k);
|
| + Bind(&init_k);
|
| {
|
| - Label done(&assembler), init_k_smi(&assembler), init_k_heap_num(&assembler),
|
| - init_k_zero(&assembler), init_k_n(&assembler);
|
| - Node* tagged_n = assembler.ToInteger(context, start_from);
|
| + Label done(this), init_k_smi(this), init_k_heap_num(this),
|
| + init_k_zero(this), init_k_n(this);
|
| + Node* tagged_n = ToInteger(context, start_from);
|
|
|
| - assembler.Branch(assembler.TaggedIsSmi(tagged_n), &init_k_smi,
|
| - &init_k_heap_num);
|
| + Branch(TaggedIsSmi(tagged_n), &init_k_smi, &init_k_heap_num);
|
|
|
| - assembler.Bind(&init_k_smi);
|
| + Bind(&init_k_smi);
|
| {
|
| - start_from_var.Bind(assembler.SmiUntag(tagged_n));
|
| - assembler.Goto(&init_k_n);
|
| + start_from_var.Bind(SmiUntag(tagged_n));
|
| + Goto(&init_k_n);
|
| }
|
|
|
| - assembler.Bind(&init_k_heap_num);
|
| + Bind(&init_k_heap_num);
|
| {
|
| - Label do_return_not_found(&assembler);
|
| + Label do_return_not_found(this);
|
| // This round is lossless for all valid lengths.
|
| - Node* fp_len = assembler.RoundIntPtrToFloat64(len_var.value());
|
| - Node* fp_n = assembler.LoadHeapNumberValue(tagged_n);
|
| - assembler.GotoIf(assembler.Float64GreaterThanOrEqual(fp_n, fp_len),
|
| - &do_return_not_found);
|
| - start_from_var.Bind(assembler.ChangeInt32ToIntPtr(
|
| - assembler.TruncateFloat64ToWord32(fp_n)));
|
| - assembler.Goto(&init_k_n);
|
| -
|
| - assembler.Bind(&do_return_not_found);
|
| + Node* fp_len = RoundIntPtrToFloat64(len_var.value());
|
| + Node* fp_n = LoadHeapNumberValue(tagged_n);
|
| + GotoIf(Float64GreaterThanOrEqual(fp_n, fp_len), &do_return_not_found);
|
| + start_from_var.Bind(ChangeInt32ToIntPtr(TruncateFloat64ToWord32(fp_n)));
|
| + Goto(&init_k_n);
|
| +
|
| + Bind(&do_return_not_found);
|
| {
|
| index_var.Bind(intptr_zero);
|
| - assembler.Goto(&return_not_found);
|
| + Goto(&return_not_found);
|
| }
|
| }
|
|
|
| - assembler.Bind(&init_k_n);
|
| + Bind(&init_k_n);
|
| {
|
| - Label if_positive(&assembler), if_negative(&assembler), done(&assembler);
|
| - assembler.Branch(
|
| - assembler.IntPtrLessThan(start_from_var.value(), intptr_zero),
|
| - &if_negative, &if_positive);
|
| + Label if_positive(this), if_negative(this), done(this);
|
| + Branch(IntPtrLessThan(start_from_var.value(), intptr_zero), &if_negative,
|
| + &if_positive);
|
|
|
| - assembler.Bind(&if_positive);
|
| + Bind(&if_positive);
|
| {
|
| index_var.Bind(start_from_var.value());
|
| - assembler.Goto(&done);
|
| + Goto(&done);
|
| }
|
|
|
| - assembler.Bind(&if_negative);
|
| + Bind(&if_negative);
|
| {
|
| - index_var.Bind(
|
| - assembler.IntPtrAdd(len_var.value(), start_from_var.value()));
|
| - assembler.Branch(
|
| - assembler.IntPtrLessThan(index_var.value(), intptr_zero),
|
| - &init_k_zero, &done);
|
| + index_var.Bind(IntPtrAdd(len_var.value(), start_from_var.value()));
|
| + Branch(IntPtrLessThan(index_var.value(), intptr_zero), &init_k_zero,
|
| + &done);
|
| }
|
|
|
| - assembler.Bind(&init_k_zero);
|
| + Bind(&init_k_zero);
|
| {
|
| index_var.Bind(intptr_zero);
|
| - assembler.Goto(&done);
|
| + Goto(&done);
|
| }
|
|
|
| - assembler.Bind(&done);
|
| + Bind(&done);
|
| }
|
| }
|
|
|
| @@ -2087,357 +2046,291 @@ void Builtins::Generate_ArrayIndexOf(compiler::CodeAssemblerState* state) {
|
| FAST_HOLEY_ELEMENTS, FAST_DOUBLE_ELEMENTS, FAST_HOLEY_DOUBLE_ELEMENTS,
|
| };
|
|
|
| - Label if_smiorobjects(&assembler), if_packed_doubles(&assembler),
|
| - if_holey_doubles(&assembler);
|
| + Label if_smiorobjects(this), if_packed_doubles(this), if_holey_doubles(this);
|
| Label* element_kind_handlers[] = {&if_smiorobjects, &if_smiorobjects,
|
| &if_smiorobjects, &if_smiorobjects,
|
| &if_packed_doubles, &if_holey_doubles};
|
|
|
| - Node* map = assembler.LoadMap(array);
|
| - Node* elements_kind = assembler.LoadMapElementsKind(map);
|
| - Node* elements = assembler.LoadElements(array);
|
| - assembler.Switch(elements_kind, &return_not_found, kElementsKind,
|
| - element_kind_handlers, arraysize(kElementsKind));
|
| + Node* map = LoadMap(array);
|
| + Node* elements_kind = LoadMapElementsKind(map);
|
| + Node* elements = LoadElements(array);
|
| + Switch(elements_kind, &return_not_found, kElementsKind, element_kind_handlers,
|
| + arraysize(kElementsKind));
|
|
|
| - assembler.Bind(&if_smiorobjects);
|
| + Bind(&if_smiorobjects);
|
| {
|
| - Variable search_num(&assembler, MachineRepresentation::kFloat64);
|
| - Label ident_loop(&assembler, &index_var),
|
| - heap_num_loop(&assembler, &search_num),
|
| - string_loop(&assembler, &index_var), undef_loop(&assembler, &index_var),
|
| - not_smi(&assembler), not_heap_num(&assembler);
|
| -
|
| - assembler.GotoIfNot(assembler.TaggedIsSmi(search_element), ¬_smi);
|
| - search_num.Bind(assembler.SmiToFloat64(search_element));
|
| - assembler.Goto(&heap_num_loop);
|
| -
|
| - assembler.Bind(¬_smi);
|
| - assembler.GotoIf(assembler.WordEqual(search_element, undefined),
|
| - &undef_loop);
|
| - Node* map = assembler.LoadMap(search_element);
|
| - assembler.GotoIfNot(assembler.IsHeapNumberMap(map), ¬_heap_num);
|
| - search_num.Bind(assembler.LoadHeapNumberValue(search_element));
|
| - assembler.Goto(&heap_num_loop);
|
| -
|
| - assembler.Bind(¬_heap_num);
|
| - Node* search_type = assembler.LoadMapInstanceType(map);
|
| - assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop);
|
| - assembler.Goto(&ident_loop);
|
| -
|
| - assembler.Bind(&ident_loop);
|
| - {
|
| - assembler.GotoIfNot(
|
| - assembler.UintPtrLessThan(index_var.value(), len_var.value()),
|
| - &return_not_found);
|
| - Node* element_k =
|
| - assembler.LoadFixedArrayElement(elements, index_var.value());
|
| - assembler.GotoIf(assembler.WordEqual(element_k, search_element),
|
| - &return_found);
|
| -
|
| - index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| - assembler.Goto(&ident_loop);
|
| - }
|
| + Variable search_num(this, MachineRepresentation::kFloat64);
|
| + Label ident_loop(this, &index_var), heap_num_loop(this, &search_num),
|
| + string_loop(this, &index_var), not_smi(this), not_heap_num(this);
|
|
|
| - assembler.Bind(&undef_loop);
|
| + GotoIfNot(TaggedIsSmi(search_element), ¬_smi);
|
| + search_num.Bind(SmiToFloat64(search_element));
|
| + Goto(&heap_num_loop);
|
| +
|
| + Bind(¬_smi);
|
| + Node* map = LoadMap(search_element);
|
| + GotoIfNot(IsHeapNumberMap(map), ¬_heap_num);
|
| + search_num.Bind(LoadHeapNumberValue(search_element));
|
| + Goto(&heap_num_loop);
|
| +
|
| + Bind(¬_heap_num);
|
| + Node* search_type = LoadMapInstanceType(map);
|
| + GotoIf(IsStringInstanceType(search_type), &string_loop);
|
| + Goto(&ident_loop);
|
| +
|
| + Bind(&ident_loop);
|
| {
|
| - assembler.GotoIfNot(
|
| - assembler.UintPtrLessThan(index_var.value(), len_var.value()),
|
| - &return_not_found);
|
| - Node* element_k =
|
| - assembler.LoadFixedArrayElement(elements, index_var.value());
|
| - assembler.GotoIf(assembler.WordEqual(element_k, undefined),
|
| - &return_found);
|
| -
|
| - index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| - assembler.Goto(&undef_loop);
|
| + GotoIfNot(UintPtrLessThan(index_var.value(), len_var.value()),
|
| + &return_not_found);
|
| + Node* element_k = LoadFixedArrayElement(elements, index_var.value());
|
| + GotoIf(WordEqual(element_k, search_element), &return_found);
|
| +
|
| + index_var.Bind(IntPtrAdd(index_var.value(), intptr_one));
|
| + Goto(&ident_loop);
|
| }
|
|
|
| - assembler.Bind(&heap_num_loop);
|
| + Bind(&heap_num_loop);
|
| {
|
| - Label not_nan_loop(&assembler, &index_var);
|
| - assembler.BranchIfFloat64IsNaN(search_num.value(), &return_not_found,
|
| - ¬_nan_loop);
|
| + Label not_nan_loop(this, &index_var);
|
| + BranchIfFloat64IsNaN(search_num.value(), &return_not_found,
|
| + ¬_nan_loop);
|
|
|
| - assembler.Bind(¬_nan_loop);
|
| + Bind(¬_nan_loop);
|
| {
|
| - Label continue_loop(&assembler), not_smi(&assembler);
|
| - assembler.GotoIfNot(
|
| - assembler.UintPtrLessThan(index_var.value(), len_var.value()),
|
| - &return_not_found);
|
| - Node* element_k =
|
| - assembler.LoadFixedArrayElement(elements, index_var.value());
|
| - assembler.GotoIfNot(assembler.TaggedIsSmi(element_k), ¬_smi);
|
| - assembler.Branch(
|
| - assembler.Float64Equal(search_num.value(),
|
| - assembler.SmiToFloat64(element_k)),
|
| - &return_found, &continue_loop);
|
| -
|
| - assembler.Bind(¬_smi);
|
| - assembler.GotoIfNot(
|
| - assembler.IsHeapNumberMap(assembler.LoadMap(element_k)),
|
| - &continue_loop);
|
| - assembler.Branch(
|
| - assembler.Float64Equal(search_num.value(),
|
| - assembler.LoadHeapNumberValue(element_k)),
|
| - &return_found, &continue_loop);
|
| -
|
| - assembler.Bind(&continue_loop);
|
| - index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| - assembler.Goto(¬_nan_loop);
|
| + Label continue_loop(this), not_smi(this);
|
| + GotoIfNot(UintPtrLessThan(index_var.value(), len_var.value()),
|
| + &return_not_found);
|
| + Node* element_k = LoadFixedArrayElement(elements, index_var.value());
|
| + GotoIfNot(TaggedIsSmi(element_k), ¬_smi);
|
| + Branch(Float64Equal(search_num.value(), SmiToFloat64(element_k)),
|
| + &return_found, &continue_loop);
|
| +
|
| + Bind(¬_smi);
|
| + GotoIfNot(IsHeapNumber(element_k), &continue_loop);
|
| + Branch(Float64Equal(search_num.value(), LoadHeapNumberValue(element_k)),
|
| + &return_found, &continue_loop);
|
| +
|
| + Bind(&continue_loop);
|
| + index_var.Bind(IntPtrAdd(index_var.value(), intptr_one));
|
| + Goto(¬_nan_loop);
|
| }
|
| }
|
|
|
| - assembler.Bind(&string_loop);
|
| + Bind(&string_loop);
|
| {
|
| - Label continue_loop(&assembler);
|
| - assembler.GotoIfNot(
|
| - assembler.UintPtrLessThan(index_var.value(), len_var.value()),
|
| - &return_not_found);
|
| - Node* element_k =
|
| - assembler.LoadFixedArrayElement(elements, index_var.value());
|
| - assembler.GotoIf(assembler.TaggedIsSmi(element_k), &continue_loop);
|
| - assembler.GotoIfNot(
|
| - assembler.IsStringInstanceType(assembler.LoadInstanceType(element_k)),
|
| - &continue_loop);
|
| + Label continue_loop(this);
|
| + GotoIfNot(UintPtrLessThan(index_var.value(), len_var.value()),
|
| + &return_not_found);
|
| + Node* element_k = LoadFixedArrayElement(elements, index_var.value());
|
| + GotoIf(TaggedIsSmi(element_k), &continue_loop);
|
| + GotoIfNot(IsString(element_k), &continue_loop);
|
|
|
| // TODO(bmeurer): Consider inlining the StringEqual logic here.
|
| - Callable callable = CodeFactory::StringEqual(assembler.isolate());
|
| - Node* result =
|
| - assembler.CallStub(callable, context, search_element, element_k);
|
| - assembler.Branch(
|
| - assembler.WordEqual(assembler.BooleanConstant(true), result),
|
| - &return_found, &continue_loop);
|
| -
|
| - assembler.Bind(&continue_loop);
|
| - index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| - assembler.Goto(&string_loop);
|
| + Callable callable = CodeFactory::StringEqual(isolate());
|
| + Node* result = CallStub(callable, context, search_element, element_k);
|
| + Branch(WordEqual(BooleanConstant(true), result), &return_found,
|
| + &continue_loop);
|
| +
|
| + Bind(&continue_loop);
|
| + index_var.Bind(IntPtrAdd(index_var.value(), intptr_one));
|
| + Goto(&string_loop);
|
| }
|
| }
|
|
|
| - assembler.Bind(&if_packed_doubles);
|
| + Bind(&if_packed_doubles);
|
| {
|
| - Label not_nan_loop(&assembler, &index_var), search_notnan(&assembler);
|
| - Variable search_num(&assembler, MachineRepresentation::kFloat64);
|
| + Label not_nan_loop(this, &index_var), search_notnan(this);
|
| + Variable search_num(this, MachineRepresentation::kFloat64);
|
|
|
| - assembler.GotoIfNot(assembler.TaggedIsSmi(search_element), &search_notnan);
|
| - search_num.Bind(assembler.SmiToFloat64(search_element));
|
| - assembler.Goto(¬_nan_loop);
|
| + GotoIfNot(TaggedIsSmi(search_element), &search_notnan);
|
| + search_num.Bind(SmiToFloat64(search_element));
|
| + Goto(¬_nan_loop);
|
|
|
| - assembler.Bind(&search_notnan);
|
| - assembler.GotoIfNot(
|
| - assembler.IsHeapNumberMap(assembler.LoadMap(search_element)),
|
| - &return_not_found);
|
| + Bind(&search_notnan);
|
| + GotoIfNot(IsHeapNumber(search_element), &return_not_found);
|
|
|
| - search_num.Bind(assembler.LoadHeapNumberValue(search_element));
|
| + search_num.Bind(LoadHeapNumberValue(search_element));
|
|
|
| - assembler.BranchIfFloat64IsNaN(search_num.value(), &return_not_found,
|
| - ¬_nan_loop);
|
| + BranchIfFloat64IsNaN(search_num.value(), &return_not_found, ¬_nan_loop);
|
|
|
| // Search for HeapNumber
|
| - assembler.Bind(¬_nan_loop);
|
| + Bind(¬_nan_loop);
|
| {
|
| - Label continue_loop(&assembler);
|
| - assembler.GotoIfNot(
|
| - assembler.UintPtrLessThan(index_var.value(), len_var.value()),
|
| - &return_not_found);
|
| - Node* element_k = assembler.LoadFixedDoubleArrayElement(
|
| - elements, index_var.value(), MachineType::Float64());
|
| - assembler.Branch(assembler.Float64Equal(element_k, search_num.value()),
|
| - &return_found, &continue_loop);
|
| - assembler.Bind(&continue_loop);
|
| - index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| - assembler.Goto(¬_nan_loop);
|
| + GotoIfNot(UintPtrLessThan(index_var.value(), len_var.value()),
|
| + &return_not_found);
|
| + Node* element_k = LoadFixedDoubleArrayElement(elements, index_var.value(),
|
| + MachineType::Float64());
|
| + GotoIf(Float64Equal(element_k, search_num.value()), &return_found);
|
| +
|
| + index_var.Bind(IntPtrAdd(index_var.value(), intptr_one));
|
| + Goto(¬_nan_loop);
|
| }
|
| }
|
|
|
| - assembler.Bind(&if_holey_doubles);
|
| + Bind(&if_holey_doubles);
|
| {
|
| - Label not_nan_loop(&assembler, &index_var), search_notnan(&assembler);
|
| - Variable search_num(&assembler, MachineRepresentation::kFloat64);
|
| + Label not_nan_loop(this, &index_var), search_notnan(this);
|
| + Variable search_num(this, MachineRepresentation::kFloat64);
|
|
|
| - assembler.GotoIfNot(assembler.TaggedIsSmi(search_element), &search_notnan);
|
| - search_num.Bind(assembler.SmiToFloat64(search_element));
|
| - assembler.Goto(¬_nan_loop);
|
| + GotoIfNot(TaggedIsSmi(search_element), &search_notnan);
|
| + search_num.Bind(SmiToFloat64(search_element));
|
| + Goto(¬_nan_loop);
|
|
|
| - assembler.Bind(&search_notnan);
|
| - assembler.GotoIfNot(
|
| - assembler.IsHeapNumberMap(assembler.LoadMap(search_element)),
|
| - &return_not_found);
|
| + Bind(&search_notnan);
|
| + GotoIfNot(IsHeapNumber(search_element), &return_not_found);
|
|
|
| - search_num.Bind(assembler.LoadHeapNumberValue(search_element));
|
| + search_num.Bind(LoadHeapNumberValue(search_element));
|
|
|
| - assembler.BranchIfFloat64IsNaN(search_num.value(), &return_not_found,
|
| - ¬_nan_loop);
|
| + BranchIfFloat64IsNaN(search_num.value(), &return_not_found, ¬_nan_loop);
|
|
|
| // Search for HeapNumber
|
| - assembler.Bind(¬_nan_loop);
|
| + Bind(¬_nan_loop);
|
| {
|
| - Label continue_loop(&assembler);
|
| - assembler.GotoIfNot(
|
| - assembler.UintPtrLessThan(index_var.value(), len_var.value()),
|
| - &return_not_found);
|
| + Label continue_loop(this);
|
| + GotoIfNot(UintPtrLessThan(index_var.value(), len_var.value()),
|
| + &return_not_found);
|
|
|
| // Load double value or continue if it contains a double hole.
|
| - Node* element_k = assembler.LoadFixedDoubleArrayElement(
|
| + Node* element_k = LoadFixedDoubleArrayElement(
|
| elements, index_var.value(), MachineType::Float64(), 0,
|
| - CodeStubAssembler::INTPTR_PARAMETERS, &continue_loop);
|
| + INTPTR_PARAMETERS, &continue_loop);
|
|
|
| - assembler.Branch(assembler.Float64Equal(element_k, search_num.value()),
|
| - &return_found, &continue_loop);
|
| - assembler.Bind(&continue_loop);
|
| - index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| - assembler.Goto(¬_nan_loop);
|
| + Branch(Float64Equal(element_k, search_num.value()), &return_found,
|
| + &continue_loop);
|
| + Bind(&continue_loop);
|
| + index_var.Bind(IntPtrAdd(index_var.value(), intptr_one));
|
| + Goto(¬_nan_loop);
|
| }
|
| }
|
|
|
| - assembler.Bind(&return_found);
|
| - assembler.Return(assembler.SmiTag(index_var.value()));
|
| + Bind(&return_found);
|
| + Return(SmiTag(index_var.value()));
|
|
|
| - assembler.Bind(&return_not_found);
|
| - assembler.Return(assembler.NumberConstant(-1));
|
| + Bind(&return_not_found);
|
| + Return(NumberConstant(-1));
|
|
|
| - assembler.Bind(&call_runtime);
|
| - assembler.Return(assembler.CallRuntime(Runtime::kArrayIndexOf, context, array,
|
| - search_element, start_from));
|
| + Bind(&call_runtime);
|
| + Return(CallRuntime(Runtime::kArrayIndexOf, context, array, search_element,
|
| + start_from));
|
| }
|
|
|
| -namespace {
|
| -
|
| -template <IterationKind kIterationKind>
|
| -void Generate_ArrayPrototypeIterationMethod(
|
| - compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef CodeStubAssembler::Variable Variable;
|
| - CodeStubAssembler assembler(state);
|
| +class ArrayPrototypeIterationAssembler : public CodeStubAssembler {
|
| + public:
|
| + explicit ArrayPrototypeIterationAssembler(compiler::CodeAssemblerState* state)
|
| + : CodeStubAssembler(state) {}
|
|
|
| - Node* receiver = assembler.Parameter(0);
|
| - Node* context = assembler.Parameter(3);
|
| + protected:
|
| + void Generate_ArrayPrototypeIterationMethod(IterationKind iteration_kind) {
|
| + Node* receiver = Parameter(0);
|
| + Node* context = Parameter(3);
|
|
|
| - Variable var_array(&assembler, MachineRepresentation::kTagged);
|
| - Variable var_map(&assembler, MachineRepresentation::kTagged);
|
| - Variable var_type(&assembler, MachineRepresentation::kWord32);
|
| + Variable var_array(this, MachineRepresentation::kTagged);
|
| + Variable var_map(this, MachineRepresentation::kTagged);
|
| + Variable var_type(this, MachineRepresentation::kWord32);
|
|
|
| - Label if_isnotobject(&assembler, Label::kDeferred);
|
| - Label create_array_iterator(&assembler);
|
| + Label if_isnotobject(this, Label::kDeferred);
|
| + Label create_array_iterator(this);
|
|
|
| - assembler.GotoIf(assembler.TaggedIsSmi(receiver), &if_isnotobject);
|
| - var_array.Bind(receiver);
|
| - var_map.Bind(assembler.LoadMap(receiver));
|
| - var_type.Bind(assembler.LoadMapInstanceType(var_map.value()));
|
| - assembler.Branch(assembler.IsJSReceiverInstanceType(var_type.value()),
|
| - &create_array_iterator, &if_isnotobject);
|
| + GotoIf(TaggedIsSmi(receiver), &if_isnotobject);
|
| + var_array.Bind(receiver);
|
| + var_map.Bind(LoadMap(receiver));
|
| + var_type.Bind(LoadMapInstanceType(var_map.value()));
|
| + Branch(IsJSReceiverInstanceType(var_type.value()), &create_array_iterator,
|
| + &if_isnotobject);
|
|
|
| - assembler.Bind(&if_isnotobject);
|
| - {
|
| - Callable callable = CodeFactory::ToObject(assembler.isolate());
|
| - Node* result = assembler.CallStub(callable, context, receiver);
|
| - var_array.Bind(result);
|
| - var_map.Bind(assembler.LoadMap(result));
|
| - var_type.Bind(assembler.LoadMapInstanceType(var_map.value()));
|
| - assembler.Goto(&create_array_iterator);
|
| - }
|
| -
|
| - assembler.Bind(&create_array_iterator);
|
| - assembler.Return(
|
| - assembler.CreateArrayIterator(var_array.value(), var_map.value(),
|
| - var_type.value(), context, kIterationKind));
|
| -}
|
| + Bind(&if_isnotobject);
|
| + {
|
| + Callable callable = CodeFactory::ToObject(isolate());
|
| + Node* result = CallStub(callable, context, receiver);
|
| + var_array.Bind(result);
|
| + var_map.Bind(LoadMap(result));
|
| + var_type.Bind(LoadMapInstanceType(var_map.value()));
|
| + Goto(&create_array_iterator);
|
| + }
|
|
|
| -} // namespace
|
| + Bind(&create_array_iterator);
|
| + Return(CreateArrayIterator(var_array.value(), var_map.value(),
|
| + var_type.value(), context, iteration_kind));
|
| + }
|
| +};
|
|
|
| -void Builtins::Generate_ArrayPrototypeValues(
|
| - compiler::CodeAssemblerState* state) {
|
| - Generate_ArrayPrototypeIterationMethod<IterationKind::kValues>(state);
|
| +TF_BUILTIN(ArrayPrototypeValues, ArrayPrototypeIterationAssembler) {
|
| + Generate_ArrayPrototypeIterationMethod(IterationKind::kValues);
|
| }
|
|
|
| -void Builtins::Generate_ArrayPrototypeEntries(
|
| - compiler::CodeAssemblerState* state) {
|
| - Generate_ArrayPrototypeIterationMethod<IterationKind::kEntries>(state);
|
| +TF_BUILTIN(ArrayPrototypeEntries, ArrayPrototypeIterationAssembler) {
|
| + Generate_ArrayPrototypeIterationMethod(IterationKind::kEntries);
|
| }
|
|
|
| -void Builtins::Generate_ArrayPrototypeKeys(
|
| - compiler::CodeAssemblerState* state) {
|
| - Generate_ArrayPrototypeIterationMethod<IterationKind::kKeys>(state);
|
| +TF_BUILTIN(ArrayPrototypeKeys, ArrayPrototypeIterationAssembler) {
|
| + Generate_ArrayPrototypeIterationMethod(IterationKind::kKeys);
|
| }
|
|
|
| -void Builtins::Generate_ArrayIteratorPrototypeNext(
|
| - compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef CodeStubAssembler::Variable Variable;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Handle<String> operation = assembler.factory()->NewStringFromAsciiChecked(
|
| +TF_BUILTIN(ArrayIteratorPrototypeNext, CodeStubAssembler) {
|
| + Handle<String> operation = factory()->NewStringFromAsciiChecked(
|
| "Array Iterator.prototype.next", TENURED);
|
|
|
| - Node* iterator = assembler.Parameter(0);
|
| - Node* context = assembler.Parameter(3);
|
| + Node* iterator = Parameter(0);
|
| + Node* context = Parameter(3);
|
|
|
| - Variable var_value(&assembler, MachineRepresentation::kTagged);
|
| - Variable var_done(&assembler, MachineRepresentation::kTagged);
|
| + Variable var_value(this, MachineRepresentation::kTagged);
|
| + Variable var_done(this, MachineRepresentation::kTagged);
|
|
|
| // Required, or else `throw_bad_receiver` fails a DCHECK due to these
|
| // variables not being bound along all paths, despite not being used.
|
| - var_done.Bind(assembler.TrueConstant());
|
| - var_value.Bind(assembler.UndefinedConstant());
|
| + var_done.Bind(TrueConstant());
|
| + var_value.Bind(UndefinedConstant());
|
|
|
| - Label throw_bad_receiver(&assembler, Label::kDeferred);
|
| - Label set_done(&assembler);
|
| - Label allocate_key_result(&assembler);
|
| - Label allocate_entry_if_needed(&assembler);
|
| - Label allocate_iterator_result(&assembler);
|
| - Label generic_values(&assembler);
|
| + Label throw_bad_receiver(this, Label::kDeferred);
|
| + Label set_done(this);
|
| + Label allocate_key_result(this);
|
| + Label allocate_entry_if_needed(this);
|
| + Label allocate_iterator_result(this);
|
| + Label generic_values(this);
|
|
|
| // If O does not have all of the internal slots of an Array Iterator Instance
|
| // (22.1.5.3), throw a TypeError exception
|
| - assembler.GotoIf(assembler.TaggedIsSmi(iterator), &throw_bad_receiver);
|
| - Node* instance_type = assembler.LoadInstanceType(iterator);
|
| - assembler.GotoIf(
|
| - assembler.Uint32LessThan(
|
| - assembler.Int32Constant(LAST_ARRAY_ITERATOR_TYPE -
|
| - FIRST_ARRAY_ITERATOR_TYPE),
|
| - assembler.Int32Sub(instance_type, assembler.Int32Constant(
|
| - FIRST_ARRAY_ITERATOR_TYPE))),
|
| + GotoIf(TaggedIsSmi(iterator), &throw_bad_receiver);
|
| + Node* instance_type = LoadInstanceType(iterator);
|
| + GotoIf(
|
| + Uint32LessThan(
|
| + Int32Constant(LAST_ARRAY_ITERATOR_TYPE - FIRST_ARRAY_ITERATOR_TYPE),
|
| + Int32Sub(instance_type, Int32Constant(FIRST_ARRAY_ITERATOR_TYPE))),
|
| &throw_bad_receiver);
|
|
|
| // Let a be O.[[IteratedObject]].
|
| - Node* array = assembler.LoadObjectField(
|
| - iterator, JSArrayIterator::kIteratedObjectOffset);
|
| + Node* array =
|
| + LoadObjectField(iterator, JSArrayIterator::kIteratedObjectOffset);
|
|
|
| // Let index be O.[[ArrayIteratorNextIndex]].
|
| - Node* index =
|
| - assembler.LoadObjectField(iterator, JSArrayIterator::kNextIndexOffset);
|
| - Node* orig_map = assembler.LoadObjectField(
|
| - iterator, JSArrayIterator::kIteratedObjectMapOffset);
|
| - Node* array_map = assembler.LoadMap(array);
|
| + Node* index = LoadObjectField(iterator, JSArrayIterator::kNextIndexOffset);
|
| + Node* orig_map =
|
| + LoadObjectField(iterator, JSArrayIterator::kIteratedObjectMapOffset);
|
| + Node* array_map = LoadMap(array);
|
|
|
| - Label if_isfastarray(&assembler), if_isnotfastarray(&assembler),
|
| - if_isdetached(&assembler, Label::kDeferred);
|
| + Label if_isfastarray(this), if_isnotfastarray(this),
|
| + if_isdetached(this, Label::kDeferred);
|
|
|
| - assembler.Branch(assembler.WordEqual(orig_map, array_map), &if_isfastarray,
|
| - &if_isnotfastarray);
|
| + Branch(WordEqual(orig_map, array_map), &if_isfastarray, &if_isnotfastarray);
|
|
|
| - assembler.Bind(&if_isfastarray);
|
| + Bind(&if_isfastarray);
|
| {
|
| - CSA_ASSERT(&assembler,
|
| - assembler.Word32Equal(assembler.LoadMapInstanceType(array_map),
|
| - assembler.Int32Constant(JS_ARRAY_TYPE)));
|
| + CSA_ASSERT(this, Word32Equal(LoadMapInstanceType(array_map),
|
| + Int32Constant(JS_ARRAY_TYPE)));
|
|
|
| - Node* length = assembler.LoadObjectField(array, JSArray::kLengthOffset);
|
| + Node* length = LoadObjectField(array, JSArray::kLengthOffset);
|
|
|
| - CSA_ASSERT(&assembler, assembler.TaggedIsSmi(length));
|
| - CSA_ASSERT(&assembler, assembler.TaggedIsSmi(index));
|
| + CSA_ASSERT(this, TaggedIsSmi(length));
|
| + CSA_ASSERT(this, TaggedIsSmi(index));
|
|
|
| - assembler.GotoIfNot(assembler.SmiBelow(index, length), &set_done);
|
| + GotoIfNot(SmiBelow(index, length), &set_done);
|
|
|
| - Node* one = assembler.SmiConstant(Smi::FromInt(1));
|
| - assembler.StoreObjectFieldNoWriteBarrier(iterator,
|
| - JSArrayIterator::kNextIndexOffset,
|
| - assembler.SmiAdd(index, one));
|
| + Node* one = SmiConstant(Smi::FromInt(1));
|
| + StoreObjectFieldNoWriteBarrier(iterator, JSArrayIterator::kNextIndexOffset,
|
| + SmiAdd(index, one));
|
|
|
| - var_done.Bind(assembler.FalseConstant());
|
| - Node* elements = assembler.LoadElements(array);
|
| + var_done.Bind(FalseConstant());
|
| + Node* elements = LoadElements(array);
|
|
|
| static int32_t kInstanceType[] = {
|
| JS_FAST_ARRAY_KEY_ITERATOR_TYPE,
|
| @@ -2455,8 +2348,8 @@ void Builtins::Generate_ArrayIteratorPrototypeNext(
|
| JS_FAST_HOLEY_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE,
|
| };
|
|
|
| - Label packed_object_values(&assembler), holey_object_values(&assembler),
|
| - packed_double_values(&assembler), holey_double_values(&assembler);
|
| + Label packed_object_values(this), holey_object_values(this),
|
| + packed_double_values(this), holey_double_values(this);
|
| Label* kInstanceTypeHandlers[] = {
|
| &allocate_key_result, &packed_object_values, &holey_object_values,
|
| &packed_object_values, &holey_object_values, &packed_double_values,
|
| @@ -2464,192 +2357,164 @@ void Builtins::Generate_ArrayIteratorPrototypeNext(
|
| &packed_object_values, &holey_object_values, &packed_double_values,
|
| &holey_double_values};
|
|
|
| - assembler.Switch(instance_type, &throw_bad_receiver, kInstanceType,
|
| - kInstanceTypeHandlers, arraysize(kInstanceType));
|
| + Switch(instance_type, &throw_bad_receiver, kInstanceType,
|
| + kInstanceTypeHandlers, arraysize(kInstanceType));
|
|
|
| - assembler.Bind(&packed_object_values);
|
| + Bind(&packed_object_values);
|
| {
|
| - var_value.Bind(assembler.LoadFixedArrayElement(
|
| - elements, index, 0, CodeStubAssembler::SMI_PARAMETERS));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + var_value.Bind(LoadFixedArrayElement(elements, index, 0, SMI_PARAMETERS));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
|
|
| - assembler.Bind(&packed_double_values);
|
| + Bind(&packed_double_values);
|
| {
|
| - Node* value = assembler.LoadFixedDoubleArrayElement(
|
| - elements, index, MachineType::Float64(), 0,
|
| - CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.AllocateHeapNumberWithValue(value));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value = LoadFixedDoubleArrayElement(
|
| + elements, index, MachineType::Float64(), 0, SMI_PARAMETERS);
|
| + var_value.Bind(AllocateHeapNumberWithValue(value));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
|
|
| - assembler.Bind(&holey_object_values);
|
| + Bind(&holey_object_values);
|
| {
|
| // Check the array_protector cell, and take the slow path if it's invalid.
|
| - Node* invalid =
|
| - assembler.SmiConstant(Smi::FromInt(Isolate::kProtectorInvalid));
|
| - Node* cell = assembler.LoadRoot(Heap::kArrayProtectorRootIndex);
|
| - Node* cell_value =
|
| - assembler.LoadObjectField(cell, PropertyCell::kValueOffset);
|
| - assembler.GotoIf(assembler.WordEqual(cell_value, invalid),
|
| - &generic_values);
|
| -
|
| - var_value.Bind(assembler.UndefinedConstant());
|
| - Node* value = assembler.LoadFixedArrayElement(
|
| - elements, index, 0, CodeStubAssembler::SMI_PARAMETERS);
|
| - assembler.GotoIf(assembler.WordEqual(value, assembler.TheHoleConstant()),
|
| - &allocate_entry_if_needed);
|
| + Node* invalid = SmiConstant(Smi::FromInt(Isolate::kProtectorInvalid));
|
| + Node* cell = LoadRoot(Heap::kArrayProtectorRootIndex);
|
| + Node* cell_value = LoadObjectField(cell, PropertyCell::kValueOffset);
|
| + GotoIf(WordEqual(cell_value, invalid), &generic_values);
|
| +
|
| + var_value.Bind(UndefinedConstant());
|
| + Node* value = LoadFixedArrayElement(elements, index, 0, SMI_PARAMETERS);
|
| + GotoIf(WordEqual(value, TheHoleConstant()), &allocate_entry_if_needed);
|
| var_value.Bind(value);
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
|
|
| - assembler.Bind(&holey_double_values);
|
| + Bind(&holey_double_values);
|
| {
|
| // Check the array_protector cell, and take the slow path if it's invalid.
|
| - Node* invalid =
|
| - assembler.SmiConstant(Smi::FromInt(Isolate::kProtectorInvalid));
|
| - Node* cell = assembler.LoadRoot(Heap::kArrayProtectorRootIndex);
|
| - Node* cell_value =
|
| - assembler.LoadObjectField(cell, PropertyCell::kValueOffset);
|
| - assembler.GotoIf(assembler.WordEqual(cell_value, invalid),
|
| - &generic_values);
|
| -
|
| - var_value.Bind(assembler.UndefinedConstant());
|
| - Node* value = assembler.LoadFixedDoubleArrayElement(
|
| - elements, index, MachineType::Float64(), 0,
|
| - CodeStubAssembler::SMI_PARAMETERS, &allocate_entry_if_needed);
|
| - var_value.Bind(assembler.AllocateHeapNumberWithValue(value));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* invalid = SmiConstant(Smi::FromInt(Isolate::kProtectorInvalid));
|
| + Node* cell = LoadRoot(Heap::kArrayProtectorRootIndex);
|
| + Node* cell_value = LoadObjectField(cell, PropertyCell::kValueOffset);
|
| + GotoIf(WordEqual(cell_value, invalid), &generic_values);
|
| +
|
| + var_value.Bind(UndefinedConstant());
|
| + Node* value = LoadFixedDoubleArrayElement(
|
| + elements, index, MachineType::Float64(), 0, SMI_PARAMETERS,
|
| + &allocate_entry_if_needed);
|
| + var_value.Bind(AllocateHeapNumberWithValue(value));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| }
|
|
|
| - assembler.Bind(&if_isnotfastarray);
|
| + Bind(&if_isnotfastarray);
|
| {
|
| - Label if_istypedarray(&assembler), if_isgeneric(&assembler);
|
| + Label if_istypedarray(this), if_isgeneric(this);
|
|
|
| // If a is undefined, return CreateIterResultObject(undefined, true)
|
| - assembler.GotoIf(assembler.WordEqual(array, assembler.UndefinedConstant()),
|
| - &allocate_iterator_result);
|
| + GotoIf(WordEqual(array, UndefinedConstant()), &allocate_iterator_result);
|
|
|
| - Node* array_type = assembler.LoadInstanceType(array);
|
| - assembler.Branch(
|
| - assembler.Word32Equal(array_type,
|
| - assembler.Int32Constant(JS_TYPED_ARRAY_TYPE)),
|
| - &if_istypedarray, &if_isgeneric);
|
| + Node* array_type = LoadInstanceType(array);
|
| + Branch(Word32Equal(array_type, Int32Constant(JS_TYPED_ARRAY_TYPE)),
|
| + &if_istypedarray, &if_isgeneric);
|
|
|
| - assembler.Bind(&if_isgeneric);
|
| + Bind(&if_isgeneric);
|
| {
|
| - Label if_wasfastarray(&assembler);
|
| + Label if_wasfastarray(this);
|
|
|
| Node* length = nullptr;
|
| {
|
| - Variable var_length(&assembler, MachineRepresentation::kTagged);
|
| - Label if_isarray(&assembler), if_isnotarray(&assembler),
|
| - done(&assembler);
|
| - assembler.Branch(
|
| - assembler.Word32Equal(array_type,
|
| - assembler.Int32Constant(JS_ARRAY_TYPE)),
|
| - &if_isarray, &if_isnotarray);
|
| -
|
| - assembler.Bind(&if_isarray);
|
| + Variable var_length(this, MachineRepresentation::kTagged);
|
| + Label if_isarray(this), if_isnotarray(this), done(this);
|
| + Branch(Word32Equal(array_type, Int32Constant(JS_ARRAY_TYPE)),
|
| + &if_isarray, &if_isnotarray);
|
| +
|
| + Bind(&if_isarray);
|
| {
|
| - var_length.Bind(
|
| - assembler.LoadObjectField(array, JSArray::kLengthOffset));
|
| + var_length.Bind(LoadObjectField(array, JSArray::kLengthOffset));
|
|
|
| // Invalidate protector cell if needed
|
| - assembler.Branch(
|
| - assembler.WordNotEqual(orig_map, assembler.UndefinedConstant()),
|
| - &if_wasfastarray, &done);
|
| + Branch(WordNotEqual(orig_map, UndefinedConstant()), &if_wasfastarray,
|
| + &done);
|
|
|
| - assembler.Bind(&if_wasfastarray);
|
| + Bind(&if_wasfastarray);
|
| {
|
| - Label if_invalid(&assembler, Label::kDeferred);
|
| + Label if_invalid(this, Label::kDeferred);
|
| // A fast array iterator transitioned to a slow iterator during
|
| // iteration. Invalidate fast_array_iteration_prtoector cell to
|
| // prevent potential deopt loops.
|
| - assembler.StoreObjectFieldNoWriteBarrier(
|
| + StoreObjectFieldNoWriteBarrier(
|
| iterator, JSArrayIterator::kIteratedObjectMapOffset,
|
| - assembler.UndefinedConstant());
|
| - assembler.GotoIf(
|
| - assembler.Uint32LessThanOrEqual(
|
| - instance_type, assembler.Int32Constant(
|
| - JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE)),
|
| - &done);
|
| + UndefinedConstant());
|
| + GotoIf(Uint32LessThanOrEqual(
|
| + instance_type,
|
| + Int32Constant(JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE)),
|
| + &done);
|
|
|
| Node* invalid =
|
| - assembler.SmiConstant(Smi::FromInt(Isolate::kProtectorInvalid));
|
| - Node* cell =
|
| - assembler.LoadRoot(Heap::kFastArrayIterationProtectorRootIndex);
|
| - assembler.StoreObjectFieldNoWriteBarrier(cell, Cell::kValueOffset,
|
| - invalid);
|
| - assembler.Goto(&done);
|
| + SmiConstant(Smi::FromInt(Isolate::kProtectorInvalid));
|
| + Node* cell = LoadRoot(Heap::kFastArrayIterationProtectorRootIndex);
|
| + StoreObjectFieldNoWriteBarrier(cell, Cell::kValueOffset, invalid);
|
| + Goto(&done);
|
| }
|
| }
|
|
|
| - assembler.Bind(&if_isnotarray);
|
| + Bind(&if_isnotarray);
|
| {
|
| - Node* length_string = assembler.HeapConstant(
|
| - assembler.isolate()->factory()->length_string());
|
| - Callable get_property = CodeFactory::GetProperty(assembler.isolate());
|
| - Node* length =
|
| - assembler.CallStub(get_property, context, array, length_string);
|
| - Callable to_length = CodeFactory::ToLength(assembler.isolate());
|
| - var_length.Bind(assembler.CallStub(to_length, context, length));
|
| - assembler.Goto(&done);
|
| + Node* length_string = HeapConstant(factory()->length_string());
|
| + Callable get_property = CodeFactory::GetProperty(isolate());
|
| + Node* length = CallStub(get_property, context, array, length_string);
|
| + Callable to_length = CodeFactory::ToLength(isolate());
|
| + var_length.Bind(CallStub(to_length, context, length));
|
| + Goto(&done);
|
| }
|
|
|
| - assembler.Bind(&done);
|
| + Bind(&done);
|
| length = var_length.value();
|
| }
|
|
|
| - assembler.GotoUnlessNumberLessThan(index, length, &set_done);
|
| + GotoUnlessNumberLessThan(index, length, &set_done);
|
|
|
| - assembler.StoreObjectField(iterator, JSArrayIterator::kNextIndexOffset,
|
| - assembler.NumberInc(index));
|
| - var_done.Bind(assembler.FalseConstant());
|
| + StoreObjectField(iterator, JSArrayIterator::kNextIndexOffset,
|
| + NumberInc(index));
|
| + var_done.Bind(FalseConstant());
|
|
|
| - assembler.Branch(
|
| - assembler.Uint32LessThanOrEqual(
|
| - instance_type,
|
| - assembler.Int32Constant(JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE)),
|
| + Branch(
|
| + Uint32LessThanOrEqual(
|
| + instance_type, Int32Constant(JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE)),
|
| &allocate_key_result, &generic_values);
|
|
|
| - assembler.Bind(&generic_values);
|
| + Bind(&generic_values);
|
| {
|
| - Callable get_property = CodeFactory::GetProperty(assembler.isolate());
|
| - var_value.Bind(assembler.CallStub(get_property, context, array, index));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Callable get_property = CodeFactory::GetProperty(isolate());
|
| + var_value.Bind(CallStub(get_property, context, array, index));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| }
|
|
|
| - assembler.Bind(&if_istypedarray);
|
| + Bind(&if_istypedarray);
|
| {
|
| - Node* buffer =
|
| - assembler.LoadObjectField(array, JSTypedArray::kBufferOffset);
|
| - assembler.GotoIf(assembler.IsDetachedBuffer(buffer), &if_isdetached);
|
| + Node* buffer = LoadObjectField(array, JSTypedArray::kBufferOffset);
|
| + GotoIf(IsDetachedBuffer(buffer), &if_isdetached);
|
|
|
| - Node* length =
|
| - assembler.LoadObjectField(array, JSTypedArray::kLengthOffset);
|
| + Node* length = LoadObjectField(array, JSTypedArray::kLengthOffset);
|
|
|
| - CSA_ASSERT(&assembler, assembler.TaggedIsSmi(length));
|
| - CSA_ASSERT(&assembler, assembler.TaggedIsSmi(index));
|
| + CSA_ASSERT(this, TaggedIsSmi(length));
|
| + CSA_ASSERT(this, TaggedIsSmi(index));
|
|
|
| - assembler.GotoIfNot(assembler.SmiBelow(index, length), &set_done);
|
| + GotoIfNot(SmiBelow(index, length), &set_done);
|
|
|
| - Node* one = assembler.SmiConstant(1);
|
| - assembler.StoreObjectFieldNoWriteBarrier(
|
| - iterator, JSArrayIterator::kNextIndexOffset,
|
| - assembler.SmiAdd(index, one));
|
| - var_done.Bind(assembler.FalseConstant());
|
| + Node* one = SmiConstant(1);
|
| + StoreObjectFieldNoWriteBarrier(
|
| + iterator, JSArrayIterator::kNextIndexOffset, SmiAdd(index, one));
|
| + var_done.Bind(FalseConstant());
|
|
|
| - Node* elements = assembler.LoadElements(array);
|
| - Node* base_ptr = assembler.LoadObjectField(
|
| - elements, FixedTypedArrayBase::kBasePointerOffset);
|
| - Node* external_ptr = assembler.LoadObjectField(
|
| - elements, FixedTypedArrayBase::kExternalPointerOffset,
|
| - MachineType::Pointer());
|
| - Node* data_ptr = assembler.IntPtrAdd(
|
| - assembler.BitcastTaggedToWord(base_ptr), external_ptr);
|
| + Node* elements = LoadElements(array);
|
| + Node* base_ptr =
|
| + LoadObjectField(elements, FixedTypedArrayBase::kBasePointerOffset);
|
| + Node* external_ptr =
|
| + LoadObjectField(elements, FixedTypedArrayBase::kExternalPointerOffset,
|
| + MachineType::Pointer());
|
| + Node* data_ptr = IntPtrAdd(BitcastTaggedToWord(base_ptr), external_ptr);
|
|
|
| static int32_t kInstanceType[] = {
|
| JS_TYPED_ARRAY_KEY_ITERATOR_TYPE,
|
| @@ -2673,10 +2538,9 @@ void Builtins::Generate_ArrayIteratorPrototypeNext(
|
| JS_FLOAT64_ARRAY_VALUE_ITERATOR_TYPE,
|
| };
|
|
|
| - Label uint8_values(&assembler), int8_values(&assembler),
|
| - uint16_values(&assembler), int16_values(&assembler),
|
| - uint32_values(&assembler), int32_values(&assembler),
|
| - float32_values(&assembler), float64_values(&assembler);
|
| + Label uint8_values(this), int8_values(this), uint16_values(this),
|
| + int16_values(this), uint32_values(this), int32_values(this),
|
| + float32_values(this), float64_values(this);
|
| Label* kInstanceTypeHandlers[] = {
|
| &allocate_key_result, &uint8_values, &uint8_values,
|
| &int8_values, &uint16_values, &int16_values,
|
| @@ -2687,156 +2551,140 @@ void Builtins::Generate_ArrayIteratorPrototypeNext(
|
| &float64_values,
|
| };
|
|
|
| - var_done.Bind(assembler.FalseConstant());
|
| - assembler.Switch(instance_type, &throw_bad_receiver, kInstanceType,
|
| - kInstanceTypeHandlers, arraysize(kInstanceType));
|
| + var_done.Bind(FalseConstant());
|
| + Switch(instance_type, &throw_bad_receiver, kInstanceType,
|
| + kInstanceTypeHandlers, arraysize(kInstanceType));
|
|
|
| - assembler.Bind(&uint8_values);
|
| + Bind(&uint8_values);
|
| {
|
| - Node* value_uint8 = assembler.LoadFixedTypedArrayElement(
|
| - data_ptr, index, UINT8_ELEMENTS, CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.SmiFromWord32(value_uint8));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value_uint8 = LoadFixedTypedArrayElement(
|
| + data_ptr, index, UINT8_ELEMENTS, SMI_PARAMETERS);
|
| + var_value.Bind(SmiFromWord32(value_uint8));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| -
|
| - assembler.Bind(&int8_values);
|
| + Bind(&int8_values);
|
| {
|
| - Node* value_int8 = assembler.LoadFixedTypedArrayElement(
|
| - data_ptr, index, INT8_ELEMENTS, CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.SmiFromWord32(value_int8));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value_int8 = LoadFixedTypedArrayElement(
|
| + data_ptr, index, INT8_ELEMENTS, SMI_PARAMETERS);
|
| + var_value.Bind(SmiFromWord32(value_int8));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| -
|
| - assembler.Bind(&uint16_values);
|
| + Bind(&uint16_values);
|
| {
|
| - Node* value_uint16 = assembler.LoadFixedTypedArrayElement(
|
| - data_ptr, index, UINT16_ELEMENTS,
|
| - CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.SmiFromWord32(value_uint16));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value_uint16 = LoadFixedTypedArrayElement(
|
| + data_ptr, index, UINT16_ELEMENTS, SMI_PARAMETERS);
|
| + var_value.Bind(SmiFromWord32(value_uint16));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| -
|
| - assembler.Bind(&int16_values);
|
| + Bind(&int16_values);
|
| {
|
| - Node* value_int16 = assembler.LoadFixedTypedArrayElement(
|
| - data_ptr, index, INT16_ELEMENTS, CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.SmiFromWord32(value_int16));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value_int16 = LoadFixedTypedArrayElement(
|
| + data_ptr, index, INT16_ELEMENTS, SMI_PARAMETERS);
|
| + var_value.Bind(SmiFromWord32(value_int16));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| -
|
| - assembler.Bind(&uint32_values);
|
| + Bind(&uint32_values);
|
| {
|
| - Node* value_uint32 = assembler.LoadFixedTypedArrayElement(
|
| - data_ptr, index, UINT32_ELEMENTS,
|
| - CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.ChangeUint32ToTagged(value_uint32));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value_uint32 = LoadFixedTypedArrayElement(
|
| + data_ptr, index, UINT32_ELEMENTS, SMI_PARAMETERS);
|
| + var_value.Bind(ChangeUint32ToTagged(value_uint32));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| - assembler.Bind(&int32_values);
|
| + Bind(&int32_values);
|
| {
|
| - Node* value_int32 = assembler.LoadFixedTypedArrayElement(
|
| - data_ptr, index, INT32_ELEMENTS, CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.ChangeInt32ToTagged(value_int32));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value_int32 = LoadFixedTypedArrayElement(
|
| + data_ptr, index, INT32_ELEMENTS, SMI_PARAMETERS);
|
| + var_value.Bind(ChangeInt32ToTagged(value_int32));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| - assembler.Bind(&float32_values);
|
| + Bind(&float32_values);
|
| {
|
| - Node* value_float32 = assembler.LoadFixedTypedArrayElement(
|
| - data_ptr, index, FLOAT32_ELEMENTS,
|
| - CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.AllocateHeapNumberWithValue(
|
| - assembler.ChangeFloat32ToFloat64(value_float32)));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value_float32 = LoadFixedTypedArrayElement(
|
| + data_ptr, index, FLOAT32_ELEMENTS, SMI_PARAMETERS);
|
| + var_value.Bind(
|
| + AllocateHeapNumberWithValue(ChangeFloat32ToFloat64(value_float32)));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| - assembler.Bind(&float64_values);
|
| + Bind(&float64_values);
|
| {
|
| - Node* value_float64 = assembler.LoadFixedTypedArrayElement(
|
| - data_ptr, index, FLOAT64_ELEMENTS,
|
| - CodeStubAssembler::SMI_PARAMETERS);
|
| - var_value.Bind(assembler.AllocateHeapNumberWithValue(value_float64));
|
| - assembler.Goto(&allocate_entry_if_needed);
|
| + Node* value_float64 = LoadFixedTypedArrayElement(
|
| + data_ptr, index, FLOAT64_ELEMENTS, SMI_PARAMETERS);
|
| + var_value.Bind(AllocateHeapNumberWithValue(value_float64));
|
| + Goto(&allocate_entry_if_needed);
|
| }
|
| }
|
| }
|
|
|
| - assembler.Bind(&set_done);
|
| + Bind(&set_done);
|
| {
|
| - assembler.StoreObjectFieldNoWriteBarrier(
|
| - iterator, JSArrayIterator::kIteratedObjectOffset,
|
| - assembler.UndefinedConstant());
|
| - assembler.Goto(&allocate_iterator_result);
|
| + StoreObjectFieldNoWriteBarrier(
|
| + iterator, JSArrayIterator::kIteratedObjectOffset, UndefinedConstant());
|
| + Goto(&allocate_iterator_result);
|
| }
|
|
|
| - assembler.Bind(&allocate_key_result);
|
| + Bind(&allocate_key_result);
|
| {
|
| var_value.Bind(index);
|
| - var_done.Bind(assembler.FalseConstant());
|
| - assembler.Goto(&allocate_iterator_result);
|
| + var_done.Bind(FalseConstant());
|
| + Goto(&allocate_iterator_result);
|
| }
|
|
|
| - assembler.Bind(&allocate_entry_if_needed);
|
| + Bind(&allocate_entry_if_needed);
|
| {
|
| - assembler.GotoIf(
|
| - assembler.Int32GreaterThan(
|
| - instance_type,
|
| - assembler.Int32Constant(LAST_ARRAY_KEY_VALUE_ITERATOR_TYPE)),
|
| - &allocate_iterator_result);
|
| -
|
| - Node* elements = assembler.AllocateFixedArray(FAST_ELEMENTS,
|
| - assembler.IntPtrConstant(2));
|
| - assembler.StoreFixedArrayElement(elements, 0, index, SKIP_WRITE_BARRIER);
|
| - assembler.StoreFixedArrayElement(elements, 1, var_value.value(),
|
| - SKIP_WRITE_BARRIER);
|
| -
|
| - Node* entry = assembler.Allocate(JSArray::kSize);
|
| - Node* map =
|
| - assembler.LoadContextElement(assembler.LoadNativeContext(context),
|
| - Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX);
|
| -
|
| - assembler.StoreMapNoWriteBarrier(entry, map);
|
| - assembler.StoreObjectFieldRoot(entry, JSArray::kPropertiesOffset,
|
| - Heap::kEmptyFixedArrayRootIndex);
|
| - assembler.StoreObjectFieldNoWriteBarrier(entry, JSArray::kElementsOffset,
|
| - elements);
|
| - assembler.StoreObjectFieldNoWriteBarrier(
|
| - entry, JSArray::kLengthOffset, assembler.SmiConstant(Smi::FromInt(2)));
|
| + GotoIf(Int32GreaterThan(instance_type,
|
| + Int32Constant(LAST_ARRAY_KEY_VALUE_ITERATOR_TYPE)),
|
| + &allocate_iterator_result);
|
| +
|
| + Node* elements = AllocateFixedArray(FAST_ELEMENTS, IntPtrConstant(2));
|
| + StoreFixedArrayElement(elements, 0, index, SKIP_WRITE_BARRIER);
|
| + StoreFixedArrayElement(elements, 1, var_value.value(), SKIP_WRITE_BARRIER);
|
| +
|
| + Node* entry = Allocate(JSArray::kSize);
|
| + Node* map = LoadContextElement(LoadNativeContext(context),
|
| + Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX);
|
| +
|
| + StoreMapNoWriteBarrier(entry, map);
|
| + StoreObjectFieldRoot(entry, JSArray::kPropertiesOffset,
|
| + Heap::kEmptyFixedArrayRootIndex);
|
| + StoreObjectFieldNoWriteBarrier(entry, JSArray::kElementsOffset, elements);
|
| + StoreObjectFieldNoWriteBarrier(entry, JSArray::kLengthOffset,
|
| + SmiConstant(Smi::FromInt(2)));
|
|
|
| var_value.Bind(entry);
|
| - assembler.Goto(&allocate_iterator_result);
|
| + Goto(&allocate_iterator_result);
|
| }
|
|
|
| - assembler.Bind(&allocate_iterator_result);
|
| + Bind(&allocate_iterator_result);
|
| {
|
| - Node* result = assembler.Allocate(JSIteratorResult::kSize);
|
| - Node* map =
|
| - assembler.LoadContextElement(assembler.LoadNativeContext(context),
|
| - Context::ITERATOR_RESULT_MAP_INDEX);
|
| - assembler.StoreMapNoWriteBarrier(result, map);
|
| - assembler.StoreObjectFieldRoot(result, JSIteratorResult::kPropertiesOffset,
|
| - Heap::kEmptyFixedArrayRootIndex);
|
| - assembler.StoreObjectFieldRoot(result, JSIteratorResult::kElementsOffset,
|
| - Heap::kEmptyFixedArrayRootIndex);
|
| - assembler.StoreObjectFieldNoWriteBarrier(
|
| - result, JSIteratorResult::kValueOffset, var_value.value());
|
| - assembler.StoreObjectFieldNoWriteBarrier(
|
| - result, JSIteratorResult::kDoneOffset, var_done.value());
|
| - assembler.Return(result);
|
| - }
|
| -
|
| - assembler.Bind(&throw_bad_receiver);
|
| + Node* result = Allocate(JSIteratorResult::kSize);
|
| + Node* map = LoadContextElement(LoadNativeContext(context),
|
| + Context::ITERATOR_RESULT_MAP_INDEX);
|
| + StoreMapNoWriteBarrier(result, map);
|
| + StoreObjectFieldRoot(result, JSIteratorResult::kPropertiesOffset,
|
| + Heap::kEmptyFixedArrayRootIndex);
|
| + StoreObjectFieldRoot(result, JSIteratorResult::kElementsOffset,
|
| + Heap::kEmptyFixedArrayRootIndex);
|
| + StoreObjectFieldNoWriteBarrier(result, JSIteratorResult::kValueOffset,
|
| + var_value.value());
|
| + StoreObjectFieldNoWriteBarrier(result, JSIteratorResult::kDoneOffset,
|
| + var_done.value());
|
| + Return(result);
|
| + }
|
| +
|
| + Bind(&throw_bad_receiver);
|
| {
|
| // The {receiver} is not a valid JSArrayIterator.
|
| - assembler.CallRuntime(Runtime::kThrowIncompatibleMethodReceiver, context,
|
| - assembler.HeapConstant(operation), iterator);
|
| - assembler.Unreachable();
|
| + CallRuntime(Runtime::kThrowIncompatibleMethodReceiver, context,
|
| + HeapConstant(operation), iterator);
|
| + Unreachable();
|
| }
|
|
|
| - assembler.Bind(&if_isdetached);
|
| + Bind(&if_isdetached);
|
| {
|
| - Node* message = assembler.SmiConstant(MessageTemplate::kDetachedOperation);
|
| - assembler.CallRuntime(Runtime::kThrowTypeError, context, message,
|
| - assembler.HeapConstant(operation));
|
| - assembler.Unreachable();
|
| + Node* message = SmiConstant(MessageTemplate::kDetachedOperation);
|
| + CallRuntime(Runtime::kThrowTypeError, context, message,
|
| + HeapConstant(operation));
|
| + Unreachable();
|
| }
|
| }
|
|
|
|
|