| Index: base/callback.h | 
| diff --git a/base/callback.h b/base/callback.h | 
| index 7579cef6716ca97da26dc3c74ab7e796e9321fc8..6844cc54dcb34317e9e0645753a304f52cc8bfc5 100644 | 
| --- a/base/callback.h | 
| +++ b/base/callback.h | 
| @@ -126,26 +126,26 @@ | 
| // The Callback classes represent a generic function pointer. Internally, | 
| // it stores a refcounted piece of state that represents the target function | 
| // and all its bound parameters.  Each Callback specialization has a templated | 
| -// constructor that takes an InvokerStorageHolder<> object.  In the context of | 
| -// the constructor, the static type of this InvokerStorageHolder<> object | 
| +// constructor that takes an BindStateHolder<> object.  In the context of | 
| +// the constructor, the static type of this BindStateHolder<> object | 
| // uniquely identifies the function it is representing, all its bound | 
| // parameters, and a DoInvoke() that is capable of invoking the target. | 
| // | 
| -// Callback's constructor is takes the InvokerStorageHolder<> that has the | 
| +// Callback's constructor is takes the BindStateHolder<> that has the | 
| // full static type and erases the target function type, and the bound | 
| // parameters.  It does this by storing a pointer to the specific DoInvoke() | 
| -// function, and upcasting the state of InvokerStorageHolder<> to a | 
| -// InvokerStorageBase. This is safe as long as this InvokerStorageBase pointer | 
| +// function, and upcasting the state of BindStateHolder<> to a | 
| +// BindStateBase. This is safe as long as this BindStateBase pointer | 
| // is only used with the stored DoInvoke() pointer. | 
| // | 
| -// To create InvokerStorageHolder<> objects, we use the Bind() functions. | 
| +// To create BindStateHolder<> objects, we use the Bind() functions. | 
| // These functions, along with a set of internal templates, are reponsible for | 
| // | 
| //  - Unwrapping the function signature into return type, and parameters | 
| //  - Determining the number of parameters that are bound | 
| //  - Creating the storage for the bound parameters | 
| //  - Performing compile-time asserts to avoid error-prone behavior | 
| -//  - Returning an InvokerStorageHolder<> with an DoInvoke() that has an arity | 
| +//  - Returning an BindStateHolder<> with an DoInvoke() that has an arity | 
| //    matching the number of unbound parameters, and knows the correct | 
| //    refcounting semantics for the target object if we are binding a class | 
| //    method. | 
| @@ -236,12 +236,11 @@ class Callback; | 
| template <typename R> | 
| class Callback<R(void)> : public internal::CallbackBase { | 
| public: | 
| -  typedef R(*PolymorphicInvoke)( | 
| -      internal::InvokerStorageBase*); | 
| +  typedef R(RunType)(); | 
|  | 
| Callback() : CallbackBase(NULL, NULL) { } | 
|  | 
| -  // We pass InvokerStorageHolder by const ref to avoid incurring an | 
| +  // We pass BindStateHolder by const ref to avoid incurring an | 
| // unnecessary AddRef/Unref pair even though we will modify the object. | 
| // We cannot use a normal reference because the compiler will warn | 
| // since this is often used on a return value, which is a temporary. | 
| @@ -249,13 +248,13 @@ class Callback<R(void)> : public internal::CallbackBase { | 
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 
| // return the exact Callback<> type.  See base/bind.h for details. | 
| template <typename T> | 
| -  Callback(const internal::InvokerStorageHolder<T>& invoker_holder) | 
| -      : CallbackBase( | 
| -          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke), | 
| -          &invoker_holder.invoker_storage_) { | 
| -    COMPILE_ASSERT((is_same<PolymorphicInvoke, | 
| -                    typename T::Invoker::DoInvokeType>::value), | 
| -                   callback_type_does_not_match_bind_result); | 
| +  Callback(const internal::BindStateHolder<T>& bind_state_holder) | 
| +      : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 
| +    // Force the assignment to a location variable of PolymorphicInvoke | 
| +    // so the compiler will typecheck that the passed in Run() method has | 
| +    // the correct type. | 
| +    PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 
| +    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 
| } | 
|  | 
| bool Equals(const Callback& other) const { | 
| @@ -266,20 +265,23 @@ class Callback<R(void)> : public internal::CallbackBase { | 
| PolymorphicInvoke f = | 
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 
|  | 
| -    return f(invoker_storage_.get()); | 
| +    return f(bind_state_.get()); | 
| } | 
| + | 
| + private: | 
| +  typedef R(*PolymorphicInvoke)( | 
| +      internal::BindStateBase*); | 
| + | 
| }; | 
|  | 
| template <typename R, typename A1> | 
| class Callback<R(A1)> : public internal::CallbackBase { | 
| public: | 
| -  typedef R(*PolymorphicInvoke)( | 
| -      internal::InvokerStorageBase*, | 
| -          typename internal::ParamTraits<A1>::ForwardType); | 
| +  typedef R(RunType)(A1); | 
|  | 
| Callback() : CallbackBase(NULL, NULL) { } | 
|  | 
| -  // We pass InvokerStorageHolder by const ref to avoid incurring an | 
| +  // We pass BindStateHolder by const ref to avoid incurring an | 
| // unnecessary AddRef/Unref pair even though we will modify the object. | 
| // We cannot use a normal reference because the compiler will warn | 
| // since this is often used on a return value, which is a temporary. | 
| @@ -287,38 +289,41 @@ class Callback<R(A1)> : public internal::CallbackBase { | 
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 
| // return the exact Callback<> type.  See base/bind.h for details. | 
| template <typename T> | 
| -  Callback(const internal::InvokerStorageHolder<T>& invoker_holder) | 
| -      : CallbackBase( | 
| -          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke), | 
| -          &invoker_holder.invoker_storage_) { | 
| -    COMPILE_ASSERT((is_same<PolymorphicInvoke, | 
| -                    typename T::Invoker::DoInvokeType>::value), | 
| -                   callback_type_does_not_match_bind_result); | 
| +  Callback(const internal::BindStateHolder<T>& bind_state_holder) | 
| +      : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 
| +    // Force the assignment to a location variable of PolymorphicInvoke | 
| +    // so the compiler will typecheck that the passed in Run() method has | 
| +    // the correct type. | 
| +    PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 
| +    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 
| } | 
|  | 
| bool Equals(const Callback& other) const { | 
| return CallbackBase::Equals(other); | 
| } | 
|  | 
| -  R Run(typename internal::ParamTraits<A1>::ForwardType a1) const { | 
| +  R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const { | 
| PolymorphicInvoke f = | 
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 
|  | 
| -    return f(invoker_storage_.get(), a1); | 
| +    return f(bind_state_.get(), a1); | 
| } | 
| + | 
| + private: | 
| +  typedef R(*PolymorphicInvoke)( | 
| +      internal::BindStateBase*, | 
| +          typename internal::CallbackParamTraits<A1>::ForwardType); | 
| + | 
| }; | 
|  | 
| template <typename R, typename A1, typename A2> | 
| class Callback<R(A1, A2)> : public internal::CallbackBase { | 
| public: | 
| -  typedef R(*PolymorphicInvoke)( | 
| -      internal::InvokerStorageBase*, | 
| -          typename internal::ParamTraits<A1>::ForwardType, | 
| -          typename internal::ParamTraits<A2>::ForwardType); | 
| +  typedef R(RunType)(A1, A2); | 
|  | 
| Callback() : CallbackBase(NULL, NULL) { } | 
|  | 
| -  // We pass InvokerStorageHolder by const ref to avoid incurring an | 
| +  // We pass BindStateHolder by const ref to avoid incurring an | 
| // unnecessary AddRef/Unref pair even though we will modify the object. | 
| // We cannot use a normal reference because the compiler will warn | 
| // since this is often used on a return value, which is a temporary. | 
| @@ -326,41 +331,44 @@ class Callback<R(A1, A2)> : public internal::CallbackBase { | 
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 
| // return the exact Callback<> type.  See base/bind.h for details. | 
| template <typename T> | 
| -  Callback(const internal::InvokerStorageHolder<T>& invoker_holder) | 
| -      : CallbackBase( | 
| -          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke), | 
| -          &invoker_holder.invoker_storage_) { | 
| -    COMPILE_ASSERT((is_same<PolymorphicInvoke, | 
| -                    typename T::Invoker::DoInvokeType>::value), | 
| -                   callback_type_does_not_match_bind_result); | 
| +  Callback(const internal::BindStateHolder<T>& bind_state_holder) | 
| +      : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 
| +    // Force the assignment to a location variable of PolymorphicInvoke | 
| +    // so the compiler will typecheck that the passed in Run() method has | 
| +    // the correct type. | 
| +    PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 
| +    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 
| } | 
|  | 
| bool Equals(const Callback& other) const { | 
| return CallbackBase::Equals(other); | 
| } | 
|  | 
| -  R Run(typename internal::ParamTraits<A1>::ForwardType a1, | 
| -        typename internal::ParamTraits<A2>::ForwardType a2) const { | 
| +  R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 
| +        typename internal::CallbackParamTraits<A2>::ForwardType a2) const { | 
| PolymorphicInvoke f = | 
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 
|  | 
| -    return f(invoker_storage_.get(), a1, | 
| +    return f(bind_state_.get(), a1, | 
| a2); | 
| } | 
| + | 
| + private: | 
| +  typedef R(*PolymorphicInvoke)( | 
| +      internal::BindStateBase*, | 
| +          typename internal::CallbackParamTraits<A1>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A2>::ForwardType); | 
| + | 
| }; | 
|  | 
| template <typename R, typename A1, typename A2, typename A3> | 
| class Callback<R(A1, A2, A3)> : public internal::CallbackBase { | 
| public: | 
| -  typedef R(*PolymorphicInvoke)( | 
| -      internal::InvokerStorageBase*, | 
| -          typename internal::ParamTraits<A1>::ForwardType, | 
| -          typename internal::ParamTraits<A2>::ForwardType, | 
| -          typename internal::ParamTraits<A3>::ForwardType); | 
| +  typedef R(RunType)(A1, A2, A3); | 
|  | 
| Callback() : CallbackBase(NULL, NULL) { } | 
|  | 
| -  // We pass InvokerStorageHolder by const ref to avoid incurring an | 
| +  // We pass BindStateHolder by const ref to avoid incurring an | 
| // unnecessary AddRef/Unref pair even though we will modify the object. | 
| // We cannot use a normal reference because the compiler will warn | 
| // since this is often used on a return value, which is a temporary. | 
| @@ -368,44 +376,47 @@ class Callback<R(A1, A2, A3)> : public internal::CallbackBase { | 
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 
| // return the exact Callback<> type.  See base/bind.h for details. | 
| template <typename T> | 
| -  Callback(const internal::InvokerStorageHolder<T>& invoker_holder) | 
| -      : CallbackBase( | 
| -          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke), | 
| -          &invoker_holder.invoker_storage_) { | 
| -    COMPILE_ASSERT((is_same<PolymorphicInvoke, | 
| -                    typename T::Invoker::DoInvokeType>::value), | 
| -                   callback_type_does_not_match_bind_result); | 
| +  Callback(const internal::BindStateHolder<T>& bind_state_holder) | 
| +      : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 
| +    // Force the assignment to a location variable of PolymorphicInvoke | 
| +    // so the compiler will typecheck that the passed in Run() method has | 
| +    // the correct type. | 
| +    PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 
| +    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 
| } | 
|  | 
| bool Equals(const Callback& other) const { | 
| return CallbackBase::Equals(other); | 
| } | 
|  | 
| -  R Run(typename internal::ParamTraits<A1>::ForwardType a1, | 
| -        typename internal::ParamTraits<A2>::ForwardType a2, | 
| -        typename internal::ParamTraits<A3>::ForwardType a3) const { | 
| +  R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 
| +        typename internal::CallbackParamTraits<A2>::ForwardType a2, | 
| +        typename internal::CallbackParamTraits<A3>::ForwardType a3) const { | 
| PolymorphicInvoke f = | 
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 
|  | 
| -    return f(invoker_storage_.get(), a1, | 
| +    return f(bind_state_.get(), a1, | 
| a2, | 
| a3); | 
| } | 
| + | 
| + private: | 
| +  typedef R(*PolymorphicInvoke)( | 
| +      internal::BindStateBase*, | 
| +          typename internal::CallbackParamTraits<A1>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A2>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A3>::ForwardType); | 
| + | 
| }; | 
|  | 
| template <typename R, typename A1, typename A2, typename A3, typename A4> | 
| class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase { | 
| public: | 
| -  typedef R(*PolymorphicInvoke)( | 
| -      internal::InvokerStorageBase*, | 
| -          typename internal::ParamTraits<A1>::ForwardType, | 
| -          typename internal::ParamTraits<A2>::ForwardType, | 
| -          typename internal::ParamTraits<A3>::ForwardType, | 
| -          typename internal::ParamTraits<A4>::ForwardType); | 
| +  typedef R(RunType)(A1, A2, A3, A4); | 
|  | 
| Callback() : CallbackBase(NULL, NULL) { } | 
|  | 
| -  // We pass InvokerStorageHolder by const ref to avoid incurring an | 
| +  // We pass BindStateHolder by const ref to avoid incurring an | 
| // unnecessary AddRef/Unref pair even though we will modify the object. | 
| // We cannot use a normal reference because the compiler will warn | 
| // since this is often used on a return value, which is a temporary. | 
| @@ -413,48 +424,51 @@ class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase { | 
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 
| // return the exact Callback<> type.  See base/bind.h for details. | 
| template <typename T> | 
| -  Callback(const internal::InvokerStorageHolder<T>& invoker_holder) | 
| -      : CallbackBase( | 
| -          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke), | 
| -          &invoker_holder.invoker_storage_) { | 
| -    COMPILE_ASSERT((is_same<PolymorphicInvoke, | 
| -                    typename T::Invoker::DoInvokeType>::value), | 
| -                   callback_type_does_not_match_bind_result); | 
| +  Callback(const internal::BindStateHolder<T>& bind_state_holder) | 
| +      : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 
| +    // Force the assignment to a location variable of PolymorphicInvoke | 
| +    // so the compiler will typecheck that the passed in Run() method has | 
| +    // the correct type. | 
| +    PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 
| +    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 
| } | 
|  | 
| bool Equals(const Callback& other) const { | 
| return CallbackBase::Equals(other); | 
| } | 
|  | 
| -  R Run(typename internal::ParamTraits<A1>::ForwardType a1, | 
| -        typename internal::ParamTraits<A2>::ForwardType a2, | 
| -        typename internal::ParamTraits<A3>::ForwardType a3, | 
| -        typename internal::ParamTraits<A4>::ForwardType a4) const { | 
| +  R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 
| +        typename internal::CallbackParamTraits<A2>::ForwardType a2, | 
| +        typename internal::CallbackParamTraits<A3>::ForwardType a3, | 
| +        typename internal::CallbackParamTraits<A4>::ForwardType a4) const { | 
| PolymorphicInvoke f = | 
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 
|  | 
| -    return f(invoker_storage_.get(), a1, | 
| +    return f(bind_state_.get(), a1, | 
| a2, | 
| a3, | 
| a4); | 
| } | 
| + | 
| + private: | 
| +  typedef R(*PolymorphicInvoke)( | 
| +      internal::BindStateBase*, | 
| +          typename internal::CallbackParamTraits<A1>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A2>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A3>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A4>::ForwardType); | 
| + | 
| }; | 
|  | 
| template <typename R, typename A1, typename A2, typename A3, typename A4, | 
| typename A5> | 
| class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase { | 
| public: | 
| -  typedef R(*PolymorphicInvoke)( | 
| -      internal::InvokerStorageBase*, | 
| -          typename internal::ParamTraits<A1>::ForwardType, | 
| -          typename internal::ParamTraits<A2>::ForwardType, | 
| -          typename internal::ParamTraits<A3>::ForwardType, | 
| -          typename internal::ParamTraits<A4>::ForwardType, | 
| -          typename internal::ParamTraits<A5>::ForwardType); | 
| +  typedef R(RunType)(A1, A2, A3, A4, A5); | 
|  | 
| Callback() : CallbackBase(NULL, NULL) { } | 
|  | 
| -  // We pass InvokerStorageHolder by const ref to avoid incurring an | 
| +  // We pass BindStateHolder by const ref to avoid incurring an | 
| // unnecessary AddRef/Unref pair even though we will modify the object. | 
| // We cannot use a normal reference because the compiler will warn | 
| // since this is often used on a return value, which is a temporary. | 
| @@ -462,51 +476,54 @@ class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase { | 
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 
| // return the exact Callback<> type.  See base/bind.h for details. | 
| template <typename T> | 
| -  Callback(const internal::InvokerStorageHolder<T>& invoker_holder) | 
| -      : CallbackBase( | 
| -          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke), | 
| -          &invoker_holder.invoker_storage_) { | 
| -    COMPILE_ASSERT((is_same<PolymorphicInvoke, | 
| -                    typename T::Invoker::DoInvokeType>::value), | 
| -                   callback_type_does_not_match_bind_result); | 
| +  Callback(const internal::BindStateHolder<T>& bind_state_holder) | 
| +      : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 
| +    // Force the assignment to a location variable of PolymorphicInvoke | 
| +    // so the compiler will typecheck that the passed in Run() method has | 
| +    // the correct type. | 
| +    PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 
| +    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 
| } | 
|  | 
| bool Equals(const Callback& other) const { | 
| return CallbackBase::Equals(other); | 
| } | 
|  | 
| -  R Run(typename internal::ParamTraits<A1>::ForwardType a1, | 
| -        typename internal::ParamTraits<A2>::ForwardType a2, | 
| -        typename internal::ParamTraits<A3>::ForwardType a3, | 
| -        typename internal::ParamTraits<A4>::ForwardType a4, | 
| -        typename internal::ParamTraits<A5>::ForwardType a5) const { | 
| +  R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 
| +        typename internal::CallbackParamTraits<A2>::ForwardType a2, | 
| +        typename internal::CallbackParamTraits<A3>::ForwardType a3, | 
| +        typename internal::CallbackParamTraits<A4>::ForwardType a4, | 
| +        typename internal::CallbackParamTraits<A5>::ForwardType a5) const { | 
| PolymorphicInvoke f = | 
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 
|  | 
| -    return f(invoker_storage_.get(), a1, | 
| +    return f(bind_state_.get(), a1, | 
| a2, | 
| a3, | 
| a4, | 
| a5); | 
| } | 
| + | 
| + private: | 
| +  typedef R(*PolymorphicInvoke)( | 
| +      internal::BindStateBase*, | 
| +          typename internal::CallbackParamTraits<A1>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A2>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A3>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A4>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A5>::ForwardType); | 
| + | 
| }; | 
|  | 
| template <typename R, typename A1, typename A2, typename A3, typename A4, | 
| typename A5, typename A6> | 
| class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase { | 
| public: | 
| -  typedef R(*PolymorphicInvoke)( | 
| -      internal::InvokerStorageBase*, | 
| -          typename internal::ParamTraits<A1>::ForwardType, | 
| -          typename internal::ParamTraits<A2>::ForwardType, | 
| -          typename internal::ParamTraits<A3>::ForwardType, | 
| -          typename internal::ParamTraits<A4>::ForwardType, | 
| -          typename internal::ParamTraits<A5>::ForwardType, | 
| -          typename internal::ParamTraits<A6>::ForwardType); | 
| +  typedef R(RunType)(A1, A2, A3, A4, A5, A6); | 
|  | 
| Callback() : CallbackBase(NULL, NULL) { } | 
|  | 
| -  // We pass InvokerStorageHolder by const ref to avoid incurring an | 
| +  // We pass BindStateHolder by const ref to avoid incurring an | 
| // unnecessary AddRef/Unref pair even though we will modify the object. | 
| // We cannot use a normal reference because the compiler will warn | 
| // since this is often used on a return value, which is a temporary. | 
| @@ -514,35 +531,46 @@ class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase { | 
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 
| // return the exact Callback<> type.  See base/bind.h for details. | 
| template <typename T> | 
| -  Callback(const internal::InvokerStorageHolder<T>& invoker_holder) | 
| -      : CallbackBase( | 
| -          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke), | 
| -          &invoker_holder.invoker_storage_) { | 
| -    COMPILE_ASSERT((is_same<PolymorphicInvoke, | 
| -                    typename T::Invoker::DoInvokeType>::value), | 
| -                   callback_type_does_not_match_bind_result); | 
| +  Callback(const internal::BindStateHolder<T>& bind_state_holder) | 
| +      : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 
| +    // Force the assignment to a location variable of PolymorphicInvoke | 
| +    // so the compiler will typecheck that the passed in Run() method has | 
| +    // the correct type. | 
| +    PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 
| +    polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 
| } | 
|  | 
| bool Equals(const Callback& other) const { | 
| return CallbackBase::Equals(other); | 
| } | 
|  | 
| -  R Run(typename internal::ParamTraits<A1>::ForwardType a1, | 
| -        typename internal::ParamTraits<A2>::ForwardType a2, | 
| -        typename internal::ParamTraits<A3>::ForwardType a3, | 
| -        typename internal::ParamTraits<A4>::ForwardType a4, | 
| -        typename internal::ParamTraits<A5>::ForwardType a5, | 
| -        typename internal::ParamTraits<A6>::ForwardType a6) const { | 
| +  R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 
| +        typename internal::CallbackParamTraits<A2>::ForwardType a2, | 
| +        typename internal::CallbackParamTraits<A3>::ForwardType a3, | 
| +        typename internal::CallbackParamTraits<A4>::ForwardType a4, | 
| +        typename internal::CallbackParamTraits<A5>::ForwardType a5, | 
| +        typename internal::CallbackParamTraits<A6>::ForwardType a6) const { | 
| PolymorphicInvoke f = | 
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 
|  | 
| -    return f(invoker_storage_.get(), a1, | 
| +    return f(bind_state_.get(), a1, | 
| a2, | 
| a3, | 
| a4, | 
| a5, | 
| a6); | 
| } | 
| + | 
| + private: | 
| +  typedef R(*PolymorphicInvoke)( | 
| +      internal::BindStateBase*, | 
| +          typename internal::CallbackParamTraits<A1>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A2>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A3>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A4>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A5>::ForwardType, | 
| +          typename internal::CallbackParamTraits<A6>::ForwardType); | 
| + | 
| }; | 
|  | 
|  | 
|  |