| Index: src/interpreter/bytecode-array-builder.cc | 
| diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc | 
| index 7f8134fb1628ecb7279c850eb76e545b04d01bb3..b8e0c605e4e754ae7ea820764800ccf7274a1caf 100644 | 
| --- a/src/interpreter/bytecode-array-builder.cc | 
| +++ b/src/interpreter/bytecode-array-builder.cc | 
| @@ -24,7 +24,7 @@ BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone, | 
| constant_array_builder_(isolate, zone), | 
| handler_table_builder_(isolate, zone), | 
| source_position_table_builder_(isolate, zone), | 
| -      exit_seen_in_block_(false), | 
| +      return_seen_in_block_(false), | 
| unbound_jumps_(0), | 
| parameter_count_(parameter_count), | 
| local_register_count_(locals_count), | 
| @@ -79,7 +79,7 @@ bool BytecodeArrayBuilder::RegisterIsParameterOrLocal(Register reg) const { | 
| Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() { | 
| DCHECK_EQ(0, unbound_jumps_); | 
| DCHECK_EQ(bytecode_generated_, false); | 
| -  DCHECK(exit_seen_in_block_); | 
| +  DCHECK(return_seen_in_block_); | 
|  | 
| pipeline()->FlushBasicBlock(); | 
| const ZoneVector<uint8_t>* bytecodes = bytecode_array_writer()->bytecodes(); | 
| @@ -117,9 +117,6 @@ void BytecodeArrayBuilder::AttachSourceInfo(BytecodeNode* node) { | 
| } | 
|  | 
| void BytecodeArrayBuilder::Output(Bytecode bytecode) { | 
| -  // Don't output dead code. | 
| -  if (exit_seen_in_block_) return; | 
| - | 
| BytecodeNode node(bytecode); | 
| AttachSourceInfo(&node); | 
| pipeline()->Write(&node); | 
| @@ -129,8 +126,6 @@ void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 
| OperandScale operand_scale, | 
| uint32_t operand0, uint32_t operand1, | 
| uint32_t operand2, uint32_t operand3) { | 
| -  // Don't output dead code. | 
| -  if (exit_seen_in_block_) return; | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2)); | 
| @@ -145,8 +140,6 @@ void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 
| OperandScale operand_scale, | 
| uint32_t operand0, uint32_t operand1, | 
| uint32_t operand2) { | 
| -  // Don't output dead code. | 
| -  if (exit_seen_in_block_) return; | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2)); | 
| @@ -158,8 +151,6 @@ void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 
| void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 
| OperandScale operand_scale, | 
| uint32_t operand0, uint32_t operand1) { | 
| -  // Don't output dead code. | 
| -  if (exit_seen_in_block_) return; | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | 
| BytecodeNode node(bytecode, operand0, operand1, operand_scale); | 
| @@ -170,8 +161,6 @@ void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 
| void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 
| OperandScale operand_scale, | 
| uint32_t operand0) { | 
| -  // Don't output dead code. | 
| -  if (exit_seen_in_block_) return; | 
| DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | 
| BytecodeNode node(bytecode, operand0, operand_scale); | 
| AttachSourceInfo(&node); | 
| @@ -666,9 +655,6 @@ void BytecodeArrayBuilder::PatchJump(size_t jump_target, size_t jump_location) { | 
|  | 
| BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, | 
| BytecodeLabel* label) { | 
| -  // Don't emit dead code. | 
| -  if (exit_seen_in_block_) return *this; | 
| - | 
| if (label->is_bound()) { | 
| // Label has been bound already so this is a backwards jump. | 
| size_t current_offset = pipeline()->FlushForOffset(); | 
| @@ -754,21 +740,19 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfNotHole( | 
|  | 
| BytecodeArrayBuilder& BytecodeArrayBuilder::Throw() { | 
| Output(Bytecode::kThrow); | 
| -  exit_seen_in_block_ = true; | 
| return *this; | 
| } | 
|  | 
|  | 
| BytecodeArrayBuilder& BytecodeArrayBuilder::ReThrow() { | 
| Output(Bytecode::kReThrow); | 
| -  exit_seen_in_block_ = true; | 
| return *this; | 
| } | 
|  | 
|  | 
| BytecodeArrayBuilder& BytecodeArrayBuilder::Return() { | 
| Output(Bytecode::kReturn); | 
| -  exit_seen_in_block_ = true; | 
| +  return_seen_in_block_ = true; | 
| return *this; | 
| } | 
|  | 
| @@ -863,17 +847,17 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::MarkTryEnd(int handler_id) { | 
|  | 
|  | 
| void BytecodeArrayBuilder::LeaveBasicBlock() { | 
| -  exit_seen_in_block_ = false; | 
| pipeline()->FlushBasicBlock(); | 
| +  return_seen_in_block_ = false; | 
| } | 
|  | 
| void BytecodeArrayBuilder::EnsureReturn() { | 
| -  if (!exit_seen_in_block_) { | 
| +  if (!return_seen_in_block_) { | 
| LoadUndefined(); | 
| SetReturnPosition(); | 
| Return(); | 
| } | 
| -  DCHECK(exit_seen_in_block_); | 
| +  DCHECK(return_seen_in_block_); | 
| } | 
|  | 
| BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, | 
| @@ -974,25 +958,21 @@ size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { | 
|  | 
| void BytecodeArrayBuilder::SetReturnPosition() { | 
| if (return_position_ == RelocInfo::kNoPosition) return; | 
| -  if (exit_seen_in_block_) return; | 
| latest_source_info_.Update({return_position_, true}); | 
| } | 
|  | 
| void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) { | 
| if (stmt->position() == RelocInfo::kNoPosition) return; | 
| -  if (exit_seen_in_block_) return; | 
| latest_source_info_.Update({stmt->position(), true}); | 
| } | 
|  | 
| void BytecodeArrayBuilder::SetExpressionPosition(Expression* expr) { | 
| if (expr->position() == RelocInfo::kNoPosition) return; | 
| -  if (exit_seen_in_block_) return; | 
| latest_source_info_.Update({expr->position(), false}); | 
| } | 
|  | 
| void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) { | 
| if (expr->position() == RelocInfo::kNoPosition) return; | 
| -  if (exit_seen_in_block_) return; | 
| latest_source_info_.Update({expr->position(), true}); | 
| } | 
|  | 
|  |