rice 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/Doxyfile +1 -1
  2. data/Makefile.in +3 -2
  3. data/README +247 -16
  4. data/aclocal.m4 +62 -51
  5. data/configure +1585 -1456
  6. data/extconf.rb +9 -1
  7. data/rice/Arg.hpp +8 -0
  8. data/rice/Arg_impl.hpp +124 -0
  9. data/rice/Arg_operators.cpp +21 -0
  10. data/rice/Arg_operators.hpp +19 -0
  11. data/rice/Constructor.hpp +150 -0
  12. data/rice/Data_Type.ipp +51 -6
  13. data/rice/Director.cpp +19 -0
  14. data/rice/Director.hpp +47 -0
  15. data/rice/Enum.hpp +2 -3
  16. data/rice/Enum.ipp +1 -1
  17. data/rice/Hash.hpp +1 -1
  18. data/rice/Makefile.am +7 -0
  19. data/rice/Makefile.in +18 -7
  20. data/rice/Module_impl.hpp +36 -3
  21. data/rice/Module_impl.ipp +56 -7
  22. data/rice/VM.cpp +2 -2
  23. data/rice/config.hpp +1 -1
  24. data/rice/detail/Arguments.hpp +118 -0
  25. data/rice/detail/Auto_Function_Wrapper.hpp +206 -96
  26. data/rice/detail/Auto_Function_Wrapper.ipp +1687 -144
  27. data/rice/detail/Auto_Member_Function_Wrapper.hpp +234 -123
  28. data/rice/detail/Auto_Member_Function_Wrapper.ipp +1133 -306
  29. data/rice/detail/Caster.hpp +3 -1
  30. data/rice/detail/creation_funcs.hpp +0 -8
  31. data/rice/detail/creation_funcs.ipp +1 -27
  32. data/rice/detail/define_method_and_auto_wrap.hpp +3 -1
  33. data/rice/detail/define_method_and_auto_wrap.ipp +4 -3
  34. data/rice/detail/object_call.ipp +1 -1
  35. data/rice/detail/ruby.hpp +1 -33
  36. data/rice/detail/wrap_function.hpp +103 -48
  37. data/rice/detail/wrap_function.ipp +154 -96
  38. data/rice/generate_code.rb +520 -55
  39. data/rice/global_function.hpp +12 -1
  40. data/rice/global_function.ipp +14 -2
  41. data/ruby/Makefile.in +5 -4
  42. data/ruby/lib/Makefile.in +4 -3
  43. data/ruby/lib/version.rb +1 -1
  44. data/sample/Makefile.in +4 -3
  45. data/test/Makefile.am +2 -0
  46. data/test/Makefile.in +32 -13
  47. data/test/test_Class.cpp +36 -14
  48. data/test/test_Constructor.cpp +176 -1
  49. data/test/test_Data_Type.cpp +121 -0
  50. data/test/test_Director.cpp +225 -0
  51. data/test/test_Enum.cpp +33 -0
  52. data/test/test_Module.cpp +175 -0
  53. data/test/test_global_functions.cpp +70 -1
  54. metadata +27 -7
@@ -284,7 +284,7 @@ wrap_header(hpp_filename, nil, docstring, false, nil, nil, GENERATED_FILE_WARNIN
284
284
  arg_list = t_array.map { |x| ", T#{x} arg#{x}" }
285
285
  if j == 0 then
286
286
  template = ''
287
- convert_list = 'Qnil';
287
+ convert_list = '';
288
288
  else
289
289
  template = 'template<' + t_array.map { |x| "typename T#{x}" }.join(', ') + '>'
290
290
  convert_list = t_array.map { |x| "to_ruby(arg#{x})" }.join(', ')
@@ -313,25 +313,56 @@ template<typename Func_T, typename Ret_T, %(typename_list)>
313
313
  Auto_Function_Wrapper<Func_T, Ret_T, %(typenames)>::
314
314
  Auto_Function_Wrapper(
315
315
  Func func,
316
- Data_Object<Exception_Handler> handler)
316
+ Data_Object<Exception_Handler> handler,
317
+ Arguments* arguments)
317
318
  : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
318
319
  , func_(func)
319
320
  , handler_(handler)
320
321
  , handler_guard_(&handler_)
321
322
  {
323
+ if(arguments == 0) {
324
+ arguments_ = new Arguments();
325
+ } else {
326
+ arguments_ = arguments;
327
+ }
322
328
  }
323
329
 
324
330
  template<typename Func_T, typename Ret_T, %(typename_list)>
325
331
  VALUE Auto_Function_Wrapper<Func_T, Ret_T, %(typenames)>::
