diff options
Diffstat (limited to 'chromium/v8/src/builtins/builtins-regexp-gen.cc')
-rw-r--r-- | chromium/v8/src/builtins/builtins-regexp-gen.cc | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/chromium/v8/src/builtins/builtins-regexp-gen.cc b/chromium/v8/src/builtins/builtins-regexp-gen.cc index 23648efb98b..e59d2a00ac3 100644 --- a/chromium/v8/src/builtins/builtins-regexp-gen.cc +++ b/chromium/v8/src/builtins/builtins-regexp-gen.cc @@ -1014,6 +1014,12 @@ TF_BUILTIN(RegExpExecInternal, RegExpBuiltinsAssembler) { TNode<String> RegExpBuiltinsAssembler::FlagsGetter(TNode<Context> context, TNode<Object> regexp, bool is_fastpath) { + TVARIABLE(String, result); + Label runtime(this, Label::kDeferred), done(this, &result); + if (is_fastpath) { + GotoIfForceSlowPath(&runtime); + } + Isolate* isolate = this->isolate(); const TNode<IntPtrT> int_one = IntPtrConstant(1); @@ -1110,7 +1116,7 @@ TNode<String> RegExpBuiltinsAssembler::FlagsGetter(TNode<Context> context, // corresponding char for each set flag. { - const TNode<String> result = AllocateSeqOneByteString(var_length.value()); + const TNode<String> string = AllocateSeqOneByteString(var_length.value()); TVARIABLE(IntPtrT, var_offset, IntPtrConstant(SeqOneByteString::kHeaderSize - kHeapObjectTag)); @@ -1120,7 +1126,7 @@ TNode<String> RegExpBuiltinsAssembler::FlagsGetter(TNode<Context> context, Label next(this); \ GotoIfNot(IsSetWord(var_flags.value(), FLAG), &next); \ const TNode<Int32T> value = Int32Constant(CHAR); \ - StoreNoWriteBarrier(MachineRepresentation::kWord8, result, \ + StoreNoWriteBarrier(MachineRepresentation::kWord8, string, \ var_offset.value(), value); \ var_offset = IntPtrAdd(var_offset.value(), int_one); \ Goto(&next); \ @@ -1137,7 +1143,26 @@ TNode<String> RegExpBuiltinsAssembler::FlagsGetter(TNode<Context> context, CASE_FOR_FLAG(JSRegExp::kSticky, 'y'); #undef CASE_FOR_FLAG - return result; + if (is_fastpath) { +#ifdef V8_ENABLE_FORCE_SLOW_PATH + result = string; + Goto(&done); + + BIND(&runtime); + { + result = + CAST(CallRuntime(Runtime::kRegExpStringFromFlags, context, regexp)); + Goto(&done); + } + + BIND(&done); + return result.value(); +#else + return string; +#endif + } else { + return string; + } } } |