Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(414)

Side by Side Diff: src/ast.h

Issue 14990014: Collect type feedback in separate pass and store it in AST (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Consistent check-alive Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/ast.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 21 matching lines...) Expand all
32 32
33 #include "assembler.h" 33 #include "assembler.h"
34 #include "factory.h" 34 #include "factory.h"
35 #include "isolate.h" 35 #include "isolate.h"
36 #include "jsregexp.h" 36 #include "jsregexp.h"
37 #include "list-inl.h" 37 #include "list-inl.h"
38 #include "runtime.h" 38 #include "runtime.h"
39 #include "small-pointer-list.h" 39 #include "small-pointer-list.h"
40 #include "smart-pointers.h" 40 #include "smart-pointers.h"
41 #include "token.h" 41 #include "token.h"
42 #include "type-info.h"
42 #include "utils.h" 43 #include "utils.h"
43 #include "variables.h" 44 #include "variables.h"
44 #include "interface.h" 45 #include "interface.h"
45 #include "zone-inl.h" 46 #include "zone-inl.h"
46 47
47 namespace v8 { 48 namespace v8 {
48 namespace internal { 49 namespace internal {
49 50
50 // The abstract syntax tree is an intermediate, light-weight 51 // The abstract syntax tree is an intermediate, light-weight
51 // representation of the parsed JavaScript code suitable for 52 // representation of the parsed JavaScript code suitable for
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 ASSERT(IsMonomorphic()); 364 ASSERT(IsMonomorphic());
364 SmallMapList* types = GetReceiverTypes(); 365 SmallMapList* types = GetReceiverTypes();
365 ASSERT(types != NULL && types->length() == 1); 366 ASSERT(types != NULL && types->length() == 1);
366 return types->at(0); 367 return types->at(0);
367 } 368 }
368 virtual KeyedAccessStoreMode GetStoreMode() { 369 virtual KeyedAccessStoreMode GetStoreMode() {
369 UNREACHABLE(); 370 UNREACHABLE();
370 return STANDARD_STORE; 371 return STANDARD_STORE;
371 } 372 }
372 373
374 // TODO(rossberg): this should move to its own AST node eventually.
375 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle);
376 byte to_boolean_types() const { return to_boolean_types_; }
377
373 BailoutId id() const { return id_; } 378 BailoutId id() const { return id_; }
374 TypeFeedbackId test_id() const { return test_id_; } 379 TypeFeedbackId test_id() const { return test_id_; }
375 380
376 protected: 381 protected:
377 explicit Expression(Isolate* isolate) 382 explicit Expression(Isolate* isolate)
378 : id_(GetNextId(isolate)), 383 : id_(GetNextId(isolate)),
379 test_id_(GetNextId(isolate)) {} 384 test_id_(GetNextId(isolate)) {}
380 385
381 private: 386 private:
387 byte to_boolean_types_;
388
382 const BailoutId id_; 389 const BailoutId id_;
383 const TypeFeedbackId test_id_; 390 const TypeFeedbackId test_id_;
384 }; 391 };
385 392
386 393
387 class BreakableStatement: public Statement { 394 class BreakableStatement: public Statement {
388 public: 395 public:
389 enum Type { 396 enum Type {
390 TARGET_FOR_ANONYMOUS, 397 TARGET_FOR_ANONYMOUS,
391 TARGET_FOR_NAMED_ONLY 398 TARGET_FOR_NAMED_ONLY
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 osr_entry_id_(GetNextId(isolate)) { 713 osr_entry_id_(GetNextId(isolate)) {
707 } 714 }
708 715
709 void Initialize(Statement* body) { 716 void Initialize(Statement* body) {
710 body_ = body; 717 body_ = body;
711 } 718 }
712 719
713 private: 720 private:
714 Statement* body_; 721 Statement* body_;
715 Label continue_target_; 722 Label continue_target_;
723
716 const BailoutId osr_entry_id_; 724 const BailoutId osr_entry_id_;
717 }; 725 };
718 726
719 727
720 class DoWhileStatement: public IterationStatement { 728 class DoWhileStatement: public IterationStatement {
721 public: 729 public:
722 DECLARE_NODE_TYPE(DoWhileStatement) 730 DECLARE_NODE_TYPE(DoWhileStatement)
723 731
724 void Initialize(Expression* cond, Statement* body) { 732 void Initialize(Expression* cond, Statement* body) {
725 IterationStatement::Initialize(body); 733 IterationStatement::Initialize(body);
(...skipping 15 matching lines...) Expand all
741 DoWhileStatement(Isolate* isolate, ZoneStringList* labels) 749 DoWhileStatement(Isolate* isolate, ZoneStringList* labels)
742 : IterationStatement(isolate, labels), 750 : IterationStatement(isolate, labels),
743 cond_(NULL), 751 cond_(NULL),
744 condition_position_(-1), 752 condition_position_(-1),
745 continue_id_(GetNextId(isolate)), 753 continue_id_(GetNextId(isolate)),
746 back_edge_id_(GetNextId(isolate)) { 754 back_edge_id_(GetNextId(isolate)) {
747 } 755 }
748 756
749 private: 757 private:
750 Expression* cond_; 758 Expression* cond_;
759
751 int condition_position_; 760 int condition_position_;
761
752 const BailoutId continue_id_; 762 const BailoutId continue_id_;
753 const BailoutId back_edge_id_; 763 const BailoutId back_edge_id_;
754 }; 764 };
755 765
756 766
757 class WhileStatement: public IterationStatement { 767 class WhileStatement: public IterationStatement {
758 public: 768 public:
759 DECLARE_NODE_TYPE(WhileStatement) 769 DECLARE_NODE_TYPE(WhileStatement)
760 770
761 void Initialize(Expression* cond, Statement* body) { 771 void Initialize(Expression* cond, Statement* body) {
(...skipping 16 matching lines...) Expand all
778 protected: 788 protected:
779 WhileStatement(Isolate* isolate, ZoneStringList* labels) 789 WhileStatement(Isolate* isolate, ZoneStringList* labels)
780 : IterationStatement(isolate, labels), 790 : IterationStatement(isolate, labels),
781 cond_(NULL), 791 cond_(NULL),
782 may_have_function_literal_(true), 792 may_have_function_literal_(true),
783 body_id_(GetNextId(isolate)) { 793 body_id_(GetNextId(isolate)) {
784 } 794 }
785 795
786 private: 796 private:
787 Expression* cond_; 797 Expression* cond_;
798
788 // True if there is a function literal subexpression in the condition. 799 // True if there is a function literal subexpression in the condition.
789 bool may_have_function_literal_; 800 bool may_have_function_literal_;
801
790 const BailoutId body_id_; 802 const BailoutId body_id_;
791 }; 803 };
792 804
793 805
794 class ForStatement: public IterationStatement { 806 class ForStatement: public IterationStatement {
795 public: 807 public:
796 DECLARE_NODE_TYPE(ForStatement) 808 DECLARE_NODE_TYPE(ForStatement)
797 809
798 void Initialize(Statement* init, 810 void Initialize(Statement* init,
799 Expression* cond, 811 Expression* cond,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 may_have_function_literal_(true), 845 may_have_function_literal_(true),
834 loop_variable_(NULL), 846 loop_variable_(NULL),
835 continue_id_(GetNextId(isolate)), 847 continue_id_(GetNextId(isolate)),
836 body_id_(GetNextId(isolate)) { 848 body_id_(GetNextId(isolate)) {
837 } 849 }
838 850
839 private: 851 private:
840 Statement* init_; 852 Statement* init_;
841 Expression* cond_; 853 Expression* cond_;
842 Statement* next_; 854 Statement* next_;
855
843 // True if there is a function literal subexpression in the condition. 856 // True if there is a function literal subexpression in the condition.
844 bool may_have_function_literal_; 857 bool may_have_function_literal_;
845 Variable* loop_variable_; 858 Variable* loop_variable_;
859
846 const BailoutId continue_id_; 860 const BailoutId continue_id_;
847 const BailoutId body_id_; 861 const BailoutId body_id_;
848 }; 862 };
849 863
850 864
851 class ForInStatement: public IterationStatement { 865 class ForInStatement: public IterationStatement {
852 public: 866 public:
853 DECLARE_NODE_TYPE(ForInStatement) 867 DECLARE_NODE_TYPE(ForInStatement)
854 868
855 void Initialize(Expression* each, Expression* enumerable, Statement* body) { 869 void Initialize(Expression* each, Expression* enumerable, Statement* body) {
856 IterationStatement::Initialize(body); 870 IterationStatement::Initialize(body);
857 each_ = each; 871 each_ = each;
858 enumerable_ = enumerable; 872 enumerable_ = enumerable;
873 for_in_type_ = SLOW_FOR_IN;
859 } 874 }
860 875
861 Expression* each() const { return each_; } 876 Expression* each() const { return each_; }
862 Expression* enumerable() const { return enumerable_; } 877 Expression* enumerable() const { return enumerable_; }
863 878
864 virtual BailoutId ContinueId() const { return EntryId(); } 879 virtual BailoutId ContinueId() const { return EntryId(); }
865 virtual BailoutId StackCheckId() const { return body_id_; } 880 virtual BailoutId StackCheckId() const { return body_id_; }
866 BailoutId BodyId() const { return body_id_; } 881 BailoutId BodyId() const { return body_id_; }
867 BailoutId PrepareId() const { return prepare_id_; } 882 BailoutId PrepareId() const { return prepare_id_; }
868 883
869 TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); } 884 TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); }
885 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
886 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN };
887 ForInType for_in_type() const { return for_in_type_; }
870 888
871 protected: 889 protected:
872 ForInStatement(Isolate* isolate, ZoneStringList* labels) 890 ForInStatement(Isolate* isolate, ZoneStringList* labels)
873 : IterationStatement(isolate, labels), 891 : IterationStatement(isolate, labels),
874 each_(NULL), 892 each_(NULL),
875 enumerable_(NULL), 893 enumerable_(NULL),
876 body_id_(GetNextId(isolate)), 894 body_id_(GetNextId(isolate)),
877 prepare_id_(GetNextId(isolate)) { 895 prepare_id_(GetNextId(isolate)) {
878 } 896 }
879 897
880 private: 898 private:
881 Expression* each_; 899 Expression* each_;
882 Expression* enumerable_; 900 Expression* enumerable_;
901
902 ForInType for_in_type_;
903
883 const BailoutId body_id_; 904 const BailoutId body_id_;
884 const BailoutId prepare_id_; 905 const BailoutId prepare_id_;
885 }; 906 };
886 907
887 908
888 class ExpressionStatement: public Statement { 909 class ExpressionStatement: public Statement {
889 public: 910 public:
890 DECLARE_NODE_TYPE(ExpressionStatement) 911 DECLARE_NODE_TYPE(ExpressionStatement)
891 912
892 void set_expression(Expression* e) { expression_ = e; } 913 void set_expression(Expression* e) { expression_ = e; }
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 }; 1034 };
1014 1035
1015 1036
1016 class SwitchStatement: public BreakableStatement { 1037 class SwitchStatement: public BreakableStatement {
1017 public: 1038 public:
1018 DECLARE_NODE_TYPE(SwitchStatement) 1039 DECLARE_NODE_TYPE(SwitchStatement)
1019 1040
1020 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { 1041 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) {
1021 tag_ = tag; 1042 tag_ = tag;
1022 cases_ = cases; 1043 cases_ = cases;
1044 switch_type_ = UNKNOWN_SWITCH;
1023 } 1045 }
1024 1046
1025 Expression* tag() const { return tag_; } 1047 Expression* tag() const { return tag_; }
1026 ZoneList<CaseClause*>* cases() const { return cases_; } 1048 ZoneList<CaseClause*>* cases() const { return cases_; }
1027 1049
1050 enum SwitchType { UNKNOWN_SWITCH, SMI_SWITCH, STRING_SWITCH, GENERIC_SWITCH };
1051 SwitchType switch_type() const { return switch_type_; }
1052 void set_switch_type(SwitchType switch_type) { switch_type_ = switch_type; }
1053
1028 protected: 1054 protected:
1029 SwitchStatement(Isolate* isolate, ZoneStringList* labels) 1055 SwitchStatement(Isolate* isolate, ZoneStringList* labels)
1030 : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS), 1056 : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS),
1031 tag_(NULL), 1057 tag_(NULL),
1032 cases_(NULL) { } 1058 cases_(NULL) { }
1033 1059
1034 private: 1060 private:
1035 Expression* tag_; 1061 Expression* tag_;
1036 ZoneList<CaseClause*>* cases_; 1062 ZoneList<CaseClause*>* cases_;
1063 SwitchType switch_type_;
1037 }; 1064 };
1038 1065
1039 1066
1040 // If-statements always have non-null references to their then- and 1067 // If-statements always have non-null references to their then- and
1041 // else-parts. When parsing if-statements with no explicit else-part, 1068 // else-parts. When parsing if-statements with no explicit else-part,
1042 // the parser implicitly creates an empty statement. Use the 1069 // the parser implicitly creates an empty statement. Use the
1043 // HasThenStatement() and HasElseStatement() functions to check if a 1070 // HasThenStatement() and HasElseStatement() functions to check if a
1044 // given if-statement has a then- or an else-part containing code. 1071 // given if-statement has a then- or an else-part containing code.
1045 class IfStatement: public Statement { 1072 class IfStatement: public Statement {
1046 public: 1073 public:
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 is_simple_(is_simple), 1299 is_simple_(is_simple),
1273 depth_(depth) {} 1300 depth_(depth) {}
1274 1301
1275 private: 1302 private:
1276 int literal_index_; 1303 int literal_index_;
1277 bool is_simple_; 1304 bool is_simple_;
1278 int depth_; 1305 int depth_;
1279 }; 1306 };
1280 1307
1281 1308
1309 // Property is used for passing information
1310 // about an object literal's properties from the parser
1311 // to the code generator.
1312 class ObjectLiteralProperty: public ZoneObject {
1313 public:
1314 enum Kind {
1315 CONSTANT, // Property with constant value (compile time).
1316 COMPUTED, // Property with computed value (execution time).
1317 MATERIALIZED_LITERAL, // Property value is a materialized literal.
1318 GETTER, SETTER, // Property is an accessor function.
1319 PROTOTYPE // Property is __proto__.
1320 };
1321
1322 ObjectLiteralProperty(Literal* key, Expression* value, Isolate* isolate);
1323
1324 Literal* key() { return key_; }
1325 Expression* value() { return value_; }
1326 Kind kind() { return kind_; }
1327
1328 // Type feedback information.
1329 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1330 bool IsMonomorphic() { return !receiver_type_.is_null(); }
1331 Handle<Map> GetReceiverType() { return receiver_type_; }
1332
1333 bool IsCompileTimeValue();
1334
1335 void set_emit_store(bool emit_store);
1336 bool emit_store();
1337
1338 protected:
1339 template<class> friend class AstNodeFactory;
1340
1341 ObjectLiteralProperty(bool is_getter, FunctionLiteral* value);
1342 void set_key(Literal* key) { key_ = key; }
1343
1344 private:
1345 Literal* key_;
1346 Expression* value_;
1347 Kind kind_;
1348 bool emit_store_;
1349 Handle<Map> receiver_type_;
1350 };
1351
1352
1282 // An object literal has a boilerplate object that is used 1353 // An object literal has a boilerplate object that is used
1283 // for minimizing the work when constructing it at runtime. 1354 // for minimizing the work when constructing it at runtime.
1284 class ObjectLiteral: public MaterializedLiteral { 1355 class ObjectLiteral: public MaterializedLiteral {
1285 public: 1356 public:
1286 // Property is used for passing information 1357 typedef ObjectLiteralProperty Property;
1287 // about an object literal's properties from the parser
1288 // to the code generator.
1289 class Property: public ZoneObject {
1290 public:
1291 enum Kind {
1292 CONSTANT, // Property with constant value (compile time).
1293 COMPUTED, // Property with computed value (execution time).
1294 MATERIALIZED_LITERAL, // Property value is a materialized literal.
1295 GETTER, SETTER, // Property is an accessor function.
1296 PROTOTYPE // Property is __proto__.
1297 };
1298
1299 Property(Literal* key, Expression* value, Isolate* isolate);
1300
1301 Literal* key() { return key_; }
1302 Expression* value() { return value_; }
1303 Kind kind() { return kind_; }
1304
1305 // Type feedback information.
1306 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1307 bool IsMonomorphic() { return !receiver_type_.is_null(); }
1308 Handle<Map> GetReceiverType() { return receiver_type_; }
1309
1310 bool IsCompileTimeValue();
1311
1312 void set_emit_store(bool emit_store);
1313 bool emit_store();
1314
1315 protected:
1316 template<class> friend class AstNodeFactory;
1317
1318 Property(bool is_getter, FunctionLiteral* value);
1319 void set_key(Literal* key) { key_ = key; }
1320
1321 private:
1322 Literal* key_;
1323 Expression* value_;
1324 Kind kind_;
1325 bool emit_store_;
1326 Handle<Map> receiver_type_;
1327 };
1328 1358
1329 DECLARE_NODE_TYPE(ObjectLiteral) 1359 DECLARE_NODE_TYPE(ObjectLiteral)
1330 1360
1331 Handle<FixedArray> constant_properties() const { 1361 Handle<FixedArray> constant_properties() const {
1332 return constant_properties_; 1362 return constant_properties_;
1333 } 1363 }
1334 ZoneList<Property*>* properties() const { return properties_; } 1364 ZoneList<Property*>* properties() const { return properties_; }
1335 bool fast_elements() const { return fast_elements_; } 1365 bool fast_elements() const { return fast_elements_; }
1336 bool may_store_doubles() const { return may_store_doubles_; } 1366 bool may_store_doubles() const { return may_store_doubles_; }
1337 bool has_function() const { return has_function_; } 1367 bool has_function() const { return has_function_; }
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 // as the holder! 1610 // as the holder!
1581 Handle<JSObject> holder() { return holder_; } 1611 Handle<JSObject> holder() { return holder_; }
1582 1612
1583 Handle<JSGlobalPropertyCell> cell() { return cell_; } 1613 Handle<JSGlobalPropertyCell> cell() { return cell_; }
1584 1614
1585 bool ComputeTarget(Handle<Map> type, Handle<String> name); 1615 bool ComputeTarget(Handle<Map> type, Handle<String> name);
1586 bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupResult* lookup); 1616 bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupResult* lookup);
1587 1617
1588 BailoutId ReturnId() const { return return_id_; } 1618 BailoutId ReturnId() const { return return_id_; }
1589 1619
1620 // TODO(rossberg): this should really move somewhere else (and be merged with
1621 // various similar methods in objets.cc), but for now...
1622 static Handle<JSObject> GetPrototypeForPrimitiveCheck(
1623 CheckType check, Isolate* isolate);
1624
1590 #ifdef DEBUG 1625 #ifdef DEBUG
1591 // Used to assert that the FullCodeGenerator records the return site. 1626 // Used to assert that the FullCodeGenerator records the return site.
1592 bool return_is_recorded_; 1627 bool return_is_recorded_;
1593 #endif 1628 #endif
1594 1629
1595 protected: 1630 protected:
1596 Call(Isolate* isolate, 1631 Call(Isolate* isolate,
1597 Expression* expression, 1632 Expression* expression,
1598 ZoneList<Expression*>* arguments, 1633 ZoneList<Expression*>* arguments,
1599 int pos) 1634 int pos)
(...skipping 26 matching lines...) Expand all
1626 DECLARE_NODE_TYPE(CallNew) 1661 DECLARE_NODE_TYPE(CallNew)
1627 1662
1628 Expression* expression() const { return expression_; } 1663 Expression* expression() const { return expression_; }
1629 ZoneList<Expression*>* arguments() const { return arguments_; } 1664 ZoneList<Expression*>* arguments() const { return arguments_; }
1630 virtual int position() const { return pos_; } 1665 virtual int position() const { return pos_; }
1631 1666
1632 // Type feedback information. 1667 // Type feedback information.
1633 TypeFeedbackId CallNewFeedbackId() const { return reuse(id()); } 1668 TypeFeedbackId CallNewFeedbackId() const { return reuse(id()); }
1634 void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1669 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1635 virtual bool IsMonomorphic() { return is_monomorphic_; } 1670 virtual bool IsMonomorphic() { return is_monomorphic_; }
1636 Handle<JSFunction> target() { return target_; } 1671 Handle<JSFunction> target() const { return target_; }
1672 ElementsKind elements_kind() const { return elements_kind_; }
1673 Handle<Smi> allocation_elements_kind() const { return alloc_elements_kind_; }
1637 1674
1638 BailoutId ReturnId() const { return return_id_; } 1675 BailoutId ReturnId() const { return return_id_; }
1639 ElementsKind elements_kind() const { return elements_kind_; }
1640 1676
1641 protected: 1677 protected:
1642 CallNew(Isolate* isolate, 1678 CallNew(Isolate* isolate,
1643 Expression* expression, 1679 Expression* expression,
1644 ZoneList<Expression*>* arguments, 1680 ZoneList<Expression*>* arguments,
1645 int pos) 1681 int pos)
1646 : Expression(isolate), 1682 : Expression(isolate),
1647 expression_(expression), 1683 expression_(expression),
1648 arguments_(arguments), 1684 arguments_(arguments),
1649 pos_(pos), 1685 pos_(pos),
1650 is_monomorphic_(false), 1686 is_monomorphic_(false),
1651 return_id_(GetNextId(isolate)), 1687 elements_kind_(GetInitialFastElementsKind()),
1652 elements_kind_(GetInitialFastElementsKind()) { } 1688 return_id_(GetNextId(isolate)) { }
1653 1689
1654 private: 1690 private:
1655 Expression* expression_; 1691 Expression* expression_;
1656 ZoneList<Expression*>* arguments_; 1692 ZoneList<Expression*>* arguments_;
1657 int pos_; 1693 int pos_;
1658 1694
1659 bool is_monomorphic_; 1695 bool is_monomorphic_;
1660 Handle<JSFunction> target_; 1696 Handle<JSFunction> target_;
1697 ElementsKind elements_kind_;
1698 Handle<Smi> alloc_elements_kind_;
1661 1699
1662 const BailoutId return_id_; 1700 const BailoutId return_id_;
1663 ElementsKind elements_kind_;
1664 }; 1701 };
1665 1702
1666 1703
1667 // The CallRuntime class does not represent any official JavaScript 1704 // The CallRuntime class does not represent any official JavaScript
1668 // language construct. Instead it is used to call a C or JS function 1705 // language construct. Instead it is used to call a C or JS function
1669 // with a set of arguments. This is used from the builtins that are 1706 // with a set of arguments. This is used from the builtins that are
1670 // implemented in JavaScript (see "v8natives.js"). 1707 // implemented in JavaScript (see "v8natives.js").
1671 class CallRuntime: public Expression { 1708 class CallRuntime: public Expression {
1672 public: 1709 public:
1673 DECLARE_NODE_TYPE(CallRuntime) 1710 DECLARE_NODE_TYPE(CallRuntime)
(...skipping 29 matching lines...) Expand all
1703 virtual bool ResultOverwriteAllowed(); 1740 virtual bool ResultOverwriteAllowed();
1704 1741
1705 Token::Value op() const { return op_; } 1742 Token::Value op() const { return op_; }
1706 Expression* expression() const { return expression_; } 1743 Expression* expression() const { return expression_; }
1707 virtual int position() const { return pos_; } 1744 virtual int position() const { return pos_; }
1708 1745
1709 BailoutId MaterializeTrueId() { return materialize_true_id_; } 1746 BailoutId MaterializeTrueId() { return materialize_true_id_; }
1710 BailoutId MaterializeFalseId() { return materialize_false_id_; } 1747 BailoutId MaterializeFalseId() { return materialize_false_id_; }
1711 1748
1712 TypeFeedbackId UnaryOperationFeedbackId() const { return reuse(id()); } 1749 TypeFeedbackId UnaryOperationFeedbackId() const { return reuse(id()); }
1750 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1751 TypeInfo type() const { return type_; }
1713 1752
1714 protected: 1753 protected:
1715 UnaryOperation(Isolate* isolate, 1754 UnaryOperation(Isolate* isolate,
1716 Token::Value op, 1755 Token::Value op,
1717 Expression* expression, 1756 Expression* expression,
1718 int pos) 1757 int pos)
1719 : Expression(isolate), 1758 : Expression(isolate),
1720 op_(op), 1759 op_(op),
1721 expression_(expression), 1760 expression_(expression),
1722 pos_(pos), 1761 pos_(pos),
1723 materialize_true_id_(GetNextId(isolate)), 1762 materialize_true_id_(GetNextId(isolate)),
1724 materialize_false_id_(GetNextId(isolate)) { 1763 materialize_false_id_(GetNextId(isolate)) {
1725 ASSERT(Token::IsUnaryOp(op)); 1764 ASSERT(Token::IsUnaryOp(op));
1726 } 1765 }
1727 1766
1728 private: 1767 private:
1729 Token::Value op_; 1768 Token::Value op_;
1730 Expression* expression_; 1769 Expression* expression_;
1731 int pos_; 1770 int pos_;
1732 1771
1772 TypeInfo type_;
1773
1733 // For unary not (Token::NOT), the AST ids where true and false will 1774 // For unary not (Token::NOT), the AST ids where true and false will
1734 // actually be materialized, respectively. 1775 // actually be materialized, respectively.
1735 const BailoutId materialize_true_id_; 1776 const BailoutId materialize_true_id_;
1736 const BailoutId materialize_false_id_; 1777 const BailoutId materialize_false_id_;
1737 }; 1778 };
1738 1779
1739 1780
1740 class BinaryOperation: public Expression { 1781 class BinaryOperation: public Expression {
1741 public: 1782 public:
1742 DECLARE_NODE_TYPE(BinaryOperation) 1783 DECLARE_NODE_TYPE(BinaryOperation)
1743 1784
1744 virtual bool ResultOverwriteAllowed(); 1785 virtual bool ResultOverwriteAllowed();
1745 1786
1746 Token::Value op() const { return op_; } 1787 Token::Value op() const { return op_; }
1747 Expression* left() const { return left_; } 1788 Expression* left() const { return left_; }
1748 Expression* right() const { return right_; } 1789 Expression* right() const { return right_; }
1749 virtual int position() const { return pos_; } 1790 virtual int position() const { return pos_; }
1750 1791
1751 BailoutId RightId() const { return right_id_; } 1792 BailoutId RightId() const { return right_id_; }
1752 1793
1753 TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); } 1794 TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); }
1795 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1796 TypeInfo left_type() const { return left_type_; }
1797 TypeInfo right_type() const { return right_type_; }
1798 TypeInfo result_type() const { return result_type_; }
1754 1799
1755 protected: 1800 protected:
1756 BinaryOperation(Isolate* isolate, 1801 BinaryOperation(Isolate* isolate,
1757 Token::Value op, 1802 Token::Value op,
1758 Expression* left, 1803 Expression* left,
1759 Expression* right, 1804 Expression* right,
1760 int pos) 1805 int pos)
1761 : Expression(isolate), 1806 : Expression(isolate),
1762 op_(op), 1807 op_(op),
1763 left_(left), 1808 left_(left),
1764 right_(right), 1809 right_(right),
1765 pos_(pos), 1810 pos_(pos),
1766 right_id_(GetNextId(isolate)) { 1811 right_id_(GetNextId(isolate)) {
1767 ASSERT(Token::IsBinaryOp(op)); 1812 ASSERT(Token::IsBinaryOp(op));
1768 } 1813 }
1769 1814
1770 private: 1815 private:
1771 Token::Value op_; 1816 Token::Value op_;
1772 Expression* left_; 1817 Expression* left_;
1773 Expression* right_; 1818 Expression* right_;
1774 int pos_; 1819 int pos_;
1820
1821 TypeInfo left_type_;
1822 TypeInfo right_type_;
1823 TypeInfo result_type_;
1824
1775 // The short-circuit logical operations need an AST ID for their 1825 // The short-circuit logical operations need an AST ID for their
1776 // right-hand subexpression. 1826 // right-hand subexpression.
1777 const BailoutId right_id_; 1827 const BailoutId right_id_;
1778 }; 1828 };
1779 1829
1780 1830
1781 class CountOperation: public Expression { 1831 class CountOperation: public Expression {
1782 public: 1832 public:
1783 DECLARE_NODE_TYPE(CountOperation) 1833 DECLARE_NODE_TYPE(CountOperation)
1784 1834
1785 bool is_prefix() const { return is_prefix_; } 1835 bool is_prefix() const { return is_prefix_; }
1786 bool is_postfix() const { return !is_prefix_; } 1836 bool is_postfix() const { return !is_prefix_; }
1787 1837
1788 Token::Value op() const { return op_; } 1838 Token::Value op() const { return op_; }
1789 Token::Value binary_op() { 1839 Token::Value binary_op() {
1790 return (op() == Token::INC) ? Token::ADD : Token::SUB; 1840 return (op() == Token::INC) ? Token::ADD : Token::SUB;
1791 } 1841 }
1792 1842
1793 Expression* expression() const { return expression_; } 1843 Expression* expression() const { return expression_; }
1794 virtual int position() const { return pos_; } 1844 virtual int position() const { return pos_; }
1795 1845
1796 virtual void MarkAsStatement() { is_prefix_ = true; } 1846 virtual void MarkAsStatement() { is_prefix_ = true; }
1797 1847
1798 void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* znoe); 1848 void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* znoe);
1799 virtual bool IsMonomorphic() { return is_monomorphic_; } 1849 virtual bool IsMonomorphic() { return is_monomorphic_; }
1800 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } 1850 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
1801 virtual KeyedAccessStoreMode GetStoreMode() { 1851 virtual KeyedAccessStoreMode GetStoreMode() {
1802 return store_mode_; 1852 return store_mode_;
1803 } 1853 }
1854 TypeInfo type() const { return type_; }
1804 1855
1805 BailoutId AssignmentId() const { return assignment_id_; } 1856 BailoutId AssignmentId() const { return assignment_id_; }
1806 1857
1807 TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; } 1858 TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; }
1808 TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); } 1859 TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); }
1809 1860
1810 protected: 1861 protected:
1811 CountOperation(Isolate* isolate, 1862 CountOperation(Isolate* isolate,
1812 Token::Value op, 1863 Token::Value op,
1813 bool is_prefix, 1864 bool is_prefix,
1814 Expression* expr, 1865 Expression* expr,
1815 int pos) 1866 int pos)
1816 : Expression(isolate), 1867 : Expression(isolate),
1817 op_(op), 1868 op_(op),
1818 is_prefix_(is_prefix), 1869 is_prefix_(is_prefix),
1819 is_monomorphic_(false), 1870 is_monomorphic_(false),
1820 store_mode_(STANDARD_STORE), 1871 store_mode_(STANDARD_STORE),
1821 expression_(expr), 1872 expression_(expr),
1822 pos_(pos), 1873 pos_(pos),
1823 assignment_id_(GetNextId(isolate)), 1874 assignment_id_(GetNextId(isolate)),
1824 count_id_(GetNextId(isolate)) {} 1875 count_id_(GetNextId(isolate)) {}
1825 1876
1826 private: 1877 private:
1827 Token::Value op_; 1878 Token::Value op_;
1828 bool is_prefix_ : 1; 1879 bool is_prefix_ : 1;
1829 bool is_monomorphic_ : 1; 1880 bool is_monomorphic_ : 1;
1830 KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, 1881 KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed,
1831 // must have extra bit. 1882 // must have extra bit.
1883 TypeInfo type_;
1884
1832 Expression* expression_; 1885 Expression* expression_;
1833 int pos_; 1886 int pos_;
1834 const BailoutId assignment_id_; 1887 const BailoutId assignment_id_;
1835 const TypeFeedbackId count_id_; 1888 const TypeFeedbackId count_id_;
1836 SmallMapList receiver_types_; 1889 SmallMapList receiver_types_;
1837 }; 1890 };
1838 1891
1839 1892
1840 class CompareOperation: public Expression { 1893 class CompareOperation: public Expression {
1841 public: 1894 public:
1842 DECLARE_NODE_TYPE(CompareOperation) 1895 DECLARE_NODE_TYPE(CompareOperation)
1843 1896
1844 Token::Value op() const { return op_; } 1897 Token::Value op() const { return op_; }
1845 Expression* left() const { return left_; } 1898 Expression* left() const { return left_; }
1846 Expression* right() const { return right_; } 1899 Expression* right() const { return right_; }
1847 virtual int position() const { return pos_; } 1900 virtual int position() const { return pos_; }
1848 1901
1849 // Type feedback information. 1902 // Type feedback information.
1850 TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); } 1903 TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); }
1904 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1905 TypeInfo left_type() const { return left_type_; }
1906 TypeInfo right_type() const { return right_type_; }
1907 TypeInfo overall_type() const { return overall_type_; }
1908 byte compare_nil_types() const { return compare_nil_types_; }
1909 Handle<Map> map() const { return map_; }
1851 1910
1852 // Match special cases. 1911 // Match special cases.
1853 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); 1912 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check);
1854 bool IsLiteralCompareUndefined(Expression** expr); 1913 bool IsLiteralCompareUndefined(Expression** expr);
1855 bool IsLiteralCompareNull(Expression** expr); 1914 bool IsLiteralCompareNull(Expression** expr);
1856 1915
1857 protected: 1916 protected:
1858 CompareOperation(Isolate* isolate, 1917 CompareOperation(Isolate* isolate,
1859 Token::Value op, 1918 Token::Value op,
1860 Expression* left, 1919 Expression* left,
1861 Expression* right, 1920 Expression* right,
1862 int pos) 1921 int pos)
1863 : Expression(isolate), 1922 : Expression(isolate),
1864 op_(op), 1923 op_(op),
1865 left_(left), 1924 left_(left),
1866 right_(right), 1925 right_(right),
1867 pos_(pos) { 1926 pos_(pos) {
1868 ASSERT(Token::IsCompareOp(op)); 1927 ASSERT(Token::IsCompareOp(op));
1869 } 1928 }
1870 1929
1871 private: 1930 private:
1872 Token::Value op_; 1931 Token::Value op_;
1873 Expression* left_; 1932 Expression* left_;
1874 Expression* right_; 1933 Expression* right_;
1875 int pos_; 1934 int pos_;
1935
1936 TypeInfo left_type_;
1937 TypeInfo right_type_;
1938 TypeInfo overall_type_;
1939 byte compare_nil_types_;
1940 Handle<Map> map_;
1876 }; 1941 };
1877 1942
1878 1943
1879 class Conditional: public Expression { 1944 class Conditional: public Expression {
1880 public: 1945 public:
1881 DECLARE_NODE_TYPE(Conditional) 1946 DECLARE_NODE_TYPE(Conditional)
1882 1947
1883 Expression* condition() const { return condition_; } 1948 Expression* condition() const { return condition_; }
1884 Expression* then_expression() const { return then_expression_; } 1949 Expression* then_expression() const { return then_expression_; }
1885 Expression* else_expression() const { return else_expression_; } 1950 Expression* else_expression() const { return else_expression_; }
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after
3049 private: 3114 private:
3050 Isolate* isolate_; 3115 Isolate* isolate_;
3051 Zone* zone_; 3116 Zone* zone_;
3052 Visitor visitor_; 3117 Visitor visitor_;
3053 }; 3118 };
3054 3119
3055 3120
3056 } } // namespace v8::internal 3121 } } // namespace v8::internal
3057 3122
3058 #endif // V8_AST_H_ 3123 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698