Index: src/code-stub-assembler.cc |
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
index 8b006713bbeaa18d40b1e75158fd3a0387c87cfd..de1ee8cd782496e1e3b1d1a930cbe3efdabc8493 100644 |
--- a/src/code-stub-assembler.cc |
+++ b/src/code-stub-assembler.cc |
@@ -3544,7 +3544,9 @@ Node* AllocAndCopyStringCharacters(CodeStubAssembler* a, Node* context, |
} // namespace |
Node* CodeStubAssembler::SubString(Node* context, Node* string, Node* from, |
- Node* to) { |
+ Node* to, SubStringFlags flags) { |
+ DCHECK(flags == SubStringFlags::NONE || |
+ flags == SubStringFlags::FROM_TO_ARE_BOUNDED); |
VARIABLE(var_result, MachineRepresentation::kTagged); |
ToDirectStringAssembler to_direct(state(), string); |
Label end(this), runtime(this); |
@@ -3555,8 +3557,10 @@ Node* CodeStubAssembler::SubString(Node* context, Node* string, Node* from, |
// Make sure that both from and to are non-negative smis. |
- GotoIfNot(TaggedIsPositiveSmi(from), &runtime); |
- GotoIfNot(TaggedIsPositiveSmi(to), &runtime); |
+ if (flags == SubStringFlags::NONE) { |
+ GotoIfNot(TaggedIsPositiveSmi(from), &runtime); |
jgruber
2017/05/11 08:57:41
We should assert the conditions otherwise, same be
mvstanton
2017/05/12 11:00:43
Done.
|
+ GotoIfNot(TaggedIsPositiveSmi(to), &runtime); |
+ } |
Node* const substr_length = SmiSub(to, from); |
Node* const string_length = LoadStringLength(string); |
@@ -3657,8 +3661,10 @@ Node* CodeStubAssembler::SubString(Node* context, Node* string, Node* from, |
BIND(&original_string_or_invalid_length); |
{ |
- // Longer than original string's length or negative: unsafe arguments. |
- GotoIf(SmiAbove(substr_length, string_length), &runtime); |
+ if (flags == SubStringFlags::NONE) { |
+ // Longer than original string's length or negative: unsafe arguments. |
+ GotoIf(SmiAbove(substr_length, string_length), &runtime); |
+ } |
// Equal length - check if {from, to} == {0, str.length}. |
GotoIf(SmiAbove(from, SmiConstant(Smi::kZero)), &runtime); |