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

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: Rebase onto current master Created 7 years, 6 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 V(IfStatement) \ 83 V(IfStatement) \
84 V(ContinueStatement) \ 84 V(ContinueStatement) \
85 V(BreakStatement) \ 85 V(BreakStatement) \
86 V(ReturnStatement) \ 86 V(ReturnStatement) \
87 V(WithStatement) \ 87 V(WithStatement) \
88 V(SwitchStatement) \ 88 V(SwitchStatement) \
89 V(DoWhileStatement) \ 89 V(DoWhileStatement) \
90 V(WhileStatement) \ 90 V(WhileStatement) \
91 V(ForStatement) \ 91 V(ForStatement) \
92 V(ForInStatement) \ 92 V(ForInStatement) \
93 V(ForOfStatement) \
93 V(TryCatchStatement) \ 94 V(TryCatchStatement) \
94 V(TryFinallyStatement) \ 95 V(TryFinallyStatement) \
95 V(DebuggerStatement) 96 V(DebuggerStatement)
96 97
97 #define EXPRESSION_NODE_LIST(V) \ 98 #define EXPRESSION_NODE_LIST(V) \
98 V(FunctionLiteral) \ 99 V(FunctionLiteral) \
99 V(SharedFunctionInfoLiteral) \ 100 V(SharedFunctionInfoLiteral) \
100 V(Conditional) \ 101 V(Conditional) \
101 V(VariableProxy) \ 102 V(VariableProxy) \
102 V(Literal) \ 103 V(Literal) \
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 868
868 // True if there is a function literal subexpression in the condition. 869 // True if there is a function literal subexpression in the condition.
869 bool may_have_function_literal_; 870 bool may_have_function_literal_;
870 Variable* loop_variable_; 871 Variable* loop_variable_;
871 872
872 const BailoutId continue_id_; 873 const BailoutId continue_id_;
873 const BailoutId body_id_; 874 const BailoutId body_id_;
874 }; 875 };
875 876
876 877
877 class ForInStatement: public IterationStatement { 878 class ForEachStatement: public IterationStatement {
878 public: 879 public:
879 DECLARE_NODE_TYPE(ForInStatement) 880 enum VisitMode {
881 ENUMERATE, // for (each in subject) body;
882 ITERATE // for (each of subject) body;
883 };
880 884
881 void Initialize(Expression* each, Expression* enumerable, Statement* body) { 885 void Initialize(Expression* each, Expression* subject, Statement* body) {
882 IterationStatement::Initialize(body); 886 IterationStatement::Initialize(body);
883 each_ = each; 887 each_ = each;
884 enumerable_ = enumerable; 888 subject_ = subject;
885 for_in_type_ = SLOW_FOR_IN;
886 } 889 }
887 890
888 Expression* each() const { return each_; } 891 Expression* each() const { return each_; }
889 Expression* enumerable() const { return enumerable_; } 892 Expression* subject() const { return subject_; }
890 893
891 virtual BailoutId ContinueId() const { return EntryId(); } 894 virtual BailoutId ContinueId() const { return EntryId(); }
892 virtual BailoutId StackCheckId() const { return body_id_; } 895 virtual BailoutId StackCheckId() const { return body_id_; }
893 BailoutId BodyId() const { return body_id_; } 896 BailoutId BodyId() const { return body_id_; }
894 BailoutId PrepareId() const { return prepare_id_; } 897 BailoutId PrepareId() const { return prepare_id_; }
895 898
899 protected:
900 ForEachStatement(Isolate* isolate, ZoneStringList* labels)
901 : IterationStatement(isolate, labels),
902 each_(NULL),
903 subject_(NULL),
904 body_id_(GetNextId(isolate)),
905 prepare_id_(GetNextId(isolate)) {
906 }
907
908 private:
909 Expression* each_;
910 Expression* subject_;
911 const BailoutId body_id_;
912 const BailoutId prepare_id_;
913 };
914
915
916 class ForInStatement: public ForEachStatement {
917 public:
918 DECLARE_NODE_TYPE(ForInStatement)
919
920 Expression* enumerable() const {
921 return subject();
922 }
923
896 TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); } 924 TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); }
897 void RecordTypeFeedback(TypeFeedbackOracle* oracle); 925 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
898 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; 926 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN };
899 ForInType for_in_type() const { return for_in_type_; } 927 ForInType for_in_type() const { return for_in_type_; }
900 928
901 protected: 929 protected:
902 ForInStatement(Isolate* isolate, ZoneStringList* labels) 930 ForInStatement(Isolate* isolate, ZoneStringList* labels)
903 : IterationStatement(isolate, labels), 931 : ForEachStatement(isolate, labels),
904 each_(NULL), 932 for_in_type_(SLOW_FOR_IN) {
905 enumerable_(NULL),
906 body_id_(GetNextId(isolate)),
907 prepare_id_(GetNextId(isolate)) {
908 } 933 }
909 934
910 private:
911 Expression* each_;
912 Expression* enumerable_;
913
914 ForInType for_in_type_; 935 ForInType for_in_type_;
915
916 const BailoutId body_id_;
917 const BailoutId prepare_id_;
918 }; 936 };
919 937
920 938
939 class ForOfStatement: public ForEachStatement {
940 public:
941 DECLARE_NODE_TYPE(ForOfStatement)
942
943 Expression* iterable() const {
944 return subject();
945 }
946
947 protected:
948 ForOfStatement(Isolate* isolate, ZoneStringList* labels)
949 : ForEachStatement(isolate, labels) {
950 }
951 };
952
953
921 class ExpressionStatement: public Statement { 954 class ExpressionStatement: public Statement {
922 public: 955 public:
923 DECLARE_NODE_TYPE(ExpressionStatement) 956 DECLARE_NODE_TYPE(ExpressionStatement)
924 957
925 void set_expression(Expression* e) { expression_ = e; } 958 void set_expression(Expression* e) { expression_ = e; }
926 Expression* expression() const { return expression_; } 959 Expression* expression() const { return expression_; }
927 960
928 protected: 961 protected:
929 explicit ExpressionStatement(Expression* expression) 962 explicit ExpressionStatement(Expression* expression)
930 : expression_(expression) { } 963 : expression_(expression) { }
(...skipping 1915 matching lines...) Expand 10 before | Expand all | Expand 10 after
2846 } 2879 }
2847 2880
2848 #define STATEMENT_WITH_LABELS(NodeType) \ 2881 #define STATEMENT_WITH_LABELS(NodeType) \
2849 NodeType* New##NodeType(ZoneStringList* labels) { \ 2882 NodeType* New##NodeType(ZoneStringList* labels) { \
2850 NodeType* stmt = new(zone_) NodeType(isolate_, labels); \ 2883 NodeType* stmt = new(zone_) NodeType(isolate_, labels); \
2851 VISIT_AND_RETURN(NodeType, stmt); \ 2884 VISIT_AND_RETURN(NodeType, stmt); \
2852 } 2885 }
2853 STATEMENT_WITH_LABELS(DoWhileStatement) 2886 STATEMENT_WITH_LABELS(DoWhileStatement)
2854 STATEMENT_WITH_LABELS(WhileStatement) 2887 STATEMENT_WITH_LABELS(WhileStatement)
2855 STATEMENT_WITH_LABELS(ForStatement) 2888 STATEMENT_WITH_LABELS(ForStatement)
2856 STATEMENT_WITH_LABELS(ForInStatement)
2857 STATEMENT_WITH_LABELS(SwitchStatement) 2889 STATEMENT_WITH_LABELS(SwitchStatement)
2858 #undef STATEMENT_WITH_LABELS 2890 #undef STATEMENT_WITH_LABELS
2859 2891
2892 ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode,
2893 ZoneStringList* labels) {
2894 switch (visit_mode) {
2895 case ForEachStatement::ENUMERATE: {
2896 ForInStatement* stmt = new(zone_) ForInStatement(isolate_, labels);
2897 VISIT_AND_RETURN(ForInStatement, stmt);
2898 }
2899 case ForEachStatement::ITERATE: {
2900 ForOfStatement* stmt = new(zone_) ForOfStatement(isolate_, labels);
2901 VISIT_AND_RETURN(ForOfStatement, stmt);
2902 }
2903 }
2904 UNREACHABLE();
2905 return NULL;
2906 }
2907
2860 ModuleStatement* NewModuleStatement(VariableProxy* proxy, Block* body) { 2908 ModuleStatement* NewModuleStatement(VariableProxy* proxy, Block* body) {
2861 ModuleStatement* stmt = new(zone_) ModuleStatement(proxy, body); 2909 ModuleStatement* stmt = new(zone_) ModuleStatement(proxy, body);
2862 VISIT_AND_RETURN(ModuleStatement, stmt) 2910 VISIT_AND_RETURN(ModuleStatement, stmt)
2863 } 2911 }
2864 2912
2865 ExpressionStatement* NewExpressionStatement(Expression* expression) { 2913 ExpressionStatement* NewExpressionStatement(Expression* expression) {
2866 ExpressionStatement* stmt = new(zone_) ExpressionStatement(expression); 2914 ExpressionStatement* stmt = new(zone_) ExpressionStatement(expression);
2867 VISIT_AND_RETURN(ExpressionStatement, stmt) 2915 VISIT_AND_RETURN(ExpressionStatement, stmt)
2868 } 2916 }
2869 2917
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
3128 private: 3176 private:
3129 Isolate* isolate_; 3177 Isolate* isolate_;
3130 Zone* zone_; 3178 Zone* zone_;
3131 Visitor visitor_; 3179 Visitor visitor_;
3132 }; 3180 };
3133 3181
3134 3182
3135 } } // namespace v8::internal 3183 } } // namespace v8::internal
3136 3184
3137 #endif // V8_AST_H_ 3185 #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