| Index: src/deoptimizer.cc | 
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc | 
| index a82fda90f653d83776f2b4d861be59a48b93b48a..e12f3b6bc8a8f7e42e1f88e2cc4c1d4b277b90d7 100644 | 
| --- a/src/deoptimizer.cc | 
| +++ b/src/deoptimizer.cc | 
| @@ -1,4 +1,4 @@ | 
| -// Copyright 2012 the V8 project authors. All rights reserved. | 
| +// Copyright 2013 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: | 
| @@ -491,12 +491,15 @@ void Deoptimizer::ComputeOutputFrames(Deoptimizer* deoptimizer) { | 
| } | 
|  | 
|  | 
| -bool Deoptimizer::TraceEnabledFor(BailoutType type) { | 
| -  switch (type) { | 
| +bool Deoptimizer::TraceEnabledFor(BailoutType deopt_type, | 
| +                                  StackFrame::Type frame_type) { | 
| +  switch (deopt_type) { | 
| case EAGER: | 
| case LAZY: | 
| case DEBUGGER: | 
| -      return FLAG_trace_deopt; | 
| +      return (frame_type == StackFrame::STUB) | 
| +          ? FLAG_trace_stub_failures | 
| +          : FLAG_trace_deopt; | 
| case OSR: | 
| return FLAG_trace_osr; | 
| } | 
| @@ -540,7 +543,8 @@ Deoptimizer::Deoptimizer(Isolate* isolate, | 
| output_(NULL), | 
| deferred_arguments_objects_values_(0), | 
| deferred_arguments_objects_(0), | 
| -      deferred_heap_numbers_(0) { | 
| +      deferred_heap_numbers_(0), | 
| +      trace_(false) { | 
| // For COMPILED_STUBs called from builtins, the function pointer is a SMI | 
| // indicating an internal frame. | 
| if (function->IsSmi()) { | 
| @@ -550,13 +554,14 @@ Deoptimizer::Deoptimizer(Isolate* isolate, | 
| function->shared()->increment_deopt_count(); | 
| } | 
| compiled_code_ = FindOptimizedCode(function, optimized_code); | 
| -  if (TraceEnabledFor(type)) Trace(); | 
| -  ASSERT(HEAP->allow_allocation(false)); | 
| -  unsigned size = ComputeInputFrameSize(); | 
| -  input_ = new(size) FrameDescription(size, function); | 
| StackFrame::Type frame_type = function == NULL | 
| ? StackFrame::STUB | 
| : StackFrame::JAVA_SCRIPT; | 
| +  trace_ = TraceEnabledFor(type, frame_type); | 
| +  if (trace_) Trace(); | 
| +  ASSERT(HEAP->allow_allocation(false)); | 
| +  unsigned size = ComputeInputFrameSize(); | 
| +  input_ = new(size) FrameDescription(size, function); | 
| input_->SetFrameType(frame_type); | 
| } | 
|  | 
| @@ -717,7 +722,7 @@ void Deoptimizer::DoComputeOutputFrames() { | 
|  | 
| // Print some helpful diagnostic information. | 
| int64_t start = OS::Ticks(); | 
| -  if (FLAG_trace_deopt) { | 
| +  if (trace_) { | 
| PrintF("[deoptimizing%s: begin 0x%08" V8PRIxPTR " ", | 
| (bailout_type_ == LAZY ? " (lazy)" : ""), | 
| reinterpret_cast<intptr_t>(function_)); | 
| @@ -795,7 +800,7 @@ void Deoptimizer::DoComputeOutputFrames() { | 
| } | 
|  | 
| // Print some helpful diagnostic information. | 
| -  if (FLAG_trace_deopt) { | 
| +  if (trace_) { | 
| double ms = static_cast<double>(OS::Ticks() - start) / 1000; | 
| int index = output_count_ - 1;  // Index of the topmost frame. | 
| JSFunction* function = output_[index]->GetFunction(); | 
| @@ -833,7 +838,7 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { | 
| for (int i = 0; i < deferred_heap_numbers_.length(); i++) { | 
| HeapNumberMaterializationDescriptor d = deferred_heap_numbers_[i]; | 
| Handle<Object> num = isolate_->factory()->NewNumber(d.value()); | 
| -    if (FLAG_trace_deopt) { | 
| +    if (trace_) { | 
| PrintF("Materializing a new heap number %p [%e] in slot %p\n", | 
| reinterpret_cast<void*>(*num), | 
| d.value(), | 
| @@ -878,7 +883,7 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { | 
| } | 
| frame->SetExpression(i, *arguments); | 
| ASSERT_EQ(Memory::Object_at(descriptor.slot_address()), *arguments); | 
| -        if (FLAG_trace_deopt) { | 
| +        if (trace_) { | 
| PrintF("Materializing %sarguments object for %p: ", | 
| frame->has_adapted_arguments() ? "(adapted) " : "", | 
| reinterpret_cast<void*>(descriptor.slot_address())); | 
| @@ -913,7 +918,7 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( | 
| int index = (info->parameters_count() - 1) - | 
| static_cast<int>(slot - parameters_top) / kPointerSize; | 
|  | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("Materializing a new heap number %p [%e] in slot %p" | 
| "for parameter slot #%d\n", | 
| reinterpret_cast<void*>(*num), | 
| @@ -929,7 +934,7 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( | 
| int index = info->expression_count() - 1 - | 
| static_cast<int>(slot - expressions_top) / kPointerSize; | 
|  | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("Materializing a new heap number %p [%e] in slot %p" | 
| "for expression slot #%d\n", | 
| reinterpret_cast<void*>(*num), | 
| @@ -976,7 +981,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| case Translation::REGISTER: { | 
| int input_reg = iterator->Next(); | 
| intptr_t input_value = input_->GetRegister(input_reg); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF( | 
| "    0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s ", | 
| output_[frame_index]->GetTop() + output_offset, | 
| @@ -994,7 +999,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| int input_reg = iterator->Next(); | 
| intptr_t value = input_->GetRegister(input_reg); | 
| bool is_smi = Smi::IsValid(value); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF( | 
| "    0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIdPTR " ; %s (%s)\n", | 
| output_[frame_index]->GetTop() + output_offset, | 
| @@ -1021,7 +1026,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| int input_reg = iterator->Next(); | 
| uintptr_t value = static_cast<uintptr_t>(input_->GetRegister(input_reg)); | 
| bool is_smi = (value <= static_cast<uintptr_t>(Smi::kMaxValue)); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF( | 
| "    0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIuPTR | 
| " ; uint %s (%s)\n", | 
| @@ -1048,7 +1053,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| case Translation::DOUBLE_REGISTER: { | 
| int input_reg = iterator->Next(); | 
| double value = input_->GetDoubleRegister(input_reg); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- %e ; %s\n", | 
| output_[frame_index]->GetTop() + output_offset, | 
| output_offset, | 
| @@ -1067,7 +1072,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| unsigned input_offset = | 
| input_->GetOffsetFromSlotIndex(input_slot_index); | 
| intptr_t input_value = input_->GetFrameSlot(input_offset); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("    0x%08" V8PRIxPTR ": ", | 
| output_[frame_index]->GetTop() + output_offset); | 
| PrintF("[top + %d] <- 0x%08" V8PRIxPTR " ; [sp + %d] ", | 
| @@ -1087,7 +1092,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| input_->GetOffsetFromSlotIndex(input_slot_index); | 
| intptr_t value = input_->GetFrameSlot(input_offset); | 
| bool is_smi = Smi::IsValid(value); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("    0x%08" V8PRIxPTR ": ", | 
| output_[frame_index]->GetTop() + output_offset); | 
| PrintF("[top + %d] <- %" V8PRIdPTR " ; [sp + %d] (%s)\n", | 
| @@ -1117,7 +1122,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| uintptr_t value = | 
| static_cast<uintptr_t>(input_->GetFrameSlot(input_offset)); | 
| bool is_smi = (value <= static_cast<uintptr_t>(Smi::kMaxValue)); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("    0x%08" V8PRIxPTR ": ", | 
| output_[frame_index]->GetTop() + output_offset); | 
| PrintF("[top + %d] <- %" V8PRIuPTR " ; [sp + %d] (uint32 %s)\n", | 
| @@ -1145,7 +1150,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| unsigned input_offset = | 
| input_->GetOffsetFromSlotIndex(input_slot_index); | 
| double value = input_->GetDoubleFrameSlot(input_offset); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- %e ; [sp + %d]\n", | 
| output_[frame_index]->GetTop() + output_offset, | 
| output_offset, | 
| @@ -1161,7 +1166,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
|  | 
| case Translation::LITERAL: { | 
| Object* literal = ComputeLiteral(iterator->Next()); | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- ", | 
| output_[frame_index]->GetTop() + output_offset, | 
| output_offset); | 
| @@ -1176,7 +1181,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, | 
| case Translation::ARGUMENTS_OBJECT: { | 
| int args_index = iterator->Next() + 1;  // Skip receiver. | 
| int args_length = iterator->Next() - 1;  // Skip receiver. | 
| -      if (FLAG_trace_deopt) { | 
| +      if (trace_) { | 
| PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- ", | 
| output_[frame_index]->GetTop() + output_offset, | 
| output_offset); | 
|  |