| Index: src/code-stub-assembler.h
|
| diff --git a/src/code-stub-assembler.h b/src/code-stub-assembler.h
|
| index 538d548af89dcdb07d4eeaf044b8c99a751866ea..5139f402fe3009b5c06d73e55242dc861e5bb699 100644
|
| --- a/src/code-stub-assembler.h
|
| +++ b/src/code-stub-assembler.h
|
| @@ -692,6 +692,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
|
| Node* IsSpecialReceiverInstanceType(Node* instance_type);
|
| Node* IsStringInstanceType(Node* instance_type);
|
| Node* IsOneByteStringInstanceType(Node* instance_type);
|
| + Node* IsExternalStringInstanceType(Node* instance_type);
|
| + Node* IsShortExternalStringInstanceType(Node* instance_type);
|
| Node* IsSequentialStringInstanceType(Node* instance_type);
|
| Node* IsString(Node* object);
|
| Node* IsJSObject(Node* object);
|
| @@ -738,14 +740,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
|
| Node* StringAdd(Node* context, Node* first, Node* second,
|
| AllocationFlags flags = kNone);
|
|
|
| - // Tries to unpack |string| into a pseudo-sequential string. For instance,
|
| - // In addition to the work done by TryDerefExternalString and
|
| - // MaybeDerefIndirectString, this method can also unpack sliced strings into
|
| - // a (string, offset) pair. The same GC restrictions on the returned string
|
| - // value apply as for TryDerefExternalString.
|
| - void TryUnpackString(Variable* var_string, Variable* var_offset,
|
| - Variable* var_instance_type, Label* if_bailout);
|
| -
|
| // Unpack the external string, returning a pointer that (offset-wise) looks
|
| // like a sequential string.
|
| // Note that this pointer is not tagged and does not point to a real
|
| @@ -1399,6 +1393,42 @@ class CodeStubArguments {
|
| Node* fp_;
|
| };
|
|
|
| +class ToDirectStringAssembler : public CodeStubAssembler {
|
| + private:
|
| + enum StringPointerKind { PTR_TO_DATA, PTR_TO_STRING };
|
| +
|
| + public:
|
| + explicit ToDirectStringAssembler(compiler::CodeAssemblerState* state,
|
| + Node* string);
|
| +
|
| + // Converts flat cons, thin, and sliced strings and returns the direct
|
| + // string. The result can be either a sequential or external string.
|
| + Node* TryToDirect(Label* if_bailout);
|
| +
|
| + // Returns a pointer to the beginning of the string data.
|
| + Node* PointerToData(Label* if_bailout) {
|
| + return TryToSequential(PTR_TO_DATA, if_bailout);
|
| + }
|
| +
|
| + // Returns a pointer that, offset-wise, looks like a String.
|
| + Node* PointerToString(Label* if_bailout) {
|
| + return TryToSequential(PTR_TO_STRING, if_bailout);
|
| + }
|
| +
|
| + Node* string() { return var_string_.value(); }
|
| + Node* instance_type() { return var_instance_type_.value(); }
|
| + Node* offset() { return var_offset_.value(); }
|
| + Node* is_external() { return var_is_external_.value(); }
|
| +
|
| + private:
|
| + Node* TryToSequential(StringPointerKind ptr_kind, Label* if_bailout);
|
| +
|
| + Variable var_string_;
|
| + Variable var_instance_type_;
|
| + Variable var_offset_;
|
| + Variable var_is_external_;
|
| +};
|
| +
|
| #ifdef DEBUG
|
| #define CSA_ASSERT(csa, x) \
|
| (csa)->Assert([&] { return (x); }, #x, __FILE__, __LINE__)
|
|
|