00001
00002
00003 #include "cppscript"
00004 #include "dynamic/extensions.hpp"
00005 #include "tls.hpp"
00006
00007 using internal::nonroot_var;
00008
00009 static_call( register_pickle_type( cmp_varargs, varargs(null) ) );
00010
00011
00012 namespace dynamic
00013 {
00014 namespace types
00015 {
00016
00018
00019 template<typename Derived, var_cmp_index CmpIndex>
00020 class generic_function_impl : public var_impl
00021 {
00022 public:
00023
00024 void output(ostream & os)
00025 {
00026 os << "<<function>>";
00027 }
00028
00029 void output(wostream & ss)
00030 {
00031 ss << L"<<function>>";
00032 }
00033
00034 std::string class_name() { return "function"; }
00035
00036 var_cmp_result compare2(const var & other)
00037 {
00038 void * p1 = as_ptr(), *p2 = other.impl().as_ptr();
00039 if(p1<p2) return cmp_lt;
00040 if(p1>p2) return cmp_gt;
00041 return cmp_equal;
00042 }
00043
00044 void copy_to(void * dest) const
00045 {
00046 new(dest) Derived( *static_cast<const Derived*>(this) );
00047 }
00048
00049 var_cmp_index comparison_index() { return CmpIndex; }
00050
00051 void pickle(pickler & p)
00052 {
00053 p.write_object_type(CmpIndex);
00054 p.write_string( internal::lookup_function( as_ptr() ) );
00055 }
00056 };
00057
00058
00060
00062 template<typename Fn>
00063 class function_impl;
00064
00066
00067 template<> class function_impl<f0> :
00068 public generic_function_impl<function_impl<f0>, cmp_function_0 >
00069 {
00070 f0 m_fn;
00071 public:
00072 function_impl(f0 f) : m_fn(f) { }
00073 var call() { return m_fn(); }
00074 int max_args() { return 0; }
00075 void * as_ptr() { return (void*)m_fn; }
00076 };
00077
00078
00080
00081 template<> class function_impl<vf0> :
00082 public generic_function_impl<function_impl<vf0>, cmp_function_v0 >
00083 {
00084 vf0 m_fn;
00085 public:
00086 function_impl(vf0 f) : m_fn(f) { }
00087 var call() { m_fn(); return var(); }
00088 int max_args() { return 0; }
00089 void * as_ptr() { return (void*)m_fn; }
00090 };
00091
00092
00094
00095 template<> class function_impl<f1> :
00096 public generic_function_impl<function_impl<f1>, cmp_function_1 >
00097 {
00098 f1 m_fn;
00099 public:
00100 function_impl(f1 f) : m_fn(f) { }
00101 var call(const var & a0) { return m_fn(a0); }
00102 int max_args() { return 1; }
00103 void * as_ptr() { return (void*)m_fn; }
00104 };
00105
00106
00108
00109 template<> class function_impl<vf1> :
00110 public generic_function_impl<function_impl<vf1>, cmp_function_v1 >
00111 {
00112 vf1 m_fn;
00113 public:
00114 function_impl(vf1 f) : m_fn(f) { }
00115 var call(const var & a0) { m_fn(a0); return var(); }
00116 int max_args() { return 1; }
00117 void * as_ptr() { return (void*)m_fn; }
00118 };
00119
00120
00122
00123 template<> class function_impl<f2> :
00124 public generic_function_impl<function_impl<f2>, cmp_function_2 >
00125 {
00126 f2 m_fn;
00127 public:
00128 function_impl(f2 f) : m_fn(f) { }
00129 var call(const var & a0, const var & a1) { return m_fn(a0,a1); }
00130 int max_args() { return 2; }
00131 void * as_ptr() { return (void*)m_fn; }
00132 };
00133
00134
00136
00137 template<> class function_impl<vf2> :
00138 public generic_function_impl<function_impl<vf2>, cmp_function_v2 >
00139 {
00140 vf2 m_fn;
00141 public:
00142 function_impl(vf2 f) : m_fn(f) { }
00143 var call(const var & a0, const var & a1) { m_fn(a0,a1); return var(); }
00144 int max_args() { return 2; }
00145 void * as_ptr() { return (void*)m_fn; }
00146 };
00147
00148
00150
00151 template<> class function_impl<f3> :
00152 public generic_function_impl<function_impl<f3>, cmp_function_3 >
00153 {
00154 f3 m_fn;
00155 public:
00156 function_impl(f3 f) : m_fn(f) { }
00157 var call(const var & a0, const var & a1, const var & a2) { return m_fn(a0,a1,a2); }
00158 int max_args() { return 3; }
00159 void * as_ptr() { return (void*)m_fn; }
00160 };
00161
00162
00164
00165 template<> class function_impl<vf3> :
00166 public generic_function_impl<function_impl<vf3>, cmp_function_v3 >
00167 {
00168 vf3 m_fn;
00169 public:
00170 function_impl(vf3 f) : m_fn(f) { }
00171 var call(const var & a0, const var & a1, const var & a2)
00172 {
00173 m_fn(a0,a1,a2); return var();
00174 }
00175 int max_args() { return 3; }
00176 void * as_ptr() { return (void*)m_fn; }
00177 };
00178
00179
00181
00182 template<> class function_impl<f4> :
00183 public generic_function_impl<function_impl<f4>, cmp_function_4 >
00184 {
00185 f4 m_fn;
00186 public:
00187 function_impl(f4 f) : m_fn(f) { }
00188 var call(const var & a0, const var & a1, const var & a2, const var & a3)
00189 {
00190 return m_fn(a0,a1,a2,a3);
00191 }
00192 int max_args() { return 4; }
00193 void * as_ptr() { return (void*)m_fn; }
00194 };
00195
00196
00198
00199 template<> class function_impl<vf4> :
00200 public generic_function_impl<function_impl<vf4>, cmp_function_v4 >
00201 {
00202 vf4 m_fn;
00203 public:
00204 function_impl(vf4 f) : m_fn(f) { }
00205 var call(const var & a0, const var & a1, const var & a2, const var & a3)
00206 { m_fn(a0,a1,a2,a3); return var(); }
00207 int max_args() { return 4; }
00208 void * as_ptr() { return (void*)m_fn; }
00209 };
00210
00211
00213
00214 template<> class function_impl<f5> :
00215 public generic_function_impl<function_impl<f5>, cmp_function_5 >
00216 {
00217 f5 m_fn;
00218 public:
00219 function_impl(f5 f) : m_fn(f) { }
00220 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00221 { return m_fn(a0,a1,a2,a3,a4); }
00222 int max_args() { return 5; }
00223 void * as_ptr() { return (void*)m_fn; }
00224 };
00225
00226
00228
00229 template<> class function_impl<vf5> :
00230 public generic_function_impl<function_impl<vf5>, cmp_function_v5 >
00231 {
00232 vf5 m_fn;
00233 public:
00234 function_impl(vf5 f) : m_fn(f) { }
00235 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00236 { m_fn(a0,a1,a2,a3,a4); return var(); }
00237 int max_args() { return 5; }
00238 void * as_ptr() { return (void*)m_fn; }
00239 };
00240
00241
00243
00244 template<> class function_impl<f6> :
00245 public generic_function_impl<function_impl<f6>, cmp_function_6>
00246 {
00247 f6 m_fn;
00248 public:
00249 function_impl(f6 f) : m_fn(f) { }
00250 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00251 { return m_fn(a0,a1,a2,a3,a4,a5); }
00252 int max_args() { return 6; }
00253 void * as_ptr() { return (void*)m_fn; }
00254 };
00255
00256
00258
00259 template<> class function_impl<vf6> :
00260 public generic_function_impl<function_impl<vf6>, cmp_function_v6>
00261 {
00262 vf6 m_fn;
00263 public:
00264 function_impl(vf6 f) : m_fn(f) { }
00265 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00266 { m_fn(a0,a1,a2,a3,a4,a5); return var(); }
00267 int max_args() { return 6; }
00268 void * as_ptr() { return (void*)m_fn; }
00269 };
00270
00271
00273
00274 template<> class function_impl<f7> :
00275 public generic_function_impl<function_impl<f7>, cmp_function_7>
00276 {
00277 f7 m_fn;
00278 public:
00279 function_impl(f7 f) : m_fn(f) { }
00280 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00281 { return m_fn(a0,a1,a2,a3,a4,a5,a6); }
00282 int max_args() { return 7; }
00283 void * as_ptr() { return (void*)m_fn; }
00284 };
00285
00286
00288
00289 template<> class function_impl<vf7> :
00290 public generic_function_impl<function_impl<vf7>, cmp_function_v7>
00291 {
00292 vf7 m_fn;
00293 public:
00294 function_impl(vf7 f) : m_fn(f) { }
00295 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00296 { m_fn(a0,a1,a2,a3,a4,a5,a6); return var(); }
00297 int max_args() { return 7; }
00298 void * as_ptr() { return (void*)m_fn; }
00299 };
00300
00301
00303
00304 template<> class function_impl<f8> :
00305 public generic_function_impl<function_impl<f8>, cmp_function_8>
00306 {
00307 f8 m_fn;
00308 public:
00309 function_impl(f8 f) : m_fn(f) { }
00310 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
00311 { return m_fn(a0,a1,a2,a3,a4,a5,a6,a7); }
00312 int max_args() { return 8; }
00313 void * as_ptr() { return (void*)m_fn; }
00314 };
00315
00316
00318
00319 template<> class function_impl<vf8> :
00320 public generic_function_impl<function_impl<vf8>, cmp_function_v8>
00321 {
00322 vf8 m_fn;
00323 public:
00324 function_impl(vf8 f) : m_fn(f) { }
00325 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
00326 { m_fn(a0,a1,a2,a3,a4,a5,a6,a7); return var(); }
00327 int max_args() { return 8; }
00328 void * as_ptr() { return (void*)m_fn; }
00329 };
00330
00331
00333
00334 template<> class function_impl<f9> :
00335 public generic_function_impl<function_impl<f9>, cmp_function_9>
00336 {
00337 f9 m_fn;
00338 public:
00339 function_impl(f9 f) : m_fn(f) { }
00340 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8)
00341 { return m_fn(a0,a1,a2,a3,a4,a5,a6,a7,a8); }
00342 int max_args() { return 9; }
00343 void * as_ptr() { return (void*)m_fn; }
00344 };
00345
00346
00348
00349 template<> class function_impl<vf9> :
00350 public generic_function_impl<function_impl<vf9>, cmp_function_v9>
00351 {
00352 vf9 m_fn;
00353 public:
00354 function_impl(vf9 f) : m_fn(f) { }
00355 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8)
00356 { m_fn(a0,a1,a2,a3,a4,a5,a6,a7,a8); return var(); }
00357 int max_args() { return 9; }
00358 void * as_ptr() { return (void*)m_fn; }
00359 };
00360
00361
00363
00364 template<> class function_impl<f10> :
00365 public generic_function_impl<function_impl<f10>, cmp_function_10>
00366 {
00367 f10 m_fn;
00368 public:
00369 function_impl(f10 f) : m_fn(f) { }
00370 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8, const var & a9)
00371 { return m_fn(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9); }
00372 int max_args() { return 10; }
00373 void * as_ptr() { return (void*)m_fn; }
00374 };
00375
00376
00378
00379 template<> class function_impl<vf10> :
00380 public generic_function_impl<function_impl<vf10>, cmp_function_v10>
00381 {
00382 vf10 m_fn;
00383 public:
00384 function_impl(vf10 f) : m_fn(f) { }
00385 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8, const var & a9)
00386 { m_fn(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9); return var(); }
00387 int max_args() { return 10; }
00388 void * as_ptr() { return (void*)m_fn; }
00389 };
00390 }
00391 }
00392
00393
00394 template<typename Fn>
00395 var dynamic::internal::function(Fn f)
00396 {
00397 return var(types::function_impl<Fn>(f), var::assign_impl());
00398 }
00399
00400
00401 template var dynamic::internal::function<f0>(f0);
00402 template var dynamic::internal::function<f1>(f1);
00403 template var dynamic::internal::function<f2>(f2);
00404 template var dynamic::internal::function<f3>(f3);
00405 template var dynamic::internal::function<f4>(f4);
00406 template var dynamic::internal::function<f5>(f5);
00407 template var dynamic::internal::function<f6>(f6);
00408 template var dynamic::internal::function<f7>(f7);
00409 template var dynamic::internal::function<f8>(f8);
00410 template var dynamic::internal::function<f9>(f9);
00411 template var dynamic::internal::function<f10>(f10);
00412
00413 template var dynamic::internal::function<vf0>(vf0);
00414 template var dynamic::internal::function<vf1>(vf1);
00415 template var dynamic::internal::function<vf2>(vf2);
00416 template var dynamic::internal::function<vf3>(vf3);
00417 template var dynamic::internal::function<vf4>(vf4);
00418 template var dynamic::internal::function<vf5>(vf5);
00419 template var dynamic::internal::function<vf6>(vf6);
00420 template var dynamic::internal::function<vf7>(vf7);
00421 template var dynamic::internal::function<vf8>(vf8);
00422 template var dynamic::internal::function<vf9>(vf9);
00423 template var dynamic::internal::function<vf10>(vf10);
00424
00425 namespace
00426 {
00427
00428 var cc(const var & functor, nonroot_var (&args)[1])
00429 { return functor(args[0].get()); }
00430
00431 var cc(const var & functor, nonroot_var (&args)[1], const var & a0)
00432 { return functor(args[0].get(), a0); }
00433
00434 var cc(const var & functor, nonroot_var (&args)[1], const var & a0, const var & a1)
00435 { return functor(args[0].get(), a0, a1); }
00436
00437 var cc(const var & functor, nonroot_var (&args)[1], const var & a0, const var & a1, const var & a2)
00438 { return functor(args[0].get(), a0, a1, a2); }
00439
00440 var cc(const var & functor, nonroot_var (&args)[1], const var & a0, const var & a1, const var & a2, const var & a3)
00441 { return functor(args[0].get(), a0, a1, a2, a3); }
00442
00443 var cc(const var & functor, nonroot_var (&args)[1], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00444 { return functor(args[0].get(), a0, a1, a2, a3, a4); }
00445
00446 var cc(const var & functor, nonroot_var (&args)[1], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00447 { return functor(args[0].get(), a0, a1, a2, a3, a4, a5); }
00448
00449 var cc(const var & functor, nonroot_var (&args)[1], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00450 { return functor(args[0].get(), a0, a1, a2, a3, a4, a5, a6); }
00451
00452 var cc(const var & functor, nonroot_var (&args)[1], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
00453 { return functor(args[0].get(), a0, a1, a2, a3, a4, a5, a6, a7); }
00454
00455 var cc(const var & functor, nonroot_var (&args)[1], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8)
00456 { return functor(args[0].get(), a0, a1, a2, a3, a4, a5, a6, a7, a8); }
00457
00458
00459 var cc(const var & functor, nonroot_var (&args)[2])
00460 { return functor(args[0].get(), args[1].get()); }
00461
00462 var cc(const var & functor, nonroot_var (&args)[2], const var & a0)
00463 { return functor(args[0].get(), args[1].get(), a0); }
00464
00465 var cc(const var & functor, nonroot_var (&args)[2], const var & a0, const var & a1)
00466 { return functor(args[0].get(), args[1].get(), a0, a1); }
00467
00468 var cc(const var & functor, nonroot_var (&args)[2], const var & a0, const var & a1, const var & a2)
00469 { return functor(args[0].get(), args[1].get(), a0, a1, a2); }
00470
00471 var cc(const var & functor, nonroot_var (&args)[2], const var & a0, const var & a1, const var & a2, const var & a3)
00472 { return functor(args[0].get(), args[1].get(), a0, a1, a2, a3); }
00473
00474 var cc(const var & functor, nonroot_var (&args)[2], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00475 { return functor(args[0].get(), args[1].get(), a0, a1, a2, a3, a4); }
00476
00477 var cc(const var & functor, nonroot_var (&args)[2], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00478 { return functor(args[0].get(), args[1].get(), a0, a1, a2, a3, a4, a5); }
00479
00480 var cc(const var & functor, nonroot_var (&args)[2], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00481 { return functor(args[0].get(), args[1].get(), a0, a1, a2, a3, a4, a5, a6); }
00482
00483 var cc(const var & functor, nonroot_var (&args)[2], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
00484 { return functor(args[0].get(), args[1].get(), a0, a1, a2, a3, a4, a5, a6, a7); }
00485
00486 template<std::size_t N>
00487 var cc(const var & functor, nonroot_var (&args)[N], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8)
00488 { throw too_many_arguments(); }
00489
00490
00491 var cc(const var & functor, nonroot_var (&args)[3])
00492 { return functor(args[0].get(), args[1].get(), args[2].get()); }
00493
00494 var cc(const var & functor, nonroot_var (&args)[3], const var & a0)
00495 { return functor(args[0].get(), args[1].get(), args[2].get(), a0); }
00496
00497 var cc(const var & functor, nonroot_var (&args)[3], const var & a0, const var & a1)
00498 { return functor(args[0].get(), args[1].get(), args[2].get(), a0, a1); }
00499
00500 var cc(const var & functor, nonroot_var (&args)[3], const var & a0, const var & a1, const var & a2)
00501 { return functor(args[0].get(), args[1].get(), args[2].get(), a0, a1, a2); }
00502
00503 var cc(const var & functor, nonroot_var (&args)[3], const var & a0, const var & a1, const var & a2, const var & a3)
00504 { return functor(args[0].get(), args[1].get(), args[2].get(), a0, a1, a2, a3); }
00505
00506 var cc(const var & functor, nonroot_var (&args)[3], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00507 { return functor(args[0].get(), args[1].get(), args[2].get(), a0, a1, a2, a3, a4); }
00508
00509 var cc(const var & functor, nonroot_var (&args)[3], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00510 { return functor(args[0].get(), args[1].get(), args[2].get(), a0, a1, a2, a3, a4, a5); }
00511
00512 var cc(const var & functor, nonroot_var (&args)[3], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00513 { return functor(args[0].get(), args[1].get(), args[2].get(), a0, a1, a2, a3, a4, a5, a6); }
00514
00515 template<std::size_t N>
00516 var cc(const var & functor, nonroot_var (&args)[N], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
00517 { throw too_many_arguments(); }
00518
00519
00520
00521 var cc(const var & functor, nonroot_var (&args)[4])
00522 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get()); }
00523
00524 var cc(const var & functor, nonroot_var (&args)[4], const var & a0)
00525 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), a0); }
00526
00527 var cc(const var & functor, nonroot_var (&args)[4], const var & a0, const var & a1)
00528 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), a0, a1); }
00529
00530 var cc(const var & functor, nonroot_var (&args)[4], const var & a0, const var & a1, const var & a2)
00531 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), a0, a1, a2); }
00532
00533 var cc(const var & functor, nonroot_var (&args)[4], const var & a0, const var & a1, const var & a2, const var & a3)
00534 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), a0, a1, a2, a3); }
00535
00536 var cc(const var & functor, nonroot_var (&args)[4], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00537 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), a0, a1, a2, a3, a4); }
00538
00539 var cc(const var & functor, nonroot_var (&args)[4], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00540 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), a0, a1, a2, a3, a4, a5); }
00541
00542 template<std::size_t N>
00543 var cc(const var & functor, nonroot_var (&args)[N], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00544 { throw too_many_arguments(); }
00545
00546
00547
00548 var cc(const var & functor, nonroot_var (&args)[5])
00549 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get()); }
00550
00551 var cc(const var & functor, nonroot_var (&args)[5], const var & a0)
00552 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), a0); }
00553
00554 var cc(const var & functor, nonroot_var (&args)[5], const var & a0, const var & a1)
00555 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), a0, a1); }
00556
00557 var cc(const var & functor, nonroot_var (&args)[5], const var & a0, const var & a1, const var & a2)
00558 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), a0, a1, a2); }
00559
00560 var cc(const var & functor, nonroot_var (&args)[5], const var & a0, const var & a1, const var & a2, const var & a3)
00561 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), a0, a1, a2, a3); }
00562
00563 var cc(const var & functor, nonroot_var (&args)[5], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00564 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), a0, a1, a2, a3, a4); }
00565
00566 template<std::size_t N>
00567 var cc(const var & functor, nonroot_var (&args)[N], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00568 { throw too_many_arguments(); }
00569
00570
00571
00572 var cc(const var & functor, nonroot_var (&args)[6])
00573 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get()); }
00574
00575 var cc(const var & functor, nonroot_var (&args)[6], const var & a0)
00576 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), a0); }
00577
00578 var cc(const var & functor, nonroot_var (&args)[6], const var & a0, const var & a1)
00579 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), a0, a1); }
00580
00581 var cc(const var & functor, nonroot_var (&args)[6], const var & a0, const var & a1, const var & a2)
00582 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), a0, a1, a2); }
00583
00584 var cc(const var & functor, nonroot_var (&args)[6], const var & a0, const var & a1, const var & a2, const var & a3)
00585 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), a0, a1, a2, a3); }
00586
00587 template<std::size_t N>
00588 var cc(const var & functor, nonroot_var (&args)[N], const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00589 { throw too_many_arguments(); }
00590
00591
00592
00593 var cc(const var & functor, nonroot_var (&args)[7])
00594 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get()); }
00595
00596 var cc(const var & functor, nonroot_var (&args)[7], const var & a0)
00597 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), a0); }
00598
00599 var cc(const var & functor, nonroot_var (&args)[7], const var & a0, const var & a1)
00600 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), a0, a1); }
00601
00602 var cc(const var & functor, nonroot_var (&args)[7], const var & a0, const var & a1, const var & a2)
00603 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), a0, a1, a2); }
00604
00605 template<std::size_t N>
00606 var cc(const var & functor, nonroot_var (&args)[N], const var & a0, const var & a1, const var & a2, const var & a3)
00607 { throw too_many_arguments(); }
00608
00609
00610
00611 var cc(const var & functor, nonroot_var (&args)[8])
00612 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), args[7].get()); }
00613
00614 var cc(const var & functor, nonroot_var (&args)[8], const var & a0)
00615 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), args[7].get(), a0); }
00616
00617 var cc(const var & functor, nonroot_var (&args)[8], const var & a0, const var & a1)
00618 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), args[7].get(), a0, a1); }
00619
00620 template<std::size_t N>
00621 var cc(const var & functor, nonroot_var (&args)[N], const var & a0, const var & a1, const var & a2)
00622 { throw too_many_arguments(); }
00623
00624
00625
00626 var cc(const var & functor, nonroot_var (&args)[9])
00627 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), args[7].get(), args[8].get()); }
00628
00629 var cc(const var & functor, nonroot_var (&args)[9], const var & a0)
00630 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), args[7].get(), args[8].get(), a0); }
00631
00632 template<std::size_t N>
00633 var cc(const var & functor, nonroot_var (&args)[N], const var & a0, const var & a1)
00634 { throw too_many_arguments(); }
00635
00636
00637
00638 var cc(const var & functor, nonroot_var (&args)[10])
00639 { return functor(args[0].get(), args[1].get(), args[2].get(), args[3].get(), args[4].get(), args[5].get(), args[6].get(), args[7].get(), args[8].get(), args[9].get()); }
00640
00641 template<std::size_t N>
00642 var cc(const var & functor, nonroot_var (&args)[N], const var & a0)
00643 { throw too_many_arguments(); }
00644
00645 }
00646
00647 namespace dynamic
00648 {
00649 namespace types
00650 {
00652
00653 template<int Args>
00654 class bind_impl : public shared_var_impl
00655 {
00656 nonroot_var m_functor;
00657 nonroot_var m_arg[Args];
00658
00659 public:
00660
00661 int max_args() { return m_functor.ref().max_args() - Args; }
00662 int bind_args() { return Args; }
00663
00664 var_cmp_index comparison_index() { return cmp_bind; }
00665
00666 var_cmp_result compare2(const var & other)
00667 {
00668 int cmp = Args - other.impl().bind_args();
00669 if(cmp<0) return cmp_lt;
00670 if(cmp>0) return cmp_gt;
00671
00672 bind_impl * other_bind = dynamic_cast<bind_impl*>(other.impl().shared_var());
00673
00674 if(!other_bind) return cmp_not_equal;
00675
00676 var_cmp_result result = m_functor.ref().impl().compare(other_bind->m_functor.ref());
00677 if(result != cmp_equal) return result;
00678
00679 for(int i=0; i<Args; ++i)
00680 {
00681 result = m_arg[i].ref().impl().compare(other_bind->m_arg[i].ref());
00682 if(result != cmp_equal) return result;
00683 }
00684 return cmp_equal;
00685 }
00686
00687 void pickle(pickler & p)
00688 {
00689 p.write_object_type(cmp_bind);
00690 p.write_int(Args);
00691 p.write_object(m_functor.ref());
00692 for(int i=0; i<Args; ++i)
00693 p.write_object(m_arg[i].ref());
00694 }
00695
00696 void unpickle(unpickler & p)
00697 {
00698 m_functor = p.read_object();
00699 for(int i=0; i<Args; ++i)
00700 m_arg[i] = p.read_object();
00701 }
00702
00703 bind_impl()
00704 {
00705 }
00706
00707 bind_impl(const nonroot_var & functor, const nonroot_var & new_obj, const nonroot_var * args) :
00708 m_functor(functor)
00709 {
00710 m_arg[0] = new_obj;
00711 for(int i=1; i<Args; ++i)
00712 m_arg[i] = args[i];
00713 }
00714
00715 bind_impl(const var & functor, const var & a0) :
00716 m_functor(functor)
00717 { m_arg[0] = a0; }
00718
00719 bind_impl(const var & functor, const var & a0, const var & a1) :
00720 m_functor(functor)
00721 {
00722 m_arg[0] = a0;
00723 m_arg[1] = a1;
00724 }
00725
00726 bind_impl(const var & functor, const var & a0, const var & a1, const var & a2) :
00727 m_functor(functor)
00728 {
00729 m_arg[0] = a0;
00730 m_arg[1] = a1;
00731 m_arg[2] = a2;
00732 }
00733
00734 bind_impl(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3) :
00735 m_functor(functor)
00736 {
00737 m_arg[0] = a0;
00738 m_arg[1] = a1;
00739 m_arg[2] = a2;
00740 m_arg[3] = a3;
00741 }
00742
00743 bind_impl(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4) :
00744 m_functor(functor)
00745 {
00746 m_arg[0] = a0;
00747 m_arg[1] = a1;
00748 m_arg[2] = a2;
00749 m_arg[3] = a3;
00750 m_arg[4] = a4;
00751 }
00752
00753 bind_impl(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5) :
00754 m_functor(functor)
00755 {
00756 m_arg[0] = a0;
00757 m_arg[1] = a1;
00758 m_arg[2] = a2;
00759 m_arg[3] = a3;
00760 m_arg[4] = a4;
00761 m_arg[5] = a5;
00762 }
00763
00764 bind_impl(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6) :
00765 m_functor(functor)
00766 {
00767 m_arg[0] = a0;
00768 m_arg[1] = a1;
00769 m_arg[2] = a2;
00770 m_arg[3] = a3;
00771 m_arg[4] = a4;
00772 m_arg[5] = a5;
00773 m_arg[6] = a6;
00774 }
00775
00776 bind_impl(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7) :
00777 m_functor(functor)
00778 {
00779 m_arg[0] = a0;
00780 m_arg[1] = a1;
00781 m_arg[2] = a2;
00782 m_arg[3] = a3;
00783 m_arg[4] = a4;
00784 m_arg[5] = a5;
00785 m_arg[6] = a6;
00786 m_arg[7] = a7;
00787 }
00788
00789 bind_impl(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8) :
00790 m_functor(functor)
00791 {
00792 m_arg[0] = a0;
00793 m_arg[1] = a1;
00794 m_arg[2] = a2;
00795 m_arg[3] = a3;
00796 m_arg[4] = a4;
00797 m_arg[5] = a5;
00798 m_arg[6] = a6;
00799 m_arg[7] = a7;
00800 m_arg[8] = a8;
00801 }
00802
00803 bind_impl(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8, const var & a9) :
00804 m_functor(functor)
00805 {
00806 m_arg[0] = a0;
00807 m_arg[1] = a1;
00808 m_arg[2] = a2;
00809 m_arg[3] = a3;
00810 m_arg[4] = a4;
00811 m_arg[5] = a5;
00812 m_arg[6] = a6;
00813 m_arg[7] = a7;
00814 m_arg[8] = a8;
00815 m_arg[9] = a9;
00816 }
00817
00818 std::string class_name() { return "bind"; }
00819
00820 void output(ostream & ss)
00821 {
00822 m_arg[0].ref().impl().output(ss);
00823 ss << '.';
00824 foreach(member, m_arg[0].ref())
00825 {
00826 if(m_arg[0].ref()[member.as_string().c_str()] == var(this))
00827 {
00828 member.impl().output(ss);
00829 return;
00830 }
00831 }
00832 ss << "<<bind>>";
00833 }
00834
00835 void output(wostream & ss)
00836 {
00837 m_arg[0].ref().impl().output(ss);
00838 ss << L'.';
00839 foreach(member, m_arg[0].ref())
00840 {
00841 if(m_arg[0].ref()[member] == var(this))
00842 {
00843 member.impl().output(ss);
00844 return;
00845 }
00846 }
00847 ss << L"<<bind>>";
00848 }
00849
00850 void mark_children(gc::garbage_collector & gc)
00851 {
00852 m_functor.ref().impl().mark_reachable(gc);
00853 for(int i=0; i<Args; ++i)
00854 m_arg[i].ref().impl().mark_reachable(gc);
00855 }
00856
00857 var call() { stack_trace_entry e(this); return cc(m_functor.ref(), m_arg); }
00858
00859 var call(const var & a0)
00860 { stack_trace_entry e(this); return cc(m_functor.get(), m_arg, a0); }
00861
00862 var call(const var & a0, const var & a1)
00863 { stack_trace_entry e(this); return cc( m_functor.get(), m_arg, a0, a1 ); }
00864
00865 var call(const var & a0, const var & a1, const var & a2)
00866 { stack_trace_entry e(this); return cc( m_functor.get(), m_arg, a0, a1, a2 ); }
00867
00868 var call(const var & a0, const var & a1, const var & a2, const var & a3)
00869 { stack_trace_entry e(this); return cc( m_functor.get(), m_arg, a0, a1, a2, a3 ); }
00870
00871 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00872 { stack_trace_entry e(this); return cc( m_functor.get(), m_arg, a0, a1, a2, a3, a4 ); }
00873
00874 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00875 { stack_trace_entry e(this); return cc( m_functor.get(), m_arg, a0, a1, a2, a3, a4, a5 ); }
00876
00877 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00878 { stack_trace_entry e(this); return cc( m_functor.get(), m_arg, a0, a1, a2, a3, a4, a5, a6 ); }
00879
00880 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
00881 { stack_trace_entry e(this); return cc( m_functor.get(), m_arg, a0, a1, a2, a3, a4, a5, a6, a7 ); }
00882
00883 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8)
00884 { stack_trace_entry e(this); return cc( m_functor.get(), m_arg, a0, a1, a2, a3, a4, a5, a6, a7, a8 ); }
00885 };
00886 }
00887 }
00888
00889
00890 var dynamic::bind(const var & functor, const var & arg)
00891 {
00892 if(functor.max_args() < 1) throw too_many_arguments();
00893 return new types::bind_impl<1>(functor, arg);
00894 }
00895
00896
00897 var dynamic::bind(const var & functor, const var & a0, const var & a1)
00898 {
00899 if(functor.max_args() < 2) throw too_many_arguments();
00900 return new types::bind_impl<2>(functor, a0, a1);
00901 }
00902
00903
00904 var dynamic::bind(const var & functor, const var & a0, const var & a1, const var & a2)
00905 {
00906 if(functor.max_args() < 3) throw too_many_arguments();
00907 return new types::bind_impl<3>(functor, a0, a1, a2);
00908 }
00909
00910
00911 var dynamic::bind(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3)
00912 {
00913 if(functor.max_args() < 4) throw too_many_arguments();
00914 return new types::bind_impl<4>(functor, a0, a1, a2, a3);
00915 }
00916
00917
00918 var dynamic::bind(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00919 {
00920 if(functor.max_args() < 5) throw too_many_arguments();
00921 return new types::bind_impl<5>(functor, a0, a1, a2, a3, a4);
00922 }
00923
00924
00925 var dynamic::bind(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00926 {
00927 if(functor.max_args() < 6) throw too_many_arguments();
00928 return new types::bind_impl<6>(functor, a0, a1, a2, a3, a4, a5);
00929 }
00930
00931
00932 var dynamic::bind(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00933 {
00934 if(functor.max_args() < 7) throw too_many_arguments();
00935 return new types::bind_impl<7>(functor, a0, a1, a2, a3, a4, a5, a6);
00936 }
00937
00938
00939 var dynamic::bind(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
00940 {
00941 if(functor.max_args() < 8) throw too_many_arguments();
00942 return new types::bind_impl<8>(functor, a0, a1, a2, a3, a4, a5, a6, a7);
00943 }
00944
00945
00946 var dynamic::bind(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8)
00947 {
00948 if(functor.max_args() < 9) throw too_many_arguments();
00949 return new types::bind_impl<9>(functor, a0, a1, a2, a3, a4, a5, a6, a7, a8);
00950 }
00951
00952
00953 var dynamic::bind(const var & functor, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8, const var & a9)
00954 {
00955 if(functor.max_args() < 10) throw too_many_arguments();
00956 return new types::bind_impl<10>(functor, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
00957 }
00958
00959
00960 var dynamic::internal::bind(int args)
00961 {
00962 switch(args)
00963 {
00964 case 1: return new types::bind_impl<1>();
00965 case 2: return new types::bind_impl<2>();
00966 case 3: return new types::bind_impl<3>();
00967 case 4: return new types::bind_impl<4>();
00968 case 5: return new types::bind_impl<5>();
00969 case 6: return new types::bind_impl<6>();
00970 case 7: return new types::bind_impl<7>();
00971 case 8: return new types::bind_impl<8>();
00972 case 9: return new types::bind_impl<9>();
00973 case 10: return new types::bind_impl<10>();
00974 default:
00975 throw invalid_string();
00976 }
00977 }
00978
00979
00980 namespace dynamic
00981 {
00982 namespace types
00983 {
00985
00986 class varargs_impl : public shared_var_impl
00987 {
00988 nonroot_var m_fn;
00989
00990 public:
00991 varargs_impl(const var & fn) : m_fn(fn)
00992 {
00993 }
00994
00995 void mark_children(gc::garbage_collector&gc)
00996 {
00997 m_fn.ref().impl().mark_reachable(gc);
00998 }
00999
01000 var call()
01001 {
01002 return m_fn.ref()(array());
01003 }
01004
01005 var call(const var & a0)
01006 {
01007 var a = array();
01008 a.push_back(a0);
01009 return m_fn.ref()(a);
01010 }
01011
01012 var call(const var & a0, const var & a1)
01013 {
01014 var a = array();
01015 a.push_back(a0);
01016 a.push_back(a1);
01017 return m_fn.ref()(a);
01018 }
01019
01020 var call(const var & a0, const var & a1, const var & a2)
01021 {
01022 var a = array();
01023 a.push_back(a0);
01024 a.push_back(a1);
01025 a.push_back(a2);
01026 return m_fn.ref()(a);
01027 }
01028
01029 var call(const var & a0, const var & a1, const var & a2, const var & a3)
01030 {
01031 var a = array();
01032 a.push_back(a0);
01033 a.push_back(a1);
01034 a.push_back(a2);
01035 a.push_back(a3);
01036 return m_fn.ref()(a);
01037 }
01038
01039 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
01040 {
01041 var a = array();
01042 a.push_back(a0);
01043 a.push_back(a1);
01044 a.push_back(a2);
01045 a.push_back(a3);
01046 a.push_back(a4);
01047 return m_fn.ref()(a);
01048 }
01049
01050 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
01051 {
01052 var a = array();
01053 a.push_back(a0);
01054 a.push_back(a1);
01055 a.push_back(a2);
01056 a.push_back(a3);
01057 a.push_back(a4);
01058 a.push_back(a5);
01059 return m_fn.ref()(a);
01060 }
01061
01062 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
01063 {
01064 var a = array();
01065 a.push_back(a0);
01066 a.push_back(a1);
01067 a.push_back(a2);
01068 a.push_back(a3);
01069 a.push_back(a4);
01070 a.push_back(a5);
01071 a.push_back(a6);
01072 return m_fn.ref()(a);
01073 }
01074
01075 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
01076 {
01077 var a = array();
01078 a.push_back(a0);
01079 a.push_back(a1);
01080 a.push_back(a2);
01081 a.push_back(a3);
01082 a.push_back(a4);
01083 a.push_back(a5);
01084 a.push_back(a6);
01085 a.push_back(a7);
01086 return m_fn.ref()(a);
01087 }
01088
01089 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8)
01090 {
01091 var a = array();
01092 a.push_back(a0);
01093 a.push_back(a1);
01094 a.push_back(a2);
01095 a.push_back(a3);
01096 a.push_back(a4);
01097 a.push_back(a5);
01098 a.push_back(a6);
01099 a.push_back(a7);
01100 a.push_back(a8);
01101 return m_fn.ref()(a);
01102 }
01103
01104 var call(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8, const var & a9)
01105 {
01106 var a = array();
01107 a.push_back(a0);
01108 a.push_back(a1);
01109 a.push_back(a2);
01110 a.push_back(a3);
01111 a.push_back(a4);
01112 a.push_back(a5);
01113 a.push_back(a6);
01114 a.push_back(a7);
01115 a.push_back(a8);
01116 a.push_back(a9);
01117 return m_fn.ref()(a);
01118 }
01119
01120 string class_name()
01121 {
01122 return "varargs";
01123 }
01124
01125 var_cmp_index comparison_index()
01126 {
01127 return cmp_varargs;
01128 }
01129
01130 var_cmp_result compare2(const var & other_var)
01131 {
01132 varargs_impl * other = dynamic_cast<varargs_impl*>(other_var.impl().shared_var() );
01133 if( !other ) return cmp_not_equal;
01134
01135 return m_fn.ref().impl().compare(other->m_fn.ref());
01136 }
01137
01138 void output(ostream & os)
01139 {
01140 os << "varargs(";
01141 m_fn.ref().impl().output(os);
01142 os << ")";
01143 }
01144
01145 void output(wostream & os)
01146 {
01147 os << L"varargs(";
01148 m_fn.ref().impl().output(os);
01149 os << L")";
01150 }
01151
01152 void pickle(pickler & p)
01153 {
01154 p.write_object_type(cmp_varargs);
01155 m_fn.ref().impl().pickle(p);
01156 }
01157
01158 void unpickle(unpickler & p)
01159 {
01160 m_fn = p.read_object();
01161 }
01162
01163 int max_args()
01164 {
01165 return 10;
01166 }
01167
01168 var clone()
01169 {
01170 return new varargs_impl(*this);
01171 }
01172 };
01173 }
01174 }
01175
01176
01177 var dynamic::varargs(const var & fn)
01178 {
01179 return new types::varargs_impl(fn);
01180 }
01181
01182
01183 namespace
01184 {
01185 typedef cg::tls<stack_trace_entry*> stack_top;
01186 }
01187
01188
01189 dynamic::stack_trace_entry::stack_trace_entry(const var & fn) : m_fn(fn)
01190 {
01191 m_previous = stack_top::get();
01192 stack_top::set(this);
01193 }
01194
01195
01196 dynamic::stack_trace_entry::~stack_trace_entry()
01197 {
01198 stack_top::set(m_previous);
01199 }
01200
01201
01202 var dynamic::stack_trace_entry::stack_trace()
01203 {
01204 var a = array();
01205 for(stack_trace_entry * e = stack_top::get(); e; e=e->m_previous)
01206 {
01207 a.push_back( e->m_fn );
01208 }
01209 return a;
01210 }
01211
01212
01213 var dynamic::stack_trace()
01214 {
01215 return stack_trace_entry::stack_trace();
01216 }
01217
01218
01219 namespace
01220 {
01221
01222
01223 class named_functor_impl : public shared_var_impl
01224 {
01225 nonroot_var m_fn;
01226 std::string m_name;
01227
01228 public:
01229 named_functor_impl(const var & f, const char * n) : m_fn(f), m_name(n)
01230 {
01231 }
01232
01233 void mark_children(gc::garbage_collector & gc)
01234 {
01235 m_fn.ref().impl().mark_reachable(gc);
01236 }
01237
01238 void output(ostream & os)
01239 {
01240 os << m_name;
01241 }
01242
01243 void output(wostream & os)
01244 {
01246 os << std::string(m_name.begin(), m_name.end());
01247 }
01248
01249 var call()
01250 {
01251 stack_trace_entry e(this);
01252 return m_fn.ref().impl().call();
01253 }
01254
01255 var call(const var & a0)
01256 {
01257 stack_trace_entry e(this);
01258 return m_fn.ref().impl().call(a0);
01259 }
01260
01261 var call(const var & a0, const var & a1)
01262 {
01263 stack_trace_entry e(this);
01264 return m_fn.ref().impl().call(a0,a1);
01265 }
01266
01267 var call(const var & a0, const var & a1, const var & a2)
01268 {
01269 stack_trace_entry e(this);
01270 return m_fn.ref().impl().call(a0,a1,a2);
01271 }
01272
01273 string class_name()
01274 {
01275 return "named_functor";
01276 }
01277 };
01278 }
01279
01280
01281 #define func(X) ::dynamic::internal::named_functor(X, #X)
01282
01283 var dynamic::internal::named_functor(const var &fn, const char * name)
01284 {
01285 return new named_functor_impl(fn, name);
01286 }