326
- call(%(value_args))
332
+ call(int argc, VALUE *argv, VALUE self)
327
333
  {
328
334
  Auto_Function_Wrapper<Func_T, Ret_T, %(typenames)> * wrapper = 0;
329
335
  try
330
336
  {
331
337
  Data_Object<Wrapped_Function> data(detail::method_data());
332
338
  wrapper = (Auto_Function_Wrapper<Func_T, Ret_T, %(typenames)> *)data.get();
333
- %(arg_convert_list)
334
- return to_ruby(wrapper->func_(%(arg_list)));
339
+ Arguments* args = wrapper->arguments_;
340
+
341
+ bool hasSelf = (self && self != Qnil);
342
+ if(args->count() >= 0) {
343
+ hasSelf = hasSelf && args->count() == Num_Args - 1;
344
+ } else {
345
+ hasSelf = hasSelf && argc == Num_Args -1;
346
+ }
347
+
348
+ VALUE %(scan_def_list);
349
+
350
+ if(hasSelf) {
351
+ rb_scan_args(argc, argv, args->formatString(Num_Args - 1)
352
+ %(scan_args_list));
353
+
354
+ Arg0_T arg0 = from_ruby<Arg0_T>(self);
355
+ %(self_arg_convert_list)
356
+
357
+ return to_ruby(wrapper->func_(%(arg_list)));
358
+ } else {
359
+ rb_scan_args(argc, argv, args->formatString(Num_Args)
360
+ %(scan_args_list));
361
+
362
+ %(arg_convert_list)
363
+
364
+ return to_ruby(wrapper->func_(%(arg_list)));
365
+ }
335
366
  }
336
367
  catch(...)
337
368
  {
@@ -354,17 +385,23 @@ template<typename Func_T, %(typename_list)>
354
385
  Auto_Function_Wrapper<Func_T, void, %(typenames)>::
355
386
  Auto_Function_Wrapper(
356
387
  Func func,
357
- Data_Object<Exception_Handler> handler)
388
+ Data_Object<Exception_Handler> handler,
389
+ Arguments* arguments)
358
390
  : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
359
391
  , func_(func)
360
392
  , handler_(handler)
361
393
  , handler_guard_(&handler_)
362
394
  {
395
+ if(arguments == 0) {
396
+ arguments_ = new Arguments();
397
+ } else {
398
+ arguments_ = arguments;
399
+ }
363
400
  }
364
401
 
365
402
  template<typename Func_T, %(typename_list)>
366
403
  VALUE Auto_Function_Wrapper<Func_T, void, %(typenames)>::
367
- call(%(value_args))
404
+ call(int argc, VALUE* argv, VALUE self)
368
405
  {
369
406
  Auto_Function_Wrapper<Func_T, void, %(typenames)> * wrapper = 0;
370
407
  try
@@ -372,9 +409,35 @@ call(%(value_args))
372
409
  Data_Object<Wrapped_Function> data(detail::method_data());
373
410
  wrapper =
374
411
  (Auto_Function_Wrapper<Func_T, void, %(typenames)> *)data.get();
375
- %(arg_convert_list)
376
- wrapper->func_(%(arg_list));
377
- return Qnil;
412
+ Arguments* args = wrapper->arguments_;
413
+
414
+ bool hasSelf = (self && self != Qnil);
415
+ if(args->count() >= 0) {
416
+ hasSelf = hasSelf && args->count() == Num_Args - 1;
417
+ } else {
418
+ hasSelf = hasSelf && argc == Num_Args -1;
419
+ }
420
+
421
+ VALUE %(scan_def_list);
422
+
423
+ if(hasSelf) {
424
+ rb_scan_args(argc, argv, args->formatString(Num_Args - 1)
425
+ %(scan_args_list));
426
+
427
+ Arg0_T arg0 = from_ruby<Arg0_T>(self);
428
+ %(self_arg_convert_list)
429
+
430
+ wrapper->func_(%(arg_list));
431
+ return Qnil;
432
+ } else {
433
+ rb_scan_args(argc, argv, args->formatString(Num_Args)
434
+ %(scan_args_list));
435
+
436
+ %(arg_convert_list)
437
+
438
+ wrapper->func_(%(arg_list));
439
+ return Qnil;
440
+ }
378
441
  }
379
442
  catch(...)
380
443
  {
@@ -412,14 +475,16 @@ public:
412
475
 
413
476
  Auto_Function_Wrapper(
414
477
  Func func,
415
- Data_Object<Exception_Handler> handler);
478
+ Data_Object<Exception_Handler> handler,
479
+ Arguments* arguments = 0);
416
480
 
417
- static VALUE call(%(value_args));
481
+ static VALUE call(int argc, VALUE* args, VALUE self);
418
482
 
419
483
  private:
420
484
  Func func_;
421
485
  Data_Object<Exception_Handler> handler_;
422
486
  Address_Registration_Guard handler_guard_;
487
+ Arguments* arguments_;
423
488
  };
424
489
 
425
490
  template<typename Func_T, %(typename_list)>
@@ -434,14 +499,16 @@ public:
434
499
 
435
500
  Auto_Function_Wrapper(
436
501
  Func func,
437
- Data_Object<Exception_Handler> handler);
502
+ Data_Object<Exception_Handler> handler,
503
+ Arguments* arguments = 0);
438
504
 
439
- static VALUE call(%(value_args));
505
+ static VALUE call(int argc, VALUE* args, VALUE self);
440
506
 
