Index: src/ia32/full-codegen-ia32.cc |
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
index 5beec0d387e5233e7c503ac25e16d32448c338d7..5f308582c42617579f22e3f23b3dc9fffd03ca9d 100644 |
--- a/src/ia32/full-codegen-ia32.cc |
+++ b/src/ia32/full-codegen-ia32.cc |
@@ -1,4 +1,4 @@ |
-// Copyright 2010 the V8 project authors. All rights reserved. |
+// Copyright 2011 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -264,16 +264,24 @@ void FullCodeGenerator::EmitStackCheck(IterationStatement* stmt) { |
__ j(above_equal, &ok, taken); |
StackCheckStub stub; |
__ CallStub(&stub); |
- __ bind(&ok); |
- PrepareForBailoutForId(stmt->EntryId(), NO_REGISTERS); |
- PrepareForBailoutForId(stmt->OsrEntryId(), NO_REGISTERS); |
+ // Record a mapping of this PC offset to the OSR id. This is used to find |
+ // the AST id from the unoptimized code in order to use it as a key into |
+ // the deoptimization input data found in the optimized code. |
RecordStackCheck(stmt->OsrEntryId()); |
- // Loop stack checks can be patched to perform on-stack |
- // replacement. In order to decide whether or not to perform OSR we |
- // embed the loop depth in a test instruction after the call so we |
- // can extract it from the OSR builtin. |
+ |
+ // Loop stack checks can be patched to perform on-stack replacement. In |
+ // order to decide whether or not to perform OSR we embed the loop depth |
+ // in a test instruction after the call so we can extract it from the OSR |
+ // builtin. |
ASSERT(loop_depth() > 0); |
__ test(eax, Immediate(Min(loop_depth(), Code::kMaxLoopNestingMarker))); |
+ |
+ __ bind(&ok); |
+ PrepareForBailoutForId(stmt->EntryId(), NO_REGISTERS); |
+ // Record a mapping of the OSR id to this PC. This is used if the OSR |
+ // entry becomes the target of a bailout. We don't expect it to be, but |
+ // we want it to work if it is. |
+ PrepareForBailoutForId(stmt->OsrEntryId(), NO_REGISTERS); |
} |
@@ -1497,7 +1505,9 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
if (expr->is_compound()) { |
if (property->is_arguments_access()) { |
VariableProxy* obj_proxy = property->obj()->AsVariableProxy(); |
- __ push(EmitSlotSearch(obj_proxy->var()->AsSlot(), ecx)); |
+ MemOperand slot_operand = |
+ EmitSlotSearch(obj_proxy->var()->AsSlot(), ecx); |
+ __ push(slot_operand); |
__ mov(eax, Immediate(property->key()->AsLiteral()->handle())); |
} else { |
VisitForStackValue(property->obj()); |
@@ -1508,7 +1518,9 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
} else { |
if (property->is_arguments_access()) { |
VariableProxy* obj_proxy = property->obj()->AsVariableProxy(); |
- __ push(EmitSlotSearch(obj_proxy->var()->AsSlot(), ecx)); |
+ MemOperand slot_operand = |
+ EmitSlotSearch(obj_proxy->var()->AsSlot(), ecx); |
+ __ push(slot_operand); |
__ push(Immediate(property->key()->AsLiteral()->handle())); |
} else { |
VisitForStackValue(property->obj()); |
@@ -3739,7 +3751,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
} else { |
if (prop->is_arguments_access()) { |
VariableProxy* obj_proxy = prop->obj()->AsVariableProxy(); |
- __ push(EmitSlotSearch(obj_proxy->var()->AsSlot(), ecx)); |
+ MemOperand slot_operand = |
+ EmitSlotSearch(obj_proxy->var()->AsSlot(), ecx); |
+ __ push(slot_operand); |
__ mov(eax, Immediate(prop->key()->AsLiteral()->handle())); |
} else { |
VisitForStackValue(prop->obj()); |
@@ -4042,7 +4056,6 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) { |
case Token::INSTANCEOF: { |
VisitForStackValue(expr->right()); |
- __ IncrementCounter(&Counters::instance_of_full, 1); |
InstanceofStub stub(InstanceofStub::kNoFlags); |
__ CallStub(&stub); |
PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false); |