Index: src/interpreter/bytecode-array-builder.cc |
diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc |
index 91905079d113b0b85a61dda9a9a8bed17a651e4f..db90d56f34b1315e17aff71dab58c10c66aeea6e 100644 |
--- a/src/interpreter/bytecode-array-builder.cc |
+++ b/src/interpreter/bytecode-array-builder.cc |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include "src/interpreter/bytecode-array-builder.h" |
+#include "src/compiler.h" |
namespace v8 { |
namespace internal { |
@@ -115,7 +116,7 @@ bool BytecodeArrayBuilder::RegisterIsParameterOrLocal(Register reg) const { |
Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() { |
DCHECK_EQ(bytecode_generated_, false); |
- EnsureReturn(); |
+ DCHECK(exit_seen_in_block_); |
int bytecode_size = static_cast<int>(bytecodes_.size()); |
int register_count = |
@@ -1074,10 +1075,10 @@ void BytecodeArrayBuilder::LeaveBasicBlock() { |
exit_seen_in_block_ = false; |
} |
- |
-void BytecodeArrayBuilder::EnsureReturn() { |
+void BytecodeArrayBuilder::EnsureReturn(FunctionLiteral* literal) { |
if (!exit_seen_in_block_) { |
LoadUndefined(); |
+ SetReturnPosition(literal); |
Return(); |
} |
} |
@@ -1213,6 +1214,11 @@ size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { |
return constant_array_builder()->Insert(object); |
} |
+void BytecodeArrayBuilder::SetReturnPosition(FunctionLiteral* fun) { |
+ int pos = std::max(fun->start_position(), fun->end_position() - 1); |
+ source_position_table_builder_.AddStatementPosition(bytecodes_.size(), pos); |
+} |
+ |
void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) { |
if (stmt->position() == RelocInfo::kNoPosition) return; |
source_position_table_builder_.AddStatementPosition(bytecodes_.size(), |