441
507
  private:
442
508
  Func func_;
443
509
  Data_Object<Exception_Handler> handler_;
444
510
  Address_Registration_Guard handler_guard_;
511
+ Arguments* arguments_;
445
512
  };
446
513
 
447
514
  // ---------------------------------------------------------------------
@@ -455,19 +522,159 @@ ipp_head = <<END
455
522
  #include "../ruby_try_catch.hpp"
456
523
  #include "../to_from_ruby.hpp"
457
524
  END
525
+ ipp_tail = <<END
526
+ template<typename Func_T, typename Ret_T>
527
+ Auto_Function_Wrapper<Func_T, Ret_T>::
528
+ Auto_Function_Wrapper(
529
+ Func func,
530
+ Data_Object<Exception_Handler> handler,
531
+ Arguments* arguments)
532
+ : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
533
+ , func_(func)
534
+ , handler_(handler ? handler : new Default_Exception_Handler)
535
+ , arguments_(arguments)
536
+ {
537
+ }
538
+
539
+ template<typename Func_T, typename Ret_T>
540
+ VALUE Auto_Function_Wrapper<Func_T, Ret_T>::
541
+ call()
542
+ {
543
+ Auto_Function_Wrapper<Func_T, Ret_T> * wrapper = 0;
544
+ try
545
+ {
546
+ Data_Object<Wrapped_Function> data(detail::method_data());
547
+ wrapper = (Auto_Function_Wrapper<Func_T, Ret_T>*)data.get();
548
+
549
+ return to_ruby<Ret_T>(wrapper->func_());
550
+ }
551
+ catch(...)
552
+ {
553
+ RUBY_TRY
554
+ {
555
+ if(wrapper)
556
+ {
557
+ return wrapper->handler_->handle_exception();
558
+ }
559
+ else
560
+ {
561
+ throw;
562
+ }
563
+ }
564
+ RUBY_CATCH
565
+ }
566
+ }
567
+
568
+ template<typename Func_T>
569
+ Auto_Function_Wrapper<Func_T, void>::
570
+ Auto_Function_Wrapper(
571
+ Func func,
572
+ Data_Object<Exception_Handler> handler,
573
+ Arguments* arguments)
574
+ : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
575
+ , func_(func)
576
+ , handler_(handler ? handler : new Default_Exception_Handler)
577
+ , arguments_(arguments)
578
+ {
579
+ }
580
+
581
+ template<typename Func_T>
582
+ VALUE Auto_Function_Wrapper<Func_T, void>::
583
+ call()
584
+ {
585
+ Auto_Function_Wrapper<Func_T, void> * wrapper = 0;
586
+ try
587
+ {
588
+ Data_Object<Wrapped_Function> data(detail::method_data());
589
+ wrapper =
590
+ (Auto_Function_Wrapper<Func_T, void> *)data.get();
591
+
592
+ wrapper->func_();
593
+ return Qnil;
594
+ }
595
+ catch(...)
596
+ {
597
+ RUBY_TRY
598
+ {
599
+ if(wrapper)
600
+ {
601
+ return wrapper->handler_->handle_exception();
602
+ }
603
+ else
604
+ {
605
+ throw;
606
+ }
607
+ }
608
+ RUBY_CATCH
609
+ }
610
+ }
611
+ END
612
+ hpp_tail = <<END
613
+
614
+ template<typename Func_T, typename Ret_T>
615
+ class Auto_Function_Wrapper<Func_T, Ret_T>
616
+ : public Wrapped_Function
617
+ {
618
+ public:
619
+ // typedef void (*Func)();
620
+ typedef Func_T Func;
621
+
622
+ static const int Num_Args = 0;
623
+
624
+ Auto_Function_Wrapper(
625
+ Func func,
626
+ Data_Object<Exception_Handler> handler,
627
+ Arguments* arguments = new Arguments());
628
+
629
+ static VALUE call();
630
+
631
+ private:
632
+ Func func_;
633
+ Data_Object<Exception_Handler> handler_;
634
+ Arguments* arguments_;
635
+ };
636
+
637
+ template<typename Func_T>
638
+ class Auto_Function_Wrapper<Func_T, void>
639
+ : public Wrapped_Function
640
+ {
641
+ public:
642
+ // typedef void (*Func)();
643
+ typedef Func_T Func;
644
+
645
+ static const int Num_Args = 0;
646
+
647
+ Auto_Function_Wrapper(
648
+ Func func,
649
+ Data_Object<Exception_Handler> handler,
650
+ Arguments* arguments = new Arguments());
651
+
652
+ static VALUE call();
653
+
654
+ private:
655
+ Func func_;
656
+ Data_Object<Exception_Handler> handler_;
657
+ Arguments* arguments_;
658
+ };
659
+ END
458
660
  ipp_filename = 'detail/Auto_Function_Wrapper.ipp'
459
661
  hpp_filename = 'detail/Auto_Function_Wrapper.hpp'
460
662
  wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head) do |hpp|
