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.
Files changed (92) hide show
  1. data/COPYING +2 -2
  2. data/Doxyfile +1 -1
  3. data/Makefile.in +8 -3
  4. data/Rakefile +3 -3
  5. data/config.guess +30 -49
  6. data/config.sub +4 -22
  7. data/configure +319 -104
  8. data/configure.ac +6 -2
  9. data/doxygen.ac +2 -2
  10. data/extconf.rb +22 -0
  11. data/post-autoconf.rb +3 -3
  12. data/post-automake.rb +2 -2
  13. data/rice/Array.ipp +7 -6
  14. data/rice/Critical_Guard.hpp +6 -0
  15. data/rice/Critical_Guard.ipp +6 -0
  16. data/rice/Data_Object.hpp +1 -120
  17. data/rice/Data_Object.ipp +5 -1
  18. data/rice/Data_Object_defn.hpp +132 -0
  19. data/rice/Data_Type.ipp +18 -2
  20. data/rice/Enum.ipp +3 -3
  21. data/rice/Exception.hpp +1 -61
  22. data/rice/Exception_Base.hpp +2 -24
  23. data/rice/Exception_Base.ipp +2 -0
  24. data/rice/Exception_Base_defn.hpp +27 -0
  25. data/rice/Exception_defn.hpp +69 -0
  26. data/rice/Hash.hpp +5 -1
  27. data/rice/Hash.ipp +7 -7
  28. data/rice/Makefile.am +20 -3
  29. data/rice/Makefile.in +39 -4
  30. data/rice/Module.cpp +11 -3
  31. data/rice/Module_impl.hpp +20 -9
  32. data/rice/Module_impl.ipp +84 -87
  33. data/rice/Object.cpp +1 -1
  34. data/rice/VM.cpp +14 -1
  35. data/rice/VM.hpp +6 -1
  36. data/rice/config.hpp +24 -3
  37. data/rice/config.hpp.in +21 -0
  38. data/rice/detail/Auto_Function_Wrapper.hpp +97 -65
  39. data/rice/detail/Auto_Function_Wrapper.ipp +160 -128
  40. data/rice/detail/Auto_Member_Function_Wrapper.hpp +96 -64
  41. data/rice/detail/Auto_Member_Function_Wrapper.ipp +160 -128
  42. data/rice/detail/Exception_Handler.hpp +2 -112
  43. data/rice/detail/Exception_Handler.ipp +68 -0
  44. data/rice/detail/Exception_Handler_defn.hpp +96 -0
  45. data/rice/detail/Iterator.hpp +93 -0
  46. data/rice/detail/check_ruby_type.cpp +8 -2
  47. data/rice/detail/creation_funcs.ipp +2 -2
  48. data/rice/detail/define_method_and_auto_wrap.hpp +4 -2
  49. data/rice/detail/define_method_and_auto_wrap.ipp +14 -5
  50. data/rice/detail/env.hpp +4 -0
  51. data/rice/detail/method_data.cpp +362 -75
  52. data/rice/detail/method_data.cpp.rpp +301 -0
  53. data/rice/detail/method_data.hpp +6 -18
  54. data/rice/detail/mininode.cpp +1220 -0
  55. data/rice/detail/mininode.cpp.rpp +62 -0
  56. data/rice/detail/mininode.hpp +320 -0
  57. data/rice/detail/mininode.hpp.rpp +119 -0
  58. data/rice/detail/protect.cpp +4 -2
  59. data/rice/detail/ruby.hpp +44 -18
  60. data/rice/detail/ruby_version_code.hpp +6 -0
  61. data/rice/detail/ruby_version_code.hpp.in +6 -0
  62. data/rice/detail/rubysig.hpp +6 -0
  63. data/rice/detail/st.hpp +6 -2
  64. data/rice/detail/wrap_function.hpp +50 -48
  65. data/rice/detail/wrap_function.ipp +48 -48
  66. data/rice/generate_code.rb +43 -293
  67. data/rice/global_function.hpp +10 -4
  68. data/rice/global_function.ipp +1 -2
  69. data/rice/ruby_mark.hpp +13 -0
  70. data/rice/ruby_try_catch.hpp +1 -1
  71. data/rice/rubypp.rb +97 -0
  72. data/rice/to_from_ruby.ipp +3 -3
  73. data/ruby.ac +44 -8
  74. data/ruby/Makefile.in +2 -0
  75. data/ruby/lib/Makefile.in +2 -0
  76. data/ruby/lib/mkmf-rice.rb.in +4 -1
  77. data/ruby/lib/version.rb +3 -0
  78. data/sample/Makefile.am +2 -2
  79. data/sample/Makefile.in +4 -2
  80. data/test/Makefile.am +2 -1
  81. data/test/Makefile.in +7 -2
  82. data/test/test_Array.cpp +2 -2
  83. data/test/test_Class.cpp +4 -1
  84. data/test/test_Critical_Guard.cpp +4 -0
  85. data/test/test_Data_Object.cpp +43 -3
  86. data/test/test_Hash.cpp +3 -3
  87. data/test/test_String.cpp +8 -8
  88. data/test/test_VM.cpp +1 -1
  89. data/test/test_global_functions.cpp +45 -0
  90. data/test/test_rice.rb +5 -0
  91. metadata +115 -98
  92. data/rice/detail/Iterator_Definer.hpp +0 -98
