| Index: runtime/vm/regexp_assembler_ir.cc
|
| diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
|
| index 23aa5233dbe01031e5dc5203010783022abec3d9..2bdc701b8315cd222701a57599d7709d829dae86 100644
|
| --- a/runtime/vm/regexp_assembler_ir.cc
|
| +++ b/runtime/vm/regexp_assembler_ir.cc
|
| @@ -80,6 +80,7 @@ IRRegExpMacroAssembler::IRRegExpMacroAssembler(
|
| const ZoneGrowableArray<const ICData*>& ic_data_array,
|
| Zone* zone)
|
| : RegExpMacroAssembler(zone),
|
| + thread_(Thread::Current()),
|
| specialization_cid_(specialization_cid),
|
| parsed_function_(parsed_function),
|
| ic_data_array_(ic_data_array),
|
| @@ -122,14 +123,17 @@ IRRegExpMacroAssembler::IRRegExpMacroAssembler(
|
| // Create and generate all preset blocks.
|
| entry_block_ = new (zone) GraphEntryInstr(
|
| *parsed_function_,
|
| - new (zone) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex),
|
| + new (zone) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex,
|
| + GetNextDeoptId()),
|
| Compiler::kNoOSRDeoptId);
|
| - start_block_ = new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
|
| - success_block_ =
|
| - new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
|
| - backtrack_block_ =
|
| - new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
|
| - exit_block_ = new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
|
| + start_block_ = new (zone)
|
| + JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId());
|
| + success_block_ = new (zone)
|
| + JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId());
|
| + backtrack_block_ = new (zone)
|
| + JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId());
|
| + exit_block_ = new (zone)
|
| + JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId());
|
|
|
| GenerateEntryBlock();
|
| GenerateSuccessBlock();
|
| @@ -252,8 +256,8 @@ void IRRegExpMacroAssembler::GenerateSuccessBlock() {
|
| Value* type = Bind(new (Z) ConstantInstr(
|
| TypeArguments::ZoneHandle(Z, TypeArguments::null())));
|
| Value* length = Bind(Uint64Constant(saved_registers_count_));
|
| - Value* array =
|
| - Bind(new (Z) CreateArrayInstr(TokenPosition::kNoSource, type, length));
|
| + Value* array = Bind(new (Z) CreateArrayInstr(TokenPosition::kNoSource, type,
|
| + length, GetNextDeoptId()));
|
| StoreLocal(result_, array);
|
|
|
| // Store captured offsets in the `matches` parameter.
|
| @@ -276,8 +280,8 @@ void IRRegExpMacroAssembler::GenerateSuccessBlock() {
|
| PRINT(PushLocal(result_));
|
|
|
| // Return true on success.
|
| - AppendInstruction(
|
| - new (Z) ReturnInstr(TokenPosition::kNoSource, Bind(LoadLocal(result_))));
|
| + AppendInstruction(new (Z) ReturnInstr(
|
| + TokenPosition::kNoSource, Bind(LoadLocal(result_)), GetNextDeoptId()));
|
| }
|
|
|
|
|
| @@ -286,8 +290,8 @@ void IRRegExpMacroAssembler::GenerateExitBlock() {
|
| TAG();
|
|
|
| // Return false on failure.
|
| - AppendInstruction(
|
| - new (Z) ReturnInstr(TokenPosition::kNoSource, Bind(LoadLocal(result_))));
|
| + AppendInstruction(new (Z) ReturnInstr(
|
| + TokenPosition::kNoSource, Bind(LoadLocal(result_)), GetNextDeoptId()));
|
| }
|
|
|
|
|
| @@ -489,8 +493,9 @@ ComparisonInstr* IRRegExpMacroAssembler::Comparison(ComparisonKind kind,
|
| InstanceCallDescriptor::FromToken(intermediate_operator), lhs, rhs));
|
| Value* rhs_value = Bind(BoolConstant(true));
|
|
|
| - return new (Z) StrictCompareInstr(TokenPosition::kNoSource, strict_comparison,
|
| - lhs_value, rhs_value, true);
|
| + return new (Z)
|
| + StrictCompareInstr(TokenPosition::kNoSource, strict_comparison, lhs_value,
|
| + rhs_value, true, GetNextDeoptId());
|
| }
|
|
|
| ComparisonInstr* IRRegExpMacroAssembler::Comparison(ComparisonKind kind,
|
| @@ -538,9 +543,9 @@ StaticCallInstr* IRRegExpMacroAssembler::StaticCall(
|
| const Function& function,
|
| ZoneGrowableArray<PushArgumentInstr*>* arguments) const {
|
| const intptr_t kTypeArgsLen = 0;
|
| - return new (Z)
|
| - StaticCallInstr(TokenPosition::kNoSource, function, kTypeArgsLen,
|
| - Object::null_array(), arguments, ic_data_array_);
|
| + return new (Z) StaticCallInstr(TokenPosition::kNoSource, function,
|
| + kTypeArgsLen, Object::null_array(), arguments,
|
| + ic_data_array_, GetNextDeoptId());
|
| }
|
|
|
|
|
| @@ -587,10 +592,10 @@ InstanceCallInstr* IRRegExpMacroAssembler::InstanceCall(
|
| const InstanceCallDescriptor& desc,
|
| ZoneGrowableArray<PushArgumentInstr*>* arguments) const {
|
| const intptr_t kTypeArgsLen = 0;
|
| - return new (Z)
|
| - InstanceCallInstr(TokenPosition::kNoSource, desc.name, desc.token_kind,
|
| - arguments, kTypeArgsLen, Object::null_array(),
|
| - desc.checked_argument_count, ic_data_array_);
|
| + return new (Z) InstanceCallInstr(
|
| + TokenPosition::kNoSource, desc.name, desc.token_kind, arguments,
|
| + kTypeArgsLen, Object::null_array(), desc.checked_argument_count,
|
| + ic_data_array_, GetNextDeoptId());
|
| }
|
|
|
|
|
| @@ -1571,8 +1576,8 @@ void IRRegExpMacroAssembler::CheckStackLimit() {
|
| PushArgumentInstr* capacity_push = PushArgument(Bind(Sub(
|
| length_push, PushArgument(Bind(Uint64Constant(stack_limit_slack()))))));
|
| PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
|
| - BranchInstr* branch =
|
| - new (Z) BranchInstr(Comparison(kGT, capacity_push, stack_pointer_push));
|
| + BranchInstr* branch = new (Z) BranchInstr(
|
| + Comparison(kGT, capacity_push, stack_pointer_push), GetNextDeoptId());
|
| CloseBlockWith(branch);
|
|
|
| BlockLabel grow_stack;
|
| @@ -1728,7 +1733,7 @@ void IRRegExpMacroAssembler::BranchOrBacktrack(ComparisonInstr* comparison,
|
| // If the condition is not true, fall through to a new block.
|
| BlockLabel fallthrough;
|
|
|
| - BranchInstr* branch = new (Z) BranchInstr(comparison);
|
| + BranchInstr* branch = new (Z) BranchInstr(comparison, GetNextDeoptId());
|
| *branch->true_successor_address() = TargetWithJoinGoto(true_successor_block);
|
| *branch->false_successor_address() = TargetWithJoinGoto(fallthrough.block());
|
|
|
| @@ -1739,11 +1744,11 @@ void IRRegExpMacroAssembler::BranchOrBacktrack(ComparisonInstr* comparison,
|
|
|
| TargetEntryInstr* IRRegExpMacroAssembler::TargetWithJoinGoto(
|
| JoinEntryInstr* dst) {
|
| - TargetEntryInstr* target =
|
| - new (Z) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
|
| + TargetEntryInstr* target = new (Z)
|
| + TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId());
|
| blocks_.Add(target);
|
|
|
| - target->AppendInstruction(new (Z) GotoInstr(dst));
|
| + target->AppendInstruction(new (Z) GotoInstr(dst, GetNextDeoptId()));
|
|
|
| return target;
|
| }
|
| @@ -1751,11 +1756,12 @@ TargetEntryInstr* IRRegExpMacroAssembler::TargetWithJoinGoto(
|
|
|
| IndirectEntryInstr* IRRegExpMacroAssembler::IndirectWithJoinGoto(
|
| JoinEntryInstr* dst) {
|
| - IndirectEntryInstr* target = new (Z) IndirectEntryInstr(
|
| - block_id_.Alloc(), indirect_id_.Alloc(), kInvalidTryIndex);
|
| + IndirectEntryInstr* target =
|
| + new (Z) IndirectEntryInstr(block_id_.Alloc(), indirect_id_.Alloc(),
|
| + kInvalidTryIndex, GetNextDeoptId());
|
| blocks_.Add(target);
|
|
|
| - target->AppendInstruction(new (Z) GotoInstr(dst));
|
| + target->AppendInstruction(new (Z) GotoInstr(dst, GetNextDeoptId()));
|
|
|
| return target;
|
| }
|
| @@ -1763,8 +1769,8 @@ IndirectEntryInstr* IRRegExpMacroAssembler::IndirectWithJoinGoto(
|
|
|
| void IRRegExpMacroAssembler::CheckPreemption() {
|
| TAG();
|
| - AppendInstruction(new (Z)
|
| - CheckStackOverflowInstr(TokenPosition::kNoSource, 0));
|
| + AppendInstruction(new (Z) CheckStackOverflowInstr(TokenPosition::kNoSource, 0,
|
| + GetNextDeoptId()));
|
| }
|
|
|
|
|
|
|