| Index: mojo/public/cpp/bindings/lib/interface_impl_internal.h | 
| diff --git a/mojo/public/cpp/bindings/lib/interface_impl_internal.h b/mojo/public/cpp/bindings/lib/interface_impl_internal.h | 
| index 1c912661fd96a95d41661add0ad664f05ce063b3..193e6e4a6846b6a066acdadc9012c4175686b45f 100644 | 
| --- a/mojo/public/cpp/bindings/lib/interface_impl_internal.h | 
| +++ b/mojo/public/cpp/bindings/lib/interface_impl_internal.h | 
| @@ -30,12 +30,21 @@ class InterfaceImplState : public ErrorHandler { | 
|  | 
| explicit InterfaceImplState(InterfaceImplBase<Interface>* instance) | 
| : router_(NULL), | 
| -        proxy_(NULL) { | 
| +        proxy_(NULL), | 
| +        delete_on_error_(false), | 
| +#ifndef NDEBUG | 
| +        deleting_on_error_(false) | 
| +#endif | 
| +  { | 
| assert(instance); | 
| stub_.set_sink(instance); | 
| } | 
|  | 
| virtual ~InterfaceImplState() { | 
| +#ifndef NDEBUG | 
| +    if (delete_on_error_) | 
| +      assert(deleting_on_error_); | 
| +#endif | 
| delete proxy_; | 
| if (router_) { | 
| router_->set_error_handler(NULL); | 
| @@ -43,16 +52,17 @@ class InterfaceImplState : public ErrorHandler { | 
| } | 
| } | 
|  | 
| -  void BindProxy( | 
| -      InterfacePtr<Interface>* ptr, | 
| -      const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { | 
| +  void BindProxy(InterfacePtr<Interface>* ptr, | 
| +                 const MojoAsyncWaiter* waiter, | 
| +                 bool delete_on_error) { | 
| MessagePipe pipe; | 
| ptr->Bind(pipe.handle0.Pass(), waiter); | 
| -    Bind(pipe.handle1.Pass(), waiter); | 
| +    Bind(pipe.handle1.Pass(), waiter, delete_on_error); | 
| } | 
|  | 
| void Bind(ScopedMessagePipeHandle handle, | 
| -            const MojoAsyncWaiter* waiter) { | 
| +            const MojoAsyncWaiter* waiter, | 
| +            bool delete_on_error) { | 
| assert(!router_); | 
|  | 
| FilterChain filters; | 
| @@ -65,6 +75,7 @@ class InterfaceImplState : public ErrorHandler { | 
| router_->set_error_handler(this); | 
|  | 
| proxy_ = new typename Client::Proxy_(router_); | 
| +    delete_on_error_ = delete_on_error; | 
|  | 
| instance()->OnConnectionEstablished(); | 
| } | 
| @@ -83,12 +94,27 @@ class InterfaceImplState : public ErrorHandler { | 
| } | 
|  | 
| virtual void OnConnectionError() MOJO_OVERRIDE { | 
| +    // If the connection error behavior is not delete_on_error_ the instance | 
| +    // might choose to delete itself in the OnConnectionError handler, which | 
| +    // would in turn delete this.  Save the error behavior before invoking the | 
| +    // error handler so we can correctly decide what to do. | 
| +    bool delete_on_error = delete_on_error_; | 
| instance()->OnConnectionError(); | 
| +    if (delete_on_error) { | 
| +#ifndef NDEBUG | 
| +      deleting_on_error_ = true; | 
| +#endif | 
| +      delete instance(); | 
| +    } | 
| } | 
|  | 
| Router* router_; | 
| typename Client::Proxy_* proxy_; | 
| typename Interface::Stub_ stub_; | 
| +  bool delete_on_error_; | 
| +#ifndef NDEBUG | 
| +  bool deleting_on_error_; | 
| +#endif | 
|  | 
| MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceImplState); | 
| }; | 
|  |