| Index: src/interpreter/bytecode-array-builder.cc
|
| diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc
|
| index fa57c16c7cca85c9faa418815cddf63dd0620b3e..b416336e244a464ae45e4f02886616eb411fc2f6 100644
|
| --- a/src/interpreter/bytecode-array-builder.cc
|
| +++ b/src/interpreter/bytecode-array-builder.cc
|
| @@ -79,10 +79,22 @@ Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() {
|
| handler_table);
|
| }
|
|
|
| +// static
|
| +bool BytecodeArrayBuilder::NeedExpressionPosition(Bytecode bytecode) {
|
| + // Always need an expression position if filtering is turned
|
| + // off. Otherwise an expression is only needed if the bytecode has
|
| + // external side effects.
|
| + return !FLAG_ignition_filter_positions ||
|
| + !Bytecodes::IsWithoutExternalSideEffects(bytecode);
|
| +}
|
| +
|
| void BytecodeArrayBuilder::AttachSourceInfo(BytecodeNode* node) {
|
| if (latest_source_info_.is_valid()) {
|
| - node->source_info().Update(latest_source_info_);
|
| - latest_source_info_.set_invalid();
|
| + if (latest_source_info_.is_statement() ||
|
| + NeedExpressionPosition(node->bytecode())) {
|
| + node->source_info() = latest_source_info_;
|
| + latest_source_info_.set_invalid();
|
| + }
|
| }
|
| }
|
|
|
| @@ -722,6 +734,9 @@ void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) {
|
|
|
| void BytecodeArrayBuilder::SetExpressionPosition(Expression* expr) {
|
| if (expr->position() == RelocInfo::kNoPosition) return;
|
| + if (latest_source_info_.is_expression()) {
|
| + latest_source_info_.set_invalid();
|
| + }
|
| latest_source_info_.Update({expr->position(), false});
|
| }
|
|
|
|
|