| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index f69cfe37f7e191e5f3857b4250283e7c4b4eb72d..8d0317cff70f65b09f812074799a91cac2efd03d 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -1238,6 +1238,16 @@ Node* CodeStubAssembler::LoadStringLength(Node* object) {
|
| return LoadObjectField(object, String::kLengthOffset);
|
| }
|
|
|
| +Node* CodeStubAssembler::PointerToSeqStringData(Node* seq_string) {
|
| + CSA_ASSERT(this, IsString(seq_string));
|
| + CSA_ASSERT(this,
|
| + IsSequentialStringInstanceType(LoadInstanceType(seq_string)));
|
| + STATIC_ASSERT(SeqOneByteString::kHeaderSize == SeqTwoByteString::kHeaderSize);
|
| + return IntPtrAdd(
|
| + BitcastTaggedToWord(seq_string),
|
| + IntPtrConstant(SeqOneByteString::kHeaderSize - kHeapObjectTag));
|
| +}
|
| +
|
| Node* CodeStubAssembler::LoadJSValueValue(Node* object) {
|
| CSA_ASSERT(this, IsJSValue(object));
|
| return LoadObjectField(object, JSValue::kValueOffset);
|
| @@ -3656,12 +3666,13 @@ Node* CodeStubAssembler::SubString(Node* context, Node* string, Node* from,
|
| }
|
|
|
| ToDirectStringAssembler::ToDirectStringAssembler(
|
| - compiler::CodeAssemblerState* state, Node* string)
|
| + compiler::CodeAssemblerState* state, Node* string, Flags flags)
|
| : CodeStubAssembler(state),
|
| var_string_(this, MachineRepresentation::kTagged, string),
|
| var_instance_type_(this, MachineRepresentation::kWord32),
|
| var_offset_(this, MachineType::PointerRepresentation()),
|
| - var_is_external_(this, MachineRepresentation::kWord32) {
|
| + var_is_external_(this, MachineRepresentation::kWord32),
|
| + flags_(flags) {
|
| CSA_ASSERT(this, TaggedIsNotSmi(string));
|
| CSA_ASSERT(this, IsString(string));
|
|
|
| @@ -3718,16 +3729,20 @@ Node* ToDirectStringAssembler::TryToDirect(Label* if_bailout) {
|
| // Sliced string. Fetch parent and correct start index by offset.
|
| BIND(&if_issliced);
|
| {
|
| - Node* const string = var_string_.value();
|
| - Node* const sliced_offset =
|
| - LoadAndUntagObjectField(string, SlicedString::kOffsetOffset);
|
| - var_offset_.Bind(IntPtrAdd(var_offset_.value(), sliced_offset));
|
| + if (flags_ & kDontUnpackSlicedStrings) {
|
| + Goto(if_bailout);
|
| + } else {
|
| + Node* const string = var_string_.value();
|
| + Node* const sliced_offset =
|
| + LoadAndUntagObjectField(string, SlicedString::kOffsetOffset);
|
| + var_offset_.Bind(IntPtrAdd(var_offset_.value(), sliced_offset));
|
|
|
| - Node* const parent = LoadObjectField(string, SlicedString::kParentOffset);
|
| - var_string_.Bind(parent);
|
| - var_instance_type_.Bind(LoadInstanceType(parent));
|
| + Node* const parent = LoadObjectField(string, SlicedString::kParentOffset);
|
| + var_string_.Bind(parent);
|
| + var_instance_type_.Bind(LoadInstanceType(parent));
|
|
|
| - Goto(&dispatch);
|
| + Goto(&dispatch);
|
| + }
|
| }
|
|
|
| // Thin string. Fetch the actual string.
|
|
|