| 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 18 matching lines...) Expand all Loading... |
| 29 String::Handle(String::New(__FUNCTION__)), Heap::kOld)))))); | 29 String::Handle(String::New(__FUNCTION__)), Heap::kOld)))))); |
| 30 | 30 |
| 31 #define PRINT(arg) if (FLAG_trace_irregexp) { Print(arg); } | 31 #define PRINT(arg) if (FLAG_trace_irregexp) { Print(arg); } |
| 32 | 32 |
| 33 namespace dart { | 33 namespace dart { |
| 34 | 34 |
| 35 DEFINE_FLAG(bool, trace_irregexp, false, "Trace irregexps"); | 35 DEFINE_FLAG(bool, trace_irregexp, false, "Trace irregexps"); |
| 36 | 36 |
| 37 | 37 |
| 38 static const intptr_t kInvalidTryIndex = CatchClauseNode::kInvalidTryIndex; | 38 static const intptr_t kInvalidTryIndex = CatchClauseNode::kInvalidTryIndex; |
| 39 static const intptr_t kNoSourcePos = Scanner::kNoSourcePos; | 39 static const intptr_t kNoSourcePos = Token::kNoSourcePos; |
| 40 static const intptr_t kMinStackSize = 512; | 40 static const intptr_t kMinStackSize = 512; |
| 41 | 41 |
| 42 | 42 |
| 43 void PrintUtf16(uint16_t c) { | 43 void PrintUtf16(uint16_t c) { |
| 44 const char* format = (0x20 <= c && c <= 0x7F) ? | 44 const char* format = (0x20 <= c && c <= 0x7F) ? |
| 45 "%c" : (c <= 0xff) ? "\\x%02x" : "\\u%04x"; | 45 "%c" : (c <= 0xff) ? "\\x%02x" : "\\u%04x"; |
| 46 OS::Print(format, c); | 46 OS::Print(format, c); |
| 47 } | 47 } |
| 48 | 48 |
| 49 | 49 |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 desc.name, | 581 desc.name, |
| 582 desc.token_kind, | 582 desc.token_kind, |
| 583 arguments, | 583 arguments, |
| 584 Object::null_array(), | 584 Object::null_array(), |
| 585 desc.checked_argument_count, | 585 desc.checked_argument_count, |
| 586 ic_data_array_); | 586 ic_data_array_); |
| 587 } | 587 } |
| 588 | 588 |
| 589 | 589 |
| 590 LoadLocalInstr* IRRegExpMacroAssembler::LoadLocal(LocalVariable* local) const { | 590 LoadLocalInstr* IRRegExpMacroAssembler::LoadLocal(LocalVariable* local) const { |
| 591 return new(Z) LoadLocalInstr(*local); | 591 return new(Z) LoadLocalInstr(*local, kNoSourcePos); |
| 592 } | 592 } |
| 593 | 593 |
| 594 | 594 |
| 595 void IRRegExpMacroAssembler::StoreLocal(LocalVariable* local, | 595 void IRRegExpMacroAssembler::StoreLocal(LocalVariable* local, |
| 596 Value* value) { | 596 Value* value) { |
| 597 Do(new(Z) StoreLocalInstr(*local, value)); | 597 Do(new(Z) StoreLocalInstr(*local, value, kNoSourcePos)); |
| 598 } | 598 } |
| 599 | 599 |
| 600 | 600 |
| 601 void IRRegExpMacroAssembler::set_current_instruction(Instruction* instruction) { | 601 void IRRegExpMacroAssembler::set_current_instruction(Instruction* instruction) { |
| 602 current_instruction_ = instruction; | 602 current_instruction_ = instruction; |
| 603 } | 603 } |
| 604 | 604 |
| 605 | 605 |
| 606 Value* IRRegExpMacroAssembler::Bind(Definition* definition) { | 606 Value* IRRegExpMacroAssembler::Bind(Definition* definition) { |
| 607 AppendInstruction(definition); | 607 AppendInstruction(definition); |
| 608 definition->set_temp_index(temp_id_.Alloc()); | 608 definition->set_temp_index(temp_id_.Alloc()); |
| 609 | 609 |
| 610 return new(Z) Value(definition); | 610 return new(Z) Value(definition); |
| 611 } | 611 } |
| 612 | 612 |
| 613 | 613 |
| 614 void IRRegExpMacroAssembler::Do(Definition* definition) { | 614 void IRRegExpMacroAssembler::Do(Definition* definition) { |
| 615 AppendInstruction(definition); | 615 AppendInstruction(definition); |
| 616 } | 616 } |
| 617 | 617 |
| 618 | 618 |
| 619 Value* IRRegExpMacroAssembler::BindLoadLocal(const LocalVariable& local) { | 619 Value* IRRegExpMacroAssembler::BindLoadLocal(const LocalVariable& local) { |
| 620 if (local.IsConst()) { | 620 if (local.IsConst()) { |
| 621 return Bind(new(Z) ConstantInstr(*local.ConstValue())); | 621 return Bind(new(Z) ConstantInstr(*local.ConstValue())); |
| 622 } | 622 } |
| 623 ASSERT(!local.is_captured()); | 623 ASSERT(!local.is_captured()); |
| 624 return Bind(new(Z) LoadLocalInstr(local)); | 624 return Bind(new(Z) LoadLocalInstr(local, kNoSourcePos)); |
| 625 } | 625 } |
| 626 | 626 |
| 627 | 627 |
| 628 // In some cases, the V8 irregexp engine generates unreachable code by emitting | 628 // In some cases, the V8 irregexp engine generates unreachable code by emitting |
| 629 // a jmp not followed by a bind. We cannot do the same, since it is impossible | 629 // a jmp not followed by a bind. We cannot do the same, since it is impossible |
| 630 // to append to a block following a jmp. In such cases, assume that we are doing | 630 // to append to a block following a jmp. In such cases, assume that we are doing |
| 631 // the correct thing, but output a warning when tracing. | 631 // the correct thing, but output a warning when tracing. |
| 632 #define HANDLE_DEAD_CODE_EMISSION() \ | 632 #define HANDLE_DEAD_CODE_EMISSION() \ |
| 633 if (current_instruction_ == NULL) { \ | 633 if (current_instruction_ == NULL) { \ |
| 634 if (FLAG_trace_irregexp) { \ | 634 if (FLAG_trace_irregexp) { \ |
| (...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1917 } | 1917 } |
| 1918 | 1918 |
| 1919 // Here pattern_val might be untagged so this must not trigger a GC. | 1919 // Here pattern_val might be untagged so this must not trigger a GC. |
| 1920 Value* index_val = BindLoadLocal(*index); | 1920 Value* index_val = BindLoadLocal(*index); |
| 1921 | 1921 |
| 1922 return Bind(new(Z) LoadCodeUnitsInstr( | 1922 return Bind(new(Z) LoadCodeUnitsInstr( |
| 1923 pattern_val, | 1923 pattern_val, |
| 1924 index_val, | 1924 index_val, |
| 1925 characters, | 1925 characters, |
| 1926 specialization_cid_, | 1926 specialization_cid_, |
| 1927 Scanner::kNoSourcePos)); | 1927 kNoSourcePos)); |
| 1928 } | 1928 } |
| 1929 | 1929 |
| 1930 | 1930 |
| 1931 #undef __ | 1931 #undef __ |
| 1932 | 1932 |
| 1933 } // namespace dart | 1933 } // namespace dart |
| OLD | NEW |