Index: src/ia32/full-codegen-ia32.cc |
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
index 98c80cdb4c9fa9bf16530f7706cfc1eb4cc2e565..f5c1521eb9e512f1314c7ac8479a359b05a1da3b 100644 |
--- a/src/ia32/full-codegen-ia32.cc |
+++ b/src/ia32/full-codegen-ia32.cc |
@@ -332,7 +332,7 @@ void FullCodeGenerator::EmitStackCheck(IterationStatement* stmt, |
int weight = 1; |
if (FLAG_weighted_back_edges) { |
ASSERT(back_edge_target->is_bound()); |
- int distance = masm_->pc_offset() - back_edge_target->pos(); |
+ int distance = masm_->SizeOfCodeGeneratedSince(back_edge_target); |
weight = Min(127, Max(1, distance / 100)); |
} |
__ sub(Operand::Cell(profiling_counter_), Immediate(Smi::FromInt(weight))); |
@@ -389,6 +389,26 @@ void FullCodeGenerator::EmitReturnSequence() { |
__ push(eax); |
__ CallRuntime(Runtime::kTraceExit, 1); |
} |
+ if (FLAG_interrupt_at_exit) { |
+ // Pretend that the exit is a backwards jump to the entry. |
+ int weight = 1; |
+ if (FLAG_weighted_back_edges) { |
+ int distance = masm_->pc_offset(); |
+ weight = Min(127, Max(1, distance / 100)); |
+ } |
+ __ sub(Operand::Cell(profiling_counter_), |
+ Immediate(Smi::FromInt(weight))); |
+ Label ok; |
+ __ j(positive, &ok, Label::kNear); |
+ __ push(eax); |
+ InterruptStub stub; |
+ __ CallStub(&stub); |
+ __ pop(eax); |
+ // Reset the countdown. |
+ __ mov(Operand::Cell(profiling_counter_), |
+ Immediate(Smi::FromInt(FLAG_interrupt_budget))); |
+ __ bind(&ok); |
+ } |
#ifdef DEBUG |
// Add a label for checking the size of the code used for returning. |
Label check_exit_codesize; |