| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/crankshaft/typing.h" | 5 #include "src/crankshaft/typing.h" |
| 6 | 6 |
| 7 #include "src/ast/compile-time-value.h" | 7 #include "src/ast/compile-time-value.h" |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/ast/variables.h" | 9 #include "src/ast/variables.h" |
| 10 #include "src/frames-inl.h" | 10 #include "src/frames-inl.h" |
| 11 #include "src/frames.h" | 11 #include "src/frames.h" |
| 12 #include "src/ostreams.h" | 12 #include "src/ostreams.h" |
| 13 #include "src/splay-tree-inl.h" | 13 #include "src/splay-tree-inl.h" |
| 14 | 14 |
| 15 namespace v8 { | 15 namespace v8 { |
| 16 namespace internal { | 16 namespace internal { |
| 17 | 17 |
| 18 AstTyper::AstTyper(Isolate* isolate, Zone* zone, Handle<JSFunction> closure, | 18 AstTyper::AstTyper(Isolate* isolate, Zone* zone, Handle<JSFunction> closure, |
| 19 DeclarationScope* scope, BailoutId osr_ast_id, | 19 DeclarationScope* scope, BailoutId osr_ast_id, |
| 20 FunctionLiteral* root, AstTypeBounds* bounds) | 20 FunctionLiteral* root, AstTypeBounds* bounds, |
| 21 bool ignition_feedback) |
| 21 : isolate_(isolate), | 22 : isolate_(isolate), |
| 22 zone_(zone), | 23 zone_(zone), |
| 23 closure_(closure), | 24 closure_(closure), |
| 24 scope_(scope), | 25 scope_(scope), |
| 25 osr_ast_id_(osr_ast_id), | 26 osr_ast_id_(osr_ast_id), |
| 26 root_(root), | 27 root_(root), |
| 27 oracle_(isolate, zone, handle(closure->shared()->code()), | 28 oracle_(isolate, zone, handle(closure->shared()->code()), |
| 28 handle(closure->feedback_vector()), | 29 handle(closure->feedback_vector()), |
| 29 handle(closure->context()->native_context())), | 30 handle(closure->context()->native_context())), |
| 30 store_(zone), | 31 store_(zone), |
| 31 bounds_(bounds) { | 32 bounds_(bounds), |
| 33 ignition_feedback_(ignition_feedback) { |
| 32 InitializeAstVisitor(isolate); | 34 InitializeAstVisitor(isolate); |
| 33 } | 35 } |
| 34 | 36 |
| 35 | 37 |
| 36 #ifdef OBJECT_PRINT | 38 #ifdef OBJECT_PRINT |
| 37 static void PrintObserved(Variable* var, Object* value, AstType* type) { | 39 static void PrintObserved(Variable* var, Object* value, AstType* type) { |
| 38 OFStream os(stdout); | 40 OFStream os(stdout); |
| 39 os << " observed " << (var->IsParameter() ? "param" : "local") << " "; | 41 os << " observed " << (var->IsParameter() ? "param" : "local") << " "; |
| 40 var->name()->Print(os); | 42 var->name()->Print(os); |
| 41 os << " : " << Brief(value) << " -> "; | 43 os << " : " << Brief(value) << " -> "; |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 | 206 |
| 205 Effects clause_effects = EnterEffects(); | 207 Effects clause_effects = EnterEffects(); |
| 206 | 208 |
| 207 if (!clause->is_default()) { | 209 if (!clause->is_default()) { |
| 208 Expression* label = clause->label(); | 210 Expression* label = clause->label(); |
| 209 // Collect type feedback. | 211 // Collect type feedback. |
| 210 AstType* tag_type; | 212 AstType* tag_type; |
| 211 AstType* label_type; | 213 AstType* label_type; |
| 212 AstType* combined_type; | 214 AstType* combined_type; |
| 213 oracle()->CompareType(clause->CompareId(), | 215 oracle()->CompareType(clause->CompareId(), |
| 214 &tag_type, &label_type, &combined_type); | 216 clause->CompareOperationFeedbackSlot(), &tag_type, |
| 217 &label_type, &combined_type, ignition_feedback_); |
| 215 NarrowLowerType(stmt->tag(), tag_type); | 218 NarrowLowerType(stmt->tag(), tag_type); |
| 216 NarrowLowerType(label, label_type); | 219 NarrowLowerType(label, label_type); |
| 217 clause->set_compare_type(combined_type); | 220 clause->set_compare_type(combined_type); |
| 218 | 221 |
| 219 RECURSE(Visit(label)); | 222 RECURSE(Visit(label)); |
| 220 if (!clause_effects.IsEmpty()) complex_effects = true; | 223 if (!clause_effects.IsEmpty()) complex_effects = true; |
| 221 } | 224 } |
| 222 | 225 |
| 223 ZoneList<Statement*>* stmts = clause->statements(); | 226 ZoneList<Statement*>* stmts = clause->statements(); |
| 224 RECURSE(VisitStatements(stmts)); | 227 RECURSE(VisitStatements(stmts)); |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 | 610 |
| 608 void AstTyper::VisitCountOperation(CountOperation* expr) { | 611 void AstTyper::VisitCountOperation(CountOperation* expr) { |
| 609 // Collect type feedback. | 612 // Collect type feedback. |
| 610 FeedbackVectorSlot slot = expr->CountSlot(); | 613 FeedbackVectorSlot slot = expr->CountSlot(); |
| 611 KeyedAccessStoreMode store_mode; | 614 KeyedAccessStoreMode store_mode; |
| 612 IcCheckType key_type; | 615 IcCheckType key_type; |
| 613 oracle()->GetStoreModeAndKeyType(slot, &store_mode, &key_type); | 616 oracle()->GetStoreModeAndKeyType(slot, &store_mode, &key_type); |
| 614 oracle()->CountReceiverTypes(slot, expr->GetReceiverTypes()); | 617 oracle()->CountReceiverTypes(slot, expr->GetReceiverTypes()); |
| 615 expr->set_store_mode(store_mode); | 618 expr->set_store_mode(store_mode); |
| 616 expr->set_key_type(key_type); | 619 expr->set_key_type(key_type); |
| 617 expr->set_type(oracle()->CountType(expr->CountBinOpFeedbackId())); | 620 expr->set_type(oracle()->CountType(expr->CountBinOpFeedbackId(), |
| 621 expr->CountBinaryOpFeedbackSlot(), |
| 622 ignition_feedback_)); |
| 618 // TODO(rossberg): merge the count type with the generic expression type. | 623 // TODO(rossberg): merge the count type with the generic expression type. |
| 619 | 624 |
| 620 RECURSE(Visit(expr->expression())); | 625 RECURSE(Visit(expr->expression())); |
| 621 | 626 |
| 622 NarrowType(expr, AstBounds(AstType::SignedSmall(), AstType::Number())); | 627 NarrowType(expr, AstBounds(AstType::SignedSmall(), AstType::Number())); |
| 623 | 628 |
| 624 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 629 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| 625 if (proxy != NULL && proxy->var()->IsStackAllocated()) { | 630 if (proxy != NULL && proxy->var()->IsStackAllocated()) { |
| 626 store_.Seq(variable_index(proxy->var()), Effect(bounds_->get(expr))); | 631 store_.Seq(variable_index(proxy->var()), Effect(bounds_->get(expr))); |
| 627 } | 632 } |
| 628 } | 633 } |
| 629 | 634 |
| 630 | |
| 631 void AstTyper::VisitBinaryOperation(BinaryOperation* expr) { | 635 void AstTyper::VisitBinaryOperation(BinaryOperation* expr) { |
| 632 // Collect type feedback. | 636 // Collect type feedback. |
| 633 AstType* type; | 637 AstType* type; |
| 634 AstType* left_type; | 638 AstType* left_type; |
| 635 AstType* right_type; | 639 AstType* right_type; |
| 636 Maybe<int> fixed_right_arg = Nothing<int>(); | 640 Maybe<int> fixed_right_arg = Nothing<int>(); |
| 637 Handle<AllocationSite> allocation_site; | 641 Handle<AllocationSite> allocation_site; |
| 638 oracle()->BinaryType(expr->BinaryOperationFeedbackId(), | 642 oracle()->BinaryType(expr->BinaryOperationFeedbackId(), |
| 639 &left_type, &right_type, &type, &fixed_right_arg, | 643 expr->BinaryOperationFeedbackSlot(), &left_type, |
| 640 &allocation_site, expr->op()); | 644 &right_type, &type, &fixed_right_arg, &allocation_site, |
| 645 expr->op(), ignition_feedback_); |
| 646 |
| 641 NarrowLowerType(expr, type); | 647 NarrowLowerType(expr, type); |
| 642 NarrowLowerType(expr->left(), left_type); | 648 NarrowLowerType(expr->left(), left_type); |
| 643 NarrowLowerType(expr->right(), right_type); | 649 NarrowLowerType(expr->right(), right_type); |
| 644 expr->set_allocation_site(allocation_site); | 650 expr->set_allocation_site(allocation_site); |
| 645 expr->set_fixed_right_arg(fixed_right_arg); | 651 expr->set_fixed_right_arg(fixed_right_arg); |
| 646 if (expr->op() == Token::OR || expr->op() == Token::AND) { | 652 if (expr->op() == Token::OR || expr->op() == Token::AND) { |
| 647 expr->left()->RecordToBooleanTypeFeedback(oracle()); | 653 expr->left()->RecordToBooleanTypeFeedback(oracle()); |
| 648 } | 654 } |
| 649 | 655 |
| 650 switch (expr->op()) { | 656 switch (expr->op()) { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 } | 738 } |
| 733 } | 739 } |
| 734 | 740 |
| 735 | 741 |
| 736 void AstTyper::VisitCompareOperation(CompareOperation* expr) { | 742 void AstTyper::VisitCompareOperation(CompareOperation* expr) { |
| 737 // Collect type feedback. | 743 // Collect type feedback. |
| 738 AstType* left_type; | 744 AstType* left_type; |
| 739 AstType* right_type; | 745 AstType* right_type; |
| 740 AstType* combined_type; | 746 AstType* combined_type; |
| 741 oracle()->CompareType(expr->CompareOperationFeedbackId(), | 747 oracle()->CompareType(expr->CompareOperationFeedbackId(), |
| 742 &left_type, &right_type, &combined_type); | 748 expr->CompareOperationFeedbackSlot(), &left_type, |
| 749 &right_type, &combined_type, ignition_feedback_); |
| 743 NarrowLowerType(expr->left(), left_type); | 750 NarrowLowerType(expr->left(), left_type); |
| 744 NarrowLowerType(expr->right(), right_type); | 751 NarrowLowerType(expr->right(), right_type); |
| 745 expr->set_combined_type(combined_type); | 752 expr->set_combined_type(combined_type); |
| 746 | 753 |
| 747 RECURSE(Visit(expr->left())); | 754 RECURSE(Visit(expr->left())); |
| 748 RECURSE(Visit(expr->right())); | 755 RECURSE(Visit(expr->right())); |
| 749 | 756 |
| 750 NarrowType(expr, AstBounds(AstType::Boolean())); | 757 NarrowType(expr, AstBounds(AstType::Boolean())); |
| 751 } | 758 } |
| 752 | 759 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 } | 800 } |
| 794 | 801 |
| 795 | 802 |
| 796 void AstTyper::VisitFunctionDeclaration(FunctionDeclaration* declaration) { | 803 void AstTyper::VisitFunctionDeclaration(FunctionDeclaration* declaration) { |
| 797 RECURSE(Visit(declaration->fun())); | 804 RECURSE(Visit(declaration->fun())); |
| 798 } | 805 } |
| 799 | 806 |
| 800 | 807 |
| 801 } // namespace internal | 808 } // namespace internal |
| 802 } // namespace v8 | 809 } // namespace v8 |
| OLD | NEW |