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

Side by Side Diff: src/full-codegen/full-codegen.cc

Issue 2161263003: [debug] use catch prediction flag for promise rejections. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 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/full-codegen/full-codegen.h" 5 #include "src/full-codegen/full-codegen.h"
6 6
7 #include "src/ast/ast-numbering.h" 7 #include "src/ast/ast-numbering.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/prettyprinter.h" 9 #include "src/ast/prettyprinter.h"
10 #include "src/ast/scopeinfo.h" 10 #include "src/ast/scopeinfo.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 code->set_type_feedback_info(*info); 118 code->set_type_feedback_info(*info);
119 } 119 }
120 120
121 121
122 void FullCodeGenerator::PopulateHandlerTable(Handle<Code> code) { 122 void FullCodeGenerator::PopulateHandlerTable(Handle<Code> code) {
123 int handler_table_size = static_cast<int>(handler_table_.size()); 123 int handler_table_size = static_cast<int>(handler_table_.size());
124 Handle<HandlerTable> table = 124 Handle<HandlerTable> table =
125 Handle<HandlerTable>::cast(isolate()->factory()->NewFixedArray( 125 Handle<HandlerTable>::cast(isolate()->factory()->NewFixedArray(
126 HandlerTable::LengthForRange(handler_table_size), TENURED)); 126 HandlerTable::LengthForRange(handler_table_size), TENURED));
127 for (int i = 0; i < handler_table_size; ++i) { 127 for (int i = 0; i < handler_table_size; ++i) {
128 HandlerTable::CatchPrediction prediction = handler_table_[i].catch_predicted
129 ? HandlerTable::CAUGHT
130 : HandlerTable::UNCAUGHT;
131 table->SetRangeStart(i, handler_table_[i].range_start); 128 table->SetRangeStart(i, handler_table_[i].range_start);
132 table->SetRangeEnd(i, handler_table_[i].range_end); 129 table->SetRangeEnd(i, handler_table_[i].range_end);
133 table->SetRangeHandler(i, handler_table_[i].handler_offset, prediction); 130 table->SetRangeHandler(i, handler_table_[i].handler_offset,
131 handler_table_[i].catch_prediction);
134 table->SetRangeData(i, handler_table_[i].stack_depth); 132 table->SetRangeData(i, handler_table_[i].stack_depth);
135 } 133 }
136 code->set_handler_table(*table); 134 code->set_handler_table(*table);
137 } 135 }
138 136
139 137
140 int FullCodeGenerator::NewHandlerTableEntry() { 138 int FullCodeGenerator::NewHandlerTableEntry() {
141 int index = static_cast<int>(handler_table_.size()); 139 int index = static_cast<int>(handler_table_.size());
142 HandlerTableEntry entry = {0, 0, 0, 0, 0}; 140 HandlerTableEntry entry = {0, 0, 0, 0, HandlerTable::UNCAUGHT};
143 handler_table_.push_back(entry); 141 handler_table_.push_back(entry);
144 return index; 142 return index;
145 } 143 }
146 144
147 145
148 bool FullCodeGenerator::MustCreateObjectLiteralWithRuntime( 146 bool FullCodeGenerator::MustCreateObjectLiteralWithRuntime(
149 ObjectLiteral* expr) const { 147 ObjectLiteral* expr) const {
150 return masm()->serializer_enabled() || 148 return masm()->serializer_enabled() ||
151 !FastCloneShallowObjectStub::IsSupported(expr); 149 !FastCloneShallowObjectStub::IsSupported(expr);
152 } 150 }
(...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 // Restore the context. 1286 // Restore the context.
1289 LoadContextField(context_register(), Context::PREVIOUS_INDEX); 1287 LoadContextField(context_register(), Context::PREVIOUS_INDEX);
1290 StoreToFrameField(StandardFrameConstants::kContextOffset, context_register()); 1288 StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
1291 scope_ = saved_scope; 1289 scope_ = saved_scope;
1292 __ jmp(&exit); 1290 __ jmp(&exit);
1293 1291
1294 // Try block code. Sets up the exception handler chain. 1292 // Try block code. Sets up the exception handler chain.
1295 __ bind(&try_entry); 1293 __ bind(&try_entry);
1296 1294
1297 int handler_index = NewHandlerTableEntry(); 1295 int handler_index = NewHandlerTableEntry();
1298 EnterTryBlock(handler_index, &handler_entry, stmt->catch_predicted()); 1296 EnterTryBlock(handler_index, &handler_entry, stmt->catch_prediction());
1299 { 1297 {
1300 Comment cmnt_try(masm(), "[ Try block"); 1298 Comment cmnt_try(masm(), "[ Try block");
1301 Visit(stmt->try_block()); 1299 Visit(stmt->try_block());
1302 } 1300 }
1303 ExitTryBlock(handler_index); 1301 ExitTryBlock(handler_index);
1304 __ bind(&exit); 1302 __ bind(&exit);
1305 } 1303 }
1306 1304
1307 1305
1308 void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { 1306 void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
(...skipping 28 matching lines...) Expand all
1337 // Exception handler code. This code is only executed when an exception 1335 // Exception handler code. This code is only executed when an exception
1338 // is thrown. Record the continuation and jump to the finally block. 1336 // is thrown. Record the continuation and jump to the finally block.
1339 { 1337 {
1340 Comment cmnt_handler(masm(), "[ Finally handler"); 1338 Comment cmnt_handler(masm(), "[ Finally handler");
1341 deferred.RecordThrow(); 1339 deferred.RecordThrow();
1342 } 1340 }
1343 1341
1344 // Set up try handler. 1342 // Set up try handler.
1345 __ bind(&try_entry); 1343 __ bind(&try_entry);
1346 int handler_index = NewHandlerTableEntry(); 1344 int handler_index = NewHandlerTableEntry();
1347 EnterTryBlock(handler_index, &handler_entry, stmt->catch_predicted()); 1345 EnterTryBlock(handler_index, &handler_entry, stmt->catch_prediction());
1348 { 1346 {
1349 Comment cmnt_try(masm(), "[ Try block"); 1347 Comment cmnt_try(masm(), "[ Try block");
1350 TryFinally try_body(this, &deferred); 1348 TryFinally try_body(this, &deferred);
1351 Visit(stmt->try_block()); 1349 Visit(stmt->try_block());
1352 } 1350 }
1353 ExitTryBlock(handler_index); 1351 ExitTryBlock(handler_index);
1354 // Execute the finally block on the way out. Clobber the unpredictable 1352 // Execute the finally block on the way out. Clobber the unpredictable
1355 // value in the result register with one that's safe for GC because the 1353 // value in the result register with one that's safe for GC because the
1356 // finally block will unconditionally preserve the result register on the 1354 // finally block will unconditionally preserve the result register on the
1357 // stack. 1355 // stack.
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 VisitForStackValue(expr->exception()); 1518 VisitForStackValue(expr->exception());
1521 SetExpressionPosition(expr); 1519 SetExpressionPosition(expr);
1522 CallRuntimeWithOperands(Runtime::kThrow); 1520 CallRuntimeWithOperands(Runtime::kThrow);
1523 // Never returns here. 1521 // Never returns here.
1524 1522
1525 // Even though this expression doesn't produce a value, we need to simulate 1523 // Even though this expression doesn't produce a value, we need to simulate
1526 // plugging of the value context to ensure stack depth tracking is in sync. 1524 // plugging of the value context to ensure stack depth tracking is in sync.
1527 if (context()->IsStackValue()) OperandStackDepthIncrement(1); 1525 if (context()->IsStackValue()) OperandStackDepthIncrement(1);
1528 } 1526 }
1529 1527
1530 void FullCodeGenerator::EnterTryBlock(int handler_index, Label* handler, 1528 void FullCodeGenerator::EnterTryBlock(
1531 bool catch_predicted) { 1529 int handler_index, Label* handler,
1530 HandlerTable::CatchPrediction catch_prediction) {
1532 HandlerTableEntry* entry = &handler_table_[handler_index]; 1531 HandlerTableEntry* entry = &handler_table_[handler_index];
1533 entry->range_start = masm()->pc_offset(); 1532 entry->range_start = masm()->pc_offset();
1534 entry->handler_offset = handler->pos(); 1533 entry->handler_offset = handler->pos();
1535 entry->stack_depth = operand_stack_depth_; 1534 entry->stack_depth = operand_stack_depth_;
1536 entry->catch_predicted = catch_predicted; 1535 entry->catch_prediction = catch_prediction;
1537 1536
1538 // We are using the operand stack depth, check for accuracy. 1537 // We are using the operand stack depth, check for accuracy.
1539 EmitOperandStackDepthCheck(); 1538 EmitOperandStackDepthCheck();
1540 1539
1541 // Push context onto operand stack. 1540 // Push context onto operand stack.
1542 STATIC_ASSERT(TryBlockConstant::kElementCount == 1); 1541 STATIC_ASSERT(TryBlockConstant::kElementCount == 1);
1543 PushOperand(context_register()); 1542 PushOperand(context_register());
1544 } 1543 }
1545 1544
1546 1545
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
1938 return var->scope()->is_nonlinear() || 1937 return var->scope()->is_nonlinear() ||
1939 var->initializer_position() >= proxy->position(); 1938 var->initializer_position() >= proxy->position();
1940 } 1939 }
1941 1940
1942 1941
1943 #undef __ 1942 #undef __
1944 1943
1945 1944
1946 } // namespace internal 1945 } // namespace internal
1947 } // namespace v8 1946 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698