data/configure.ac CHANGED
@@ -1,4 +1,4 @@
1
- AC_INIT(rice, 1.0)
1
+ AC_INIT(rice, 1.1)
2
2
  AC_CONFIG_SRCDIR(rice)
3
3
  AM_INIT_AUTOMAKE
4
4
 
@@ -40,8 +40,12 @@ DX_INIT_DOXYGEN(rice, Doxyfile, doc)
40
40
  RICE_SAMPLES="enum map inheritance"
41
41
  AC_SUBST(RICE_SAMPLES)
42
42
 
43
+ RICE_ROOT=`pwd`
44
+ AC_SUBST(RICE_ROOT)
45
+
43
46
  AC_CONFIG_FILES(Makefile rice/Makefile test/Makefile sample/Makefile
44
- ruby/Makefile ruby/lib/Makefile ruby/lib/mkmf-rice.rb)
47
+ ruby/Makefile ruby/lib/Makefile ruby/lib/mkmf-rice.rb
48
+ rice/detail/ruby_version_code.hpp)
45
49
  AC_OUTPUT
46
50
 
47
51
  dnl Work around a bug in older versions of Rubygems
data/doxygen.ac CHANGED
@@ -78,7 +78,7 @@ AC_DEFUN([DX_REQUIRE_PROG], [
78
78
  AC_PATH_TOOL([$1], [$2])
79
79
  if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then
80
80
  AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION])
81
- AC_SUBST([DX_FLAG_[]DX_CURRENT_FEATURE], 0)
81
+ AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0)
82
82
  fi
83
83
  ])
84
84
 
@@ -101,7 +101,7 @@ test "$DX_FLAG_$1" = "$2" \
101
101
  # ----------------------------------------------------------
102
102
  # Turn off the DX_CURRENT_FEATURE if the required feature is off.
103
103
  AC_DEFUN([DX_CLEAR_DEPEND], [
104
- test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_[]DX_CURRENT_FEATURE], 0)
104
+ test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0)
105
105
  ])
106
106
 
107
107
  # DX_FEATURE_ARG(FEATURE, DESCRIPTION,
