| Index: src/deoptimizer.cc
 | 
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
 | 
| index 1b78bae30573e12b385cfbb24720aaef89561faf..4f799d43192d68ef0d19af904483833ba9671f96 100644
 | 
| --- a/src/deoptimizer.cc
 | 
| +++ b/src/deoptimizer.cc
 | 
| @@ -968,24 +968,19 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
 | 
|  
 | 
|    if (FLAG_enable_ool_constant_pool) {
 | 
|      // For the bottommost output frame the constant pool pointer can be gotten
 | 
| -    // from the input frame. For subsequent output frames, it can be gotten from
 | 
| -    // the function's code.
 | 
| -    Register constant_pool_reg =
 | 
| -        JavaScriptFrame::constant_pool_pointer_register();
 | 
| +    // from the input frame. For subsequent output frames, it can be read from
 | 
| +    // the previous frame.
 | 
|      output_offset -= kPointerSize;
 | 
|      input_offset -= kPointerSize;
 | 
|      if (is_bottommost) {
 | 
|        value = input_->GetFrameSlot(input_offset);
 | 
|      } else {
 | 
| -      value = reinterpret_cast<intptr_t>(
 | 
| -                  function->shared()->code()->constant_pool());
 | 
| +      value = output_[frame_index - 1]->GetConstantPool();
 | 
|      }
 | 
| -    output_frame->SetFrameSlot(output_offset, value);
 | 
| -    output_frame->SetConstantPool(value);
 | 
| -    if (is_topmost) output_frame->SetRegister(constant_pool_reg.code(), value);
 | 
| +    output_frame->SetCallerConstantPool(output_offset, value);
 | 
|      if (trace_scope_) {
 | 
|        PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
 | 
| -             V8PRIxPTR "; constant_pool\n",
 | 
| +             V8PRIxPTR "; caller's constant_pool\n",
 | 
|               top_address + output_offset, output_offset, value);
 | 
|      }
 | 
|    }
 | 
| @@ -1043,6 +1038,18 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
 | 
|    intptr_t pc_value = reinterpret_cast<intptr_t>(start + pc_offset);
 | 
|    output_frame->SetPc(pc_value);
 | 
|  
 | 
| +  // Update constant pool.
 | 
| +  if (FLAG_enable_ool_constant_pool) {
 | 
| +    intptr_t constant_pool_value =
 | 
| +        reinterpret_cast<intptr_t>(non_optimized_code->constant_pool());
 | 
| +    output_frame->SetConstantPool(constant_pool_value);
 | 
| +    if (is_topmost) {
 | 
| +      Register constant_pool_reg =
 | 
| +          JavaScriptFrame::constant_pool_pointer_register();
 | 
| +      output_frame->SetRegister(constant_pool_reg.code(), constant_pool_value);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
|    FullCodeGenerator::State state =
 | 
|        FullCodeGenerator::StateField::decode(pc_and_state);
 | 
|    output_frame->SetState(Smi::FromInt(state));
 | 
| @@ -1126,15 +1133,14 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
 | 
|    }
 | 
|  
 | 
|    if (FLAG_enable_ool_constant_pool) {
 | 
| -    // A marker value is used in place of the constant pool.
 | 
| +    // Read the caller's constant pool from the previous frame.
 | 
|      output_offset -= kPointerSize;
 | 
| -    intptr_t constant_pool = reinterpret_cast<intptr_t>(
 | 
| -        Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
 | 
| -    output_frame->SetFrameSlot(output_offset, constant_pool);
 | 
| +    value = output_[frame_index - 1]->GetConstantPool();
 | 
| +    output_frame->SetCallerConstantPool(output_offset, value);
 | 
|      if (trace_scope_) {
 | 
|        PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
 | 
| -             V8PRIxPTR " ; constant_pool (adaptor sentinel)\n",
 | 
| -             top_address + output_offset, output_offset, constant_pool);
 | 
| +             V8PRIxPTR "; caller's constant_pool\n",
 | 
| +             top_address + output_offset, output_offset, value);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -1181,6 +1187,11 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
 | 
|        adaptor_trampoline->instruction_start() +
 | 
|        isolate_->heap()->arguments_adaptor_deopt_pc_offset()->value());
 | 
|    output_frame->SetPc(pc_value);
 | 
| +  if (FLAG_enable_ool_constant_pool) {
 | 
| +    intptr_t constant_pool_value =
 | 
| +        reinterpret_cast<intptr_t>(adaptor_trampoline->constant_pool());
 | 
| +    output_frame->SetConstantPool(constant_pool_value);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1256,13 +1267,13 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
 | 
|    }
 | 
|  
 | 
|    if (FLAG_enable_ool_constant_pool) {
 | 
| -    // The constant pool pointer can be gotten from the previous frame.
 | 
| +    // Read the caller's constant pool from the previous frame.
 | 
|      output_offset -= kPointerSize;
 | 
|      value = output_[frame_index - 1]->GetConstantPool();
 | 
| -    output_frame->SetFrameSlot(output_offset, value);
 | 
| +    output_frame->SetCallerConstantPool(output_offset, value);
 | 
|      if (trace_scope_) {
 | 
|        PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
 | 
| -             V8PRIxPTR " ; constant pool\n",
 | 
| +             V8PRIxPTR " ; caller's constant pool\n",
 | 
|               top_address + output_offset, output_offset, value);
 | 
|      }
 | 
|    }
 | 
