rice 1.0.2 → 1.1.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/COPYING +2 -2
- data/Doxyfile +1 -1
- data/Makefile.in +8 -3
- data/Rakefile +3 -3
- data/config.guess +30 -49
- data/config.sub +4 -22
- data/configure +319 -104
- data/configure.ac +6 -2
- data/doxygen.ac +2 -2
- data/extconf.rb +22 -0
- data/post-autoconf.rb +3 -3
- data/post-automake.rb +2 -2
- data/rice/Array.ipp +7 -6
- data/rice/Critical_Guard.hpp +6 -0
- data/rice/Critical_Guard.ipp +6 -0
- data/rice/Data_Object.hpp +1 -120
- data/rice/Data_Object.ipp +5 -1
- data/rice/Data_Object_defn.hpp +132 -0
- data/rice/Data_Type.ipp +18 -2
- data/rice/Enum.ipp +3 -3
- data/rice/Exception.hpp +1 -61
- data/rice/Exception_Base.hpp +2 -24
- data/rice/Exception_Base.ipp +2 -0
- data/rice/Exception_Base_defn.hpp +27 -0
- data/rice/Exception_defn.hpp +69 -0
- data/rice/Hash.hpp +5 -1
- data/rice/Hash.ipp +7 -7
- data/rice/Makefile.am +20 -3
- data/rice/Makefile.in +39 -4
- data/rice/Module.cpp +11 -3
- data/rice/Module_impl.hpp +20 -9
- data/rice/Module_impl.ipp +84 -87
- data/rice/Object.cpp +1 -1
- data/rice/VM.cpp +14 -1
- data/rice/VM.hpp +6 -1
- data/rice/config.hpp +24 -3
- data/rice/config.hpp.in +21 -0
- data/rice/detail/Auto_Function_Wrapper.hpp +97 -65
- data/rice/detail/Auto_Function_Wrapper.ipp +160 -128
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +96 -64
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +160 -128
- data/rice/detail/Exception_Handler.hpp +2 -112
- data/rice/detail/Exception_Handler.ipp +68 -0
- data/rice/detail/Exception_Handler_defn.hpp +96 -0
- data/rice/detail/Iterator.hpp +93 -0
- data/rice/detail/check_ruby_type.cpp +8 -2
- data/rice/detail/creation_funcs.ipp +2 -2
- data/rice/detail/define_method_and_auto_wrap.hpp +4 -2
- data/rice/detail/define_method_and_auto_wrap.ipp +14 -5
- data/rice/detail/env.hpp +4 -0
- data/rice/detail/method_data.cpp +362 -75
- data/rice/detail/method_data.cpp.rpp +301 -0
- data/rice/detail/method_data.hpp +6 -18
- data/rice/detail/mininode.cpp +1220 -0
- data/rice/detail/mininode.cpp.rpp +62 -0
- data/rice/detail/mininode.hpp +320 -0
- data/rice/detail/mininode.hpp.rpp +119 -0
- data/rice/detail/protect.cpp +4 -2
- data/rice/detail/ruby.hpp +44 -18
- data/rice/detail/ruby_version_code.hpp +6 -0
- data/rice/detail/ruby_version_code.hpp.in +6 -0
- data/rice/detail/rubysig.hpp +6 -0
- data/rice/detail/st.hpp +6 -2
- data/rice/detail/wrap_function.hpp +50 -48
- data/rice/detail/wrap_function.ipp +48 -48
- data/rice/generate_code.rb +43 -293
- data/rice/global_function.hpp +10 -4
- data/rice/global_function.ipp +1 -2
- data/rice/ruby_mark.hpp +13 -0
- data/rice/ruby_try_catch.hpp +1 -1
- data/rice/rubypp.rb +97 -0
- data/rice/to_from_ruby.ipp +3 -3
- data/ruby.ac +44 -8
- data/ruby/Makefile.in +2 -0
- data/ruby/lib/Makefile.in +2 -0
- data/ruby/lib/mkmf-rice.rb.in +4 -1
- data/ruby/lib/version.rb +3 -0
- data/sample/Makefile.am +2 -2
- data/sample/Makefile.in +4 -2
- data/test/Makefile.am +2 -1
- data/test/Makefile.in +7 -2
- data/test/test_Array.cpp +2 -2
- data/test/test_Class.cpp +4 -1
- data/test/test_Critical_Guard.cpp +4 -0
- data/test/test_Data_Object.cpp +43 -3
- data/test/test_Hash.cpp +3 -3
- data/test/test_String.cpp +8 -8
- data/test/test_VM.cpp +1 -1
- data/test/test_global_functions.cpp +45 -0
- data/test/test_rice.rb +5 -0
- metadata +115 -98
- data/rice/detail/Iterator_Definer.hpp +0 -98
@@ -1,118 +1,8 @@
|
|
1
1
|
#ifndef Rice__detail__Exception_Handler__hpp_
|
2
2
|
#define Rice__detail__Exception_Handler__hpp_
|
3
3
|
|
4
|
-
#include "
|
5
|
-
#
|
6
|
-
|
7
|
-
namespace Rice
|
8
|
-
{
|
9
|
-
|
10
|
-
namespace detail
|
11
|
-
{
|
12
|
-
|
13
|
-
// A class for converting C++ exceptions to ruby exceptions. It's used
|
14
|
-
// like this:
|
15
|
-
//
|
16
|
-
// try
|
17
|
-
// {
|
18
|
-
// }
|
19
|
-
// catch(...)
|
20
|
-
// {
|
21
|
-
// handler->handle_exception();
|
22
|
-
// }
|
23
|
-
//
|
24
|
-
// If an exception is thrown the handler will pass the exception up the
|
25
|
-
// chain, then the last handler in the chain will throw the exception
|
26
|
-
// down the chain until a lower handler can handle it, e.g.:
|
27
|
-
//
|
28
|
-
// try
|
29
|
-
// {
|
30
|
-
// return call_next_exception_handler();
|
31
|
-
// }
|
32
|
-
// catch(MyException const & ex)
|
33
|
-
// {
|
34
|
-
// throw Rice::Exception(rb_cMyException, "%s", ex.what());
|
35
|
-
// }
|
36
|
-
//
|
37
|
-
class Exception_Handler
|
38
|
-
{
|
39
|
-
public:
|
40
|
-
Exception_Handler(Exception_Handler const * next_exception_handler)
|
41
|
-
: next_exception_handler_(next_exception_handler)
|
42
|
-
{
|
43
|
-
}
|
44
|
-
|
45
|
-
virtual ~Exception_Handler()
|
46
|
-
{
|
47
|
-
}
|
48
|
-
|
49
|
-
virtual VALUE handle_exception() const = 0;
|
50
|
-
|
51
|
-
VALUE call_next_exception_handler() const
|
52
|
-
{
|
53
|
-
return next_exception_handler_->handle_exception();
|
54
|
-
}
|
55
|
-
|
56
|
-
private:
|
57
|
-
Exception_Handler const * next_exception_handler_;
|
58
|
-
};
|
59
|
-
|
60
|
-
// The default exception handler just rethrows the exception. If there
|
61
|
-
// are other handlers in the chain, they will try to handle the rethrown
|
62
|
-
// exception.
|
63
|
-
class Default_Exception_Handler
|
64
|
-
: public Exception_Handler
|
65
|
-
{
|
66
|
-
public:
|
67
|
-
Default_Exception_Handler()
|
68
|
-
: Exception_Handler(0)
|
69
|
-
{
|
70
|
-
}
|
71
|
-
|
72
|
-
virtual VALUE handle_exception() const
|
73
|
-
{
|
74
|
-
throw;
|
75
|
-
}
|
76
|
-
};
|
77
|
-
|
78
|
-
// An exception handler that takes a functor as an argument. The
|
79
|
-
// functor should throw a Rice::Exception to handle the exception. If
|
80
|
-
// the functor does not handle the exception, the exception will be
|
81
|
-
// re-thrown.
|
82
|
-
template <typename Exception_T, typename Functor_T>
|
83
|
-
class Functor_Exception_Handler
|
84
|
-
: public Exception_Handler
|
85
|
-
{
|
86
|
-
public:
|
87
|
-
Functor_Exception_Handler(
|
88
|
-
Functor_T handler,
|
89
|
-
Exception_Handler const * next_exception_handler)
|
90
|
-
: Exception_Handler(next_exception_handler)
|
91
|
-
, handler_(handler)
|
92
|
-
{
|
93
|
-
}
|
94
|
-
|
95
|
-
private:
|
96
|
-
virtual VALUE handle_exception() const
|
97
|
-
{
|
98
|
-
try
|
99
|
-
{
|
100
|
-
return call_next_exception_handler();
|
101
|
-
}
|
102
|
-
catch(Exception_T const & ex)
|
103
|
-
{
|
104
|
-
handler_(ex);
|
105
|
-
throw;
|
106
|
-
}
|
107
|
-
}
|
108
|
-
|
109
|
-
private:
|
110
|
-
Functor_T handler_;
|
111
|
-
};
|
112
|
-
|
113
|
-
} // namespace detail
|
114
|
-
|
115
|
-
} // namespace Rice
|
4
|
+
#include "Exception_Handler_defn.hpp"
|
5
|
+
#include "Exception_Handler.ipp"
|
116
6
|
|
117
7
|
#endif // Rice__detail__Exception_Handler__hpp_
|
118
8
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#include "../Data_Type_defn.hpp"
|
2
|
+
|
3
|
+
inline
|
4
|
+
Rice::detail::Exception_Handler::
|
5
|
+
Exception_Handler(
|
6
|
+
Data_Object<Exception_Handler> next_exception_handler)
|
7
|
+
: next_exception_handler_(next_exception_handler)
|
8
|
+
, next_exception_handler_guard_(&next_exception_handler_)
|
9
|
+
{
|
10
|
+
}
|
11
|
+
|
12
|
+
inline
|
13
|
+
Rice::detail::Exception_Handler::
|
14
|
+
~Exception_Handler()
|
15
|
+
{
|
16
|
+
}
|
17
|
+
|
18
|
+
inline
|
19
|
+
VALUE
|
20
|
+
Rice::detail::Exception_Handler::
|
21
|
+
call_next_exception_handler() const
|
22
|
+
{
|
23
|
+
return next_exception_handler_->handle_exception();
|
24
|
+
}
|
25
|
+
|
26
|
+
inline Rice::detail::Default_Exception_Handler::
|
27
|
+
Default_Exception_Handler()
|
28
|
+
: Exception_Handler(
|
29
|
+
Data_Object<Exception_Handler>(0, rb_cObject))
|
30
|
+
{
|
31
|
+
}
|
32
|
+
|
33
|
+
inline
|
34
|
+
VALUE
|
35
|
+
Rice::detail::Default_Exception_Handler::
|
36
|
+
handle_exception() const
|
37
|
+
{
|
38
|
+
throw;
|
39
|
+
}
|
40
|
+
|
41
|
+
template <typename Exception_T, typename Functor_T>
|
42
|
+
inline
|
43
|
+
Rice::detail::Functor_Exception_Handler<Exception_T, Functor_T>::
|
44
|
+
Functor_Exception_Handler(
|
45
|
+
Functor_T handler,
|
46
|
+
Data_Object<Exception_Handler> next_exception_handler)
|
47
|
+
: Exception_Handler(next_exception_handler)
|
48
|
+
, handler_(handler)
|
49
|
+
{
|
50
|
+
}
|
51
|
+
|
52
|
+
template <typename Exception_T, typename Functor_T>
|
53
|
+
inline
|
54
|
+
VALUE
|
55
|
+
Rice::detail::Functor_Exception_Handler<Exception_T, Functor_T>::
|
56
|
+
handle_exception() const
|
57
|
+
{
|
58
|
+
try
|
59
|
+
{
|
60
|
+
return call_next_exception_handler();
|
61
|
+
}
|
62
|
+
catch(Exception_T const & ex)
|
63
|
+
{
|
64
|
+
handler_(ex);
|
65
|
+
throw;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
#ifndef Rice__detail__Exception_Handler_defn__hpp_
|
2
|
+
#define Rice__detail__Exception_Handler_defn__hpp_
|
3
|
+
|
4
|
+
#include "ruby.h"
|
5
|
+
#undef TYPE
|
6
|
+
|
7
|
+
#include "Not_Copyable.hpp"
|
8
|
+
#include "../Address_Registration_Guard_defn.hpp"
|
9
|
+
#include "../Data_Object_defn.hpp"
|
10
|
+
|
11
|
+
namespace Rice
|
12
|
+
{
|
13
|
+
|
14
|
+
namespace detail
|
15
|
+
{
|
16
|
+
|
17
|
+
// A class for converting C++ exceptions to ruby exceptions. It's used
|
18
|
+
// like this:
|
19
|
+
//
|
20
|
+
// try
|
21
|
+
// {
|
22
|
+
// }
|
23
|
+
// catch(...)
|
24
|
+
// {
|
25
|
+
// handler->handle_exception();
|
26
|
+
// }
|
27
|
+
//
|
28
|
+
// If an exception is thrown the handler will pass the exception up the
|
29
|
+
// chain, then the last handler in the chain will throw the exception
|
30
|
+
// down the chain until a lower handler can handle it, e.g.:
|
31
|
+
//
|
32
|
+
// try
|
33
|
+
// {
|
34
|
+
// return call_next_exception_handler();
|
35
|
+
// }
|
36
|
+
// catch(MyException const & ex)
|
37
|
+
// {
|
38
|
+
// throw Rice::Exception(rb_cMyException, "%s", ex.what());
|
39
|
+
// }
|
40
|
+
//
|
41
|
+
class Exception_Handler
|
42
|
+
: public Rice::detail::Not_Copyable
|
43
|
+
{
|
44
|
+
public:
|
45
|
+
Exception_Handler(
|
46
|
+
Data_Object<Exception_Handler> next_exception_handler);
|
47
|
+
|
48
|
+
virtual ~Exception_Handler();
|
49
|
+
|
50
|
+
virtual VALUE handle_exception() const = 0;
|
51
|
+
|
52
|
+
VALUE call_next_exception_handler() const;
|
53
|
+
|
54
|
+
private:
|
55
|
+
Data_Object<Exception_Handler> next_exception_handler_;
|
56
|
+
Address_Registration_Guard next_exception_handler_guard_;
|
57
|
+
};
|
58
|
+
|
59
|
+
// The default exception handler just rethrows the exception. If there
|
60
|
+
// are other handlers in the chain, they will try to handle the rethrown
|
61
|
+
// exception.
|
62
|
+
class Default_Exception_Handler
|
63
|
+
: public Exception_Handler
|
64
|
+
{
|
65
|
+
public:
|
66
|
+
Default_Exception_Handler();
|
67
|
+
|
68
|
+
virtual VALUE handle_exception() const;
|
69
|
+
};
|
70
|
+
|
71
|
+
// An exception handler that takes a functor as an argument. The
|
72
|
+
// functor should throw a Rice::Exception to handle the exception. If
|
73
|
+
// the functor does not handle the exception, the exception will be
|
74
|
+
// re-thrown.
|
75
|
+
template <typename Exception_T, typename Functor_T>
|
76
|
+
class Functor_Exception_Handler
|
77
|
+
: public Exception_Handler
|
78
|
+
{
|
79
|
+
public:
|
80
|
+
Functor_Exception_Handler(
|
81
|
+
Functor_T handler,
|
82
|
+
Data_Object<Exception_Handler> next_exception_handler);
|
83
|
+
|
84
|
+
private:
|
85
|
+
virtual VALUE handle_exception() const;
|
86
|
+
|
87
|
+
private:
|
88
|
+
Functor_T handler_;
|
89
|
+
};
|
90
|
+
|
91
|
+
} // namespace detail
|
92
|
+
|
93
|
+
} // namespace Rice
|
94
|
+
|
95
|
+
#endif // Rice__detail__Exception_Handler_defn__hpp_
|
96
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
#ifndef Rice__detail__Iterator__hpp_
|
2
|
+
#define Rice__detail__Iterator__hpp_
|
3
|
+
|
4
|
+
#include "method_data.hpp"
|
5
|
+
#include "ruby.hpp"
|
6
|
+
#include "../protect.hpp"
|
7
|
+
#include "../Data_Object.hpp"
|
8
|
+
#include "../Identifier.hpp"
|
9
|
+
|
10
|
+
namespace Rice
|
11
|
+
{
|
12
|
+
|
13
|
+
namespace detail
|
14
|
+
{
|
15
|
+
|
16
|
+
class Iterator
|
17
|
+
{
|
18
|
+
public:
|
19
|
+
virtual ~Iterator() { }
|
20
|
+
|
21
|
+
virtual VALUE call_impl(VALUE self) = 0;
|
22
|
+
|
23
|
+
static VALUE call(VALUE self)
|
24
|
+
{
|
25
|
+
VALUE data = (VALUE)method_data();
|
26
|
+
Data_Object<Iterator> iterator(
|
27
|
+
data,
|
28
|
+
Data_Type<Iterator>());
|
29
|
+
return iterator->call_impl(self);
|
30
|
+
}
|
31
|
+
};
|
32
|
+
|
33
|
+
template<typename T, typename Iterator_T>
|
34
|
+
class Iterator_Impl
|
35
|
+
: public Iterator
|
36
|
+
{
|
37
|
+
public:
|
38
|
+
Iterator_Impl(
|
39
|
+
Iterator_T (T::*begin)(),
|
40
|
+
Iterator_T (T::*end)(),
|
41
|
+
Data_Type<T> data_type)
|
42
|
+
: begin_(begin)
|
43
|
+
, end_(end)
|
44
|
+
, data_type_(data_type)
|
45
|
+
{
|
46
|
+
}
|
47
|
+
|
48
|
+
virtual VALUE call_impl(VALUE self)
|
49
|
+
{
|
50
|
+
Data_Object<T> obj(self, data_type_);
|
51
|
+
Iterator_T it = obj->begin();
|
52
|
+
Iterator_T end = obj->end();
|
53
|
+
for(; it != end; ++it)
|
54
|
+
{
|
55
|
+
Rice::protect(rb_yield, to_ruby(*it));
|
56
|
+
}
|
57
|
+
return self;
|
58
|
+
}
|
59
|
+
|
60
|
+
private:
|
61
|
+
Iterator_T (T::*begin_)();
|
62
|
+
Iterator_T (T::*end_)();
|
63
|
+
Data_Type<T> data_type_;
|
64
|
+
};
|
65
|
+
|
66
|
+
template<typename T, typename Iterator_T>
|
67
|
+
void define_iterator(
|
68
|
+
Module klass,
|
69
|
+
Identifier name,
|
70
|
+
Iterator_T (T::*begin)(),
|
71
|
+
Iterator_T (T::*end)())
|
72
|
+
{
|
73
|
+
Data_Type<Iterator> iterator_klass;
|
74
|
+
Data_Object<Iterator> iterator(
|
75
|
+
new Iterator_Impl<T, Iterator_T>(
|
76
|
+
begin,
|
77
|
+
end,
|
78
|
+
Data_Type<T>(klass)),
|
79
|
+
iterator_klass);
|
80
|
+
define_method_with_data(
|
81
|
+
klass,
|
82
|
+
name,
|
83
|
+
(RUBY_METHOD_FUNC)iterator->call,
|
84
|
+
0,
|
85
|
+
iterator);
|
86
|
+
}
|
87
|
+
|
88
|
+
} // namespace detail
|
89
|
+
|
90
|
+
} // namespace Rice
|
91
|
+
|
92
|
+
#endif // Rice__detail__Iterator__hpp_
|
93
|
+
|
@@ -11,11 +11,17 @@ check_ruby_type(
|
|
11
11
|
if( !rb_obj_is_kind_of(value, klass) ||
|
12
12
|
(!include_super && rb_obj_class(value) != klass))
|
13
13
|
{
|
14
|
+
// Not sure why this stuff can't be chained
|
15
|
+
VALUE gotV = protect(rb_mod_name, rb_obj_class(value));
|
16
|
+
char* got = StringValuePtr(gotV);
|
17
|
+
VALUE exptV = protect(rb_mod_name, klass);
|
18
|
+
char* expected = StringValuePtr(exptV);
|
19
|
+
|
14
20
|
throw Exception(
|
15
21
|
rb_eTypeError,
|
16
22
|
"wrong argument type %s (expected %s)",
|
17
|
-
|
18
|
-
|
23
|
+
got, expected
|
24
|
+
);
|
19
25
|
}
|
20
26
|
}
|
21
27
|
|
@@ -21,7 +21,7 @@ inline void define_alloc_func(
|
|
21
21
|
Class const & klass,
|
22
22
|
RUBY_VALUE_FUNC allocate_func)
|
23
23
|
{
|
24
|
-
#if
|
24
|
+
#if RICE__RUBY_VERSION_CODE < 170
|
25
25
|
klass.define_singleton_method("allocate", allocate_func);
|
26
26
|
klass.define_singleton_method("new", ruby_16_new);
|
27
27
|
#else
|
@@ -41,7 +41,7 @@ inline void define_creation_funcs(
|
|
41
41
|
|
42
42
|
inline void undef_alloc_func(Class const & klass)
|
43
43
|
{
|
44
|
-
#if
|
44
|
+
#if RICE__RUBY_VERSION_CODE >= 170
|
45
45
|
rb_undef_alloc_func(klass);
|
46
46
|
#else
|
47
47
|
rb_undef_method(CLASS_OF(klass), "new");
|
@@ -2,6 +2,8 @@
|
|
2
2
|
#define Rice__detail__define_method_and_auto_wrap__hpp_
|
3
3
|
|
4
4
|
#include "ruby.hpp"
|
5
|
+
#include "../Data_Object.hpp"
|
6
|
+
#include "../Identifier.hpp"
|
5
7
|
|
6
8
|
namespace Rice
|
7
9
|
{
|
@@ -14,9 +16,9 @@ class Exception_Handler;
|
|
14
16
|
template<typename Fun_T>
|
15
17
|
void define_method_and_auto_wrap(
|
16
18
|
VALUE klass,
|
17
|
-
|
19
|
+
Identifier name,
|
18
20
|
Fun_T function,
|
19
|
-
Exception_Handler
|
21
|
+
Data_Object<Exception_Handler> handler);
|
20
22
|
|
21
23
|
} // detail
|
22
24
|
|
@@ -3,18 +3,27 @@
|
|
3
3
|
|
4
4
|
#include "wrap_function.hpp"
|
5
5
|
#include "method_data.hpp"
|
6
|
-
#include "
|
6
|
+
#include "Exception_Handler_defn.hpp"
|
7
|
+
#include "../protect.hpp"
|
7
8
|
|
8
9
|
template<typename Fun_T>
|
9
10
|
void Rice::detail::
|
10
11
|
define_method_and_auto_wrap(
|
11
12
|
VALUE klass,
|
12
|
-
|
13
|
+
Identifier name,
|
13
14
|
Fun_T function,
|
14
|
-
Exception_Handler
|
15
|
+
Data_Object<Exception_Handler> handler)
|
15
16
|
{
|
16
|
-
Wrapped_Function
|
17
|
-
|
17
|
+
Data_Object<Wrapped_Function> f(
|
18
|
+
wrap_function(function, handler),
|
19
|
+
rb_cObject);
|
20
|
+
Rice::protect(
|
21
|
+
define_method_with_data,
|
22
|
+
klass,
|
23
|
+
name.id(),
|
24
|
+
f->func(),
|
25
|
+
f->arity(),
|
26
|
+
f);
|
18
27
|
}
|
19
28
|
|
20
29
|
#endif // Rice__detail__define_method_and_auto_wrap__ipp_
|