data/extconf.rb ADDED
@@ -0,0 +1,22 @@
1
+ # To allow Rice to be installed on non-system installs of Ruby (say the user has
2
+ # 1.8.7 and 1.9.0 installed), the rice gem uses the extconf version of deployment
3
+ # rather than configure. This file will get the appropriate values from CONFIG
4
+ # for the Ruby that this library is being installed into and generate
5
+ # the proper arguments to ./configure.
6
+ #
7
+ # With this, installing on any of the Ruby versions installed on a machine is as
8
+ # easy as /path/to/the/gem install rice.
9
+ #
10
+ # This isn't actually an extconf.rb file, all it needs to do is create a Makefile
11
+ # for gem to continue 'make'-ing. It needs to be named 'extconf.rb' to fit Rubygem's
12
+ # expectations
13
+
14
+ require 'rbconfig'
15
+ require 'rubygems'
16
+ require 'ruby/lib/version.rb'
17
+
18
+ gem_name = "rice-#{Rice::VERSION}"
19
+ prefix_dir = File.join(Gem.default_dir, "gems", gem_name, "ruby", "lib")
20
+ with_ruby = File.join(Config::CONFIG["bindir"], Config::CONFIG["RUBY_INSTALL_NAME"])
21
+
22
+ system "./configure --with-ruby=#{with_ruby} --prefix=#{prefix_dir}"
data/post-autoconf.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'ftools'
1
+ require 'fileutils'
2
2
  require 'find'
3
3
 
4
4
  def process(file)
@@ -10,7 +10,7 @@ def process(file)
10
10
  end
11
11
  end
12
12
  end
13
- File.mv("#{file}.pp", "#{file}")
13
+ FileUtils.mv("#{file}.pp", "#{file}")
14
14
  end
15
15
 
16
16
  process("configure") do |out, line|
