| Index: src/builtins/builtins-regexp.cc
|
| diff --git a/src/builtins/builtins-regexp.cc b/src/builtins/builtins-regexp.cc
|
| index 4d8340d71ea3853d41bae497daf0b901d1cf36ed..f6ca8bb2c16a0c7e16dc537c130b731e5b2735de 100644
|
| --- a/src/builtins/builtins-regexp.cc
|
| +++ b/src/builtins/builtins-regexp.cc
|
| @@ -340,6 +340,33 @@ Node* RegExpBuiltinsAssembler::RegExpPrototypeExecBodyWithoutResult(
|
| return var_result.value();
|
| }
|
|
|
| +// Wrapper around RegExpPrototypeExecBody to reduce code duplication.
|
| +TF_BUILTIN(RegExpExecInternalFast, RegExpBuiltinsAssembler) {
|
| + typedef RegExpExecInternalDescriptor Descriptor;
|
| +
|
| + Node* const regexp = Parameter(Descriptor::kReceiver);
|
| + Node* const string = Parameter(Descriptor::kString);
|
| + Node* const context = Parameter(Descriptor::kContext);
|
| +
|
| + CSA_ASSERT(this, HasInstanceType(regexp, JS_REGEXP_TYPE));
|
| + CSA_ASSERT(this, IsString(string));
|
| +
|
| + Return(RegExpPrototypeExecBody(context, regexp, string, true));
|
| +}
|
| +
|
| +// Wrapper around RegExpPrototypeExecBody to reduce code duplication.
|
| +TF_BUILTIN(RegExpExecInternalSlow, RegExpBuiltinsAssembler) {
|
| + typedef RegExpExecInternalDescriptor Descriptor;
|
| +
|
| + Node* const regexp = Parameter(Descriptor::kReceiver);
|
| + Node* const string = Parameter(Descriptor::kString);
|
| + Node* const context = Parameter(Descriptor::kContext);
|
| +
|
| + CSA_ASSERT(this, IsString(string));
|
| +
|
| + Return(RegExpPrototypeExecBody(context, regexp, string, false));
|
| +}
|
| +
|
| // ES#sec-regexp.prototype.exec
|
| // RegExp.prototype.exec ( string )
|
| Node* RegExpBuiltinsAssembler::RegExpPrototypeExecBody(Node* const context,
|
| @@ -498,16 +525,14 @@ TF_BUILTIN(RegExpPrototypeExec, RegExpBuiltinsAssembler) {
|
|
|
| Bind(&if_isfastpath);
|
| {
|
| - Node* const result =
|
| - RegExpPrototypeExecBody(context, receiver, string, true);
|
| - Return(result);
|
| + Callable exec_callable = CodeFactory::RegExpExecInternal(isolate(), true);
|
| + Return(CallStub(exec_callable, context, receiver, string));
|
| }
|
|
|
| Bind(&if_isslowpath);
|
| {
|
| - Node* const result =
|
| - RegExpPrototypeExecBody(context, receiver, string, false);
|
| - Return(result);
|
| + Callable exec_callable = CodeFactory::RegExpExecInternal(isolate(), false);
|
| + Return(CallStub(exec_callable, context, receiver, string));
|
| }
|
| }
|
|
|
| @@ -1224,7 +1249,8 @@ Node* RegExpBuiltinsAssembler::RegExpExec(Node* context, Node* regexp,
|
|
|
| Bind(&if_isfastpath);
|
| {
|
| - Node* const result = RegExpPrototypeExecBody(context, regexp, string, true);
|
| + Callable exec_callable = CodeFactory::RegExpExecInternal(isolate, true);
|
| + Node* const result = CallStub(exec_callable, context, regexp, string);
|
| var_result.Bind(result);
|
| Goto(&out);
|
| }
|
| @@ -1266,8 +1292,8 @@ Node* RegExpBuiltinsAssembler::RegExpExec(Node* context, Node* regexp,
|
| ThrowIfNotInstanceType(context, regexp, JS_REGEXP_TYPE,
|
| "RegExp.prototype.exec");
|
|
|
| - Node* const result =
|
| - RegExpPrototypeExecBody(context, regexp, string, false);
|
| + Callable exec_callable = CodeFactory::RegExpExecInternal(isolate, false);
|
| + Node* const result = CallStub(exec_callable, context, regexp, string);
|
| var_result.Bind(result);
|
| Goto(&out);
|
| }
|
| @@ -1524,10 +1550,12 @@ void RegExpBuiltinsAssembler::RegExpPrototypeMatchBody(Node* const context,
|
|
|
| Bind(&if_isnotglobal);
|
| {
|
| - Node* const result =
|
| - is_fastpath ? RegExpPrototypeExecBody(context, regexp, string, true)
|
| - : RegExpExec(context, regexp, string);
|
| - Return(result);
|
| + if (is_fastpath) {
|
| + Callable exec_callable = CodeFactory::RegExpExecInternal(isolate, true);
|
| + Return(CallStub(exec_callable, context, regexp, string));
|
| + } else {
|
| + Return(RegExpExec(context, regexp, string));
|
| + }
|
| }
|
|
|
| Bind(&if_isglobal);
|
|
|