OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/full-codegen/full-codegen.h" | 5 #include "src/full-codegen/full-codegen.h" |
6 | 6 |
7 #include "src/ast/ast-numbering.h" | 7 #include "src/ast/ast-numbering.h" |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/prettyprinter.h" | 9 #include "src/ast/prettyprinter.h" |
10 #include "src/ast/scopeinfo.h" | 10 #include "src/ast/scopeinfo.h" |
11 #include "src/ast/scopes.h" | 11 #include "src/ast/scopes.h" |
12 #include "src/code-factory.h" | 12 #include "src/code-factory.h" |
13 #include "src/codegen.h" | 13 #include "src/codegen.h" |
14 #include "src/compiler.h" | 14 #include "src/compiler.h" |
15 #include "src/debug/debug.h" | 15 #include "src/debug/debug.h" |
16 #include "src/debug/liveedit.h" | 16 #include "src/debug/liveedit.h" |
17 #include "src/frames-inl.h" | 17 #include "src/frames-inl.h" |
| 18 #include "src/globals.h" |
18 #include "src/isolate-inl.h" | 19 #include "src/isolate-inl.h" |
19 #include "src/macro-assembler.h" | 20 #include "src/macro-assembler.h" |
20 #include "src/snapshot/snapshot.h" | 21 #include "src/snapshot/snapshot.h" |
21 #include "src/tracing/trace-event.h" | 22 #include "src/tracing/trace-event.h" |
22 | 23 |
23 namespace v8 { | 24 namespace v8 { |
24 namespace internal { | 25 namespace internal { |
25 | 26 |
26 #define __ ACCESS_MASM(masm()) | 27 #define __ ACCESS_MASM(masm()) |
27 | 28 |
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 | 594 |
594 void FullCodeGenerator::EmitHasProperty() { | 595 void FullCodeGenerator::EmitHasProperty() { |
595 Callable callable = CodeFactory::HasProperty(isolate()); | 596 Callable callable = CodeFactory::HasProperty(isolate()); |
596 PopOperand(callable.descriptor().GetRegisterParameter(1)); | 597 PopOperand(callable.descriptor().GetRegisterParameter(1)); |
597 PopOperand(callable.descriptor().GetRegisterParameter(0)); | 598 PopOperand(callable.descriptor().GetRegisterParameter(0)); |
598 __ Call(callable.code(), RelocInfo::CODE_TARGET); | 599 __ Call(callable.code(), RelocInfo::CODE_TARGET); |
599 RestoreContext(); | 600 RestoreContext(); |
600 } | 601 } |
601 | 602 |
602 void FullCodeGenerator::RecordStatementPosition(int pos) { | 603 void FullCodeGenerator::RecordStatementPosition(int pos) { |
603 DCHECK_NE(RelocInfo::kNoPosition, pos); | 604 DCHECK_NE(kNoSourcePosition, pos); |
604 source_position_table_builder_.AddPosition(masm_->pc_offset(), pos, true); | 605 source_position_table_builder_.AddPosition(masm_->pc_offset(), pos, true); |
605 } | 606 } |
606 | 607 |
607 void FullCodeGenerator::RecordPosition(int pos) { | 608 void FullCodeGenerator::RecordPosition(int pos) { |
608 DCHECK_NE(RelocInfo::kNoPosition, pos); | 609 DCHECK_NE(kNoSourcePosition, pos); |
609 source_position_table_builder_.AddPosition(masm_->pc_offset(), pos, false); | 610 source_position_table_builder_.AddPosition(masm_->pc_offset(), pos, false); |
610 } | 611 } |
611 | 612 |
612 | 613 |
613 void FullCodeGenerator::SetFunctionPosition(FunctionLiteral* fun) { | 614 void FullCodeGenerator::SetFunctionPosition(FunctionLiteral* fun) { |
614 RecordPosition(fun->start_position()); | 615 RecordPosition(fun->start_position()); |
615 } | 616 } |
616 | 617 |
617 | 618 |
618 void FullCodeGenerator::SetReturnPosition(FunctionLiteral* fun) { | 619 void FullCodeGenerator::SetReturnPosition(FunctionLiteral* fun) { |
619 // For default constructors, start position equals end position, and there | 620 // For default constructors, start position equals end position, and there |
620 // is no source code besides the class literal. | 621 // is no source code besides the class literal. |
621 int pos = std::max(fun->start_position(), fun->end_position() - 1); | 622 int pos = std::max(fun->start_position(), fun->end_position() - 1); |
622 RecordStatementPosition(pos); | 623 RecordStatementPosition(pos); |
623 if (info_->is_debug()) { | 624 if (info_->is_debug()) { |
624 // Always emit a debug break slot before a return. | 625 // Always emit a debug break slot before a return. |
625 DebugCodegen::GenerateSlot(masm_, RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN); | 626 DebugCodegen::GenerateSlot(masm_, RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN); |
626 } | 627 } |
627 } | 628 } |
628 | 629 |
629 | 630 |
630 void FullCodeGenerator::SetStatementPosition( | 631 void FullCodeGenerator::SetStatementPosition( |
631 Statement* stmt, FullCodeGenerator::InsertBreak insert_break) { | 632 Statement* stmt, FullCodeGenerator::InsertBreak insert_break) { |
632 if (stmt->position() == RelocInfo::kNoPosition) return; | 633 if (stmt->position() == kNoSourcePosition) return; |
633 RecordStatementPosition(stmt->position()); | 634 RecordStatementPosition(stmt->position()); |
634 if (insert_break == INSERT_BREAK && info_->is_debug() && | 635 if (insert_break == INSERT_BREAK && info_->is_debug() && |
635 !stmt->IsDebuggerStatement()) { | 636 !stmt->IsDebuggerStatement()) { |
636 DebugCodegen::GenerateSlot(masm_, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION); | 637 DebugCodegen::GenerateSlot(masm_, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION); |
637 } | 638 } |
638 } | 639 } |
639 | 640 |
640 void FullCodeGenerator::SetExpressionPosition(Expression* expr) { | 641 void FullCodeGenerator::SetExpressionPosition(Expression* expr) { |
641 if (expr->position() == RelocInfo::kNoPosition) return; | 642 if (expr->position() == kNoSourcePosition) return; |
642 RecordPosition(expr->position()); | 643 RecordPosition(expr->position()); |
643 } | 644 } |
644 | 645 |
645 | 646 |
646 void FullCodeGenerator::SetExpressionAsStatementPosition(Expression* expr) { | 647 void FullCodeGenerator::SetExpressionAsStatementPosition(Expression* expr) { |
647 if (expr->position() == RelocInfo::kNoPosition) return; | 648 if (expr->position() == kNoSourcePosition) return; |
648 RecordStatementPosition(expr->position()); | 649 RecordStatementPosition(expr->position()); |
649 if (info_->is_debug()) { | 650 if (info_->is_debug()) { |
650 DebugCodegen::GenerateSlot(masm_, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION); | 651 DebugCodegen::GenerateSlot(masm_, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION); |
651 } | 652 } |
652 } | 653 } |
653 | 654 |
654 void FullCodeGenerator::SetCallPosition(Expression* expr, | 655 void FullCodeGenerator::SetCallPosition(Expression* expr, |
655 TailCallMode tail_call_mode) { | 656 TailCallMode tail_call_mode) { |
656 if (expr->position() == RelocInfo::kNoPosition) return; | 657 if (expr->position() == kNoSourcePosition) return; |
657 RecordPosition(expr->position()); | 658 RecordPosition(expr->position()); |
658 if (info_->is_debug()) { | 659 if (info_->is_debug()) { |
659 RelocInfo::Mode mode = (tail_call_mode == TailCallMode::kAllow) | 660 RelocInfo::Mode mode = (tail_call_mode == TailCallMode::kAllow) |
660 ? RelocInfo::DEBUG_BREAK_SLOT_AT_TAIL_CALL | 661 ? RelocInfo::DEBUG_BREAK_SLOT_AT_TAIL_CALL |
661 : RelocInfo::DEBUG_BREAK_SLOT_AT_CALL; | 662 : RelocInfo::DEBUG_BREAK_SLOT_AT_CALL; |
662 // Always emit a debug break slot before a call. | 663 // Always emit a debug break slot before a call. |
663 DebugCodegen::GenerateSlot(masm_, mode); | 664 DebugCodegen::GenerateSlot(masm_, mode); |
664 } | 665 } |
665 } | 666 } |
666 | 667 |
(...skipping 1290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1957 } | 1958 } |
1958 | 1959 |
1959 if (var->is_this()) { | 1960 if (var->is_this()) { |
1960 DCHECK(literal() != nullptr && | 1961 DCHECK(literal() != nullptr && |
1961 (literal()->kind() & kSubclassConstructor) != 0); | 1962 (literal()->kind() & kSubclassConstructor) != 0); |
1962 // TODO(littledan): implement 'this' hole check elimination. | 1963 // TODO(littledan): implement 'this' hole check elimination. |
1963 return true; | 1964 return true; |
1964 } | 1965 } |
1965 | 1966 |
1966 // Check that we always have valid source position. | 1967 // Check that we always have valid source position. |
1967 DCHECK(var->initializer_position() != RelocInfo::kNoPosition); | 1968 DCHECK(var->initializer_position() != kNoSourcePosition); |
1968 DCHECK(proxy->position() != RelocInfo::kNoPosition); | 1969 DCHECK(proxy->position() != kNoSourcePosition); |
1969 | 1970 |
1970 return var->scope()->is_nonlinear() || | 1971 return var->scope()->is_nonlinear() || |
1971 var->initializer_position() >= proxy->position(); | 1972 var->initializer_position() >= proxy->position(); |
1972 } | 1973 } |
1973 | 1974 |
1974 | 1975 |
1975 #undef __ | 1976 #undef __ |
1976 | 1977 |
1977 | 1978 |
1978 } // namespace internal | 1979 } // namespace internal |
1979 } // namespace v8 | 1980 } // namespace v8 |
OLD | NEW |