diff options
author | ajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-26 16:22:50 +0000 |
---|---|---|
committer | ajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-26 16:22:50 +0000 |
commit | 6a341fbb4fa4651ea5d60ce8aa57e5fabe3da375 (patch) | |
tree | 1062e8ae71f9d3a15421809847e6b0208bde8ad0 /base/bind_internal.h.pump | |
parent | e93fd55e815c0004672e0a7621fcd617b8196035 (diff) | |
download | chromium_src-6a341fbb4fa4651ea5d60ce8aa57e5fabe3da375.zip chromium_src-6a341fbb4fa4651ea5d60ce8aa57e5fabe3da375.tar.gz chromium_src-6a341fbb4fa4651ea5d60ce8aa57e5fabe3da375.tar.bz2 |
Add COMPILE_ASSERT to ensure the result of Bind matches the Callback's type.
Required because we abstract the storage of the funciton pointer out using
a reinterpret_cast to reduce template bloat. This effectively readds the
failure that would have happened had we stored the function pointer directly
in the template class.
BUG=86008
TEST=new unittests.
Review URL: http://codereview.chromium.org/7241015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90525 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/bind_internal.h.pump')
-rw-r--r-- | base/bind_internal.h.pump | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/base/bind_internal.h.pump b/base/bind_internal.h.pump index 85875de..31988c5 100644 --- a/base/bind_internal.h.pump +++ b/base/bind_internal.h.pump @@ -198,6 +198,11 @@ template <typename StorageType, typename R[[]] $if ARITY > 0 [[,]][[]] $for ARG , [[typename X$(ARG)]]> struct Invoker$(BOUND)<false, StorageType, R(*)($for ARG , [[X$(ARG)]])> { + typedef R(*DoInvokeType)( + internal::InvokerStorageBase*[[]] +$if UNBOUND != 0 [[, ]] +$for UNBOUND_ARG , [[typename internal::ParamTraits<X$(UNBOUND_ARG)>::ForwardType]]); + static R DoInvoke(InvokerStorageBase* base[[]] $if UNBOUND != 0 [[, ]][[]] $for UNBOUND_ARG , [[typename internal::ParamTraits<X$(UNBOUND_ARG)>::ForwardType x$(UNBOUND_ARG)]]) { @@ -215,6 +220,11 @@ $if BOUND > 0 [[ template <typename StorageType, typename R, typename T[[]] $if M_ARITY > 0[[, ]] $for M_ARG , [[typename X$(M_ARG)]]> struct Invoker$(BOUND)<false, StorageType, R(T::*)($for M_ARG , [[X$(M_ARG)]])> { + typedef R(*DoInvokeType)( + internal::InvokerStorageBase*[[]] +$if UNBOUND != 0 [[, ]] +$for M_UNBOUND_ARG , [[typename internal::ParamTraits<X$(M_UNBOUND_ARG)>::ForwardType]]); + static R DoInvoke(InvokerStorageBase* base[[]] $if UNBOUND > 0 [[, ]][[]] $for M_UNBOUND_ARG , [[typename internal::ParamTraits<X$(M_UNBOUND_ARG)>::ForwardType x$(M_UNBOUND_ARG)]]) { @@ -230,6 +240,11 @@ $for M_UNBOUND_ARG , [[x$(M_UNBOUND_ARG)]]); template <typename StorageType, typename T[[]] $if M_ARITY > 0[[, ]] $for M_ARG , [[typename X$(M_ARG)]]> struct Invoker$(BOUND)<true, StorageType, void(T::*)($for M_ARG , [[X$(M_ARG)]])> { + typedef void(*DoInvokeType)( + internal::InvokerStorageBase*[[]] +$if UNBOUND != 0 [[, ]] +$for M_UNBOUND_ARG , [[typename internal::ParamTraits<X$(M_UNBOUND_ARG)>::ForwardType]]); + static void DoInvoke(InvokerStorageBase* base[[]] $if UNBOUND > 0 [[, ]][[]] $for M_UNBOUND_ARG , [[typename internal::ParamTraits<X$(M_UNBOUND_ARG)>::ForwardType x$(M_UNBOUND_ARG)]]) { |