| @@ -1343,6 +1354,11 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
 | 
|        construct_stub->instruction_start() +
 | 
|        isolate_->heap()->construct_stub_deopt_pc_offset()->value());
 | 
|    output_frame->SetPc(pc);
 | 
| +  if (FLAG_enable_ool_constant_pool) {
 | 
| +    intptr_t constant_pool_value =
 | 
| +        reinterpret_cast<intptr_t>(construct_stub->constant_pool());
 | 
| +    output_frame->SetConstantPool(constant_pool_value);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1414,13 +1430,13 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
 | 
|    }
 | 
|  
 | 
|    if (FLAG_enable_ool_constant_pool) {
 | 
| -    // The constant pool pointer can be gotten from the previous frame.
 | 
| +    // Read the caller's constant pool from the previous frame.
 | 
|      output_offset -= kPointerSize;
 | 
|      value = output_[frame_index - 1]->GetConstantPool();
 | 
| -    output_frame->SetFrameSlot(output_offset, value);
 | 
| +    output_frame->SetCallerConstantPool(output_offset, value);
 | 
|      if (trace_scope_) {
 | 
|        PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
 | 
| -             V8PRIxPTR " ; constant pool\n",
 | 
| +             V8PRIxPTR " ; caller's constant pool\n",
 | 
|               top_address + output_offset, output_offset, value);
 | 
|      }
 | 
|    }
 | 
| @@ -1482,6 +1498,11 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
 | 
|    intptr_t pc = reinterpret_cast<intptr_t>(
 | 
|        accessor_stub->instruction_start() + offset->value());
 | 
|    output_frame->SetPc(pc);
 | 
| +  if (FLAG_enable_ool_constant_pool) {
 | 
| +    intptr_t constant_pool_value =
 | 
| +        reinterpret_cast<intptr_t>(accessor_stub->constant_pool());
 | 
| +    output_frame->SetConstantPool(constant_pool_value);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1585,17 +1606,14 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
 | 
|    }
 | 
|  
 | 
|    if (FLAG_enable_ool_constant_pool) {
 | 
| -    // The constant pool pointer can be gotten from the input frame.
 | 
| -    Register constant_pool_pointer_register =
 | 
| -        StubFailureTrampolineFrame::constant_pool_pointer_register();
 | 
| +    // Read the caller's constant pool from the input frame.
 | 
|      input_frame_offset -= kPointerSize;
 | 
|      value = input_->GetFrameSlot(input_frame_offset);
 | 
| -    output_frame->SetRegister(constant_pool_pointer_register.code(), value);
 | 
|      output_frame_offset -= kPointerSize;
 | 
| -    output_frame->SetFrameSlot(output_frame_offset, value);
 | 
| +    output_frame->SetCallerConstantPool(output_frame_offset, value);
 | 
|      if (trace_scope_) {
 | 
|        PrintF("    0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
 | 
| -             V8PRIxPTR " ; constant_pool_pointer\n",
 | 
| +             V8PRIxPTR " ; caller's constant_pool\n",
 | 
|               top_address + output_frame_offset, output_frame_offset, value);
 | 
|      }
 | 
|    }
 | 
| @@ -1729,6 +1747,14 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
 | 
|    ASSERT(trampoline != NULL);
 | 
|    output_frame->SetPc(reinterpret_cast<intptr_t>(
 | 
|        trampoline->instruction_start()));
 | 
| +  if (FLAG_enable_ool_constant_pool) {
 | 
| +    Register constant_pool_reg =
 | 
| +        StubFailureTrampolineFrame::constant_pool_pointer_register();
 | 
| +    intptr_t constant_pool_value =
 | 
| +        reinterpret_cast<intptr_t>(trampoline->constant_pool());
 | 
| +    output_frame->SetConstantPool(constant_pool_value);
 | 
| +    output_frame->SetRegister(constant_pool_reg.code(), constant_pool_value);
 | 
| +  }
 | 
|    output_frame->SetState(Smi::FromInt(FullCodeGenerator::NO_REGISTERS));
 | 
|    Code* notify_failure = NotifyStubFailureBuiltin();
 | 
|    output_frame->SetContinuation(
 | 
| 
 |