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

Side by Side Diff: src/parsing/parser.cc

Issue 2357423002: Improve stack traces for async functions (Closed)
Patch Set: Format Created 4 years, 2 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/ast/ast-expression-rewriter.h" 10 #include "src/ast/ast-expression-rewriter.h"
(...skipping 3113 matching lines...) Expand 10 before | Expand all | Expand 10 after
3124 if (param_scope != nullptr) { 3124 if (param_scope != nullptr) {
3125 CheckConflictingVarDeclarations(param_scope, CHECK_OK); 3125 CheckConflictingVarDeclarations(param_scope, CHECK_OK);
3126 } 3126 }
3127 init_block->statements()->Add(param_block, zone()); 3127 init_block->statements()->Add(param_block, zone());
3128 } 3128 }
3129 } 3129 }
3130 return init_block; 3130 return init_block;
3131 } 3131 }
3132 3132
3133 Block* Parser::BuildRejectPromiseOnException(Block* inner_block, bool* ok) { 3133 Block* Parser::BuildRejectPromiseOnException(Block* inner_block, bool* ok) {
3134 // .promise = %CreatePromise(); 3134 // .promise = %AsyncFunctionPromiseCreate();
3135 // .debug_is_active = %_DebugIsActive();
3136 // if (.debug_is_active) %DebugPushPromise(.promise);
3137 // try { 3135 // try {
3138 // <inner_block> 3136 // <inner_block>
3139 // } catch (.catch) { 3137 // } catch (.catch) {
3140 // %RejectPromise(.promise, .catch); 3138 // %RejectPromise(.promise, .catch);
3141 // return .promise; 3139 // return .promise;
3142 // } finally { 3140 // } finally {
3143 // if (.debug_is_active) %DebugPopPromise(); 3141 // %AsyncFunctionPromiseRelease(.promise);
3144 // } 3142 // }
3145 Block* result = factory()->NewBlock(nullptr, 4, true, kNoSourcePosition); 3143 Block* result = factory()->NewBlock(nullptr, 2, true, kNoSourcePosition);
3146 3144
3147 // .promise = %CreatePromise(); 3145 // .promise = %AsyncFunctionPromiseCreate();
3148 Statement* set_promise; 3146 Statement* set_promise;
3149 { 3147 {
3150 Expression* create_promise = factory()->NewCallRuntime( 3148 Expression* create_promise = factory()->NewCallRuntime(
3151 Context::PROMISE_CREATE_INDEX, 3149 Context::ASYNC_FUNCTION_PROMISE_CREATE_INDEX,
3152 new (zone()) ZoneList<Expression*>(0, zone()), kNoSourcePosition); 3150 new (zone()) ZoneList<Expression*>(0, zone()), kNoSourcePosition);
3153 Assignment* assign_promise = factory()->NewAssignment( 3151 Assignment* assign_promise = factory()->NewAssignment(
3154 Token::INIT, factory()->NewVariableProxy(PromiseVariable()), 3152 Token::INIT, factory()->NewVariableProxy(PromiseVariable()),
3155 create_promise, kNoSourcePosition); 3153 create_promise, kNoSourcePosition);
3156 set_promise = 3154 set_promise =
3157 factory()->NewExpressionStatement(assign_promise, kNoSourcePosition); 3155 factory()->NewExpressionStatement(assign_promise, kNoSourcePosition);
3158 } 3156 }
3159 result->statements()->Add(set_promise, zone()); 3157 result->statements()->Add(set_promise, zone());
3160 3158
3161 Variable* debug_is_active =
3162 scope()->NewTemporary(ast_value_factory()->empty_string());
3163 // .debug_is_active = %_DebugIsActive();
3164 Statement* set_debug_is_active;
3165 {
3166 Expression* call_debug_is_active = factory()->NewCallRuntime(
3167 Runtime::kInlineDebugIsActive,
3168 new (zone()) ZoneList<Expression*>(0, zone()), kNoSourcePosition);
3169 Assignment* assign_debug_is_active = factory()->NewAssignment(
3170 Token::INIT, factory()->NewVariableProxy(debug_is_active),
3171 call_debug_is_active, kNoSourcePosition);
3172 set_debug_is_active = factory()->NewExpressionStatement(
3173 assign_debug_is_active, kNoSourcePosition);
3174 }
3175 result->statements()->Add(set_debug_is_active, zone());
3176
3177 // if (.debug_is_active) %DebugPushPromise(.promise);
3178 Statement* conditionally_debug_push_promise;
3179 {
3180 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone());
3181 args->Add(factory()->NewVariableProxy(PromiseVariable()), zone());
3182 Expression* call_push_promise = factory()->NewCallRuntime(
3183 Runtime::kDebugPushPromise, args, kNoSourcePosition);
3184 Statement* debug_push_promise =
3185 factory()->NewExpressionStatement(call_push_promise, kNoSourcePosition);
3186 conditionally_debug_push_promise = factory()->NewIfStatement(
3187 factory()->NewVariableProxy(debug_is_active), debug_push_promise,
3188 factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition);
3189 }
3190 result->statements()->Add(conditionally_debug_push_promise, zone());
3191
3192 // catch (.catch) { return %RejectPromise(.promise, .catch), .promise } 3159 // catch (.catch) { return %RejectPromise(.promise, .catch), .promise }
3193 Scope* catch_scope = NewScope(CATCH_SCOPE); 3160 Scope* catch_scope = NewScope(CATCH_SCOPE);
3194 catch_scope->set_is_hidden(); 3161 catch_scope->set_is_hidden();
3195 Variable* catch_variable = 3162 Variable* catch_variable =
3196 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, 3163 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR,
3197 kCreatedInitialized, NORMAL_VARIABLE); 3164 kCreatedInitialized, NORMAL_VARIABLE);
3198 Block* catch_block = factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); 3165 Block* catch_block = factory()->NewBlock(nullptr, 1, true, kNoSourcePosition);
3199 3166
3200 Expression* promise_reject = BuildRejectPromise( 3167 Expression* promise_reject = BuildRejectPromise(
3201 factory()->NewVariableProxy(catch_variable), kNoSourcePosition); 3168 factory()->NewVariableProxy(catch_variable), kNoSourcePosition);
3202 ReturnStatement* return_promise_reject = 3169 ReturnStatement* return_promise_reject =
3203 factory()->NewReturnStatement(promise_reject, kNoSourcePosition); 3170 factory()->NewReturnStatement(promise_reject, kNoSourcePosition);
3204 catch_block->statements()->Add(return_promise_reject, zone()); 3171 catch_block->statements()->Add(return_promise_reject, zone());
3205 3172
3206 TryStatement* try_catch_statement = 3173 TryStatement* try_catch_statement =
3207 factory()->NewTryCatchStatementForAsyncAwait(inner_block, catch_scope, 3174 factory()->NewTryCatchStatementForAsyncAwait(inner_block, catch_scope,
3208 catch_variable, catch_block, 3175 catch_variable, catch_block,
3209 kNoSourcePosition); 3176 kNoSourcePosition);
3210 3177
3211 // There is no TryCatchFinally node, so wrap it in an outer try/finally 3178 // There is no TryCatchFinally node, so wrap it in an outer try/finally
3212 Block* outer_try_block = 3179 Block* outer_try_block =
3213 factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); 3180 factory()->NewBlock(nullptr, 1, true, kNoSourcePosition);
3214 outer_try_block->statements()->Add(try_catch_statement, zone()); 3181 outer_try_block->statements()->Add(try_catch_statement, zone());
3215 3182
3216 // finally { if (.debug_is_active) %DebugPopPromise(); } 3183 // finally { %AsyncFunctionPromiseRelease(.promise) }
3217 Block* finally_block = 3184 Block* finally_block =
3218 factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); 3185 factory()->NewBlock(nullptr, 1, true, kNoSourcePosition);
3219 { 3186 {
3220 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(0, zone()); 3187 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone());
3221 Expression* call_pop_promise = factory()->NewCallRuntime( 3188 args->Add(factory()->NewVariableProxy(PromiseVariable()), zone());
3222 Runtime::kDebugPopPromise, args, kNoSourcePosition); 3189 Expression* call_promise_release = factory()->NewCallRuntime(
3223 Statement* debug_pop_promise = 3190 Context::ASYNC_FUNCTION_PROMISE_RELEASE_INDEX, args, kNoSourcePosition);
3224 factory()->NewExpressionStatement(call_pop_promise, kNoSourcePosition); 3191 Statement* promise_release = factory()->NewExpressionStatement(
3225 Statement* conditionally_debug_pop_promise = factory()->NewIfStatement( 3192 call_promise_release, kNoSourcePosition);
3226 factory()->NewVariableProxy(debug_is_active), debug_pop_promise, 3193 finally_block->statements()->Add(promise_release, zone());
3227 factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition);
3228 finally_block->statements()->Add(conditionally_debug_pop_promise, zone());
3229 } 3194 }
3230 3195
3231 Statement* try_finally_statement = factory()->NewTryFinallyStatement( 3196 Statement* try_finally_statement = factory()->NewTryFinallyStatement(
3232 outer_try_block, finally_block, kNoSourcePosition); 3197 outer_try_block, finally_block, kNoSourcePosition);
3233 3198
3234 result->statements()->Add(try_finally_statement, zone()); 3199 result->statements()->Add(try_finally_statement, zone());
3235 return result; 3200 return result;
3236 } 3201 }
3237 3202
3238 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) { 3203 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) {
(...skipping 2367 matching lines...) Expand 10 before | Expand all | Expand 10 after
5606 5571
5607 return final_loop; 5572 return final_loop;
5608 } 5573 }
5609 5574
5610 #undef CHECK_OK 5575 #undef CHECK_OK
5611 #undef CHECK_OK_VOID 5576 #undef CHECK_OK_VOID
5612 #undef CHECK_FAILED 5577 #undef CHECK_FAILED
5613 5578
5614 } // namespace internal 5579 } // namespace internal
5615 } // namespace v8 5580 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698