From: Cheng Zhao Date: Fri, 7 Aug 2015 11:15:36 +0000 (+0800) Subject: Reimplement callback.h with C++11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5c18d894530cf84bdcfa1890a485216f4a1cee38;p=platform%2Fframework%2Fweb%2Fcrosswalk-tizen.git Reimplement callback.h with C++11 --- diff --git a/atom/common/native_mate_converters/callback.h b/atom/common/native_mate_converters/callback.h index 5dfcf9b..e7dc6af 100644 --- a/atom/common/native_mate_converters/callback.h +++ b/atom/common/native_mate_converters/callback.h @@ -2,6 +2,8 @@ // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. +#include + #include "base/bind.h" #include "base/callback.h" #include "native_mate/function_template.h" @@ -14,407 +16,55 @@ namespace internal { typedef scoped_refptr > SafeV8Function; -// This set of templates invokes a V8::Function by converting the C++ types. -template -struct V8FunctionInvoker; - -template -struct V8FunctionInvoker()> { - static v8::Local Go(v8::Isolate* isolate, SafeV8Function function) { - Locker locker(isolate); - v8::EscapableHandleScope handle_scope(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local val(holder->Call(holder, 0, NULL)); - return handle_scope.Escape(val); - } -}; - -template -struct V8FunctionInvoker { - static R Go(v8::Isolate* isolate, SafeV8Function function) { - R ret; - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local val(holder->Call(holder, 0, NULL)); - Converter::FromV8(isolate, val, &ret); - return ret; - } -}; - -template<> -struct V8FunctionInvoker { - static void Go(v8::Isolate* isolate, SafeV8Function function) { - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - holder->Call(holder, 0, NULL); - } -}; - -template -struct V8FunctionInvoker(P1)> { - static v8::Local Go(v8::Isolate* isolate, SafeV8Function function, P1 a1) { - Locker locker(isolate); - v8::EscapableHandleScope handle_scope(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - return handle_scope.Escape(val); - } -}; - -template -struct V8FunctionInvoker { - static R Go(v8::Isolate* isolate, SafeV8Function function, P1 a1) { - R ret; - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - Converter::FromV8(isolate, val, &ret); - return ret; - } -}; - -template -struct V8FunctionInvoker { - static void Go(v8::Isolate* isolate, SafeV8Function function, P1 a1) { - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - }; - holder->Call(holder, arraysize(args), args); - } -}; - -template -struct V8FunctionInvoker(P1, P2)> { - static v8::Local Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, - P2 a2) { - Locker locker(isolate); - v8::EscapableHandleScope handle_scope(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - return handle_scope.Escape(val); - } -}; - -template -struct V8FunctionInvoker { - static R Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2) { - R ret; - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - Converter::FromV8(isolate, val, &ret); - return ret; - } -}; - -template -struct V8FunctionInvoker { - static void Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2) { - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - }; - holder->Call(holder, arraysize(args), args); - } -}; - -template -struct V8FunctionInvoker(P1, P2, P3)> { - static v8::Local Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, - P2 a2, P3 a3) { - Locker locker(isolate); - v8::EscapableHandleScope handle_scope(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - return handle_scope.Escape(val); - } -}; - -template -struct V8FunctionInvoker { - static R Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2, - P3 a3) { - R ret; - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - Converter::FromV8(isolate, val, &ret); - return ret; - } -}; - -template -struct V8FunctionInvoker { - static void Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2, - P3 a3) { - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - }; - holder->Call(holder, arraysize(args), args); - } -}; - -template -struct V8FunctionInvoker(P1, P2, P3, P4)> { - static v8::Local Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, - P2 a2, P3 a3, P4 a4) { - Locker locker(isolate); - v8::EscapableHandleScope handle_scope(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - return handle_scope.Escape(val); - } -}; - -template -struct V8FunctionInvoker { - static R Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2, - P3 a3, P4 a4) { - R ret; - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - Converter::FromV8(isolate, val, &ret); - return ret; - } -}; - -template -struct V8FunctionInvoker { - static void Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2, - P3 a3, P4 a4) { - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - }; - holder->Call(holder, arraysize(args), args); - } -}; +template +struct V8FunctionInvoker {}; -template -struct V8FunctionInvoker(P1, P2, P3, P4, P5)> { - static v8::Local Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, - P2 a2, P3 a3, P4 a4, P5 a5) { +template +struct V8FunctionInvoker(ArgTypes...)> { + static v8::Local Go(v8::Isolate* isolate, SafeV8Function function, + ArgTypes... raw) { Locker locker(isolate); v8::EscapableHandleScope handle_scope(isolate); v8::Local holder = function->NewHandle(); v8::Local context = holder->CreationContext(); v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - ConvertToV8(isolate, a5), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - return handle_scope.Escape(val); + std::vector> args = { ConvertToV8(isolate, raw)... }; + v8::Local ret(holder->Call(holder, args.size(), &args.front())); + return handle_scope.Escape(ret); } }; -template -struct V8FunctionInvoker { - static R Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2, - P3 a3, P4 a4, P5 a5) { - R ret; +template +struct V8FunctionInvoker { + static void Go(v8::Isolate* isolate, SafeV8Function function, + ArgTypes... raw) { Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); + v8::HandleScope handle_scope(isolate); v8::Local holder = function->NewHandle(); v8::Local context = holder->CreationContext(); v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - ConvertToV8(isolate, a5), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - Converter::FromV8(isolate, val, &ret); - return ret; + std::vector> args = { ConvertToV8(isolate, raw)... }; + holder->Call(holder, args.size(), &args.front()); } }; -template -struct V8FunctionInvoker { - static void Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2, - P3 a3, P4 a4, P5 a5) { +template +struct V8FunctionInvoker { + static ReturnType Go(v8::Isolate* isolate, SafeV8Function function, + ArgTypes... raw) { Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); + v8::HandleScope handle_scope(isolate); v8::Local holder = function->NewHandle(); v8::Local context = holder->CreationContext(); v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - ConvertToV8(isolate, a5), - }; - holder->Call(holder, arraysize(args), args); - } -}; - -template -struct V8FunctionInvoker(P1, P2, P3, P4, P5, P6)> { - static v8::Local Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, - P2 a2, P3 a3, P4 a4, P5 a5, P6 a6) { - Locker locker(isolate); - v8::EscapableHandleScope handle_scope(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - ConvertToV8(isolate, a5), - ConvertToV8(isolate, a6), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - return handle_scope.Escape(val); - } -}; - -template -struct V8FunctionInvoker { - static R Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2, - P3 a3, P4 a4, P5 a5, P6 a6) { - R ret; - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - ConvertToV8(isolate, a5), - ConvertToV8(isolate, a6), - }; - v8::Local val(holder->Call(holder, arraysize(args), args)); - Converter::FromV8(isolate, val, &ret); + ReturnType ret; + std::vector> args = { ConvertToV8(isolate, raw)... }; + v8::Local val(holder->Call(holder, args.size(), &args.front())); + Converter::FromV8(isolate, val, &ret); return ret; } }; -template -struct V8FunctionInvoker { - static void Go(v8::Isolate* isolate, SafeV8Function function, P1 a1, P2 a2, - P3 a3, P4 a4, P5 a5, P6 a6) { - Locker locker(isolate); - MATE_HANDLE_SCOPE(isolate); - v8::Local holder = function->NewHandle(); - v8::Local context = holder->CreationContext(); - v8::Context::Scope context_scope(context); - v8::Local args[] = { - ConvertToV8(isolate, a1), - ConvertToV8(isolate, a2), - ConvertToV8(isolate, a3), - ConvertToV8(isolate, a4), - ConvertToV8(isolate, a5), - ConvertToV8(isolate, a6), - }; - holder->Call(holder, arraysize(args), args); - } -}; - } // namespace internal template