| OLD | NEW |
| 1 $$ This is a pump file for generating file templates. Pump is a python | 1 $$ This is a pump file for generating file templates. Pump is a python |
| 2 $$ script that is part of the Google Test suite of utilities. Description | 2 $$ script that is part of the Google Test suite of utilities. Description |
| 3 $$ can be found here: | 3 $$ can be found here: |
| 4 $$ | 4 $$ |
| 5 $$ http://code.google.com/p/googletest/wiki/PumpManual | 5 $$ http://code.google.com/p/googletest/wiki/PumpManual |
| 6 $$ | 6 $$ |
| 7 | 7 |
| 8 $var MAX_ARITY = 3 | 8 $var MAX_ARITY = 4 |
| 9 | 9 |
| 10 // Copyright 2013 The Chromium Authors. All rights reserved. | 10 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 11 // Use of this source code is governed by a BSD-style license that can be | 11 // Use of this source code is governed by a BSD-style license that can be |
| 12 // found in the LICENSE file. | 12 // found in the LICENSE file. |
| 13 | 13 |
| 14 #include "base/callback.h" | 14 #include "base/callback.h" |
| 15 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "gin/arguments.h" | 16 #include "gin/arguments.h" |
| 17 #include "gin/converter.h" | 17 #include "gin/converter.h" |
| 18 #include "gin/public/gin_embedders.h" | 18 #include "gin/public/gin_embedders.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 41 // CreateFunctionTemplate through v8 (via v8::FunctionTemplate) to | 41 // CreateFunctionTemplate through v8 (via v8::FunctionTemplate) to |
| 42 // DispatchToCallback, where it is invoked. | 42 // DispatchToCallback, where it is invoked. |
| 43 // | 43 // |
| 44 // v8::FunctionTemplate only supports passing void* as data so how do we know | 44 // v8::FunctionTemplate only supports passing void* as data so how do we know |
| 45 // when to delete the base::Callback? That's where CallbackHolderBase comes in. | 45 // when to delete the base::Callback? That's where CallbackHolderBase comes in. |
| 46 // It inherits from Wrappable, which delete itself when both (a) the refcount | 46 // It inherits from Wrappable, which delete itself when both (a) the refcount |
| 47 // via base::RefCounted has dropped to zero, and (b) there are no more | 47 // via base::RefCounted has dropped to zero, and (b) there are no more |
| 48 // JavaScript references in V8. | 48 // JavaScript references in V8. |
| 49 class CallbackHolderBase : public Wrappable { | 49 class CallbackHolderBase : public Wrappable { |
| 50 public: | 50 public: |
| 51 static void EnsureRegistered(PerIsolateData* isolate_data); | |
| 52 virtual WrapperInfo* GetWrapperInfo() OVERRIDE; | 51 virtual WrapperInfo* GetWrapperInfo() OVERRIDE; |
| 53 static WrapperInfo kWrapperInfo; | 52 static WrapperInfo kWrapperInfo; |
| 54 protected: | 53 protected: |
| 55 virtual ~CallbackHolderBase() {} | 54 virtual ~CallbackHolderBase() {} |
| 56 }; | 55 }; |
| 57 | 56 |
| 58 template<typename Sig> | 57 template<typename Sig> |
| 59 class CallbackHolder : public CallbackHolderBase { | 58 class CallbackHolder : public CallbackHolderBase { |
| 60 public: | 59 public: |
| 61 CallbackHolder(const base::Callback<Sig>& callback) | 60 CallbackHolder(const base::Callback<Sig>& callback) |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 ]] | 139 ]] |
| 141 | 140 |
| 142 Invoker<R$for ARG [[, P$(ARG)]]>::Go(&args, holder->callback$for ARG [[, a$(AR
G)]]); | 141 Invoker<R$for ARG [[, P$(ARG)]]>::Go(&args, holder->callback$for ARG [[, a$(AR
G)]]); |
| 143 } | 142 } |
| 144 | 143 |
| 145 ]] | 144 ]] |
| 146 | 145 |
| 147 } // namespace internal | 146 } // namespace internal |
| 148 | 147 |
| 149 | 148 |
| 149 // This should be called once per-isolate to initialize the function template |
| 150 // system. |
| 151 void InitFunctionTemplates(PerIsolateData* isolate_data); |
| 152 |
| 153 |
| 150 // This has to be outside the internal namespace because template | 154 // This has to be outside the internal namespace because template |
| 151 // specializations must be declared in the same namespace as the original | 155 // specializations must be declared in the same namespace as the original |
| 152 // template. | 156 // template. |
| 153 template<> | 157 template<> |
| 154 struct Converter<internal::CallbackHolderBase*> | 158 struct Converter<internal::CallbackHolderBase*> |
| 155 : public WrappableConverter<internal::CallbackHolderBase> {}; | 159 : public WrappableConverter<internal::CallbackHolderBase> {}; |
| 156 | 160 |
| 157 | 161 |
| 158 // Creates a v8::FunctionTemplate that will run the provided base::Callback each | 162 // Creates a v8::FunctionTemplate that will run the provided base::Callback each |
| 159 // time it is called. JavaScript arguments and return values are converted via | 163 // time it is called. JavaScript arguments and return values are converted via |
| 160 // gin::Converter. | 164 // gin::Converter. |
| 161 $range ARITY 0..MAX_ARITY | 165 $range ARITY 0..MAX_ARITY |
| 162 $for ARITY [[ | 166 $for ARITY [[ |
| 163 $range ARG 1..ARITY | 167 $range ARG 1..ARITY |
| 164 | 168 |
| 165 template<typename R$for ARG [[, typename P$(ARG)]]> | 169 template<typename R$for ARG [[, typename P$(ARG)]]> |
| 166 v8::Local<v8::FunctionTemplate> CreateFunctionTemplate( | 170 v8::Local<v8::FunctionTemplate> CreateFunctionTemplate( |
| 167 v8::Isolate* isolate, | 171 v8::Isolate* isolate, |
| 168 const base::Callback<R($for ARG , [[P$(ARG)]])> callback) { | 172 const base::Callback<R($for ARG , [[P$(ARG)]])> callback) { |
| 169 typedef internal::CallbackHolder<R($for ARG , [[P$(ARG)]])> HolderT; | 173 typedef internal::CallbackHolder<R($for ARG , [[P$(ARG)]])> HolderT; |
| 170 scoped_refptr<HolderT> holder(new HolderT(callback)); | 174 scoped_refptr<HolderT> holder(new HolderT(callback)); |
| 171 return v8::FunctionTemplate::New( | 175 return v8::FunctionTemplate::New( |
| 172 &internal::DispatchToCallback<R$for ARG [[, P$(ARG)]]>, | 176 &internal::DispatchToCallback<R$for ARG [[, P$(ARG)]]>, |
| 173 ConvertToV8<internal::CallbackHolderBase*>(isolate, holder.get())); | 177 ConvertToV8<internal::CallbackHolderBase*>(isolate, holder.get())); |
| 174 } | 178 } |
| 175 | 179 |
| 176 ]] | 180 ]] |
| 177 | 181 |
| 178 } // namespace gin | 182 } // namespace gin |
| OLD | NEW |