OLD | NEW |
1 // This file was GENERATED by command: | 1 // This file was GENERATED by command: |
2 // pump.py function_template.h.pump | 2 // pump.py function_template.h.pump |
3 // DO NOT EDIT BY HAND!!! | 3 // DO NOT EDIT BY HAND!!! |
4 | 4 |
5 | 5 |
6 | 6 |
7 #ifndef GIN_FUNCTION_TEMPLATE_H_ | 7 #ifndef GIN_FUNCTION_TEMPLATE_H_ |
8 #define GIN_FUNCTION_TEMPLATE_H_ | 8 #define GIN_FUNCTION_TEMPLATE_H_ |
9 | 9 |
10 // Copyright 2013 The Chromium Authors. All rights reserved. | 10 // Copyright 2013 The Chromium Authors. All rights reserved. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // when to delete the base::Callback? That's where CallbackHolderBase comes in. | 55 // when to delete the base::Callback? That's where CallbackHolderBase comes in. |
56 // It inherits from Wrappable, which delete itself when both (a) the refcount | 56 // It inherits from Wrappable, which delete itself when both (a) the refcount |
57 // via base::RefCounted has dropped to zero, and (b) there are no more | 57 // via base::RefCounted has dropped to zero, and (b) there are no more |
58 // JavaScript references in V8. | 58 // JavaScript references in V8. |
59 | 59 |
60 // This simple base class is used so that we can share a single object template | 60 // This simple base class is used so that we can share a single object template |
61 // among every CallbackHolder instance. | 61 // among every CallbackHolder instance. |
62 class GIN_EXPORT CallbackHolderBase : public Wrappable<CallbackHolderBase> { | 62 class GIN_EXPORT CallbackHolderBase : public Wrappable<CallbackHolderBase> { |
63 public: | 63 public: |
64 static WrapperInfo kWrapperInfo; | 64 static WrapperInfo kWrapperInfo; |
| 65 |
65 protected: | 66 protected: |
66 virtual ~CallbackHolderBase() {} | 67 virtual ~CallbackHolderBase() {} |
67 }; | 68 }; |
68 | 69 |
69 template<typename Sig> | 70 template<typename Sig> |
70 class CallbackHolder : public CallbackHolderBase { | 71 class CallbackHolder : public CallbackHolderBase { |
71 public: | 72 public: |
72 CallbackHolder(const base::Callback<Sig>& callback, int flags) | 73 CallbackHolder(const base::Callback<Sig>& callback, int flags) |
73 : callback(callback), flags(flags) {} | 74 : callback(callback), flags(flags) {} |
74 base::Callback<Sig> callback; | 75 base::Callback<Sig> callback; |
75 int flags; | 76 int flags; |
76 private: | 77 private: |
77 virtual ~CallbackHolder() {} | 78 virtual ~CallbackHolder() {} |
78 }; | 79 }; |
79 | 80 |
80 | 81 |
81 // This set of templates invokes a base::Callback, converts the return type to a | 82 // This set of templates invokes a base::Callback, converts the return type to a |
82 // JavaScript value, and returns that value to script via the provided | 83 // JavaScript value, and returns that value to script via the provided |
83 // gin::Arguments object. | 84 // gin::Arguments object. |
84 // | 85 // |
85 // In C++, you can declare the function foo(void), but you can't pass a void | 86 // In C++, you can declare the function foo(void), but you can't pass a void |
86 // expression to foo. As a result, we must specialize the case of Callbacks that | 87 // expression to foo. As a result, we must specialize the case of Callbacks that |
87 // have the void return type. | 88 // have the void return type. |
88 template<typename R, typename P1 = void, typename P2 = void, | 89 template<typename R, typename P1 = void, typename P2 = void, |
89 typename P3 = void, typename P4 = void> | 90 typename P3 = void, typename P4 = void, typename P5 = void, |
| 91 typename P6 = void> |
90 struct Invoker { | 92 struct Invoker { |
91 inline static void Go( | 93 inline static void Go( |
92 Arguments* args, | 94 Arguments* args, |
| 95 const base::Callback<R(P1, P2, P3, P4, P5, P6)>& callback, |
| 96 const P1& a1, |
| 97 const P2& a2, |
| 98 const P3& a3, |
| 99 const P4& a4, |
| 100 const P5& a5, |
| 101 const P6& a6) { |
| 102 args->Return(callback.Run(a1, a2, a3, a4, a5, a6)); |
| 103 } |
| 104 }; |
| 105 template<typename P1, typename P2, typename P3, typename P4, typename P5, |
| 106 typename P6> |
| 107 struct Invoker<void, P1, P2, P3, P4, P5, P6> { |
| 108 inline static void Go( |
| 109 Arguments* args, |
| 110 const base::Callback<void(P1, P2, P3, P4, P5, P6)>& callback, |
| 111 const P1& a1, |
| 112 const P2& a2, |
| 113 const P3& a3, |
| 114 const P4& a4, |
| 115 const P5& a5, |
| 116 const P6& a6) { |
| 117 callback.Run(a1, a2, a3, a4, a5, a6); |
| 118 } |
| 119 }; |
| 120 |
| 121 template<typename R, typename P1, typename P2, typename P3, typename P4, |
| 122 typename P5> |
| 123 struct Invoker<R, P1, P2, P3, P4, P5, void> { |
| 124 inline static void Go( |
| 125 Arguments* args, |
| 126 const base::Callback<R(P1, P2, P3, P4, P5)>& callback, |
| 127 const P1& a1, |
| 128 const P2& a2, |
| 129 const P3& a3, |
| 130 const P4& a4, |
| 131 const P5& a5) { |
| 132 args->Return(callback.Run(a1, a2, a3, a4, a5)); |
| 133 } |
| 134 }; |
| 135 template<typename P1, typename P2, typename P3, typename P4, typename P5> |
| 136 struct Invoker<void, P1, P2, P3, P4, P5, void> { |
| 137 inline static void Go( |
| 138 Arguments* args, |
| 139 const base::Callback<void(P1, P2, P3, P4, P5)>& callback, |
| 140 const P1& a1, |
| 141 const P2& a2, |
| 142 const P3& a3, |
| 143 const P4& a4, |
| 144 const P5& a5) { |
| 145 callback.Run(a1, a2, a3, a4, a5); |
| 146 } |
| 147 }; |
| 148 |
| 149 template<typename R, typename P1, typename P2, typename P3, typename P4> |
| 150 struct Invoker<R, P1, P2, P3, P4, void, void> { |
| 151 inline static void Go( |
| 152 Arguments* args, |
93 const base::Callback<R(P1, P2, P3, P4)>& callback, | 153 const base::Callback<R(P1, P2, P3, P4)>& callback, |
94 const P1& a1, | 154 const P1& a1, |
95 const P2& a2, | 155 const P2& a2, |
96 const P3& a3, | 156 const P3& a3, |
97 const P4& a4) { | 157 const P4& a4) { |
98 args->Return(callback.Run(a1, a2, a3, a4)); | 158 args->Return(callback.Run(a1, a2, a3, a4)); |
99 } | 159 } |
100 }; | 160 }; |
101 template<typename P1, typename P2, typename P3, typename P4> | 161 template<typename P1, typename P2, typename P3, typename P4> |
102 struct Invoker<void, P1, P2, P3, P4> { | 162 struct Invoker<void, P1, P2, P3, P4, void, void> { |
103 inline static void Go( | 163 inline static void Go( |
104 Arguments* args, | 164 Arguments* args, |
105 const base::Callback<void(P1, P2, P3, P4)>& callback, | 165 const base::Callback<void(P1, P2, P3, P4)>& callback, |
106 const P1& a1, | 166 const P1& a1, |
107 const P2& a2, | 167 const P2& a2, |
108 const P3& a3, | 168 const P3& a3, |
109 const P4& a4) { | 169 const P4& a4) { |
110 callback.Run(a1, a2, a3, a4); | 170 callback.Run(a1, a2, a3, a4); |
111 } | 171 } |
112 }; | 172 }; |
113 | 173 |
114 template<typename R, typename P1, typename P2, typename P3> | 174 template<typename R, typename P1, typename P2, typename P3> |
115 struct Invoker<R, P1, P2, P3, void> { | 175 struct Invoker<R, P1, P2, P3, void, void, void> { |
116 inline static void Go( | 176 inline static void Go( |
117 Arguments* args, | 177 Arguments* args, |
118 const base::Callback<R(P1, P2, P3)>& callback, | 178 const base::Callback<R(P1, P2, P3)>& callback, |
119 const P1& a1, | 179 const P1& a1, |
120 const P2& a2, | 180 const P2& a2, |
121 const P3& a3) { | 181 const P3& a3) { |
122 args->Return(callback.Run(a1, a2, a3)); | 182 args->Return(callback.Run(a1, a2, a3)); |
123 } | 183 } |
124 }; | 184 }; |
125 template<typename P1, typename P2, typename P3> | 185 template<typename P1, typename P2, typename P3> |
126 struct Invoker<void, P1, P2, P3, void> { | 186 struct Invoker<void, P1, P2, P3, void, void, void> { |
127 inline static void Go( | 187 inline static void Go( |
128 Arguments* args, | 188 Arguments* args, |
129 const base::Callback<void(P1, P2, P3)>& callback, | 189 const base::Callback<void(P1, P2, P3)>& callback, |
130 const P1& a1, | 190 const P1& a1, |
131 const P2& a2, | 191 const P2& a2, |
132 const P3& a3) { | 192 const P3& a3) { |
133 callback.Run(a1, a2, a3); | 193 callback.Run(a1, a2, a3); |
134 } | 194 } |
135 }; | 195 }; |
136 | 196 |
137 template<typename R, typename P1, typename P2> | 197 template<typename R, typename P1, typename P2> |
138 struct Invoker<R, P1, P2, void, void> { | 198 struct Invoker<R, P1, P2, void, void, void, void> { |
139 inline static void Go( | 199 inline static void Go( |
140 Arguments* args, | 200 Arguments* args, |
141 const base::Callback<R(P1, P2)>& callback, | 201 const base::Callback<R(P1, P2)>& callback, |
142 const P1& a1, | 202 const P1& a1, |
143 const P2& a2) { | 203 const P2& a2) { |
144 args->Return(callback.Run(a1, a2)); | 204 args->Return(callback.Run(a1, a2)); |
145 } | 205 } |
146 }; | 206 }; |
147 template<typename P1, typename P2> | 207 template<typename P1, typename P2> |
148 struct Invoker<void, P1, P2, void, void> { | 208 struct Invoker<void, P1, P2, void, void, void, void> { |
149 inline static void Go( | 209 inline static void Go( |
150 Arguments* args, | 210 Arguments* args, |
151 const base::Callback<void(P1, P2)>& callback, | 211 const base::Callback<void(P1, P2)>& callback, |
152 const P1& a1, | 212 const P1& a1, |
153 const P2& a2) { | 213 const P2& a2) { |
154 callback.Run(a1, a2); | 214 callback.Run(a1, a2); |
155 } | 215 } |
156 }; | 216 }; |
157 | 217 |
158 template<typename R, typename P1> | 218 template<typename R, typename P1> |
159 struct Invoker<R, P1, void, void, void> { | 219 struct Invoker<R, P1, void, void, void, void, void> { |
160 inline static void Go( | 220 inline static void Go( |
161 Arguments* args, | 221 Arguments* args, |
162 const base::Callback<R(P1)>& callback, | 222 const base::Callback<R(P1)>& callback, |
163 const P1& a1) { | 223 const P1& a1) { |
164 args->Return(callback.Run(a1)); | 224 args->Return(callback.Run(a1)); |
165 } | 225 } |
166 }; | 226 }; |
167 template<typename P1> | 227 template<typename P1> |
168 struct Invoker<void, P1, void, void, void> { | 228 struct Invoker<void, P1, void, void, void, void, void> { |
169 inline static void Go( | 229 inline static void Go( |
170 Arguments* args, | 230 Arguments* args, |
171 const base::Callback<void(P1)>& callback, | 231 const base::Callback<void(P1)>& callback, |
172 const P1& a1) { | 232 const P1& a1) { |
173 callback.Run(a1); | 233 callback.Run(a1); |
174 } | 234 } |
175 }; | 235 }; |
176 | 236 |
177 template<typename R> | 237 template<typename R> |
178 struct Invoker<R, void, void, void, void> { | 238 struct Invoker<R, void, void, void, void, void, void> { |
179 inline static void Go( | 239 inline static void Go( |
180 Arguments* args, | 240 Arguments* args, |
181 const base::Callback<R()>& callback) { | 241 const base::Callback<R()>& callback) { |
182 args->Return(callback.Run()); | 242 args->Return(callback.Run()); |
183 } | 243 } |
184 }; | 244 }; |
185 template<> | 245 template<> |
186 struct Invoker<void, void, void, void, void> { | 246 struct Invoker<void, void, void, void, void, void, void> { |
187 inline static void Go( | 247 inline static void Go( |
188 Arguments* args, | 248 Arguments* args, |
189 const base::Callback<void()>& callback) { | 249 const base::Callback<void()>& callback) { |
190 callback.Run(); | 250 callback.Run(); |
191 } | 251 } |
192 }; | 252 }; |
193 | 253 |
194 | 254 |
195 template<typename T> | 255 template<typename T> |
196 bool GetNextArgument(Arguments* args, int create_flags, bool is_first, | 256 bool GetNextArgument(Arguments* args, int create_flags, bool is_first, |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 !GetNextArgument(&args, holder->flags, false, &a3) || | 381 !GetNextArgument(&args, holder->flags, false, &a3) || |
322 !GetNextArgument(&args, holder->flags, false, &a4)) { | 382 !GetNextArgument(&args, holder->flags, false, &a4)) { |
323 args.ThrowError(); | 383 args.ThrowError(); |
324 return; | 384 return; |
325 } | 385 } |
326 | 386 |
327 Invoker<R, P1, P2, P3, P4>::Go(&args, holder->callback, a1, a2, a3, a4); | 387 Invoker<R, P1, P2, P3, P4>::Go(&args, holder->callback, a1, a2, a3, a4); |
328 } | 388 } |
329 }; | 389 }; |
330 | 390 |
| 391 template<typename R, typename P1, typename P2, typename P3, typename P4, |
| 392 typename P5> |
| 393 struct Dispatcher<R(P1, P2, P3, P4, P5)> { |
| 394 static void DispatchToCallback( |
| 395 const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 396 Arguments args(info); |
| 397 CallbackHolderBase* holder_base = NULL; |
| 398 CHECK(args.GetData(&holder_base)); |
| 399 |
| 400 typedef CallbackHolder<R(P1, P2, P3, P4, P5)> HolderT; |
| 401 HolderT* holder = static_cast<HolderT*>(holder_base); |
| 402 |
| 403 typename CallbackParamTraits<P1>::LocalType a1; |
| 404 typename CallbackParamTraits<P2>::LocalType a2; |
| 405 typename CallbackParamTraits<P3>::LocalType a3; |
| 406 typename CallbackParamTraits<P4>::LocalType a4; |
| 407 typename CallbackParamTraits<P5>::LocalType a5; |
| 408 if (!GetNextArgument(&args, holder->flags, true, &a1) || |
| 409 !GetNextArgument(&args, holder->flags, false, &a2) || |
| 410 !GetNextArgument(&args, holder->flags, false, &a3) || |
| 411 !GetNextArgument(&args, holder->flags, false, &a4) || |
| 412 !GetNextArgument(&args, holder->flags, false, &a5)) { |
| 413 args.ThrowError(); |
| 414 return; |
| 415 } |
| 416 |
| 417 Invoker<R, P1, P2, P3, P4, P5>::Go(&args, holder->callback, a1, a2, a3, a4, |
| 418 a5); |
| 419 } |
| 420 }; |
| 421 |
| 422 template<typename R, typename P1, typename P2, typename P3, typename P4, |
| 423 typename P5, typename P6> |
| 424 struct Dispatcher<R(P1, P2, P3, P4, P5, P6)> { |
| 425 static void DispatchToCallback( |
| 426 const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 427 Arguments args(info); |
| 428 CallbackHolderBase* holder_base = NULL; |
| 429 CHECK(args.GetData(&holder_base)); |
| 430 |
| 431 typedef CallbackHolder<R(P1, P2, P3, P4, P5, P6)> HolderT; |
| 432 HolderT* holder = static_cast<HolderT*>(holder_base); |
| 433 |
| 434 typename CallbackParamTraits<P1>::LocalType a1; |
| 435 typename CallbackParamTraits<P2>::LocalType a2; |
| 436 typename CallbackParamTraits<P3>::LocalType a3; |
| 437 typename CallbackParamTraits<P4>::LocalType a4; |
| 438 typename CallbackParamTraits<P5>::LocalType a5; |
| 439 typename CallbackParamTraits<P6>::LocalType a6; |
| 440 if (!GetNextArgument(&args, holder->flags, true, &a1) || |
| 441 !GetNextArgument(&args, holder->flags, false, &a2) || |
| 442 !GetNextArgument(&args, holder->flags, false, &a3) || |
| 443 !GetNextArgument(&args, holder->flags, false, &a4) || |
| 444 !GetNextArgument(&args, holder->flags, false, &a5) || |
| 445 !GetNextArgument(&args, holder->flags, false, &a6)) { |
| 446 args.ThrowError(); |
| 447 return; |
| 448 } |
| 449 |
| 450 Invoker<R, P1, P2, P3, P4, P5, P6>::Go(&args, holder->callback, a1, a2, a3, |
| 451 a4, a5, a6); |
| 452 } |
| 453 }; |
| 454 |
331 } // namespace internal | 455 } // namespace internal |
332 | 456 |
333 | 457 |
334 // CreateFunctionTemplate creates a v8::FunctionTemplate that will create | 458 // CreateFunctionTemplate creates a v8::FunctionTemplate that will create |
335 // JavaScript functions that execute a provided C++ function or base::Callback. | 459 // JavaScript functions that execute a provided C++ function or base::Callback. |
336 // JavaScript arguments are automatically converted via gin::Converter, as is | 460 // JavaScript arguments are automatically converted via gin::Converter, as is |
337 // the return value of the C++ function, if any. | 461 // the return value of the C++ function, if any. |
338 template<typename Sig> | 462 template<typename Sig> |
339 v8::Local<v8::FunctionTemplate> CreateFunctionTemplate( | 463 v8::Local<v8::FunctionTemplate> CreateFunctionTemplate( |
340 v8::Isolate* isolate, const base::Callback<Sig> callback, | 464 v8::Isolate* isolate, const base::Callback<Sig> callback, |
341 int callback_flags = 0) { | 465 int callback_flags = 0) { |
342 typedef internal::CallbackHolder<Sig> HolderT; | 466 typedef internal::CallbackHolder<Sig> HolderT; |
343 gin::Handle<HolderT> holder = CreateHandle( | 467 gin::Handle<HolderT> holder = CreateHandle( |
344 isolate, new HolderT(callback, callback_flags)); | 468 isolate, new HolderT(callback, callback_flags)); |
345 return v8::FunctionTemplate::New( | 469 return v8::FunctionTemplate::New( |
346 isolate, | 470 isolate, |
347 &internal::Dispatcher<Sig>::DispatchToCallback, | 471 &internal::Dispatcher<Sig>::DispatchToCallback, |
348 ConvertToV8<internal::CallbackHolderBase*>(isolate, holder.get())); | 472 ConvertToV8<internal::CallbackHolderBase*>(isolate, holder.get())); |
349 } | 473 } |
350 | 474 |
351 } // namespace gin | 475 } // namespace gin |
352 | 476 |
353 #endif // GIN_FUNCTION_TEMPLATE_H_ | 477 #endif // GIN_FUNCTION_TEMPLATE_H_ |
OLD | NEW |