@@ -19,4 +19,4 @@ process("configure") do |out, line|
19
19
  line.gsub!(/([^"'])(\$am_aux_dir)/, '\1\"\2\"')
20
20
  out.puts line
21
21
  end
22
- File.chmod(0700, "configure")
22
+ FileUtils.chmod(0700, "configure")
data/post-automake.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'ftools'
1
+ require 'fileutils'
2
2
  require 'find'
3
3
 
4
4
  def process(file)
@@ -10,7 +10,7 @@ def process(file)
10
10
  end
11
11
  end
12
12
  end
13
- File.mv("#{file}.pp", "#{file}")
13
+ FileUtils.mv("#{file}.pp", "#{file}")
14
14
  end
15
15
 
16
16
  Find.find(".") do |file|
data/rice/Array.ipp CHANGED
@@ -46,13 +46,14 @@ Array(T const (& a)[n])
46
46
  inline size_t Rice::Array::
47
47
  size() const
48
48
  {
49
- return (*this)->len;
49
+ return RARRAY_LEN(this->value());
50
50
  }
51
51
 
52
52
  inline Rice::Object Rice::Array::
53
53
  operator[](ptrdiff_t index) const
54
54
  {
55
- return (*this)->ptr[position_of(index)];
55
+ VALUE * ptr = RARRAY_PTR(this->value());
56
+ return ptr[position_of(index)];
56
57
  }
57
58
 
58
59
  inline Rice::Array::Proxy Rice::Array::
@@ -90,7 +91,7 @@ shift()
90
91
  inline VALUE * Rice::Array::
91
92
  to_c_array()
92
93
  {
93
- return (*this)->ptr;
94
+ return RARRAY_PTR(this->value());
94
95
  }
95
96
 
96
97
  inline size_t Rice::Array::
@@ -116,13 +117,13 @@ Proxy(Array array, size_t index)
116
117
  inline Rice::Array::Proxy::
117
118
  operator Rice::Object() const
118
119
  {
119
- return array_->ptr[index_];
120
+ return RARRAY_PTR(array_.value())[index_];
120
121
  }
121
122
 
122
123
  inline VALUE Rice::Array::Proxy::
123
124
  value() const
124
125
  {
125
- return array_->ptr[index_];
126
+ return RARRAY_PTR(array_.value())[index_];
126
127
  }
127
128
 
128
129
  template<typename T>
@@ -130,7 +131,7 @@ Rice::Object Rice::Array::Proxy::
130
131
  operator=(T const & value)
131
132
  {
132
133
  Object o = to_ruby(value);
133
- array_->ptr[index_] = o.value();
134
+ RARRAY_PTR(array_.value())[index_] = o.value();
134
135
  return o;
135
136
  }
136
137
 
@@ -1,6 +1,10 @@
1
1
  #ifndef Rice__ruby_Critical_Guard__hpp_
2
2
  #define Rice__ruby_Critical_Guard__hpp_
3
3
 
4
+ #include "detail/ruby_version_code.hpp"
5
+
6
+ #if RICE__RUBY_VERSION_CODE < 190
7
+
4
8
  namespace Rice
5
9
  {
6
10
 
@@ -28,6 +32,8 @@ public:
28
32
 
29
33
  }
30
34
 
35
+ #endif
36
+
31
37
  #include "Critical_Guard.ipp"
32
38
 
33
39
  #endif // Rice__ruby_Critical_Guard__hpp_
@@ -1,6 +1,10 @@
1
1
  #ifndef Rice__ruby_Critical_Guard__ipp_
2
2
  #define Rice__ruby_Critical_Guard__ipp_
3
3
 
4
+ #include "detail/ruby_version_code.hpp"
5
+
6
+ #if RICE__RUBY_VERSION_CODE < 190
7
+
4
8
  #include "detail/ruby.hpp"
5
9
  #include "detail/rubysig.hpp"
6
10
 
@@ -16,5 +20,7 @@ inline Rice::Critical_Guard::
16
20
  rb_thread_critical = 0;
17
21
  }
18
22
 
23
+ #endif
24
+
19
25
  #endif // Rice__ruby_Critical_Guard__ipp_
20
26
 
data/rice/Data_Object.hpp CHANGED
@@ -1,126 +1,7 @@
1
1
  #ifndef Rice__Data_Object__hpp_
2
2
  #define Rice__Data_Object__hpp_
3
3
 
4
- #include "Object_defn.hpp"
5
- #include "Data_Type_fwd.hpp"
6
- #include "Allocation_Strategies.hpp"
7
- #include "detail/to_ruby.hpp"
8
- #include "detail/ruby.hpp"
9
-
10
- /*! \file
11
- * \brief Provides a helper class for wrapping and unwrapping C++
12
- * objects as Ruby objects.
13
- */
14
-
15
- namespace Rice
16
- {
17
-
18
- //! A smartpointer-like wrapper for Ruby data objects.
19
- /*! A data object is a ruby object of type T_DATA, which is usually
20
- * created by using the Data_Wrap_Struct or Data_Make_Struct macro.
21
- * This class wraps creation of the data structure, providing a
22
- * type-safe object-oriented interface to the underlying C interface.
23
- * This class works in conjunction with the Data_Type class to ensure
24
- * type safety.
25
- *
26
- * Example:
27
- * \code
28
- * class Foo { };
29
- * ...
30
- * Data_Type<Foo> rb_cFoo = define_class("Foo");
31
- * ...
32
- * // Wrap:
33
- * Data_Object<Foo> foo1(new Foo);
34
- *
35
- * // Get value to return:
36
- * VALUE v = foo1.value()
37
- *
38
- * // Unwrap:
39
- * Data_Object<Foo> foo2(v, rb_cFoo);
40
- * \endcode
41
- */
42
- template<typename T>
43
- class Data_Object
44
- : public Object
45
- {
46
- public:
47
- //! A function that takes a T* and returns void.
48
- typedef void (*Ruby_Data_Func)(T * obj);
49
-
50
- //! Wrap a C++ object.
51
- /*! This constructor is analgous to calling Data_Wrap_Struct. Be
52
- * careful not to call this function more than once for the same
53
- * pointer (in general, it should only be called for newly
54
- * constructed objects that need to be managed by Ruby's garbage
55
- * collector).
56
- * \param obj the object to wrap.
57
- * \param klass the Ruby class to use for the newly created Ruby
58
- * object.
59
- * \param mark_func a function that gets called by the garbage
60
- * collector to mark the object's children.
61
- * \param free_func a function that gets called by the garbage
62
- * collector to free the object.
63
- */
64
- Data_Object(
65
- T * obj,
66
- VALUE klass = Data_Type<T>::klass(),
67
- Ruby_Data_Func mark_func = 0,
68
- Ruby_Data_Func free_func = Default_Allocation_Strategy<T>::free);
69
-
70
- //! Unwrap a Ruby object.
71
- /*! This constructor is analgous to calling Data_Get_Struct. Uses
72
- * Data_Type<T>::klass as the class of the object.
73
- * \param value the Ruby object to unwrap.
74
- */
75
- Data_Object(
76
- Object value);
77
-
78
- //! Unwrap a Ruby object.
79
- /*! This constructor is analgous to calling Data_Get_Struct. Will
80
- * throw an exception if the class of the object differs from the
81
- * specified class.
82
- * \param value the Ruby object to unwrap.
83
- * \param klass the expected class of the object.
84
- */
85
- template<typename U>
86
- Data_Object(
87
- Object value,
88
- Data_Type<U> const & klass = Data_Type<T>::klass());
89
-
90
- //! Make a copy of a Data_Object
91
- /*! \param other the Data_Object to copy.
92
- */
93
- Data_Object(Data_Object const & other);
94
-
95
- T & operator*() const { return *obj_; } //!< Return a reference to obj_
96
- T * operator->() const { return obj_; } //!< Return a pointer to obj_
97
- T * get() const { return obj_; } //!< Return a pointer to obj_
98
-
99
- //! Swap with another data object of the same type
100
- /*! \param ref the object with which to swap.
101
- */
102
- template<typename U>
103
- void swap(Data_Object<U> & ref);
104
-
105
- private:
106
- static void check_cpp_type(Data_Type<T> const & klass);
107
-
108
- private:
109
- T * obj_;
110
- };
111
-
112
- namespace detail
113
- {
114
- template<typename T>
115
- struct to_ruby_<Data_Object<T> >
116
- {
117
- static Rice::Object convert(Data_Object<T> const & x);
118
- };
119
- }
120
-
121
- } // namespace Rice
122
-
123
- #include "Object.hpp"
4
+ #include "Data_Object_defn.hpp"
124
5
  #include "Data_Object.ipp"
125
6
 
126
7
  #endif // Rice__Data_Object__hpp_
data/rice/Data_Object.ipp CHANGED
@@ -6,6 +6,10 @@
6
6
 
7
7
  #include <algorithm>
8
8
 
9
+ template<typename T>
10
+ const typename Rice::Default_Mark_Function<T>::Ruby_Data_Func
11
+ Rice::Default_Mark_Function<T>::mark = ruby_mark<T>;
12
+
9
13
  namespace Rice
10
14
  {
11
15
 
@@ -109,7 +113,7 @@ inline void Rice::Data_Object<T>::
109
113
  swap(Data_Object<U> & ref)
110
114
  {
111
115
  std::swap(obj_, ref.obj_);
112
- Object::swap(*this, ref);
116
+ Object::swap(ref);
113
117
  }
114
118
 
115
119
  template<typename T>
@@ -0,0 +1,132 @@
1
+ #ifndef Rice__Data_Object_defn__hpp_
2
+ #define Rice__Data_Object_defn__hpp_
3
+
4
+ #include "Object_defn.hpp"
5
+ #include "Data_Type_fwd.hpp"
6
+ #include "Allocation_Strategies.hpp"
7
+ #include "ruby_mark.hpp"
8
+ #include "detail/to_ruby.hpp"
9
+ #include "detail/ruby.hpp"
10
+
11
+ /*! \file
12
+ * \brief Provides a helper class for wrapping and unwrapping C++
13
+ * objects as Ruby objects.
14
+ */
15
+
16
+ namespace Rice
17
+ {
18
+
19
+ template<typename T>
20
+ struct Default_Mark_Function
21
+ {
22
+ typedef void (*Ruby_Data_Func)(T * obj);
23
+ static const Ruby_Data_Func mark;
24
+ };
25
+
26
+ //! A smartpointer-like wrapper for Ruby data objects.
27
+ /*! A data object is a ruby object of type T_DATA, which is usually
28
+ * created by using the Data_Wrap_Struct or Data_Make_Struct macro.
29
+ * This class wraps creation of the data structure, providing a
30
+ * type-safe object-oriented interface to the underlying C interface.
31
+ * This class works in conjunction with the Data_Type class to ensure
32
+ * type safety.
33
+ *
34
+ * Example:
35
+ * \code
36
+ * class Foo { };
37
+ * ...
38
+ * Data_Type<Foo> rb_cFoo = define_class("Foo");
39
+ * ...
40
+ * // Wrap:
41
+ * Data_Object<Foo> foo1(new Foo);
42
+ *
43
+ * // Get value to return:
44
+ * VALUE v = foo1.value()
45
+ *
46
+ * // Unwrap:
47
+ * Data_Object<Foo> foo2(v, rb_cFoo);
48
+ * \endcode
49
+ */
50
+ template<typename T>
51
+ class Data_Object
52
+ : public Object
53
+ {
54
+ public:
55
+ //! A function that takes a T* and returns void.
56
+ typedef void (*Ruby_Data_Func)(T * obj);
57
+
58
+ //! Wrap a C++ object.
59
+ /*! This constructor is analgous to calling Data_Wrap_Struct. Be
60
+ * careful not to call this function more than once for the same
61
+ * pointer (in general, it should only be called for newly
62
+ * constructed objects that need to be managed by Ruby's garbage
63
+ * collector).
64
+ * \param obj the object to wrap.
65
+ * \param klass the Ruby class to use for the newly created Ruby
66
+ * object.
67
+ * \param mark_func a function that gets called by the garbage
68
+ * collector to mark the object's children.
69
+ * \param free_func a function that gets called by the garbage
70
+ * collector to free the object.
71
+ */
72
+ Data_Object(
73
+ T * obj,
74
+ VALUE klass = Data_Type<T>::klass(),
75
+ Ruby_Data_Func mark_func = Default_Mark_Function<T>::mark,
76
+ Ruby_Data_Func free_func = Default_Allocation_Strategy<T>::free);
77
+
78
+ //! Unwrap a Ruby object.
79
+ /*! This constructor is analgous to calling Data_Get_Struct. Uses
80
+ * Data_Type<T>::klass as the class of the object.
81
+ * \param value the Ruby object to unwrap.
82
+ */
83
+ Data_Object(
84
+ Object value);
85
+
86
+ //! Unwrap a Ruby object.
87
+ /*! This constructor is analgous to calling Data_Get_Struct. Will
88
+ * throw an exception if the class of the object differs from the
89
+ * specified class.
90
+ * \param value the Ruby object to unwrap.
91
+ * \param klass the expected class of the object.
92
+ */
93
+ template<typename U>
94
+ Data_Object(
95
+ Object value,
96
+ Data_Type<U> const & klass = Data_Type<T>::klass());
97
+
98
+ //! Make a copy of a Data_Object
99
+ /*! \param other the Data_Object to copy.
100
+ */
101
+ Data_Object(Data_Object const & other);
102
+
103
+ T & operator*() const { return *obj_; } //!< Return a reference to obj_
104
+ T * operator->() const { return obj_; } //!< Return a pointer to obj_
105
+ T * get() const { return obj_; } //!< Return a pointer to obj_
106
+
107
+ //! Swap with another data object of the same type
108
+ /*! \param ref the object with which to swap.
109
+ */
110
+ template<typename U>
111
+ void swap(Data_Object<U> & ref);
112
+
113
+ private:
114
+ static void check_cpp_type(Data_Type<T> const & klass);
115
+
116
+ private:
117
+ T * obj_;
118
+ };
119
+
120
+ namespace detail
121
+ {
122
+ template<typename T>
123
+ struct to_ruby_<Data_Object<T> >
124
+ {
125
+ static Rice::Object convert(Data_Object<T> const & x);
126
+ };
127
+ }
128
+
129
+ } // namespace Rice
130
+
131
+ #endif // Rice__Data_Object_defn__hpp_
132
+