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.
- data/Doxyfile +1 -1
- data/Makefile.in +3 -2
- data/README +247 -16
- data/aclocal.m4 +62 -51
- data/configure +1585 -1456
- data/extconf.rb +9 -1
- data/rice/Arg.hpp +8 -0
- data/rice/Arg_impl.hpp +124 -0
- data/rice/Arg_operators.cpp +21 -0
- data/rice/Arg_operators.hpp +19 -0
- data/rice/Constructor.hpp +150 -0
- data/rice/Data_Type.ipp +51 -6
- data/rice/Director.cpp +19 -0
- data/rice/Director.hpp +47 -0
- data/rice/Enum.hpp +2 -3
- data/rice/Enum.ipp +1 -1
- data/rice/Hash.hpp +1 -1
- data/rice/Makefile.am +7 -0
- data/rice/Makefile.in +18 -7
- data/rice/Module_impl.hpp +36 -3
- data/rice/Module_impl.ipp +56 -7
- data/rice/VM.cpp +2 -2
- data/rice/config.hpp +1 -1
- data/rice/detail/Arguments.hpp +118 -0
- data/rice/detail/Auto_Function_Wrapper.hpp +206 -96
- data/rice/detail/Auto_Function_Wrapper.ipp +1687 -144
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +234 -123
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +1133 -306
- data/rice/detail/Caster.hpp +3 -1
- data/rice/detail/creation_funcs.hpp +0 -8
- data/rice/detail/creation_funcs.ipp +1 -27
- data/rice/detail/define_method_and_auto_wrap.hpp +3 -1
- data/rice/detail/define_method_and_auto_wrap.ipp +4 -3
- data/rice/detail/object_call.ipp +1 -1
- data/rice/detail/ruby.hpp +1 -33
- data/rice/detail/wrap_function.hpp +103 -48
- data/rice/detail/wrap_function.ipp +154 -96
- data/rice/generate_code.rb +520 -55
- data/rice/global_function.hpp +12 -1
- data/rice/global_function.ipp +14 -2
- data/ruby/Makefile.in +5 -4
- data/ruby/lib/Makefile.in +4 -3
- data/ruby/lib/version.rb +1 -1
- data/sample/Makefile.in +4 -3
- data/test/Makefile.am +2 -0
- data/test/Makefile.in +32 -13
- data/test/test_Class.cpp +36 -14
- data/test/test_Constructor.cpp +176 -1
- data/test/test_Data_Type.cpp +121 -0
- data/test/test_Director.cpp +225 -0
- data/test/test_Enum.cpp +33 -0
- data/test/test_Module.cpp +175 -0
- data/test/test_global_functions.cpp +70 -1
- metadata +27 -7
data/rice/generate_code.rb
CHANGED
@@ -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 = '
|
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(
|
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
|
-
|
334
|
-
|
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(
|
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
|
-
|
376
|
-
|
377
|
-
|
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(
|
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(
|
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
|
-
|
463
|
-
while j >= 0 do
|
664
|
+
MAX_ARGS.downto(0) do |j|
|
464
665
|
t_array = (0..j).to_a
|
465
|
-
|
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
|
469
|
-
"Arg#{x}_T 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
|
-
:
|
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
|
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
|
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
|
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
|
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
|
-
|
654
|
-
|
655
|
-
t_array
|
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
|
661
|
-
"Arg#{x}_T 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
|
-
:
|
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)
|