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

Side by Side Diff: src/ast.h

Issue 15300018: Add initial parser support for harmony iteration (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Use subtyping instead of enumerated value 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') | src/full-codegen.cc » ('J')
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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 V(IfStatement) \ 81 V(IfStatement) \
82 V(ContinueStatement) \ 82 V(ContinueStatement) \
83 V(BreakStatement) \ 83 V(BreakStatement) \
84 V(ReturnStatement) \ 84 V(ReturnStatement) \
85 V(WithStatement) \ 85 V(WithStatement) \
86 V(SwitchStatement) \ 86 V(SwitchStatement) \
87 V(DoWhileStatement) \ 87 V(DoWhileStatement) \
88 V(WhileStatement) \ 88 V(WhileStatement) \
89 V(ForStatement) \ 89 V(ForStatement) \
90 V(ForInStatement) \ 90 V(ForInStatement) \
91 V(ForOfStatement) \
91 V(TryCatchStatement) \ 92 V(TryCatchStatement) \
92 V(TryFinallyStatement) \ 93 V(TryFinallyStatement) \
93 V(DebuggerStatement) 94 V(DebuggerStatement)
94 95
95 #define EXPRESSION_NODE_LIST(V) \ 96 #define EXPRESSION_NODE_LIST(V) \
96 V(FunctionLiteral) \ 97 V(FunctionLiteral) \
97 V(SharedFunctionInfoLiteral) \ 98 V(SharedFunctionInfoLiteral) \
98 V(Conditional) \ 99 V(Conditional) \
99 V(VariableProxy) \ 100 V(VariableProxy) \
100 V(Literal) \ 101 V(Literal) \
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 Expression* cond_; 843 Expression* cond_;
843 Statement* next_; 844 Statement* next_;
844 // True if there is a function literal subexpression in the condition. 845 // True if there is a function literal subexpression in the condition.
845 bool may_have_function_literal_; 846 bool may_have_function_literal_;
846 Variable* loop_variable_; 847 Variable* loop_variable_;
847 const BailoutId continue_id_; 848 const BailoutId continue_id_;
848 const BailoutId body_id_; 849 const BailoutId body_id_;
849 }; 850 };
850 851
851 852
852 class ForInStatement: public IterationStatement { 853 class ForEachStatement: public IterationStatement {
853 public: 854 public:
854 DECLARE_NODE_TYPE(ForInStatement) 855 enum VisitMode {
856 ENUMERATE, // for (each in subject) body;
857 ITERATE // for (each of subject) body;
858 };
855 859
856 void Initialize(Expression* each, Expression* enumerable, Statement* body) { 860 void Initialize(Expression* each,
rossberg 2013/06/06 10:32:33 Nit: doesn't this fit on one line?
wingo 2013/06/06 14:09:51 Ah, yep. Artifact from a previous patch; fixed.
861 Expression* subject,
862 Statement* body) {
857 IterationStatement::Initialize(body); 863 IterationStatement::Initialize(body);
858 each_ = each; 864 each_ = each;
859 enumerable_ = enumerable; 865 subject_ = subject;
860 } 866 }
861 867
862 Expression* each() const { return each_; } 868 Expression* each() const { return each_; }
863 Expression* enumerable() const { return enumerable_; } 869 Expression* subject() const { return subject_; }
864 870
865 virtual BailoutId ContinueId() const { return EntryId(); } 871 virtual BailoutId ContinueId() const { return EntryId(); }
866 virtual BailoutId StackCheckId() const { return body_id_; } 872 virtual BailoutId StackCheckId() const { return body_id_; }
867 BailoutId BodyId() const { return body_id_; } 873 BailoutId BodyId() const { return body_id_; }
868 BailoutId PrepareId() const { return prepare_id_; } 874 BailoutId PrepareId() const { return prepare_id_; }
869 875
870 TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); }
871
872 protected: 876 protected:
873 ForInStatement(Isolate* isolate, ZoneStringList* labels) 877 ForEachStatement(Isolate* isolate, ZoneStringList* labels)
874 : IterationStatement(isolate, labels), 878 : IterationStatement(isolate, labels),
875 each_(NULL), 879 each_(NULL),
876 enumerable_(NULL), 880 subject_(NULL),
877 body_id_(GetNextId(isolate)), 881 body_id_(GetNextId(isolate)),
878 prepare_id_(GetNextId(isolate)) { 882 prepare_id_(GetNextId(isolate)) {
879 } 883 }
880 884
881 private: 885 private:
882 Expression* each_; 886 Expression* each_;
883 Expression* enumerable_; 887 Expression* subject_;
884 const BailoutId body_id_; 888 const BailoutId body_id_;
885 const BailoutId prepare_id_; 889 const BailoutId prepare_id_;
886 }; 890 };
887 891
888 892
893 class ForInStatement: public ForEachStatement {
894 public:
895 DECLARE_NODE_TYPE(ForInStatement)
896
897 Expression* enumerable() const {
898 return subject();
899 }
900
901 TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); }
902
903 protected:
904 ForInStatement(Isolate* isolate, ZoneStringList* labels)
905 : ForEachStatement(isolate, labels) {
906 }
907 };
908
909
910 class ForOfStatement: public ForEachStatement {
911 public:
912 DECLARE_NODE_TYPE(ForOfStatement)
913
914 Expression* iterable() const {
915 return subject();
916 }
917
918 protected:
919 ForOfStatement(Isolate* isolate, ZoneStringList* labels)
920 : ForEachStatement(isolate, labels) {
921 }
922 };
923
924
889 class ExpressionStatement: public Statement { 925 class ExpressionStatement: public Statement {
890 public: 926 public:
891 DECLARE_NODE_TYPE(ExpressionStatement) 927 DECLARE_NODE_TYPE(ExpressionStatement)
892 928
893 void set_expression(Expression* e) { expression_ = e; } 929 void set_expression(Expression* e) { expression_ = e; }
894 Expression* expression() const { return expression_; } 930 Expression* expression() const { return expression_; }
895 931
896 protected: 932 protected:
897 explicit ExpressionStatement(Expression* expression) 933 explicit ExpressionStatement(Expression* expression)
898 : expression_(expression) { } 934 : expression_(expression) { }
(...skipping 1880 matching lines...) Expand 10 before | Expand all | Expand 10 after
2779 } 2815 }
2780 2816
2781 #define STATEMENT_WITH_LABELS(NodeType) \ 2817 #define STATEMENT_WITH_LABELS(NodeType) \
2782 NodeType* New##NodeType(ZoneStringList* labels) { \ 2818 NodeType* New##NodeType(ZoneStringList* labels) { \
2783 NodeType* stmt = new(zone_) NodeType(isolate_, labels); \ 2819 NodeType* stmt = new(zone_) NodeType(isolate_, labels); \
2784 VISIT_AND_RETURN(NodeType, stmt); \ 2820 VISIT_AND_RETURN(NodeType, stmt); \
2785 } 2821 }
2786 STATEMENT_WITH_LABELS(DoWhileStatement) 2822 STATEMENT_WITH_LABELS(DoWhileStatement)
2787 STATEMENT_WITH_LABELS(WhileStatement) 2823 STATEMENT_WITH_LABELS(WhileStatement)
2788 STATEMENT_WITH_LABELS(ForStatement) 2824 STATEMENT_WITH_LABELS(ForStatement)
2789 STATEMENT_WITH_LABELS(ForInStatement)
2790 STATEMENT_WITH_LABELS(SwitchStatement) 2825 STATEMENT_WITH_LABELS(SwitchStatement)
2791 #undef STATEMENT_WITH_LABELS 2826 #undef STATEMENT_WITH_LABELS
2792 2827
2828 ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode,
2829 ZoneStringList* labels) {
2830 switch (visit_mode) {
2831 case ForEachStatement::ENUMERATE: {
2832 ForInStatement* stmt = new(zone_) ForInStatement(isolate_, labels);
2833 VISIT_AND_RETURN(ForInStatement, stmt);
2834 }
2835 case ForEachStatement::ITERATE: {
2836 ForOfStatement* stmt = new(zone_) ForOfStatement(isolate_, labels);
2837 VISIT_AND_RETURN(ForOfStatement, stmt);
2838 }
2839 default:
Michael Starzinger 2013/06/06 09:36:36 Please avoid default cases in switches over enums.
wingo 2013/06/06 14:09:51 Fixed as per Sven's recommendation. I think it wa
2840 UNREACHABLE();
2841 return NULL;
2842 }
2843 }
2844
2793 ModuleStatement* NewModuleStatement(VariableProxy* proxy, Block* body) { 2845 ModuleStatement* NewModuleStatement(VariableProxy* proxy, Block* body) {
2794 ModuleStatement* stmt = new(zone_) ModuleStatement(proxy, body); 2846 ModuleStatement* stmt = new(zone_) ModuleStatement(proxy, body);
2795 VISIT_AND_RETURN(ModuleStatement, stmt) 2847 VISIT_AND_RETURN(ModuleStatement, stmt)
2796 } 2848 }
2797 2849
2798 ExpressionStatement* NewExpressionStatement(Expression* expression) { 2850 ExpressionStatement* NewExpressionStatement(Expression* expression) {
2799 ExpressionStatement* stmt = new(zone_) ExpressionStatement(expression); 2851 ExpressionStatement* stmt = new(zone_) ExpressionStatement(expression);
2800 VISIT_AND_RETURN(ExpressionStatement, stmt) 2852 VISIT_AND_RETURN(ExpressionStatement, stmt)
2801 } 2853 }
2802 2854
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
3064 private: 3116 private:
3065 Isolate* isolate_; 3117 Isolate* isolate_;
3066 Zone* zone_; 3118 Zone* zone_;
3067 Visitor visitor_; 3119 Visitor visitor_;
3068 }; 3120 };
3069 3121
3070 3122
3071 } } // namespace v8::internal 3123 } } // namespace v8::internal
3072 3124
3073 #endif // V8_AST_H_ 3125 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/full-codegen.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698