Index: src/ia32/full-codegen-ia32.cc |
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
index 9c08ef3033de13d7a74c3964aea2f50877220b2e..fa96a41925434fd63cd19377e7104c96ba376663 100644 |
--- a/src/ia32/full-codegen-ia32.cc |
+++ b/src/ia32/full-codegen-ia32.cc |
@@ -1013,10 +1013,34 @@ void FullCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { |
// Compile all the case bodies. |
for (int i = 0; i < clauses->length(); i++) { |
- Comment cmnt(masm_, "[ Case body"); |
CaseClause* clause = clauses->at(i); |
__ bind(clause->body_target()); |
PrepareForBailoutForId(clause->EntryId(), NO_REGISTERS); |
+ |
+ // Initialize counter |
+ { Comment cmnt(masm_, "[ Case hit counter"); |
+ Handle<JSGlobalPropertyCell> cell = |
+ isolate()->factory()->NewJSGlobalPropertyCell( |
+ Handle<Object>(Smi::FromInt(0), isolate())); |
+ RecordTypeFeedbackCell(clause->CounterId(), cell); |
+ |
+ // Increment counter |
+ Label ok; |
+ Operand counter = FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset); |
+ |
+ __ LoadHeapObject(ebx, cell); |
+ __ mov(ecx, counter); |
+ __ AssertSmi(ecx); |
+ __ add(ecx, Immediate(Smi::FromInt(1))); |
+ __ j(no_overflow, &ok, Label::kNear); |
+ |
+ // Decrement on overflow |
+ __ sub(ecx, Immediate(Smi::FromInt(1))); |
+ __ bind(&ok); |
+ __ mov(counter, ecx); |
+ } |
+ |
+ Comment cmnt(masm_, "[ Case body"); |
VisitStatements(clause->statements()); |
} |