1/*
2 * Copyright (C) 2009-2010 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef CrossThreadTask_h
32#define CrossThreadTask_h
33
34#include "CrossThreadCopier.h"
35#include "ScriptExecutionContext.h"
36#include <memory>
37#include <wtf/PassOwnPtr.h>
38#include <wtf/PassRefPtr.h>
39#include <wtf/TypeTraits.h>
40
41namespace WebCore {
42
43// Traits for the CrossThreadTask.
44template<typename T> struct CrossThreadTaskTraits {
45    typedef const T& ParamType;
46};
47
48template<typename T> struct CrossThreadTaskTraits<T*> {
49    typedef T* ParamType;
50};
51
52template<typename T> struct CrossThreadTaskTraits<PassRefPtr<T> > {
53    typedef PassRefPtr<T> ParamType;
54};
55
56template<typename T> struct CrossThreadTaskTraits<PassOwnPtr<T> > {
57    typedef PassOwnPtr<T> ParamType;
58};
59
60template<typename P1, typename MP1>
61class CrossThreadTask1 : public ScriptExecutionContext::Task {
62public:
63    typedef void (*Method)(ScriptExecutionContext*, MP1);
64    typedef CrossThreadTask1<P1, MP1> CrossThreadTask;
65    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
66
67    static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1)
68    {
69        return new CrossThreadTask(method, parameter1);
70    }
71
72private:
73    CrossThreadTask1(Method method, Param1 parameter1)
74        : m_method(method)
75        , m_parameter1(parameter1)
76    {
77    }
78
79    virtual void performTask(ScriptExecutionContext* context)
80    {
81        (*m_method)(context, m_parameter1);
82    }
83
84private:
85    Method m_method;
86    P1 m_parameter1;
87};
88
89template<typename P1, typename MP1, typename P2, typename MP2>
90class CrossThreadTask2 : public ScriptExecutionContext::Task {
91public:
92    typedef void (*Method)(ScriptExecutionContext*, MP1, MP2);
93    typedef CrossThreadTask2<P1, MP1, P2, MP2> CrossThreadTask;
94    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
95    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
96
97    static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1, Param2 parameter2)
98    {
99        return new CrossThreadTask(method, parameter1, parameter2);
100    }
101
102private:
103    CrossThreadTask2(Method method, Param1 parameter1, Param2 parameter2)
104        : m_method(method)
105        , m_parameter1(parameter1)
106        , m_parameter2(parameter2)
107    {
108    }
109
110    virtual void performTask(ScriptExecutionContext* context)
111    {
112        (*m_method)(context, m_parameter1, m_parameter2);
113    }
114
115private:
116    Method m_method;
117    P1 m_parameter1;
118    P2 m_parameter2;
119};
120
121template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
122class CrossThreadTask3 : public ScriptExecutionContext::Task {
123public:
124    typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3);
125    typedef CrossThreadTask3<P1, MP1, P2, MP2, P3, MP3> CrossThreadTask;
126    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
127    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
128    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
129
130    static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)
131    {
132        return new CrossThreadTask(method, parameter1, parameter2, parameter3);
133    }
134
135private:
136    CrossThreadTask3(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)
137        : m_method(method)
138        , m_parameter1(parameter1)
139        , m_parameter2(parameter2)
140        , m_parameter3(parameter3)
141    {
142    }
143
144    virtual void performTask(ScriptExecutionContext* context)
145    {
146        (*m_method)(context, m_parameter1, m_parameter2, m_parameter3);
147    }
148
149private:
150    Method m_method;
151    P1 m_parameter1;
152    P2 m_parameter2;
153    P3 m_parameter3;
154};
155
156template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4>
157class CrossThreadTask4 : public ScriptExecutionContext::Task {
158public:
159    typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4);
160    typedef CrossThreadTask4<P1, MP1, P2, MP2, P3, MP3, P4, MP4> CrossThreadTask;
161    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
162    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
163    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
164    typedef typename CrossThreadTaskTraits<P4>::ParamType Param4;
165
166    static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4)
167    {
168        return new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4);
169    }
170
171private:
172    CrossThreadTask4(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4)
173        : m_method(method)
174        , m_parameter1(parameter1)
175        , m_parameter2(parameter2)
176        , m_parameter3(parameter3)
177        , m_parameter4(parameter4)
178    {
179    }
180
181    virtual void performTask(ScriptExecutionContext* context)
182    {
183        (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4);
184    }
185
186private:
187    Method m_method;
188    P1 m_parameter1;
189    P2 m_parameter2;
190    P3 m_parameter3;
191    P4 m_parameter4;
192};
193
194template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5>
195class CrossThreadTask5 : public ScriptExecutionContext::Task {
196public:
197    typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5);
198    typedef CrossThreadTask5<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5> CrossThreadTask;
199    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
200    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
201    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
202    typedef typename CrossThreadTaskTraits<P4>::ParamType Param4;
203    typedef typename CrossThreadTaskTraits<P5>::ParamType Param5;
204
205    static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5)
206    {
207        return new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4, parameter5);
208    }
209
210private:
211    CrossThreadTask5(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5)
212        : m_method(method)
213        , m_parameter1(parameter1)
214        , m_parameter2(parameter2)
215        , m_parameter3(parameter3)
216        , m_parameter4(parameter4)
217        , m_parameter5(parameter5)
218    {
219    }
220
221    virtual void performTask(ScriptExecutionContext* context)
222    {
223        (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5);
224    }
225
226private:
227    Method m_method;
228    P1 m_parameter1;
229    P2 m_parameter2;
230    P3 m_parameter3;
231    P4 m_parameter4;
232    P5 m_parameter5;
233};
234
235template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6>
236class CrossThreadTask6 : public ScriptExecutionContext::Task {
237public:
238    typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6);
239    typedef CrossThreadTask6<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6> CrossThreadTask;
240    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
241    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
242    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
243    typedef typename CrossThreadTaskTraits<P4>::ParamType Param4;
244    typedef typename CrossThreadTaskTraits<P5>::ParamType Param5;
245    typedef typename CrossThreadTaskTraits<P6>::ParamType Param6;
246
247    static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6)
248    {
249        return new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6);
250    }
251
252private:
253    CrossThreadTask6(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6)
254        : m_method(method)
255        , m_parameter1(parameter1)
256        , m_parameter2(parameter2)
257        , m_parameter3(parameter3)
258        , m_parameter4(parameter4)
259        , m_parameter5(parameter5)
260        , m_parameter6(parameter6)
261    {
262    }
263
264    virtual void performTask(ScriptExecutionContext* context)
265    {
266        (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6);
267    }
268
269private:
270    Method m_method;
271    P1 m_parameter1;
272    P2 m_parameter2;
273    P3 m_parameter3;
274    P4 m_parameter4;
275    P5 m_parameter5;
276    P6 m_parameter6;
277};
278
279template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7>
280class CrossThreadTask7 : public ScriptExecutionContext::Task {
281public:
282    typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7);
283    typedef CrossThreadTask7<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6, P7, MP7> CrossThreadTask;
284    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
285    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
286    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
287    typedef typename CrossThreadTaskTraits<P4>::ParamType Param4;
288    typedef typename CrossThreadTaskTraits<P5>::ParamType Param5;
289    typedef typename CrossThreadTaskTraits<P6>::ParamType Param6;
290    typedef typename CrossThreadTaskTraits<P7>::ParamType Param7;
291
292    static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7)
293    {
294        return new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7);
295    }
296
297private:
298    CrossThreadTask7(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7)
299        : m_method(method)
300        , m_parameter1(parameter1)
301        , m_parameter2(parameter2)
302        , m_parameter3(parameter3)
303        , m_parameter4(parameter4)
304        , m_parameter5(parameter5)
305        , m_parameter6(parameter6)
306        , m_parameter7(parameter7)
307    {
308    }
309
310    virtual void performTask(ScriptExecutionContext* context)
311    {
312        (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6, m_parameter7);
313    }
314
315private:
316    Method m_method;
317    P1 m_parameter1;
318    P2 m_parameter2;
319    P3 m_parameter3;
320    P4 m_parameter4;
321    P5 m_parameter5;
322    P6 m_parameter6;
323    P7 m_parameter7;
324};
325
326template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8>
327class CrossThreadTask8 : public ScriptExecutionContext::Task {
328public:
329    typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8);
330    typedef CrossThreadTask8<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6, P7, MP7, P8, MP8> CrossThreadTask;
331    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
332    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
333    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
334    typedef typename CrossThreadTaskTraits<P4>::ParamType Param4;
335    typedef typename CrossThreadTaskTraits<P5>::ParamType Param5;
336    typedef typename CrossThreadTaskTraits<P6>::ParamType Param6;
337    typedef typename CrossThreadTaskTraits<P7>::ParamType Param7;
338    typedef typename CrossThreadTaskTraits<P8>::ParamType Param8;
339
340    static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7, Param8 parameter8)
341    {
342        return new CrossThreadTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8);
343    }
344
345private:
346    CrossThreadTask8(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7, Param8 parameter8)
347    : m_method(method)
348    , m_parameter1(parameter1)
349    , m_parameter2(parameter2)
350    , m_parameter3(parameter3)
351    , m_parameter4(parameter4)
352    , m_parameter5(parameter5)
353    , m_parameter6(parameter6)
354    , m_parameter7(parameter7)
355    , m_parameter8(parameter8)
356    {
357    }
358
359    virtual void performTask(ScriptExecutionContext* context)
360    {
361        (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6, m_parameter7, m_parameter8);
362    }
363
364private:
365    Method m_method;
366    P1 m_parameter1;
367    P2 m_parameter2;
368    P3 m_parameter3;
369    P4 m_parameter4;
370    P5 m_parameter5;
371    P6 m_parameter6;
372    P7 m_parameter7;
373    P8 m_parameter8;
374};
375
376template<typename P1, typename MP1>
377PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask(
378    void (*method)(ScriptExecutionContext*, MP1),
379    const P1& parameter1)
380{
381    return CrossThreadTask1<typename CrossThreadCopier<P1>::Type, MP1>::create(
382        method,
383        CrossThreadCopier<P1>::copy(parameter1));
384}
385
386template<typename P1, typename MP1, typename P2, typename MP2>
387PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask(
388    void (*method)(ScriptExecutionContext*, MP1, MP2),
389    const P1& parameter1, const P2& parameter2)
390{
391    return CrossThreadTask2<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2>::create(
392        method,
393        CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2));
394}
395
396template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
397PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask(
398    void (*method)(ScriptExecutionContext*, MP1, MP2, MP3),
399    const P1& parameter1, const P2& parameter2, const P3& parameter3)
400{
401    return CrossThreadTask3<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3>::create(
402        method,
403        CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2),
404        CrossThreadCopier<P3>::copy(parameter3));
405}
406
407template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4>
408PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask(
409    void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4),
410    const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4)
411{
412    return CrossThreadTask4<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3,
413        typename CrossThreadCopier<P4>::Type, MP4>::create(
414            method,
415            CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2),
416            CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4));
417}
418
419template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5>
420PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask(
421    void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5),
422    const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4, const P5& parameter5)
423{
424    return CrossThreadTask5<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3,
425        typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::Type, MP5>::create(
426            method,
427            CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2),
428            CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4),
429            CrossThreadCopier<P5>::copy(parameter5));
430}
431
432template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6>
433PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask(
434    void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6),
435    const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4, const P5& parameter5, const P6& parameter6)
436{
437    return CrossThreadTask6<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3,
438        typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::Type, MP5, typename CrossThreadCopier<P6>::Type, MP6>::create(
439            method,
440            CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2),
441            CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4),
442            CrossThreadCopier<P5>::copy(parameter5), CrossThreadCopier<P6>::copy(parameter6));
443}
444
445template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7>
446PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask(
447    void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7),
448    const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4, const P5& parameter5, const P6& parameter6, const P7& parameter7)
449{
450    return CrossThreadTask7<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3,
451        typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::Type, MP5, typename CrossThreadCopier<P6>::Type, MP6,
452        typename CrossThreadCopier<P7>::Type, MP7>::create(
453            method,
454            CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2),
455            CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4),
456            CrossThreadCopier<P5>::copy(parameter5), CrossThreadCopier<P6>::copy(parameter6),
457            CrossThreadCopier<P7>::copy(parameter7));
458}
459
460template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8>
461PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask(
462                                                            void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8),
463                                                            const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4, const P5& parameter5, const P6& parameter6, const P7& parameter7, const P8& parameter8)
464{
465    return CrossThreadTask8<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3,
466    typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::Type, MP5, typename CrossThreadCopier<P6>::Type, MP6,
467    typename CrossThreadCopier<P7>::Type, MP7, typename CrossThreadCopier<P8>::Type, MP8>::create(
468                                                       method,
469                                                       CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2),
470                                                       CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4),
471                                                       CrossThreadCopier<P5>::copy(parameter5), CrossThreadCopier<P6>::copy(parameter6),
472                                                       CrossThreadCopier<P7>::copy(parameter7), CrossThreadCopier<P8>::copy(parameter8));
473}
474
475} // namespace WebCore
476
477#endif // CrossThreadTask_h
478