Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: gin/function_template.h

Issue 654653005: Rewrite gin/function_template.h to use C++11 variadic templates. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Re-add assignment operator. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gin/array_buffer.cc ('k') | gin/function_template.h.pump » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // This file was GENERATED by command: 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // pump.py function_template.h.pump 2 // Use of this source code is governed by a BSD-style license that can be
3 // DO NOT EDIT BY HAND!!! 3 // found in the LICENSE file.
4 4
5
6
7 #ifndef GIN_FUNCTION_TEMPLATE_H_ 5 #ifndef GIN_FUNCTION_TEMPLATE_H_
8 #define GIN_FUNCTION_TEMPLATE_H_ 6 #define GIN_FUNCTION_TEMPLATE_H_
9 7
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
12 // found in the LICENSE file.
13
14 #include "base/callback.h" 8 #include "base/callback.h"
15 #include "base/logging.h" 9 #include "base/logging.h"
16 #include "gin/arguments.h" 10 #include "gin/arguments.h"
17 #include "gin/converter.h" 11 #include "gin/converter.h"
18 #include "gin/gin_export.h" 12 #include "gin/gin_export.h"
19 #include "v8/include/v8.h" 13 #include "v8/include/v8.h"
20 14
21 namespace gin { 15 namespace gin {
22 16
23 class PerIsolateData; 17 class PerIsolateData;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 : CallbackHolderBase(isolate), callback(callback), flags(flags) {} 68 : CallbackHolderBase(isolate), callback(callback), flags(flags) {}
75 base::Callback<Sig> callback; 69 base::Callback<Sig> callback;
76 int flags; 70 int flags;
77 private: 71 private:
78 virtual ~CallbackHolder() {} 72 virtual ~CallbackHolder() {}
79 73
80 DISALLOW_COPY_AND_ASSIGN(CallbackHolder); 74 DISALLOW_COPY_AND_ASSIGN(CallbackHolder);
81 }; 75 };
82 76
83 77
84 // This set of templates invokes a base::Callback, converts the return type to a 78 // This template struct invokes a base::Callback, converts the return type to a
85 // JavaScript value, and returns that value to script via the provided 79 // JavaScript value, and returns that value to script via the provided
86 // gin::Arguments object. 80 // gin::Arguments object.
87 // 81 template <typename R, typename... A>
82 struct Invoker {
83 inline static void Go(
84 Arguments* args,
85 const base::Callback<R(A...)>& callback,
86 const A&... a) {
87 args->Return(callback.Run(a...));
88 }
89 };
90
88 // In C++, you can declare the function foo(void), but you can't pass a void 91 // In C++, you can declare the function foo(void), but you can't pass a void
89 // expression to foo. As a result, we must specialize the case of Callbacks that 92 // expression to foo. As a result, we must specialize the case of Callbacks that
90 // have the void return type. 93 // have the void return type.
91 template<typename R, typename P1 = void, typename P2 = void, 94 template <typename... A>
92 typename P3 = void, typename P4 = void, typename P5 = void, 95 struct Invoker<void, A...> {
93 typename P6 = void>
94 struct Invoker {
95 inline static void Go( 96 inline static void Go(
96 Arguments* args, 97 Arguments* args,
97 const base::Callback<R(P1, P2, P3, P4, P5, P6)>& callback, 98 const base::Callback<void(A...)>& callback,
98 const P1& a1, 99 const A&... a) {
99 const P2& a2, 100 callback.Run(a...);
100 const P3& a3,
101 const P4& a4,
102 const P5& a5,
103 const P6& a6) {
104 args->Return(callback.Run(a1, a2, a3, a4, a5, a6));
105 } 101 }
106 }; 102 };
107 template<typename P1, typename P2, typename P3, typename P4, typename P5,
108 typename P6>
109 struct Invoker<void, P1, P2, P3, P4, P5, P6> {
110 inline static void Go(
111 Arguments* args,
112 const base::Callback<void(P1, P2, P3, P4, P5, P6)>& callback,
113 const P1& a1,
114 const P2& a2,
115 const P3& a3,
116 const P4& a4,
117 const P5& a5,
118 const P6& a6) {
119 callback.Run(a1, a2, a3, a4, a5, a6);
120 }
121 };
122
123 template<typename R, typename P1, typename P2, typename P3, typename P4,
124 typename P5>
125 struct Invoker<R, P1, P2, P3, P4, P5, void> {
126 inline static void Go(
127 Arguments* args,
128 const base::Callback<R(P1, P2, P3, P4, P5)>& callback,
129 const P1& a1,
130 const P2& a2,
131 const P3& a3,
132 const P4& a4,
133 const P5& a5) {
134 args->Return(callback.Run(a1, a2, a3, a4, a5));
135 }
136 };
137 template<typename P1, typename P2, typename P3, typename P4, typename P5>
138 struct Invoker<void, P1, P2, P3, P4, P5, void> {
139 inline static void Go(
140 Arguments* args,
141 const base::Callback<void(P1, P2, P3, P4, P5)>& callback,
142 const P1& a1,
143 const P2& a2,
144 const P3& a3,
145 const P4& a4,
146 const P5& a5) {
147 callback.Run(a1, a2, a3, a4, a5);
148 }
149 };
150
151 template<typename R, typename P1, typename P2, typename P3, typename P4>
152 struct Invoker<R, P1, P2, P3, P4, void, void> {
153 inline static void Go(
154 Arguments* args,
155 const base::Callback<R(P1, P2, P3, P4)>& callback,
156 const P1& a1,
157 const P2& a2,
158 const P3& a3,
159 const P4& a4) {
160 args->Return(callback.Run(a1, a2, a3, a4));
161 }
162 };
163 template<typename P1, typename P2, typename P3, typename P4>
164 struct Invoker<void, P1, P2, P3, P4, void, void> {
165 inline static void Go(
166 Arguments* args,
167 const base::Callback<void(P1, P2, P3, P4)>& callback,
168 const P1& a1,
169 const P2& a2,
170 const P3& a3,
171 const P4& a4) {
172 callback.Run(a1, a2, a3, a4);
173 }
174 };
175
176 template<typename R, typename P1, typename P2, typename P3>
177 struct Invoker<R, P1, P2, P3, void, void, void> {
178 inline static void Go(
179 Arguments* args,
180 const base::Callback<R(P1, P2, P3)>& callback,
181 const P1& a1,
182 const P2& a2,
183 const P3& a3) {
184 args->Return(callback.Run(a1, a2, a3));
185 }
186 };
187 template<typename P1, typename P2, typename P3>
188 struct Invoker<void, P1, P2, P3, void, void, void> {
189 inline static void Go(
190 Arguments* args,
191 const base::Callback<void(P1, P2, P3)>& callback,
192 const P1& a1,
193 const P2& a2,
194 const P3& a3) {
195 callback.Run(a1, a2, a3);
196 }
197 };
198
199 template<typename R, typename P1, typename P2>
200 struct Invoker<R, P1, P2, void, void, void, void> {
201 inline static void Go(
202 Arguments* args,
203 const base::Callback<R(P1, P2)>& callback,
204 const P1& a1,
205 const P2& a2) {
206 args->Return(callback.Run(a1, a2));
207 }
208 };
209 template<typename P1, typename P2>
210 struct Invoker<void, P1, P2, void, void, void, void> {
211 inline static void Go(
212 Arguments* args,
213 const base::Callback<void(P1, P2)>& callback,
214 const P1& a1,
215 const P2& a2) {
216 callback.Run(a1, a2);
217 }
218 };
219
220 template<typename R, typename P1>
221 struct Invoker<R, P1, void, void, void, void, void> {
222 inline static void Go(
223 Arguments* args,
224 const base::Callback<R(P1)>& callback,
225 const P1& a1) {
226 args->Return(callback.Run(a1));
227 }
228 };
229 template<typename P1>
230 struct Invoker<void, P1, void, void, void, void, void> {
231 inline static void Go(
232 Arguments* args,
233 const base::Callback<void(P1)>& callback,
234 const P1& a1) {
235 callback.Run(a1);
236 }
237 };
238
239 template<typename R>
240 struct Invoker<R, void, void, void, void, void, void> {
241 inline static void Go(
242 Arguments* args,
243 const base::Callback<R()>& callback) {
244 args->Return(callback.Run());
245 }
246 };
247 template<>
248 struct Invoker<void, void, void, void, void, void, void> {
249 inline static void Go(
250 Arguments* args,
251 const base::Callback<void()>& callback) {
252 callback.Run();
253 }
254 };
255
256 103
257 template<typename T> 104 template<typename T>
258 bool GetNextArgument(Arguments* args, int create_flags, bool is_first, 105 bool GetNextArgument(Arguments* args, int create_flags, bool is_first,
259 T* result) { 106 T* result) {
260 if (is_first && (create_flags & HolderIsFirstArgument) != 0) { 107 if (is_first && (create_flags & HolderIsFirstArgument) != 0) {
261 return args->GetHolder(result); 108 return args->GetHolder(result);
262 } else { 109 } else {
263 return args->GetNext(result); 110 return args->GetNext(result);
264 } 111 }
265 } 112 }
(...skipping 18 matching lines...) Expand all
284 return true; 131 return true;
285 } 132 }
286 133
287 134
288 // DispatchToCallback converts all the JavaScript arguments to C++ types and 135 // DispatchToCallback converts all the JavaScript arguments to C++ types and
289 // invokes the base::Callback. 136 // invokes the base::Callback.
290 template<typename Sig> 137 template<typename Sig>
291 struct Dispatcher { 138 struct Dispatcher {
292 }; 139 };
293 140
294 template<typename R> 141 template <typename R, typename... A>
295 struct Dispatcher<R()> { 142 class Dispatcher<R(A...)> {
143 public:
144 template <typename T>
145 struct TypeTag {};
146
296 static void DispatchToCallback( 147 static void DispatchToCallback(
297 const v8::FunctionCallbackInfo<v8::Value>& info) { 148 const v8::FunctionCallbackInfo<v8::Value>& info) {
298 Arguments args(info); 149 Arguments args(info);
299 v8::Handle<v8::External> v8_holder;
300 CHECK(args.GetData(&v8_holder));
301 CallbackHolderBase* holder_base = reinterpret_cast<CallbackHolderBase*>(
302 v8_holder->Value());
303
304 typedef CallbackHolder<R()> HolderT;
305 HolderT* holder = static_cast<HolderT*>(holder_base);
306
307 Invoker<R>::Go(&args, holder->callback);
308 }
309 };
310
311 template<typename R, typename P1>
312 struct Dispatcher<R(P1)> {
313 static void DispatchToCallback(
314 const v8::FunctionCallbackInfo<v8::Value>& info) {
315 Arguments args(info);
316 v8::Handle<v8::External> v8_holder;
317 CHECK(args.GetData(&v8_holder));
318 CallbackHolderBase* holder_base = reinterpret_cast<CallbackHolderBase*>(
319 v8_holder->Value());
320
321 typedef CallbackHolder<R(P1)> HolderT;
322 HolderT* holder = static_cast<HolderT*>(holder_base);
323
324 typename CallbackParamTraits<P1>::LocalType a1;
325 if (!GetNextArgument(&args, holder->flags, true, &a1)) {
326 args.ThrowError();
327 return;
328 }
329
330 Invoker<R, P1>::Go(&args, holder->callback, a1);
331 }
332 };
333
334 template<typename R, typename P1, typename P2>
335 struct Dispatcher<R(P1, P2)> {
336 static void DispatchToCallback(
337 const v8::FunctionCallbackInfo<v8::Value>& info) {
338 Arguments args(info);
339 v8::Handle<v8::External> v8_holder;
340 CHECK(args.GetData(&v8_holder));
341 CallbackHolderBase* holder_base = reinterpret_cast<CallbackHolderBase*>(
342 v8_holder->Value());
343
344 typedef CallbackHolder<R(P1, P2)> HolderT;
345 HolderT* holder = static_cast<HolderT*>(holder_base);
346
347 typename CallbackParamTraits<P1>::LocalType a1;
348 typename CallbackParamTraits<P2>::LocalType a2;
349 if (!GetNextArgument(&args, holder->flags, true, &a1) ||
350 !GetNextArgument(&args, holder->flags, false, &a2)) {
351 args.ThrowError();
352 return;
353 }
354
355 Invoker<R, P1, P2>::Go(&args, holder->callback, a1, a2);
356 }
357 };
358
359 template<typename R, typename P1, typename P2, typename P3>
360 struct Dispatcher<R(P1, P2, P3)> {
361 static void DispatchToCallback(
362 const v8::FunctionCallbackInfo<v8::Value>& info) {
363 Arguments args(info);
364 v8::Handle<v8::External> v8_holder;
365 CHECK(args.GetData(&v8_holder));
366 CallbackHolderBase* holder_base = reinterpret_cast<CallbackHolderBase*>(
367 v8_holder->Value());
368
369 typedef CallbackHolder<R(P1, P2, P3)> HolderT;
370 HolderT* holder = static_cast<HolderT*>(holder_base);
371
372 typename CallbackParamTraits<P1>::LocalType a1;
373 typename CallbackParamTraits<P2>::LocalType a2;
374 typename CallbackParamTraits<P3>::LocalType a3;
375 if (!GetNextArgument(&args, holder->flags, true, &a1) ||
376 !GetNextArgument(&args, holder->flags, false, &a2) ||
377 !GetNextArgument(&args, holder->flags, false, &a3)) {
378 args.ThrowError();
379 return;
380 }
381
382 Invoker<R, P1, P2, P3>::Go(&args, holder->callback, a1, a2, a3);
383 }
384 };
385
386 template<typename R, typename P1, typename P2, typename P3, typename P4>
387 struct Dispatcher<R(P1, P2, P3, P4)> {
388 static void DispatchToCallback(
389 const v8::FunctionCallbackInfo<v8::Value>& info) {
390 Arguments args(info);
391 v8::Handle<v8::External> v8_holder;
392 CHECK(args.GetData(&v8_holder));
393 CallbackHolderBase* holder_base = reinterpret_cast<CallbackHolderBase*>(
394 v8_holder->Value());
395
396 typedef CallbackHolder<R(P1, P2, P3, P4)> HolderT;
397 HolderT* holder = static_cast<HolderT*>(holder_base);
398
399 typename CallbackParamTraits<P1>::LocalType a1;
400 typename CallbackParamTraits<P2>::LocalType a2;
401 typename CallbackParamTraits<P3>::LocalType a3;
402 typename CallbackParamTraits<P4>::LocalType a4;
403 if (!GetNextArgument(&args, holder->flags, true, &a1) ||
404 !GetNextArgument(&args, holder->flags, false, &a2) ||
405 !GetNextArgument(&args, holder->flags, false, &a3) ||
406 !GetNextArgument(&args, holder->flags, false, &a4)) {
407 args.ThrowError();
408 return;
409 }
410
411 Invoker<R, P1, P2, P3, P4>::Go(&args, holder->callback, a1, a2, a3, a4);
412 }
413 };
414
415 template<typename R, typename P1, typename P2, typename P3, typename P4,
416 typename P5>
417 struct Dispatcher<R(P1, P2, P3, P4, P5)> {
418 static void DispatchToCallback(
419 const v8::FunctionCallbackInfo<v8::Value>& info) {
420 Arguments args(info);
421 v8::Handle<v8::External> v8_holder; 150 v8::Handle<v8::External> v8_holder;
422 CHECK(args.GetData(&v8_holder)); 151 CHECK(args.GetData(&v8_holder));
423 CallbackHolderBase* holder_base = reinterpret_cast<CallbackHolderBase*>( 152 CallbackHolderBase* holder_base = reinterpret_cast<CallbackHolderBase*>(
424 v8_holder->Value()); 153 v8_holder->Value());
425 154
426 typedef CallbackHolder<R(P1, P2, P3, P4, P5)> HolderT; 155 typedef CallbackHolder<R(A...)> HolderT;
427 HolderT* holder = static_cast<HolderT*>(holder_base); 156 HolderT* holder = static_cast<HolderT*>(holder_base);
157 bool all_arguments_ok = true;
158 bool is_first_argument = true;
159 InvokeCallback{
160 &all_arguments_ok, &args, holder->callback,
161 PassNextArgument(
162 &all_arguments_ok, &is_first_argument,
163 &args, holder->flags,
164 TypeTag<typename CallbackParamTraits<A>::LocalType>())...};
165 }
428 166
429 typename CallbackParamTraits<P1>::LocalType a1; 167 private:
430 typename CallbackParamTraits<P2>::LocalType a2; 168 template <typename T>
431 typename CallbackParamTraits<P3>::LocalType a3; 169 static T PassNextArgument(bool* all_arguments_ok, bool* is_first,
432 typename CallbackParamTraits<P4>::LocalType a4; 170 Arguments* args, int create_flags, TypeTag<T>) {
433 typename CallbackParamTraits<P5>::LocalType a5; 171 // Short-circuit if getting some previous argument has already failed:
434 if (!GetNextArgument(&args, holder->flags, true, &a1) || 172 if (!*all_arguments_ok)
435 !GetNextArgument(&args, holder->flags, false, &a2) || 173 return T();
436 !GetNextArgument(&args, holder->flags, false, &a3) || 174
437 !GetNextArgument(&args, holder->flags, false, &a4) || 175 T value = T();
438 !GetNextArgument(&args, holder->flags, false, &a5)) { 176 *all_arguments_ok = GetNextArgument(args, create_flags, *is_first, &value);
439 args.ThrowError(); 177 *is_first = false;
440 return; 178 return value;
179 }
180
181 struct InvokeCallback {
182 InvokeCallback(bool* all_arguments_ok, Arguments* args,
183 const base::Callback<R(A...)>& callback,
184 const A&... actual_args) {
185 if (!*all_arguments_ok) {;
186 args->ThrowError();
187 return;
188 }
189
190 Invoker<R, A...>::Go(args, callback, actual_args...);
441 } 191 }
442 192 };
443 Invoker<R, P1, P2, P3, P4, P5>::Go(&args, holder->callback, a1, a2, a3, a4,
444 a5);
445 }
446 };
447
448 template<typename R, typename P1, typename P2, typename P3, typename P4,
449 typename P5, typename P6>
450 struct Dispatcher<R(P1, P2, P3, P4, P5, P6)> {
451 static void DispatchToCallback(
452 const v8::FunctionCallbackInfo<v8::Value>& info) {
453 Arguments args(info);
454 v8::Handle<v8::External> v8_holder;
455 CHECK(args.GetData(&v8_holder));
456 CallbackHolderBase* holder_base = reinterpret_cast<CallbackHolderBase*>(
457 v8_holder->Value());
458
459 typedef CallbackHolder<R(P1, P2, P3, P4, P5, P6)> HolderT;
460 HolderT* holder = static_cast<HolderT*>(holder_base);
461
462 typename CallbackParamTraits<P1>::LocalType a1;
463 typename CallbackParamTraits<P2>::LocalType a2;
464 typename CallbackParamTraits<P3>::LocalType a3;
465 typename CallbackParamTraits<P4>::LocalType a4;
466 typename CallbackParamTraits<P5>::LocalType a5;
467 typename CallbackParamTraits<P6>::LocalType a6;
468 if (!GetNextArgument(&args, holder->flags, true, &a1) ||
469 !GetNextArgument(&args, holder->flags, false, &a2) ||
470 !GetNextArgument(&args, holder->flags, false, &a3) ||
471 !GetNextArgument(&args, holder->flags, false, &a4) ||
472 !GetNextArgument(&args, holder->flags, false, &a5) ||
473 !GetNextArgument(&args, holder->flags, false, &a6)) {
474 args.ThrowError();
475 return;
476 }
477
478 Invoker<R, P1, P2, P3, P4, P5, P6>::Go(&args, holder->callback, a1, a2, a3,
479 a4, a5, a6);
480 }
481 }; 193 };
482 194
483 } // namespace internal 195 } // namespace internal
484 196
485 197
486 // CreateFunctionTemplate creates a v8::FunctionTemplate that will create 198 // CreateFunctionTemplate creates a v8::FunctionTemplate that will create
487 // JavaScript functions that execute a provided C++ function or base::Callback. 199 // JavaScript functions that execute a provided C++ function or base::Callback.
488 // JavaScript arguments are automatically converted via gin::Converter, as is 200 // JavaScript arguments are automatically converted via gin::Converter, as is
489 // the return value of the C++ function, if any. 201 // the return value of the C++ function, if any.
490 template<typename Sig> 202 template<typename Sig>
(...skipping 20 matching lines...) Expand all
511 typedef internal::CallbackHolder<Sig> HolderT; 223 typedef internal::CallbackHolder<Sig> HolderT;
512 HolderT* holder = new HolderT(isolate, callback, callback_flags); 224 HolderT* holder = new HolderT(isolate, callback, callback_flags);
513 tmpl->SetCallAsFunctionHandler(&internal::Dispatcher<Sig>::DispatchToCallback, 225 tmpl->SetCallAsFunctionHandler(&internal::Dispatcher<Sig>::DispatchToCallback,
514 ConvertToV8<v8::Handle<v8::External> >( 226 ConvertToV8<v8::Handle<v8::External> >(
515 isolate, holder->GetHandle(isolate))); 227 isolate, holder->GetHandle(isolate)));
516 } 228 }
517 229
518 } // namespace gin 230 } // namespace gin
519 231
520 #endif // GIN_FUNCTION_TEMPLATE_H_ 232 #endif // GIN_FUNCTION_TEMPLATE_H_
OLDNEW
« no previous file with comments | « gin/array_buffer.cc ('k') | gin/function_template.h.pump » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698