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

Side by Side Diff: gin/function_template.h

Issue 114883003: Implement more of the JavaScript GL API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: asdf Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « gin/converter.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 // 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
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
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_
OLDNEW
« no previous file with comments | « gin/converter.cc ('k') | gin/function_template.h.pump » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698