diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-23 20:26:51 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-23 20:26:51 +0000 |
commit | 314cde1222cbc81c1d42054fc379235598f0125a (patch) | |
tree | a9a698a4acebe708171d972cd1151455bc9da916 /gin/function_template.h | |
parent | 52e48aed8d0ec12cfb7b22434805758cfee5d41c (diff) | |
download | chromium_src-314cde1222cbc81c1d42054fc379235598f0125a.zip chromium_src-314cde1222cbc81c1d42054fc379235598f0125a.tar.gz chromium_src-314cde1222cbc81c1d42054fc379235598f0125a.tar.bz2 |
First cut at gin::Bind().
BUG=
Review URL: https://codereview.chromium.org/76923003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@236958 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gin/function_template.h')
-rw-r--r-- | gin/function_template.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/gin/function_template.h b/gin/function_template.h new file mode 100644 index 0000000..9c5b154 --- /dev/null +++ b/gin/function_template.h @@ -0,0 +1,85 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/callback.h" +#include "base/logging.h" +#include "gin/arguments.h" +#include "gin/converter.h" +#include "gin/public/gin_embedders.h" +#include "gin/public/wrapper_info.h" +#include "gin/wrappable.h" + +#include "v8/include/v8.h" + +namespace gin { + +class PerIsolateData; + +template<typename T> +struct RemoveConstRef { + typedef T Type; +}; +template<typename T> +struct RemoveConstRef<const T&> { + typedef T Type; +}; + +class CallbackHolderBase : public Wrappable { + public: + static void EnsureRegistered(PerIsolateData* isolate_data); + virtual WrapperInfo* GetWrapperInfo() OVERRIDE; + static WrapperInfo kWrapperInfo; + protected: + virtual ~CallbackHolderBase() {} +}; + +template<> +struct Converter<CallbackHolderBase*> + : public WrappableConverter<CallbackHolderBase> {}; + +template<typename Sig> +class CallbackHolder : public CallbackHolderBase { + public: + CallbackHolder(const base::Callback<Sig>& callback) + : callback(callback) {} + base::Callback<Sig> callback; + private: + virtual ~CallbackHolder() {} +}; + +// TODO(aa): Generate the overloads below with pump. + +template<typename P1, typename P2> +static void DispatchToCallback( + const v8::FunctionCallbackInfo<v8::Value>& info) { + Arguments args(info); + CallbackHolderBase* holder_base = NULL; + CHECK(args.GetData(&holder_base)); + + typedef CallbackHolder<void(P1, P2)> HolderT; + HolderT* holder = static_cast<HolderT*>(holder_base); + + typename RemoveConstRef<P1>::Type a1; + typename RemoveConstRef<P2>::Type a2; + if (!args.GetNext(&a1) || + !args.GetNext(&a2)) { + args.ThrowError(); + return; + } + + holder->callback.Run(a1, a2); +} + +template<typename P1, typename P2> +v8::Local<v8::FunctionTemplate> CreateFunctionTempate( + v8::Isolate* isolate, + const base::Callback<void(P1, P2)>& callback) { + typedef CallbackHolder<void(P1, P2)> HolderT; + scoped_refptr<HolderT> holder(new HolderT(callback)); + return v8::FunctionTemplate::New( + &DispatchToCallback<P1, P2>, + ConvertToV8<CallbackHolderBase*>(isolate, holder.get())); +} + +} // namespace gin |