| Index: dart/runtime/vm/debugger_ia32.cc | 
| =================================================================== | 
| --- dart/runtime/vm/debugger_ia32.cc	(revision 31821) | 
| +++ dart/runtime/vm/debugger_ia32.cc	(working copy) | 
| @@ -36,6 +36,72 @@ | 
| *reinterpret_cast<uword*>(closure_addr)); | 
| } | 
|  | 
| + | 
| +uword CodeBreakpoint::OrigStubAddress() const { | 
| +  return saved_value_; | 
| +} | 
| + | 
| + | 
| +void CodeBreakpoint::PatchCode() { | 
| +  ASSERT(!is_enabled_); | 
| +  switch (breakpoint_kind_) { | 
| +    case PcDescriptors::kIcCall: { | 
| +      const Code& code = | 
| +          Code::Handle(Function::Handle(function_).unoptimized_code()); | 
| +      saved_value_ = CodePatcher::GetInstanceCallAt(pc_, code, NULL); | 
| +      CodePatcher::PatchInstanceCallAt(pc_, code, | 
| +                                       StubCode::BreakpointDynamicEntryPoint()); | 
| +      break; | 
| +    } | 
| +    case PcDescriptors::kUnoptStaticCall: { | 
| +      const Code& code = | 
| +          Code::Handle(Function::Handle(function_).unoptimized_code()); | 
| +      saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code); | 
| +      CodePatcher::PatchStaticCallAt(pc_, code, | 
| +                                     StubCode::BreakpointStaticEntryPoint()); | 
| +      break; | 
| +    } | 
| +    case PcDescriptors::kRuntimeCall: | 
| +    case PcDescriptors::kClosureCall: | 
| +    case PcDescriptors::kReturn: { | 
| +      const Code& code = | 
| +          Code::Handle(Function::Handle(function_).unoptimized_code()); | 
| +      saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code); | 
| +      CodePatcher::PatchStaticCallAt(pc_, code, | 
| +                                     StubCode::BreakpointRuntimeEntryPoint()); | 
| +      break; | 
| +    } | 
| +    default: | 
| +      UNREACHABLE(); | 
| +  } | 
| +  is_enabled_ = true; | 
| +} | 
| + | 
| + | 
| +void CodeBreakpoint::RestoreCode() { | 
| +  ASSERT(is_enabled_); | 
| +  switch (breakpoint_kind_) { | 
| +    case PcDescriptors::kIcCall: { | 
| +      const Code& code = | 
| +          Code::Handle(Function::Handle(function_).unoptimized_code()); | 
| +      CodePatcher::PatchInstanceCallAt(pc_, code, saved_value_); | 
| +      break; | 
| +    } | 
| +    case PcDescriptors::kUnoptStaticCall: | 
| +    case PcDescriptors::kClosureCall: | 
| +    case PcDescriptors::kRuntimeCall: | 
| +    case PcDescriptors::kReturn: { | 
| +      const Code& code = | 
| +          Code::Handle(Function::Handle(function_).unoptimized_code()); | 
| +      CodePatcher::PatchStaticCallAt(pc_, code, saved_value_); | 
| +      break; | 
| +    } | 
| +    default: | 
| +      UNREACHABLE(); | 
| +  } | 
| +  is_enabled_ = false; | 
| +} | 
| + | 
| }  // namespace dart | 
|  | 
| #endif  // defined TARGET_ARCH_IA32 | 
|  |