461
663
  wrap_header(ipp_filename, 'Rice::detail', nil, false, ipp_head) do |ipp|
462
- j = MAX_ARGS # TODO: what's the best way to iterate backward?
463
- while j >= 0 do
664
+ MAX_ARGS.downto(0) do |j|
464
665
  t_array = (0..j).to_a
465
- value_args = t_array.map { |x| "VALUE ruby_arg#{x}" }.join(', ')
666
+ scan_def_list = t_array.map { |x| "varg#{x}" }.join(', ')
667
+ arg_def_list = t_array.map { |x| "Arg#{x}_T arg#{x};"}
466
668
  arg_list = t_array.map { |x| "arg#{x}" }.join(', ')
669
+ scan_args_list = t_array.map { |x| ", &varg#{x}"}
467
670
  typenames = t_array.map { |x| "Arg#{x}_T" }.join(', ')
468
- arg_convert_list = t_array.map do |x|
469
- "Arg#{x}_T arg#{x}(from_ruby<Arg#{x}_T>(ruby_arg#{x})); "
470
- end
671
+ arg_convert_list = t_array.map do |x|
672
+ "Arg#{x}_T arg#{x} = args->getArgumentOrDefault<Arg#{x}_T>(#{x}, varg#{x});"
673
+ end.join("\n\t\t\t")
674
+ self_arg_convert_list = (0...j).to_a.map do |x|
675
+ n = x + 1
676
+ "Arg#{n}_T arg#{n} = args->getArgumentOrDefault<Arg#{n}_T>(#{x}, varg#{x});"
677
+ end.join("\n\t\t\t")
471
678
  if j == MAX_ARGS then
472
679
  typename_list = t_array.map { |x| "typename Arg#{x}_T" }.join(', ')
473
680
  typename_list_d = t_array.map { |x| "typename Arg#{x}_T = void" }.join(', ')
@@ -478,22 +685,24 @@ wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head) do |hpp|
478
685
  specializations = "<Func_T, Ret_T, #{typenames}>"
479
686
  end
480
687
  ipp.puts fill_template(ipp_template, {
481
- :value_args => value_args,
688
+ :scan_def_list => scan_def_list,
482
689
  :arg_list => arg_list,
483
690
  :typenames => typenames,
484
691
  :typename_list => typename_list,
485
692
  :arg_convert_list => arg_convert_list,
693
+ :scan_args_list => scan_args_list,
694
+ :self_arg_convert_list => self_arg_convert_list,
486
695
  })
487
696
  hpp.puts fill_template(hpp_template, {
488
- :value_args => value_args,
489
697
  :typenames => typenames,
490
698
  :typename_list_d => typename_list_d,
491
699
  :typename_list => typename_list,
492
- :j => j,
700
+ :j => j + 1,
493
701
  :specializations => specializations,
494
702
  })
495
- j -= 1
496
703
  end
704
+ ipp.puts ipp_tail
705
+ hpp.puts hpp_tail
497
706
  end
498
707
  end
499
708
 
@@ -508,17 +717,24 @@ template<typename Func_T, typename Ret_T, typename Self_T%(typename_list)>
508
717
  Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T%(typenames)>::
509
718
  Auto_Member_Function_Wrapper(
510
719
  Func func,
511
- Data_Object<Exception_Handler> handler)
720
+ Data_Object<Exception_Handler> handler,
721
+ Arguments* arguments)
512
722
  : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
513
723
  , func_(func)
514
724
  , handler_(handler)
515
725
  , handler_guard_(&handler_)
726
+ , arguments_(arguments)
516
727
  {
728
+ if(arguments == 0) {
729
+ arguments_ = new Arguments();
730
+ } else {
731
+ arguments_ = arguments;
732
+ }
517
733
  }
518
734
 
519
735
  template<typename Func_T, typename Ret_T, typename Self_T%(typename_list)>
520
736
  VALUE Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T%(typenames)>::
521
- call(VALUE self%(value_args))
737
+ call(int argc, VALUE* argv, VALUE self)
522
738
  {
523
739
  Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T%(typenames)> * wrapper = 0;
524
740
  try
@@ -526,8 +742,16 @@ call(VALUE self%(value_args))
526
742
  Data_Object<Wrapped_Function> data(detail::method_data());
527
743
  wrapper =
528
744
  (Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T%(typenames)> *)data.get();
745
+ Arguments* args = wrapper->arguments_;
746
+
747
+ VALUE %(scan_def_list);
748
+
749
+ rb_scan_args(argc, argv, args->formatString(Num_Args),
750
+ %(scan_args_list));
751
+
529
752
  Self_T * obj = from_ruby<Self_T *>(self);
530
753
  %(arg_convert_list)
754
+
531
755
  Func func = wrapper->func_;
532
756
  return to_ruby((*obj.*func)(%(arg_list)));
533
757
  }
@@ -552,17 +776,24 @@ template<typename Func_T, typename Self_T%(typename_list)>
552
776
  Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)>::
