| OLD | NEW | 
|---|
| 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "vm/regexp_assembler_ir.h" | 5 #include "vm/regexp_assembler_ir.h" | 
| 6 | 6 | 
| 7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" | 
| 8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" | 
| 9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" | 
| 10 #include "vm/flow_graph_builder.h" | 10 #include "vm/flow_graph_builder.h" | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 71  * indices of -1 denote non-matched groups. Note that we store these indices | 71  * indices of -1 denote non-matched groups. Note that we store these indices | 
| 72  * as a negative offset from the end of the string in registers_array_ | 72  * as a negative offset from the end of the string in registers_array_ | 
| 73  * during processing, and convert them to standard indexes when copying them | 73  * during processing, and convert them to standard indexes when copying them | 
| 74  * to matches_param_ on successful match. | 74  * to matches_param_ on successful match. | 
| 75  */ | 75  */ | 
| 76 IRRegExpMacroAssembler::IRRegExpMacroAssembler( | 76 IRRegExpMacroAssembler::IRRegExpMacroAssembler( | 
| 77     intptr_t specialization_cid, | 77     intptr_t specialization_cid, | 
| 78     intptr_t capture_count, | 78     intptr_t capture_count, | 
| 79     const ParsedFunction* parsed_function, | 79     const ParsedFunction* parsed_function, | 
| 80     const ZoneGrowableArray<const ICData*>& ic_data_array, | 80     const ZoneGrowableArray<const ICData*>& ic_data_array, | 
| 81     intptr_t osr_id, |  | 
| 82     Zone* zone) | 81     Zone* zone) | 
| 83     : RegExpMacroAssembler(zone), | 82     : RegExpMacroAssembler(zone), | 
| 84       thread_(Thread::Current()), | 83       thread_(Thread::Current()), | 
| 85       specialization_cid_(specialization_cid), | 84       specialization_cid_(specialization_cid), | 
| 86       parsed_function_(parsed_function), | 85       parsed_function_(parsed_function), | 
| 87       ic_data_array_(ic_data_array), | 86       ic_data_array_(ic_data_array), | 
| 88       current_instruction_(NULL), | 87       current_instruction_(NULL), | 
| 89       stack_(NULL), | 88       stack_(NULL), | 
| 90       stack_pointer_(NULL), | 89       stack_pointer_(NULL), | 
| 91       current_character_(NULL), | 90       current_character_(NULL), | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 119   stack_array_cell_.SetAt( | 118   stack_array_cell_.SetAt( | 
| 120       0, | 119       0, | 
| 121       TypedData::Handle(zone, TypedData::New(kTypedDataInt32ArrayCid, | 120       TypedData::Handle(zone, TypedData::New(kTypedDataInt32ArrayCid, | 
| 122                                              kMinStackSize / 4, Heap::kOld))); | 121                                              kMinStackSize / 4, Heap::kOld))); | 
| 123 | 122 | 
| 124   // Create and generate all preset blocks. | 123   // Create and generate all preset blocks. | 
| 125   entry_block_ = new (zone) GraphEntryInstr( | 124   entry_block_ = new (zone) GraphEntryInstr( | 
| 126       *parsed_function_, | 125       *parsed_function_, | 
| 127       new (zone) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex, | 126       new (zone) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex, | 
| 128                                   GetNextDeoptId()), | 127                                   GetNextDeoptId()), | 
| 129       osr_id); | 128       Compiler::kNoOSRDeoptId); | 
| 130   start_block_ = new (zone) | 129   start_block_ = new (zone) | 
| 131       JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 130       JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 
| 132   success_block_ = new (zone) | 131   success_block_ = new (zone) | 
| 133       JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 132       JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 
| 134   backtrack_block_ = new (zone) | 133   backtrack_block_ = new (zone) | 
| 135       JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 134       JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 
| 136   exit_block_ = new (zone) | 135   exit_block_ = new (zone) | 
| 137       JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 136       JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 
| 138 | 137 | 
| 139   GenerateEntryBlock(); | 138   GenerateEntryBlock(); | 
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 217   StoreLocal(stack_pointer_, Bind(Int64Constant(-1))); | 216   StoreLocal(stack_pointer_, Bind(Int64Constant(-1))); | 
| 218 | 217 | 
| 219   // Jump to the start block. | 218   // Jump to the start block. | 
| 220   current_instruction_->Goto(start_block_); | 219   current_instruction_->Goto(start_block_); | 
| 221 } | 220 } | 
| 222 | 221 | 
| 223 | 222 | 
| 224 void IRRegExpMacroAssembler::GenerateBacktrackBlock() { | 223 void IRRegExpMacroAssembler::GenerateBacktrackBlock() { | 
| 225   set_current_instruction(backtrack_block_); | 224   set_current_instruction(backtrack_block_); | 
| 226   TAG(); | 225   TAG(); | 
| 227   CheckPreemption(/*is_backtrack=*/true); | 226   CheckPreemption(); | 
| 228 | 227 | 
| 229   const intptr_t entries_count = entry_block_->indirect_entries().length(); | 228   const intptr_t entries_count = entry_block_->indirect_entries().length(); | 
| 230 | 229 | 
| 231   TypedData& offsets = TypedData::ZoneHandle( | 230   TypedData& offsets = TypedData::ZoneHandle( | 
| 232       Z, TypedData::New(kTypedDataInt32ArrayCid, entries_count, Heap::kOld)); | 231       Z, TypedData::New(kTypedDataInt32ArrayCid, entries_count, Heap::kOld)); | 
| 233 | 232 | 
| 234   PushArgumentInstr* block_offsets_push = | 233   PushArgumentInstr* block_offsets_push = | 
| 235       PushArgument(Bind(new (Z) ConstantInstr(offsets))); | 234       PushArgument(Bind(new (Z) ConstantInstr(offsets))); | 
| 236   PushArgumentInstr* block_id_push = PushArgument(Bind(PopStack())); | 235   PushArgumentInstr* block_id_push = PushArgument(Bind(PopStack())); | 
| 237 | 236 | 
| (...skipping 1523 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1761       new (Z) IndirectEntryInstr(block_id_.Alloc(), indirect_id_.Alloc(), | 1760       new (Z) IndirectEntryInstr(block_id_.Alloc(), indirect_id_.Alloc(), | 
| 1762                                  kInvalidTryIndex, GetNextDeoptId()); | 1761                                  kInvalidTryIndex, GetNextDeoptId()); | 
| 1763   blocks_.Add(target); | 1762   blocks_.Add(target); | 
| 1764 | 1763 | 
| 1765   target->AppendInstruction(new (Z) GotoInstr(dst, GetNextDeoptId())); | 1764   target->AppendInstruction(new (Z) GotoInstr(dst, GetNextDeoptId())); | 
| 1766 | 1765 | 
| 1767   return target; | 1766   return target; | 
| 1768 } | 1767 } | 
| 1769 | 1768 | 
| 1770 | 1769 | 
| 1771 void IRRegExpMacroAssembler::CheckPreemption(bool is_backtrack) { | 1770 void IRRegExpMacroAssembler::CheckPreemption() { | 
| 1772   TAG(); | 1771   TAG(); | 
| 1773 | 1772   AppendInstruction(new (Z) CheckStackOverflowInstr(TokenPosition::kNoSource, 0, | 
| 1774   // We don't have the loop_depth available when compiling regexps, but | 1773                                                     GetNextDeoptId())); | 
| 1775   // we set loop_depth to a non-zero value because this instruction does |  | 
| 1776   // not act as an OSR entry outside loops. |  | 
| 1777   AppendInstruction(new (Z) CheckStackOverflowInstr( |  | 
| 1778       TokenPosition::kNoSource, |  | 
| 1779       /*loop_depth=*/1, GetNextDeoptId(), |  | 
| 1780       is_backtrack ? CheckStackOverflowInstr::kOsrAndPreemption |  | 
| 1781                    : CheckStackOverflowInstr::kOsrOnly)); |  | 
| 1782 } | 1774 } | 
| 1783 | 1775 | 
| 1784 | 1776 | 
| 1785 Definition* IRRegExpMacroAssembler::Add(PushArgumentInstr* lhs, | 1777 Definition* IRRegExpMacroAssembler::Add(PushArgumentInstr* lhs, | 
| 1786                                         PushArgumentInstr* rhs) { | 1778                                         PushArgumentInstr* rhs) { | 
| 1787   return InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD), lhs, rhs); | 1779   return InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD), lhs, rhs); | 
| 1788 } | 1780 } | 
| 1789 | 1781 | 
| 1790 | 1782 | 
| 1791 Definition* IRRegExpMacroAssembler::Sub(PushArgumentInstr* lhs, | 1783 Definition* IRRegExpMacroAssembler::Sub(PushArgumentInstr* lhs, | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1860 | 1852 | 
| 1861   return Bind(new (Z) LoadCodeUnitsInstr(pattern_val, index_val, characters, | 1853   return Bind(new (Z) LoadCodeUnitsInstr(pattern_val, index_val, characters, | 
| 1862                                          specialization_cid_, | 1854                                          specialization_cid_, | 
| 1863                                          TokenPosition::kNoSource)); | 1855                                          TokenPosition::kNoSource)); | 
| 1864 } | 1856 } | 
| 1865 | 1857 | 
| 1866 | 1858 | 
| 1867 #undef __ | 1859 #undef __ | 
| 1868 | 1860 | 
| 1869 }  // namespace dart | 1861 }  // namespace dart | 
| OLD | NEW | 
|---|