| Index: src/builtins/builtins-regexp-gen.cc
|
| diff --git a/src/builtins/builtins-regexp-gen.cc b/src/builtins/builtins-regexp-gen.cc
|
| index d1fb9e82f193276867951be555e5d52635a59507..a675c483f4f042a483f68f31d5d3c7470455bd87 100644
|
| --- a/src/builtins/builtins-regexp-gen.cc
|
| +++ b/src/builtins/builtins-regexp-gen.cc
|
| @@ -306,9 +306,16 @@ Node* RegExpBuiltinsAssembler::RegExpExecInternal(Node* const context,
|
|
|
| Node* const smi_string_length = LoadStringLength(string);
|
|
|
| - // Bail out to runtime for invalid {last_index} values.
|
| - GotoIfNot(TaggedIsSmi(last_index), &runtime);
|
| - GotoIf(SmiAboveOrEqual(last_index, smi_string_length), &runtime);
|
| + // At this point, last_index is definitely a canonicalized non-negative
|
| + // number, which implies that any non-Smi last_index is greater than
|
| + // the maximal string length. If lastIndex > string.length then the matcher
|
| + // must fail.
|
| +
|
| + Label if_failure(this);
|
| + CSA_ASSERT(this, IsNumberNormalized(last_index));
|
| + CSA_ASSERT(this, IsNumberPositive(last_index));
|
| + GotoIfNot(TaggedIsSmi(last_index), &if_failure); // Outside Smi range.
|
| + GotoIf(SmiGreaterThan(last_index, smi_string_length), &if_failure);
|
|
|
| // Load the irregexp code object and offsets into the subject string. Both
|
| // depend on whether the string is one- or two-byte.
|
| @@ -358,8 +365,7 @@ Node* RegExpBuiltinsAssembler::RegExpExecInternal(Node* const context,
|
| GotoIf(TaggedIsSmi(code), &runtime);
|
| CSA_ASSERT(this, HasInstanceType(code, CODE_TYPE));
|
|
|
| - Label if_success(this), if_failure(this),
|
| - if_exception(this, Label::kDeferred);
|
| + Label if_success(this), if_exception(this, Label::kDeferred);
|
| {
|
| IncrementCounter(isolate()->counters()->regexp_entry_native(), 1);
|
|
|
|
|