553
777
  Auto_Member_Function_Wrapper(
554
778
  Func func,
555
- Data_Object<Exception_Handler> handler)
779
+ Data_Object<Exception_Handler> handler,
780
+ Arguments* arguments)
556
781
  : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
557
782
  , func_(func)
558
783
  , handler_(handler)
559
784
  , handler_guard_(&handler_)
785
+ , arguments_(arguments)
560
786
  {
787
+ if(arguments == 0) {
788
+ arguments_ = new Arguments();
789
+ } else {
790
+ arguments_ = arguments;
791
+ }
561
792
  }
562
793
 
563
794
  template<typename Func_T, typename Self_T%(typename_list)>
564
795
  VALUE Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)>::
565
- call(VALUE self%(value_args))
796
+ call(int argc, VALUE* argv, VALUE self)
566
797
  {
567
798
  Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)> * wrapper = 0;
568
799
  try
@@ -570,8 +801,16 @@ call(VALUE self%(value_args))
570
801
  Data_Object<Wrapped_Function> data(detail::method_data());
571
802
  wrapper =
572
803
  (Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)> *)data.get();
804
+ Arguments* args = wrapper->arguments_;
805
+
806
+ VALUE %(scan_def_list);
807
+
808
+ rb_scan_args(argc, argv, args->formatString(Num_Args),
809
+ %(scan_args_list));
810
+
573
811
  Self_T * obj = from_ruby<Self_T *>(self);
574
812
  %(arg_convert_list)
813
+
575
814
  Func func = wrapper->func_;
576
815
  (*obj.*func)(%(arg_list));
577
816
  return Qnil;
@@ -593,6 +832,115 @@ call(VALUE self%(value_args))
593
832
  }
594
833
  }
595
834
 
835
+ // ---------------------------------------------------------------------
836
+ END
837
+ ipp_tail = <<END
838
+ template<typename Func_T, typename Ret_T, typename Self_T>
839
+ Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T>::
840
+ Auto_Member_Function_Wrapper(
841
+ Func func,
842
+ Data_Object<Exception_Handler> handler,
843
+ Arguments* arguments)
844
+ : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
845
+ , func_(func)
846
+ , handler_(handler)
847
+ , handler_guard_(&handler_)
848
+ , arguments_(arguments)
849
+ {
850
+ if(arguments == 0) {
851
+ arguments_ = new Arguments();
852
+ } else {
853
+ arguments_ = arguments;
854
+ }
855
+ }
856
+
857
+ template<typename Func_T, typename Ret_T, typename Self_T>
858
+ VALUE Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T>::
859
+ call(int argc, VALUE* argv, VALUE self)
860
+ {
861
+ Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T> * wrapper = 0;
862
+ try
863
+ {
864
+ Data_Object<Wrapped_Function> data(detail::method_data());
865
+ wrapper =
866
+ (Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T> *)data.get();
867
+
868
+ rb_scan_args(argc, argv, "0");
869
+ Self_T * obj = from_ruby<Self_T *>(self);
870
+
871
+ Func func = wrapper->func_;
872
+ return to_ruby((*obj.*func)());
873
+ }
874
+ catch(...)
875
+ {
876
+ RUBY_TRY
877
+ {
878
+ if(wrapper)
879
+ {
880
+ return wrapper->handler_->handle_exception();
881
+ }
882
+ else
883
+ {
884
+ throw;
885
+ }
886
+ }
887
+ RUBY_CATCH
888
+ }
889
+ }
890
+
891
+ template<typename Func_T, typename Self_T>
892
+ Auto_Member_Function_Wrapper<Func_T, void, Self_T>::
893
+ Auto_Member_Function_Wrapper(
894
+ Func func,
895
+ Data_Object<Exception_Handler> handler,
896
+ Arguments* arguments)
897
+ : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
898
+ , func_(func)
899
+ , handler_(handler)
900
+ , handler_guard_(&handler_)
901
+ , arguments_(arguments)
902
+ {
903
+ if(arguments == 0) {
904
+ arguments_ = new Arguments();
905
+ } else {
906
+ arguments_ = arguments;
907
+ }
908
+ }
909
+
910
+ template<typename Func_T, typename Self_T>
911
+ VALUE Auto_Member_Function_Wrapper<Func_T, void, Self_T>::
912
+ call(int argc, VALUE* argv, VALUE self)
913
+ {
914
+ Auto_Member_Function_Wrapper<Func_T, void, Self_T> * wrapper = 0;
915
+ try
916
+ {
917
+ Data_Object<Wrapped_Function> data(detail::method_data());
918
+ wrapper =
919
+ (Auto_Member_Function_Wrapper<Func_T, void, Self_T> *)data.get();
920
+ rb_scan_args(argc, argv, "0");
921
+ Self_T * obj = from_ruby<Self_T *>(self);
922
+
923
+ Func func = wrapper->func_;
924
+ (*obj.*func)();
925
+ return Qnil;
926
+ }
927
+ catch(...)
928
+ {
929
+ RUBY_TRY
930
+ {
931
+ if(wrapper)
932
+ {
933
+ return wrapper->handler_->handle_exception();
934
+ }
935
+ else
936
+ {
937
+ throw;
938
+ }
939
+ }
940
+ RUBY_CATCH
941
+ }
942
+ }
943
+
596
944
  // ---------------------------------------------------------------------
