summaryrefslogtreecommitdiffstats
path: root/base/bind_internal.h.pump
diff options
context:
space:
mode:
authorajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-26 16:22:50 +0000
committerajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-26 16:22:50 +0000
commit6a341fbb4fa4651ea5d60ce8aa57e5fabe3da375 (patch)
tree1062e8ae71f9d3a15421809847e6b0208bde8ad0 /base/bind_internal.h.pump
parente93fd55e815c0004672e0a7621fcd617b8196035 (diff)
downloadchromium_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.pump15
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)]]) {