rice 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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)