597
945
  END
598
946
  hpp_template = <<END
@@ -607,14 +955,16 @@ public:
607
955
 
608
956
  Auto_Member_Function_Wrapper(
609
957
  Func func,
610
- Data_Object<Exception_Handler> handler);
958
+ Data_Object<Exception_Handler> handler,
959
+ Arguments* arguments = 0);
611
960
 
612
- static VALUE call(VALUE self%(value_args));
961
+ static VALUE call(int argc, VALUE* argv, VALUE self);
613
962
 
614
963
  private:
615
964
  Func func_;
616
965
  Data_Object<Exception_Handler> handler_;
617
966
  Address_Registration_Guard handler_guard_;
967
+ Arguments* arguments_;
618
968
  };
619
969
 
620
970
  template<typename Func_T, typename Self_T%(typename_list)>
@@ -628,14 +978,65 @@ public:
628
978
 
629
979
  Auto_Member_Function_Wrapper(
630
980
  Func func,
631
- Data_Object<Exception_Handler> handler);
981
+ Data_Object<Exception_Handler> handler,
982
+ Arguments* arguments = 0);
983
+
984
+ static VALUE call(int argc, VALUE* argv, VALUE self);
985
+
986
+ private:
987
+ Func func_;
988
+ Data_Object<Exception_Handler> handler_;
989
+ Address_Registration_Guard handler_guard_;
990
+ Arguments* arguments_;
991
+ };
992
+
993
+ // ---------------------------------------------------------------------
994
+ END
995
+ hpp_tail = <<END
996
+ template<typename Func_T, typename Ret_T, typename Self_T>
997
+ class Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T>
998
+ : public Wrapped_Function
999
+ {
1000
+ public:
1001
+ typedef Func_T Func;
1002
+
1003
+ static const int Num_Args = 0;
1004
+
1005
+ Auto_Member_Function_Wrapper(
1006
+ Func func,
1007
+ Data_Object<Exception_Handler> handler,
1008
+ Arguments* arguments = 0);
632
1009
 
633
- static VALUE call(VALUE self%(value_args));
1010
+ static VALUE call(int argc, VALUE* argv, VALUE self);
634
1011
 
635
1012
  private:
636
1013
  Func func_;
637
1014
  Data_Object<Exception_Handler> handler_;
638
1015
  Address_Registration_Guard handler_guard_;
1016
+ Arguments* arguments_;
1017
+ };
1018
+
1019
+ template<typename Func_T, typename Self_T>
1020
+ class Auto_Member_Function_Wrapper<Func_T, void, Self_T>
1021
+ : public Wrapped_Function
1022
+ {
1023
+ public:
1024
+ typedef Func_T Func;
1025
+
1026
+ static const int Num_Args = 0;
1027
+
1028
+ Auto_Member_Function_Wrapper(
1029
+ Func func,
1030
+ Data_Object<Exception_Handler> handler,
1031
+ Arguments* arguments = 0);
1032
+
1033
+ static VALUE call(int argc, VALUE* argv, VALUE self);
1034
+
1035
+ private:
1036
+ Func func_;
1037
+ Data_Object<Exception_Handler> handler_;
1038
+ Address_Registration_Guard handler_guard_;
1039
+ Arguments* arguments_;
639
1040
  };
640
1041
 
641
1042
  // ---------------------------------------------------------------------
@@ -650,16 +1051,16 @@ ipp_filename = 'detail/Auto_Member_Function_Wrapper.ipp'
650
1051
  hpp_filename = 'detail/Auto_Member_Function_Wrapper.hpp'
651
1052
  wrap_header(hpp_filename, 'Rice::detail', docstring, true) do |hpp|
652
1053
  wrap_header(ipp_filename, 'Rice::detail', nil, false, ipp_head) do |ipp|
653
- j = MAX_ARGS # TODO: what's the best way to iterate backward?
654
- while j >= 0 do
655
- t_array = (1..j).to_a
656
- value_args = t_array.map { |x| ", VALUE ruby_arg#{x}" }
1054
+ MAX_ARGS.downto(0) do |j|
1055
+ t_array = (0..j).to_a
1056
+ scan_def_list = t_array.map { |x| "varg#{x}" }.join(', ')
657
1057
  arg_list = t_array.map { |x| "arg#{x}" }.join(', ')
1058
+ scan_args_list = t_array.map { |x| "&varg#{x}"}.join(', ')
658
1059
  typenames = t_array.map { |x| ", Arg#{x}_T" }
659
1060
  typenames_n = t_array.map { |x| "Arg#{x}_T" }.join(', ')
