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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Zone* zone) | 81 Zone* zone) |
82 : RegExpMacroAssembler(zone), | 82 : RegExpMacroAssembler(zone), |
83 thread_(Thread::Current()), | |
84 specialization_cid_(specialization_cid), | 83 specialization_cid_(specialization_cid), |
85 parsed_function_(parsed_function), | 84 parsed_function_(parsed_function), |
86 ic_data_array_(ic_data_array), | 85 ic_data_array_(ic_data_array), |
87 current_instruction_(NULL), | 86 current_instruction_(NULL), |
88 stack_(NULL), | 87 stack_(NULL), |
89 stack_pointer_(NULL), | 88 stack_pointer_(NULL), |
90 current_character_(NULL), | 89 current_character_(NULL), |
91 current_position_(NULL), | 90 current_position_(NULL), |
92 string_param_(NULL), | 91 string_param_(NULL), |
93 string_param_length_(NULL), | 92 string_param_length_(NULL), |
(...skipping 22 matching lines...) Expand all Loading... |
116 // backing is indirectly referred to so we can reuse it on subsequent matches | 115 // backing is indirectly referred to so we can reuse it on subsequent matches |
117 // even in the case where the backing has been enlarged and thus reallocated. | 116 // even in the case where the backing has been enlarged and thus reallocated. |
118 stack_array_cell_.SetAt( | 117 stack_array_cell_.SetAt( |
119 0, | 118 0, |
120 TypedData::Handle(zone, TypedData::New(kTypedDataInt32ArrayCid, | 119 TypedData::Handle(zone, TypedData::New(kTypedDataInt32ArrayCid, |
121 kMinStackSize / 4, Heap::kOld))); | 120 kMinStackSize / 4, Heap::kOld))); |
122 | 121 |
123 // Create and generate all preset blocks. | 122 // Create and generate all preset blocks. |
124 entry_block_ = new (zone) GraphEntryInstr( | 123 entry_block_ = new (zone) GraphEntryInstr( |
125 *parsed_function_, | 124 *parsed_function_, |
126 new (zone) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex, | 125 new (zone) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex), |
127 GetNextDeoptId()), | |
128 Compiler::kNoOSRDeoptId); | 126 Compiler::kNoOSRDeoptId); |
129 start_block_ = new (zone) | 127 start_block_ = new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex); |
130 JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 128 success_block_ = |
131 success_block_ = new (zone) | 129 new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex); |
132 JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 130 backtrack_block_ = |
133 backtrack_block_ = new (zone) | 131 new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex); |
134 JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 132 exit_block_ = new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex); |
135 exit_block_ = new (zone) | |
136 JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | |
137 | 133 |
138 GenerateEntryBlock(); | 134 GenerateEntryBlock(); |
139 GenerateSuccessBlock(); | 135 GenerateSuccessBlock(); |
140 GenerateExitBlock(); | 136 GenerateExitBlock(); |
141 | 137 |
142 blocks_.Add(entry_block_); | 138 blocks_.Add(entry_block_); |
143 blocks_.Add(entry_block_->normal_entry()); | 139 blocks_.Add(entry_block_->normal_entry()); |
144 blocks_.Add(start_block_); | 140 blocks_.Add(start_block_); |
145 blocks_.Add(success_block_); | 141 blocks_.Add(success_block_); |
146 blocks_.Add(backtrack_block_); | 142 blocks_.Add(backtrack_block_); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 } | 245 } |
250 | 246 |
251 | 247 |
252 void IRRegExpMacroAssembler::GenerateSuccessBlock() { | 248 void IRRegExpMacroAssembler::GenerateSuccessBlock() { |
253 set_current_instruction(success_block_); | 249 set_current_instruction(success_block_); |
254 TAG(); | 250 TAG(); |
255 | 251 |
256 Value* type = Bind(new (Z) ConstantInstr( | 252 Value* type = Bind(new (Z) ConstantInstr( |
257 TypeArguments::ZoneHandle(Z, TypeArguments::null()))); | 253 TypeArguments::ZoneHandle(Z, TypeArguments::null()))); |
258 Value* length = Bind(Uint64Constant(saved_registers_count_)); | 254 Value* length = Bind(Uint64Constant(saved_registers_count_)); |
259 Value* array = Bind(new (Z) CreateArrayInstr(TokenPosition::kNoSource, type, | 255 Value* array = |
260 length, GetNextDeoptId())); | 256 Bind(new (Z) CreateArrayInstr(TokenPosition::kNoSource, type, length)); |
261 StoreLocal(result_, array); | 257 StoreLocal(result_, array); |
262 | 258 |
263 // Store captured offsets in the `matches` parameter. | 259 // Store captured offsets in the `matches` parameter. |
264 for (intptr_t i = 0; i < saved_registers_count_; i++) { | 260 for (intptr_t i = 0; i < saved_registers_count_; i++) { |
265 PushArgumentInstr* matches_push = PushLocal(result_); | 261 PushArgumentInstr* matches_push = PushLocal(result_); |
266 PushArgumentInstr* index_push = PushArgument(Bind(Uint64Constant(i))); | 262 PushArgumentInstr* index_push = PushArgument(Bind(Uint64Constant(i))); |
267 | 263 |
268 // Convert negative offsets from the end of the string to string indices. | 264 // Convert negative offsets from the end of the string to string indices. |
269 // TODO(zerny): use positive offsets from the get-go. | 265 // TODO(zerny): use positive offsets from the get-go. |
270 PushArgumentInstr* offset_push = PushArgument(LoadRegister(i)); | 266 PushArgumentInstr* offset_push = PushArgument(LoadRegister(i)); |
271 PushArgumentInstr* len_push = PushLocal(string_param_length_); | 267 PushArgumentInstr* len_push = PushLocal(string_param_length_); |
272 PushArgumentInstr* value_push = | 268 PushArgumentInstr* value_push = |
273 PushArgument(Bind(Add(offset_push, len_push))); | 269 PushArgument(Bind(Add(offset_push, len_push))); |
274 | 270 |
275 Do(InstanceCall(InstanceCallDescriptor::FromToken(Token::kASSIGN_INDEX), | 271 Do(InstanceCall(InstanceCallDescriptor::FromToken(Token::kASSIGN_INDEX), |
276 matches_push, index_push, value_push)); | 272 matches_push, index_push, value_push)); |
277 } | 273 } |
278 | 274 |
279 // Print the result if tracing. | 275 // Print the result if tracing. |
280 PRINT(PushLocal(result_)); | 276 PRINT(PushLocal(result_)); |
281 | 277 |
282 // Return true on success. | 278 // Return true on success. |
283 AppendInstruction(new (Z) ReturnInstr( | 279 AppendInstruction( |
284 TokenPosition::kNoSource, Bind(LoadLocal(result_)), GetNextDeoptId())); | 280 new (Z) ReturnInstr(TokenPosition::kNoSource, Bind(LoadLocal(result_)))); |
285 } | 281 } |
286 | 282 |
287 | 283 |
288 void IRRegExpMacroAssembler::GenerateExitBlock() { | 284 void IRRegExpMacroAssembler::GenerateExitBlock() { |
289 set_current_instruction(exit_block_); | 285 set_current_instruction(exit_block_); |
290 TAG(); | 286 TAG(); |
291 | 287 |
292 // Return false on failure. | 288 // Return false on failure. |
293 AppendInstruction(new (Z) ReturnInstr( | 289 AppendInstruction( |
294 TokenPosition::kNoSource, Bind(LoadLocal(result_)), GetNextDeoptId())); | 290 new (Z) ReturnInstr(TokenPosition::kNoSource, Bind(LoadLocal(result_)))); |
295 } | 291 } |
296 | 292 |
297 | 293 |
298 void IRRegExpMacroAssembler::FinalizeRegistersArray() { | 294 void IRRegExpMacroAssembler::FinalizeRegistersArray() { |
299 ASSERT(registers_count_ >= saved_registers_count_); | 295 ASSERT(registers_count_ >= saved_registers_count_); |
300 registers_array_ = | 296 registers_array_ = |
301 TypedData::New(kTypedDataInt32ArrayCid, registers_count_, Heap::kOld); | 297 TypedData::New(kTypedDataInt32ArrayCid, registers_count_, Heap::kOld); |
302 } | 298 } |
303 | 299 |
304 | 300 |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 default: | 482 default: |
487 UNREACHABLE(); | 483 UNREACHABLE(); |
488 } | 484 } |
489 | 485 |
490 ASSERT(intermediate_operator != Token::kILLEGAL); | 486 ASSERT(intermediate_operator != Token::kILLEGAL); |
491 | 487 |
492 Value* lhs_value = Bind(InstanceCall( | 488 Value* lhs_value = Bind(InstanceCall( |
493 InstanceCallDescriptor::FromToken(intermediate_operator), lhs, rhs)); | 489 InstanceCallDescriptor::FromToken(intermediate_operator), lhs, rhs)); |
494 Value* rhs_value = Bind(BoolConstant(true)); | 490 Value* rhs_value = Bind(BoolConstant(true)); |
495 | 491 |
496 return new (Z) | 492 return new (Z) StrictCompareInstr(TokenPosition::kNoSource, strict_comparison, |
497 StrictCompareInstr(TokenPosition::kNoSource, strict_comparison, lhs_value, | 493 lhs_value, rhs_value, true); |
498 rhs_value, true, GetNextDeoptId()); | |
499 } | 494 } |
500 | 495 |
501 ComparisonInstr* IRRegExpMacroAssembler::Comparison(ComparisonKind kind, | 496 ComparisonInstr* IRRegExpMacroAssembler::Comparison(ComparisonKind kind, |
502 Definition* lhs, | 497 Definition* lhs, |
503 Definition* rhs) { | 498 Definition* rhs) { |
504 PushArgumentInstr* lhs_push = PushArgument(Bind(lhs)); | 499 PushArgumentInstr* lhs_push = PushArgument(Bind(lhs)); |
505 PushArgumentInstr* rhs_push = PushArgument(Bind(rhs)); | 500 PushArgumentInstr* rhs_push = PushArgument(Bind(rhs)); |
506 return Comparison(kind, lhs_push, rhs_push); | 501 return Comparison(kind, lhs_push, rhs_push); |
507 } | 502 } |
508 | 503 |
(...skipping 27 matching lines...) Expand all Loading... |
536 arguments->Add(arg2); | 531 arguments->Add(arg2); |
537 | 532 |
538 return StaticCall(function, arguments); | 533 return StaticCall(function, arguments); |
539 } | 534 } |
540 | 535 |
541 | 536 |
542 StaticCallInstr* IRRegExpMacroAssembler::StaticCall( | 537 StaticCallInstr* IRRegExpMacroAssembler::StaticCall( |
543 const Function& function, | 538 const Function& function, |
544 ZoneGrowableArray<PushArgumentInstr*>* arguments) const { | 539 ZoneGrowableArray<PushArgumentInstr*>* arguments) const { |
545 const intptr_t kTypeArgsLen = 0; | 540 const intptr_t kTypeArgsLen = 0; |
546 return new (Z) StaticCallInstr(TokenPosition::kNoSource, function, | 541 return new (Z) |
547 kTypeArgsLen, Object::null_array(), arguments, | 542 StaticCallInstr(TokenPosition::kNoSource, function, kTypeArgsLen, |
548 ic_data_array_, GetNextDeoptId()); | 543 Object::null_array(), arguments, ic_data_array_); |
549 } | 544 } |
550 | 545 |
551 | 546 |
552 InstanceCallInstr* IRRegExpMacroAssembler::InstanceCall( | 547 InstanceCallInstr* IRRegExpMacroAssembler::InstanceCall( |
553 const InstanceCallDescriptor& desc, | 548 const InstanceCallDescriptor& desc, |
554 PushArgumentInstr* arg1) const { | 549 PushArgumentInstr* arg1) const { |
555 ZoneGrowableArray<PushArgumentInstr*>* arguments = | 550 ZoneGrowableArray<PushArgumentInstr*>* arguments = |
556 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1); | 551 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1); |
557 arguments->Add(arg1); | 552 arguments->Add(arg1); |
558 | 553 |
(...skipping 26 matching lines...) Expand all Loading... |
585 arguments->Add(arg3); | 580 arguments->Add(arg3); |
586 | 581 |
587 return InstanceCall(desc, arguments); | 582 return InstanceCall(desc, arguments); |
588 } | 583 } |
589 | 584 |
590 | 585 |
591 InstanceCallInstr* IRRegExpMacroAssembler::InstanceCall( | 586 InstanceCallInstr* IRRegExpMacroAssembler::InstanceCall( |
592 const InstanceCallDescriptor& desc, | 587 const InstanceCallDescriptor& desc, |
593 ZoneGrowableArray<PushArgumentInstr*>* arguments) const { | 588 ZoneGrowableArray<PushArgumentInstr*>* arguments) const { |
594 const intptr_t kTypeArgsLen = 0; | 589 const intptr_t kTypeArgsLen = 0; |
595 return new (Z) InstanceCallInstr( | 590 return new (Z) |
596 TokenPosition::kNoSource, desc.name, desc.token_kind, arguments, | 591 InstanceCallInstr(TokenPosition::kNoSource, desc.name, desc.token_kind, |
597 kTypeArgsLen, Object::null_array(), desc.checked_argument_count, | 592 arguments, kTypeArgsLen, Object::null_array(), |
598 ic_data_array_, GetNextDeoptId()); | 593 desc.checked_argument_count, ic_data_array_); |
599 } | 594 } |
600 | 595 |
601 | 596 |
602 LoadLocalInstr* IRRegExpMacroAssembler::LoadLocal(LocalVariable* local) const { | 597 LoadLocalInstr* IRRegExpMacroAssembler::LoadLocal(LocalVariable* local) const { |
603 return new (Z) LoadLocalInstr(*local, TokenPosition::kNoSource); | 598 return new (Z) LoadLocalInstr(*local, TokenPosition::kNoSource); |
604 } | 599 } |
605 | 600 |
606 | 601 |
607 void IRRegExpMacroAssembler::StoreLocal(LocalVariable* local, Value* value) { | 602 void IRRegExpMacroAssembler::StoreLocal(LocalVariable* local, Value* value) { |
608 Do(new (Z) StoreLocalInstr(*local, value, TokenPosition::kNoSource)); | 603 Do(new (Z) StoreLocalInstr(*local, value, TokenPosition::kNoSource)); |
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1569 void IRRegExpMacroAssembler::CheckStackLimit() { | 1564 void IRRegExpMacroAssembler::CheckStackLimit() { |
1570 TAG(); | 1565 TAG(); |
1571 PushArgumentInstr* stack_push = PushLocal(stack_); | 1566 PushArgumentInstr* stack_push = PushLocal(stack_); |
1572 PushArgumentInstr* length_push = PushArgument( | 1567 PushArgumentInstr* length_push = PushArgument( |
1573 Bind(InstanceCall(InstanceCallDescriptor(String::ZoneHandle( | 1568 Bind(InstanceCall(InstanceCallDescriptor(String::ZoneHandle( |
1574 Field::GetterSymbol(Symbols::Length()))), | 1569 Field::GetterSymbol(Symbols::Length()))), |
1575 stack_push))); | 1570 stack_push))); |
1576 PushArgumentInstr* capacity_push = PushArgument(Bind(Sub( | 1571 PushArgumentInstr* capacity_push = PushArgument(Bind(Sub( |
1577 length_push, PushArgument(Bind(Uint64Constant(stack_limit_slack())))))); | 1572 length_push, PushArgument(Bind(Uint64Constant(stack_limit_slack())))))); |
1578 PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_); | 1573 PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_); |
1579 BranchInstr* branch = new (Z) BranchInstr( | 1574 BranchInstr* branch = |
1580 Comparison(kGT, capacity_push, stack_pointer_push), GetNextDeoptId()); | 1575 new (Z) BranchInstr(Comparison(kGT, capacity_push, stack_pointer_push)); |
1581 CloseBlockWith(branch); | 1576 CloseBlockWith(branch); |
1582 | 1577 |
1583 BlockLabel grow_stack; | 1578 BlockLabel grow_stack; |
1584 BlockLabel fallthrough; | 1579 BlockLabel fallthrough; |
1585 *branch->true_successor_address() = TargetWithJoinGoto(fallthrough.block()); | 1580 *branch->true_successor_address() = TargetWithJoinGoto(fallthrough.block()); |
1586 *branch->false_successor_address() = TargetWithJoinGoto(grow_stack.block()); | 1581 *branch->false_successor_address() = TargetWithJoinGoto(grow_stack.block()); |
1587 | 1582 |
1588 BindBlock(&grow_stack); | 1583 BindBlock(&grow_stack); |
1589 GrowStack(); | 1584 GrowStack(); |
1590 | 1585 |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1726 JoinEntryInstr* true_successor_block = backtrack_block_; | 1721 JoinEntryInstr* true_successor_block = backtrack_block_; |
1727 if (true_successor != NULL) { | 1722 if (true_successor != NULL) { |
1728 true_successor->SetLinked(); | 1723 true_successor->SetLinked(); |
1729 true_successor_block = true_successor->block(); | 1724 true_successor_block = true_successor->block(); |
1730 } | 1725 } |
1731 ASSERT(true_successor_block != NULL); | 1726 ASSERT(true_successor_block != NULL); |
1732 | 1727 |
1733 // If the condition is not true, fall through to a new block. | 1728 // If the condition is not true, fall through to a new block. |
1734 BlockLabel fallthrough; | 1729 BlockLabel fallthrough; |
1735 | 1730 |
1736 BranchInstr* branch = new (Z) BranchInstr(comparison, GetNextDeoptId()); | 1731 BranchInstr* branch = new (Z) BranchInstr(comparison); |
1737 *branch->true_successor_address() = TargetWithJoinGoto(true_successor_block); | 1732 *branch->true_successor_address() = TargetWithJoinGoto(true_successor_block); |
1738 *branch->false_successor_address() = TargetWithJoinGoto(fallthrough.block()); | 1733 *branch->false_successor_address() = TargetWithJoinGoto(fallthrough.block()); |
1739 | 1734 |
1740 CloseBlockWith(branch); | 1735 CloseBlockWith(branch); |
1741 BindBlock(&fallthrough); | 1736 BindBlock(&fallthrough); |
1742 } | 1737 } |
1743 | 1738 |
1744 | 1739 |
1745 TargetEntryInstr* IRRegExpMacroAssembler::TargetWithJoinGoto( | 1740 TargetEntryInstr* IRRegExpMacroAssembler::TargetWithJoinGoto( |
1746 JoinEntryInstr* dst) { | 1741 JoinEntryInstr* dst) { |
1747 TargetEntryInstr* target = new (Z) | 1742 TargetEntryInstr* target = |
1748 TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex, GetNextDeoptId()); | 1743 new (Z) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex); |
1749 blocks_.Add(target); | 1744 blocks_.Add(target); |
1750 | 1745 |
1751 target->AppendInstruction(new (Z) GotoInstr(dst, GetNextDeoptId())); | 1746 target->AppendInstruction(new (Z) GotoInstr(dst)); |
1752 | 1747 |
1753 return target; | 1748 return target; |
1754 } | 1749 } |
1755 | 1750 |
1756 | 1751 |
1757 IndirectEntryInstr* IRRegExpMacroAssembler::IndirectWithJoinGoto( | 1752 IndirectEntryInstr* IRRegExpMacroAssembler::IndirectWithJoinGoto( |
1758 JoinEntryInstr* dst) { | 1753 JoinEntryInstr* dst) { |
1759 IndirectEntryInstr* target = | 1754 IndirectEntryInstr* target = new (Z) IndirectEntryInstr( |
1760 new (Z) IndirectEntryInstr(block_id_.Alloc(), indirect_id_.Alloc(), | 1755 block_id_.Alloc(), indirect_id_.Alloc(), kInvalidTryIndex); |
1761 kInvalidTryIndex, GetNextDeoptId()); | |
1762 blocks_.Add(target); | 1756 blocks_.Add(target); |
1763 | 1757 |
1764 target->AppendInstruction(new (Z) GotoInstr(dst, GetNextDeoptId())); | 1758 target->AppendInstruction(new (Z) GotoInstr(dst)); |
1765 | 1759 |
1766 return target; | 1760 return target; |
1767 } | 1761 } |
1768 | 1762 |
1769 | 1763 |
1770 void IRRegExpMacroAssembler::CheckPreemption() { | 1764 void IRRegExpMacroAssembler::CheckPreemption() { |
1771 TAG(); | 1765 TAG(); |
1772 AppendInstruction(new (Z) CheckStackOverflowInstr(TokenPosition::kNoSource, 0, | 1766 AppendInstruction(new (Z) |
1773 GetNextDeoptId())); | 1767 CheckStackOverflowInstr(TokenPosition::kNoSource, 0)); |
1774 } | 1768 } |
1775 | 1769 |
1776 | 1770 |
1777 Definition* IRRegExpMacroAssembler::Add(PushArgumentInstr* lhs, | 1771 Definition* IRRegExpMacroAssembler::Add(PushArgumentInstr* lhs, |
1778 PushArgumentInstr* rhs) { | 1772 PushArgumentInstr* rhs) { |
1779 return InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD), lhs, rhs); | 1773 return InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD), lhs, rhs); |
1780 } | 1774 } |
1781 | 1775 |
1782 | 1776 |
1783 Definition* IRRegExpMacroAssembler::Sub(PushArgumentInstr* lhs, | 1777 Definition* IRRegExpMacroAssembler::Sub(PushArgumentInstr* lhs, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1852 | 1846 |
1853 return Bind(new (Z) LoadCodeUnitsInstr(pattern_val, index_val, characters, | 1847 return Bind(new (Z) LoadCodeUnitsInstr(pattern_val, index_val, characters, |
1854 specialization_cid_, | 1848 specialization_cid_, |
1855 TokenPosition::kNoSource)); | 1849 TokenPosition::kNoSource)); |
1856 } | 1850 } |
1857 | 1851 |
1858 | 1852 |
1859 #undef __ | 1853 #undef __ |
1860 | 1854 |
1861 } // namespace dart | 1855 } // namespace dart |
OLD | NEW |