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

Side by Side Diff: runtime/vm/parser.h

Issue 958243003: Fix async machinery (issue 22445 and possibly others to be triaged later). (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 9 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
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_PARSER_H_ 5 #ifndef VM_PARSER_H_
6 #define VM_PARSER_H_ 6 #define VM_PARSER_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 9
10 #include "platform/assert.h" 10 #include "platform/assert.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 default_parameter_values_(Array::ZoneHandle(zone(), Array::null())), 50 default_parameter_values_(Array::ZoneHandle(zone(), Array::null())),
51 current_context_var_(NULL), 51 current_context_var_(NULL),
52 expression_temp_var_(NULL), 52 expression_temp_var_(NULL),
53 finally_return_temp_var_(NULL), 53 finally_return_temp_var_(NULL),
54 deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()), 54 deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()),
55 guarded_fields_(new ZoneGrowableArray<const Field*>()), 55 guarded_fields_(new ZoneGrowableArray<const Field*>()),
56 first_parameter_index_(0), 56 first_parameter_index_(0),
57 first_stack_local_index_(0), 57 first_stack_local_index_(0),
58 num_copied_params_(0), 58 num_copied_params_(0),
59 num_stack_locals_(0), 59 num_stack_locals_(0),
60 have_seen_await_expr_(false), 60 have_seen_await_expr_(false) {
61 saved_try_ctx_(NULL),
62 async_saved_try_ctx_name_(String::ZoneHandle(zone(), String::null())) {
63 ASSERT(function.IsZoneHandle()); 61 ASSERT(function.IsZoneHandle());
64 // Every function has a local variable for the current context. 62 // Every function has a local variable for the current context.
65 LocalVariable* temp = new(zone()) LocalVariable( 63 LocalVariable* temp = new(zone()) LocalVariable(
66 function.token_pos(), 64 function.token_pos(),
67 Symbols::CurrentContextVar(), 65 Symbols::CurrentContextVar(),
68 Type::ZoneHandle(zone(), Type::DynamicType())); 66 Type::ZoneHandle(zone(), Type::DynamicType()));
69 ASSERT(temp != NULL); 67 ASSERT(temp != NULL);
70 current_context_var_ = temp; 68 current_context_var_ = temp;
71 } 69 }
72 70
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 return (num_copied_params_ == 0) 143 return (num_copied_params_ == 0)
146 ? function().num_fixed_parameters() : 0; 144 ? function().num_fixed_parameters() : 0;
147 } 145 }
148 146
149 void AllocateVariables(); 147 void AllocateVariables();
150 void AllocateIrregexpVariables(intptr_t num_stack_locals); 148 void AllocateIrregexpVariables(intptr_t num_stack_locals);
151 149
152 void record_await() { have_seen_await_expr_ = true; } 150 void record_await() { have_seen_await_expr_ = true; }
153 bool have_seen_await() const { return have_seen_await_expr_; } 151 bool have_seen_await() const { return have_seen_await_expr_; }
154 152
155 void set_saved_try_ctx(LocalVariable* saved_try_ctx) {
156 ASSERT((saved_try_ctx == NULL) || !saved_try_ctx->is_captured());
157 saved_try_ctx_ = saved_try_ctx;
158 }
159 LocalVariable* saved_try_ctx() const { return saved_try_ctx_; }
160
161 void set_async_saved_try_ctx_name(const String& async_saved_try_ctx_name) {
162 async_saved_try_ctx_name_ = async_saved_try_ctx_name.raw();
163 }
164 RawString* async_saved_try_ctx_name() const {
165 return async_saved_try_ctx_name_.raw();
166 }
167
168 void reset_saved_try_ctx_vars() {
169 saved_try_ctx_ = NULL;
170 async_saved_try_ctx_name_ = String::null();
171 }
172
173 Thread* thread() const { return thread_; } 153 Thread* thread() const { return thread_; }
174 Isolate* isolate() const { return thread()->isolate(); } 154 Isolate* isolate() const { return thread()->isolate(); }
175 Zone* zone() const { return thread()->zone(); } 155 Zone* zone() const { return thread()->zone(); }
176 156
177 private: 157 private:
178 Thread* thread_; 158 Thread* thread_;
179 const Function& function_; 159 const Function& function_;
180 Code& code_; 160 Code& code_;
181 SequenceNode* node_sequence_; 161 SequenceNode* node_sequence_;
182 RegExpCompileData* regexp_compile_data_; 162 RegExpCompileData* regexp_compile_data_;
183 LocalVariable* instantiator_; 163 LocalVariable* instantiator_;
184 Array& default_parameter_values_; 164 Array& default_parameter_values_;
185 LocalVariable* current_context_var_; 165 LocalVariable* current_context_var_;
186 LocalVariable* expression_temp_var_; 166 LocalVariable* expression_temp_var_;
187 LocalVariable* finally_return_temp_var_; 167 LocalVariable* finally_return_temp_var_;
188 ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_; 168 ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_;
189 ZoneGrowableArray<const Field*>* guarded_fields_; 169 ZoneGrowableArray<const Field*>* guarded_fields_;
190 170
191 int first_parameter_index_; 171 int first_parameter_index_;
192 int first_stack_local_index_; 172 int first_stack_local_index_;
193 int num_copied_params_; 173 int num_copied_params_;
194 int num_stack_locals_; 174 int num_stack_locals_;
195 bool have_seen_await_expr_; 175 bool have_seen_await_expr_;
196 LocalVariable* saved_try_ctx_;
197 String& async_saved_try_ctx_name_;
198 176
199 friend class Parser; 177 friend class Parser;
200 DISALLOW_COPY_AND_ASSIGN(ParsedFunction); 178 DISALLOW_COPY_AND_ASSIGN(ParsedFunction);
201 }; 179 };
202 180
203 181
204 class Parser : public ValueObject { 182 class Parser : public ValueObject {
205 public: 183 public:
206 // Parse the top level of a whole script file and register declared classes 184 // Parse the top level of a whole script file and register declared classes
207 // in the given library. 185 // in the given library.
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 RawClass* CheckCaseExpressions(const GrowableArray<LiteralNode*>& values); 573 RawClass* CheckCaseExpressions(const GrowableArray<LiteralNode*>& values);
596 CaseNode* ParseCaseClause(LocalVariable* switch_expr_value, 574 CaseNode* ParseCaseClause(LocalVariable* switch_expr_value,
597 GrowableArray<LiteralNode*>* case_expr_values, 575 GrowableArray<LiteralNode*>* case_expr_values,
598 SourceLabel* case_label); 576 SourceLabel* case_label);
599 AstNode* ParseSwitchStatement(String* label_name); 577 AstNode* ParseSwitchStatement(String* label_name);
600 578
601 // try/catch/finally parsing. 579 // try/catch/finally parsing.
602 void AddCatchParamsToScope(CatchParamDesc* exception_param, 580 void AddCatchParamsToScope(CatchParamDesc* exception_param,
603 CatchParamDesc* stack_trace_param, 581 CatchParamDesc* stack_trace_param,
604 LocalScope* scope); 582 LocalScope* scope);
605 void AddSavedExceptionAndStacktraceToScope(LocalVariable* exception_var, 583 void SetupSavedExceptionAndStacktrace();
606 LocalVariable* stack_trace_var, 584 void SaveExceptionAndStacktrace(LocalVariable* exception_var,
607 LocalScope* scope); 585 LocalVariable* stack_trace_var);
608 // Parse all the catch clause of a try. 586 // Parse all the catch clause of a try.
609 SequenceNode* ParseCatchClauses(intptr_t handler_pos, 587 SequenceNode* ParseCatchClauses(intptr_t handler_pos,
610 LocalVariable* exception_var, 588 LocalVariable* exception_var,
611 LocalVariable* stack_trace_var, 589 LocalVariable* stack_trace_var,
612 const GrowableObjectArray& handler_types, 590 const GrowableObjectArray& handler_types,
613 bool* needs_stack_trace); 591 bool* needs_stack_trace);
614 // Parse finally block and create an AST for it. 592 // Parse finally block and create an AST for it.
615 SequenceNode* ParseFinallyBlock(); 593 SequenceNode* ParseFinallyBlock();
616 // Adds try block to the list of try blocks seen so far. 594 // Adds try block to the list of try blocks seen so far.
617 void PushTryBlock(Block* try_block); 595 void PushTryBlock(Block* try_block);
618 // Pops the inner most try block from the list. 596 // Pops the inner most try block from the list.
619 TryBlocks* PopTryBlock(); 597 TryBlocks* PopTryBlock();
598 // Collect try block scopes and indices if await or yield is in try block.
599 void CheckAsyncOpInTryBlock(LocalScope** try_scope,
600 int16_t* try_index,
601 LocalScope** outer_try_scope,
602 int16_t* outer_try_index) const;
620 // Add specified node to try block list so that it can be patched with 603 // Add specified node to try block list so that it can be patched with
621 // inlined finally code if needed. 604 // inlined finally code if needed.
622 void AddNodeForFinallyInlining(AstNode* node); 605 void AddNodeForFinallyInlining(AstNode* node);
623 // Add the inlined finally block to the specified node. 606 // Add the inlined finally block to the specified node.
624 void AddFinallyBlockToNode(AstNode* node, InlinedFinallyNode* finally_node); 607 void AddFinallyBlockToNode(AstNode* node, InlinedFinallyNode* finally_node);
625 AstNode* ParseTryStatement(String* label_name); 608 AstNode* ParseTryStatement(String* label_name);
626 RawAbstractType* ParseConstFinalVarOrType( 609 RawAbstractType* ParseConstFinalVarOrType(
627 ClassFinalizer::FinalizationKind finalization); 610 ClassFinalizer::FinalizationKind finalization);
628 AstNode* ParseVariableDeclaration(const AbstractType& type, 611 AstNode* ParseVariableDeclaration(const AbstractType& type,
629 bool is_final, 612 bool is_final,
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 AstNode* ThrowTypeError(intptr_t type_pos, const AbstractType& type); 728 AstNode* ThrowTypeError(intptr_t type_pos, const AbstractType& type);
746 AstNode* ThrowNoSuchMethodError(intptr_t call_pos, 729 AstNode* ThrowNoSuchMethodError(intptr_t call_pos,
747 const Class& cls, 730 const Class& cls,
748 const String& function_name, 731 const String& function_name,
749 ArgumentListNode* function_arguments, 732 ArgumentListNode* function_arguments,
750 InvocationMirror::Call call, 733 InvocationMirror::Call call,
751 InvocationMirror::Type type, 734 InvocationMirror::Type type,
752 const Function* func); 735 const Function* func);
753 736
754 void SetupSavedTryContext(LocalVariable* saved_try_context); 737 void SetupSavedTryContext(LocalVariable* saved_try_context);
755 void RestoreSavedTryContext(LocalScope* saved_try_context_scope,
756 int16_t try_index,
757 SequenceNode* target);
758 738
759 void CheckOperatorArity(const MemberDesc& member); 739 void CheckOperatorArity(const MemberDesc& member);
760 740
761 void EnsureExpressionTemp(); 741 void EnsureExpressionTemp();
762 bool IsLegalAssignableSyntax(AstNode* expr, intptr_t end_pos); 742 bool IsLegalAssignableSyntax(AstNode* expr, intptr_t end_pos);
763 AstNode* CreateAssignmentNode(AstNode* original, 743 AstNode* CreateAssignmentNode(AstNode* original,
764 AstNode* rhs, 744 AstNode* rhs,
765 const String* left_ident, 745 const String* left_ident,
766 intptr_t left_pos); 746 intptr_t left_pos);
767 AstNode* InsertClosureCallNodes(AstNode* condition); 747 AstNode* InsertClosureCallNodes(AstNode* condition);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 824
845 // Indentation of parser trace. 825 // Indentation of parser trace.
846 intptr_t trace_indent_; 826 intptr_t trace_indent_;
847 827
848 DISALLOW_COPY_AND_ASSIGN(Parser); 828 DISALLOW_COPY_AND_ASSIGN(Parser);
849 }; 829 };
850 830
851 } // namespace dart 831 } // namespace dart
852 832
853 #endif // VM_PARSER_H_ 833 #endif // VM_PARSER_H_
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_builder.cc ('k') | runtime/vm/parser.cc » ('j') | runtime/vm/parser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698