660
- arg_convert_list = t_array.map do |x|
661
- "Arg#{x}_T arg#{x}(from_ruby<Arg#{x}_T>(ruby_arg#{x})); "
662
- end
1061
+ arg_convert_list = t_array.map do |x|
1062
+ "Arg#{x}_T arg#{x} = args->getArgumentOrDefault<Arg#{x}_T>(#{x}, varg#{x});"
1063
+ end.join("\n\t\t")
663
1064
  if j == MAX_ARGS then
664
1065
  typename_list = t_array.map { |x| ", typename Arg#{x}_T" }.join
665
1066
  typename_list_d = t_array.map { |x| ", typename Arg#{x}_T = void" }.join
@@ -670,23 +1071,23 @@ wrap_header(hpp_filename, 'Rice::detail', docstring, true) do |hpp|
670
1071
  specializations = "<Func_T, Ret_T, Self_T#{typenames}>"
671
1072
  end
672
1073
  ipp.puts fill_template(ipp_template, {
673
- :value_args => value_args,
1074
+ :scan_def_list => scan_def_list,
674
1075
  :arg_list => arg_list,
675
1076
  :typenames => typenames,
676
1077
  :typename_list => typename_list,
1078
+ :scan_args_list => scan_args_list,
677
1079
  :arg_convert_list => arg_convert_list,
678
1080
  })
679
1081
  hpp.puts fill_template(hpp_template, {
680
- :value_args => value_args,
681
1082
  :typenames => typenames,
682
- # :typenames_n => typenames_n,
683
1083
  :typename_list => typename_list,
684
1084
  :typename_list_d => typename_list_d,
685
- :j => j,
1085
+ :j => j + 1,
686
1086
  :specializations => specializations,
687
1087
  })
688
- j -= 1
689
1088
  end
1089
+ hpp.puts hpp_tail
1090
+ ipp.puts ipp_tail
690
1091
  end
691
1092
  end
692
1093
 
@@ -696,28 +1097,31 @@ ipp_template = <<END
696
1097
  template<typename Ret_T, %(typename_list)>
697
1098
  Wrapped_Function * wrap_function(
698
1099
  Ret_T (*func)(%(typenames)),
699
- Data_Object<Exception_Handler> handler)
1100
+ Data_Object<Exception_Handler> handler,
1101
+ Arguments* arguments)
700
1102
  {
701
1103
  typedef Ret_T (*Func)(%(typenames));
702
- return new Auto_Function_Wrapper<Func, Ret_T, %(typenames)>(func, handler);
1104
+ return new Auto_Function_Wrapper<Func, Ret_T, %(typenames)>(func, handler, arguments);
703
1105
  }
704
1106
 
705
1107
  template<typename Ret_T, typename Self_T%(typename_list_no_self)>
706
1108
  Wrapped_Function * wrap_function(
707
1109
  Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)),
708
- Data_Object<Exception_Handler> handler)
1110
+ Data_Object<Exception_Handler> handler,
1111
+ Arguments* arguments)
709
1112
  {
710
1113
  typedef Ret_T (Self_T::*Func)(%(typenames_no_self_no_comma));
711
- return new Auto_Member_Function_Wrapper<Func, Ret_T, Self_T%(typenames_no_self)>(func, handler);
1114
+ return new Auto_Member_Function_Wrapper<Func, Ret_T, Self_T%(typenames_no_self)>(func, handler, arguments);
712
1115
  }
713
1116
 
714
1117
  template<typename Ret_T, typename Self_T%(typename_list_no_self)>
715
1118
  Wrapped_Function * wrap_function(
716
1119
  Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)) const,
717
- Data_Object<Exception_Handler> handler)
1120
+ Data_Object<Exception_Handler> handler,
1121
+ Arguments* arguments)
718
1122
  {
719
1123
  typedef Ret_T (Self_T::*Func)(%(typenames_no_self_no_comma)) const;
720
- return new Auto_Member_Function_Wrapper<Func, Ret_T, Self_T%(typenames_no_self)>(func, handler);
1124
+ return new Auto_Member_Function_Wrapper<Func, Ret_T, Self_T%(typenames_no_self)>(func, handler, arguments);
721
1125
  }
722
1126
 
723
1127
  // ---------------------------------------------------------------------
@@ -726,17 +1130,20 @@ hpp_template = <<END
726
1130
  template<typename Ret_T, %(typename_list)>
727
1131
  Wrapped_Function * wrap_function(
728
1132
  Ret_T (*func)(%(typenames)),
729
- Data_Object<Exception_Handler> handler = Rice::Nil);
1133
+ Data_Object<Exception_Handler> handler = Rice::Nil,
1134
+ Arguments* arguments = 0);
730
1135
 
731
1136
  template<typename Ret_T, typename Self_T%(typename_list_no_self)>
732
1137
  Wrapped_Function * wrap_function(
733
1138
  Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)),
734
- Data_Object<Exception_Handler> handler = Rice::Nil);
1139
+ Data_Object<Exception_Handler> handler = Rice::Nil,
1140
+ Arguments* arguments = 0);
735
1141
 
736
1142
  template<typename Ret_T, typename Self_T%(typename_list_no_self)>
