Index: runtime/vm/regexp_assembler_bytecode.cc |
diff --git a/runtime/vm/regexp_assembler_bytecode.cc b/runtime/vm/regexp_assembler_bytecode.cc |
index a67c37b9960006fd40d57fe902efb9e41913d87d..4f31fcfbbe42ce160ac56f3d6b926a985e8d2b87 100644 |
--- a/runtime/vm/regexp_assembler_bytecode.cc |
+++ b/runtime/vm/regexp_assembler_bytecode.cc |
@@ -457,11 +457,12 @@ void BytecodeRegExpMacroAssembler::Expand() { |
static intptr_t Prepare(const RegExp& regexp, |
const String& subject, |
+ bool sticky, |
Zone* zone) { |
bool is_one_byte = |
subject.IsOneByteString() || subject.IsExternalOneByteString(); |
- if (regexp.bytecode(is_one_byte) == TypedData::null()) { |
+ if (regexp.bytecode(is_one_byte, sticky) == TypedData::null()) { |
const String& pattern = String::Handle(zone, regexp.pattern()); |
#if !defined(PRODUCT) |
TimelineDurationScope tds(Thread::Current(), Timeline::GetCompilerStream(), |
@@ -486,13 +487,13 @@ static intptr_t Prepare(const RegExp& regexp, |
regexp.set_is_complex(); |
} |
- RegExpEngine::CompilationResult result = |
- RegExpEngine::CompileBytecode(compile_data, regexp, is_one_byte, zone); |
+ RegExpEngine::CompilationResult result = RegExpEngine::CompileBytecode( |
+ compile_data, regexp, is_one_byte, sticky, zone); |
ASSERT(result.bytecode != NULL); |
ASSERT((regexp.num_registers() == -1) || |
(regexp.num_registers() == result.num_registers)); |
regexp.set_num_registers(result.num_registers); |
- regexp.set_bytecode(is_one_byte, *(result.bytecode)); |
+ regexp.set_bytecode(is_one_byte, sticky, *(result.bytecode)); |
} |
ASSERT(regexp.num_registers() != -1); |
@@ -505,6 +506,7 @@ static intptr_t Prepare(const RegExp& regexp, |
static IrregexpInterpreter::IrregexpResult ExecRaw(const RegExp& regexp, |
const String& subject, |
intptr_t index, |
+ bool sticky, |
int32_t* output, |
intptr_t output_size, |
Zone* zone) { |
@@ -527,7 +529,7 @@ static IrregexpInterpreter::IrregexpResult ExecRaw(const RegExp& regexp, |
} |
const TypedData& bytecode = |
- TypedData::Handle(zone, regexp.bytecode(is_one_byte)); |
+ TypedData::Handle(zone, regexp.bytecode(is_one_byte, sticky)); |
ASSERT(!bytecode.IsNull()); |
IrregexpInterpreter::IrregexpResult result = |
IrregexpInterpreter::Match(bytecode, subject, raw_output, index, zone); |
@@ -551,8 +553,9 @@ static IrregexpInterpreter::IrregexpResult ExecRaw(const RegExp& regexp, |
RawInstance* BytecodeRegExpMacroAssembler::Interpret(const RegExp& regexp, |
const String& subject, |
const Smi& start_index, |
+ bool sticky, |
Zone* zone) { |
- intptr_t required_registers = Prepare(regexp, subject, zone); |
+ intptr_t required_registers = Prepare(regexp, subject, sticky, zone); |
if (required_registers < 0) { |
// Compiling failed with an exception. |
UNREACHABLE(); |
@@ -562,7 +565,7 @@ RawInstance* BytecodeRegExpMacroAssembler::Interpret(const RegExp& regexp, |
int32_t* output_registers = zone->Alloc<int32_t>(required_registers); |
IrregexpInterpreter::IrregexpResult result = |
- ExecRaw(regexp, subject, start_index.Value(), output_registers, |
+ ExecRaw(regexp, subject, start_index.Value(), sticky, output_registers, |
required_registers, zone); |
if (result == IrregexpInterpreter::RE_SUCCESS) { |