diff --git a/native_mate/function_template.h b/native_mate/function_template.h index 192aa8ed15e..cfbc85935df 100644 --- a/native_mate/function_template.h +++ b/native_mate/function_template.h @@ -83,23 +83,42 @@ class CallbackHolder : public CallbackHolderBase { // have the void return type. template + typename P6 = void, typename P7 = void> struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, - const base::Callback& callback, + const base::Callback& callback, const P1& a1, const P2& a2, const P3& a3, const P4& a4, const P5& a5, - const P6& a6) { - MATE_METHOD_RETURN(callback.Run(a1, a2, a3, a4, a5, a6)); + const P6& a6, + const P7& a7) { + MATE_METHOD_RETURN(callback.Run(a1, a2, a3, a4, a5, a6, a7)); } }; +template +struct Invoker { + inline static MATE_METHOD_RETURN_TYPE Go( + Arguments& args, + const base::Callback& callback, + const P1& a1, + const P2& a2, + const P3& a3, + const P4& a4, + const P5& a5, + const P6& a6, + const P7& a7) { + callback.Run(a1, a2, a3, a4, a5, a6, a7); + MATE_METHOD_RETURN_UNDEFINED(); + } +}; + template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -116,7 +135,7 @@ struct Invoker { template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -129,7 +148,7 @@ struct Invoker { } }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -144,7 +163,7 @@ struct Invoker { }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -156,7 +175,7 @@ struct Invoker { } }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -170,7 +189,7 @@ struct Invoker { }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -181,7 +200,7 @@ struct Invoker { } }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -194,7 +213,7 @@ struct Invoker { }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -204,7 +223,7 @@ struct Invoker { } }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -216,7 +235,7 @@ struct Invoker { }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -225,7 +244,7 @@ struct Invoker { } }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback, @@ -236,7 +255,7 @@ struct Invoker { }; template -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback) { @@ -244,7 +263,7 @@ struct Invoker { } }; template<> -struct Invoker { +struct Invoker { inline static MATE_METHOD_RETURN_TYPE Go( Arguments& args, const base::Callback& callback) { @@ -474,6 +493,43 @@ struct Dispatcher { } }; +template +struct Dispatcher { + static MATE_METHOD(DispatchToCallback) { + Arguments args(info); + v8::Handle v8_holder; + CHECK(args.GetData(&v8_holder)); + CallbackHolderBase* holder_base = reinterpret_cast( + v8_holder->Value()); + + typedef CallbackHolder HolderT; + HolderT* holder = static_cast(holder_base); + + typename CallbackParamTraits::LocalType a1; + typename CallbackParamTraits::LocalType a2; + typename CallbackParamTraits::LocalType a3; + typename CallbackParamTraits::LocalType a4; + typename CallbackParamTraits::LocalType a5; + typename CallbackParamTraits::LocalType a6; + typename CallbackParamTraits::LocalType a7; + if (!GetNextArgument(&args, holder->flags, true, &a1) || + !GetNextArgument(&args, holder->flags, false, &a2) || + !GetNextArgument(&args, holder->flags, false, &a3) || + !GetNextArgument(&args, holder->flags, false, &a4) || + !GetNextArgument(&args, holder->flags, false, &a5) || + !GetNextArgument(&args, holder->flags, false, &a6) || + !GetNextArgument(&args, holder->flags, false, &a7)) { + args.ThrowError(); + MATE_METHOD_RETURN_UNDEFINED(); + } + + return Invoker::Go(args, holder->callback, + a1, a2, a3, a4, a5, a6, a7); + } +}; + + } // namespace internal