737
1143
  Wrapped_Function * wrap_function(
738
1144
  Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)) const,
739
- Data_Object<Exception_Handler> handler = Rice::Nil);
1145
+ Data_Object<Exception_Handler> handler = Rice::Nil,
1146
+ Arguments* arguments = 0);
740
1147
 
741
1148
  // ---------------------------------------------------------------------
742
1149
  END
@@ -745,16 +1152,39 @@ hpp_head = <<END
745
1152
  #include "Wrapped_Function.hpp"
746
1153
  #include "../Object_defn.hpp"
747
1154
  #include "../Data_Object.hpp"
1155
+ #include "Arguments.hpp"
1156
+
1157
+ END
1158
+ hpp_start = <<END
1159
+ template<typename Ret_T>
1160
+ Wrapped_Function * wrap_function(
1161
+ Ret_T (*func)(),
1162
+ Data_Object<Exception_Handler> handler = Rice::Nil,
1163
+ Arguments* arguments = 0);
748
1164
 
749
1165
  END
750
1166
  ipp_head = <<END
751
1167
  #include "Auto_Function_Wrapper.hpp"
752
1168
  #include "Auto_Member_Function_Wrapper.hpp"
1169
+ END
1170
+ ipp_start = <<END
1171
+ template<typename Ret_T>
1172
+ Wrapped_Function * wrap_function(
1173
+ Ret_T (*func)(),
1174
+ Data_Object<Exception_Handler> handler,
1175
+ Arguments* arguments)
1176
+ {
1177
+ typedef Ret_T (*Func)();
1178
+ return new Auto_Function_Wrapper<Func, Ret_T>(func, handler, arguments);
1179
+ }
1180
+
753
1181
  END
754
1182
  ipp_filename = 'detail/wrap_function.ipp'
755
1183
  hpp_filename = 'detail/wrap_function.hpp'
756
1184
  wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head) do |hpp|
757
1185
  wrap_header(ipp_filename, 'Rice::detail', nil, false, ipp_head) do |ipp|
1186
+ ipp.puts ipp_start
1187
+ hpp.puts hpp_start
758
1188
  for j in 0..MAX_ARGS do
759
1189
  t_array = (0..j).to_a
760
1190
  typenames = t_array.map { |x| "Arg#{x}_T" }.join(', ')
@@ -806,6 +1236,19 @@ public:
806
1236
  }
807
1237
  };
808
1238
 
1239
+ END
1240
+
1241
+ hpp_self_template = <<END
1242
+ template<typename T%(typename_list)>
1243
+ class Constructor<T, Object%(type_list)%(void_list)>
1244
+ {
1245
+ public:
1246
+ static void construct(Object self%(arg_list))
1247
+ {
1248
+ DATA_PTR(self.value()) = new T(self%(arg_names));
1249
+ }
1250
+ };
1251
+
809
1252
  END
810
1253
  hpp_head = <<END
811
1254
  #include "to_from_ruby_defn.hpp"
@@ -820,18 +1263,40 @@ wrap_header(hpp_filename, 'Rice', nil, false, hpp_head) do |hpp|
820
1263
  typename_list = t_array.map { |x| ", typename Arg#{x}_T" }
821
1264
  type_list = t_array.map { |x| ", Arg#{x}_T" }
822
1265
  void_list = o_array.map { |x| ", void" }
1266
+
823
1267
  arg_list = t_array.map { |x| ", Arg#{x}_T arg#{x}" }
824
1268
  arg_names = t_array.map { |x| "arg#{x}" }.join(', ')
1269
+
825
1270
  hpp.puts fill_template(hpp_template, {
826
1271
  :typename_list => typename_list,
827
1272
  :type_list => type_list,
828
1273
  :void_list => void_list,
829
1274
  :arg_list => arg_list,
830
- :arg_names => arg_names,
1275
+ :arg_names => arg_names
1276
+ })
1277
+ end
1278
+
1279
+ # For the self / Director system
1280
+ for j in 0..(MAX_ARGS - 1) do
1281
+ t_array = (1..j).to_a
1282
+ o_array = (j..(MAX_ARGS - 1)).to_a
1283
+ typename_list = t_array.map { |x| ", typename Arg#{x}_T" }
1284
+ type_list = t_array.map { |x| ", Arg#{x}_T" }
1285
+ void_list = o_array.map { |x| ", void" }
1286
+
1287
+ arg_list = t_array.map { |x| ", Arg#{x}_T arg#{x}" }
1288
+ arg_names = t_array.map { |x| ", arg#{x}" }
1289
+
1290
+ hpp.puts fill_template(hpp_self_template, {
1291
+ :typename_list => typename_list,
1292
+ :type_list => type_list,
1293
+ :void_list => void_list,
1294
+ :arg_list => arg_list,
1295
+ :arg_names => arg_names
831
1296
  })
832
1297
  end
833
1298
  end
834
-
1299
+
835
1300
  if ARGV[0] == '--clean' then
836
1301
  $filenames.each do |filename|
837
1302
  File.rm_f(filename)