rucy 0.1.2 → 0.1.3
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/.doc/ext/rucy/tester.cpp +222 -0
- data/ChangeLog +5 -0
- data/README +28 -1
- data/Rakefile +13 -38
- data/VERSION +1 -1
- data/bin/rucy2rdoc +113 -0
- data/ext/rucy/extconf.rb +23 -14
- data/ext/rucy/tester.cpp +153 -17
- data/include/rucy/class.h +0 -3
- data/include/rucy/defs.h +4 -0
- data/include/rucy/defs.h.erb +4 -1
- data/include/rucy/exception.h +31 -35
- data/include/rucy/function.h.erb +0 -1
- data/include/rucy/module.h +4 -2
- data/include/rucy/module.h.erb +4 -3
- data/include/rucy/rucy.h +12 -4
- data/include/rucy/value.h.erb +0 -1
- data/include/rucy.h +4 -4
- data/lib/rucy/module.rb +10 -2
- data/rucy.gemspec +23 -9
- data/src/class.cpp +0 -7
- data/src/exception.cpp +28 -52
- data/src/function.cpp +1 -0
- data/src/function.cpp.erb +1 -1
- data/src/module.cpp +8 -4
- data/src/module.cpp.erb +8 -5
- data/src/rucy.cpp +38 -17
- data/src/value.cpp.erb +0 -1
- data/task/ext.rake +74 -15
- data/test/test_rucy.rb +13 -0
- metadata +28 -20
- data/include/rucy/string.h +0 -28
- data/src/string.cpp +0 -78
- data/support.rb +0 -64
- data/task/gem.rake +0 -33
- data/task/git.rake +0 -22
- data/task/lib.rake +0 -62
@@ -0,0 +1,222 @@
|
|
1
|
+
#include <rucy.h>
|
2
|
+
|
3
|
+
|
4
|
+
using namespace Rucy;
|
5
|
+
|
6
|
+
|
7
|
+
struct Tester
|
8
|
+
{
|
9
|
+
|
10
|
+
int value;
|
11
|
+
|
12
|
+
};// Tester
|
13
|
+
|
14
|
+
|
15
|
+
static Class cTester;
|
16
|
+
|
17
|
+
|
18
|
+
Class
|
19
|
+
tester_class ()
|
20
|
+
{
|
21
|
+
return cTester;
|
22
|
+
}
|
23
|
+
|
24
|
+
|
25
|
+
namespace Rucy
|
26
|
+
{
|
27
|
+
|
28
|
+
|
29
|
+
static Value
|
30
|
+
value (const Tester& obj)
|
31
|
+
{
|
32
|
+
return new_type<Tester>(tester_class(), new Tester(obj));
|
33
|
+
}
|
34
|
+
|
35
|
+
template <> inline Tester*
|
36
|
+
value_to<Tester*> (Value obj, bool)
|
37
|
+
{
|
38
|
+
return get_type<Tester>(obj, tester_class());
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
}// Rucy
|
43
|
+
|
44
|
+
|
45
|
+
/*
|
46
|
+
alloc function.
|
47
|
+
*/
|
48
|
+
static
|
49
|
+
VALUE alloc(VALUE klass)
|
50
|
+
{
|
51
|
+
return new_type<Tester>(klass);
|
52
|
+
}
|
53
|
+
|
54
|
+
/*
|
55
|
+
get value.
|
56
|
+
*/
|
57
|
+
static
|
58
|
+
VALUE get_value(VALUE self)
|
59
|
+
{
|
60
|
+
Tester* t = to<Tester*>(self);
|
61
|
+
if (t) return value(t->value);
|
62
|
+
}
|
63
|
+
|
64
|
+
/*
|
65
|
+
set value.
|
66
|
+
*/
|
67
|
+
static
|
68
|
+
VALUE set_value(VALUE self, VALUE value)
|
69
|
+
{
|
70
|
+
Tester* t = to<Tester*>(self);
|
71
|
+
if (t) t->value = to<int>(value);
|
72
|
+
}
|
73
|
+
|
74
|
+
/*
|
75
|
+
do nothing.
|
76
|
+
*/
|
77
|
+
static
|
78
|
+
VALUE do_nothing(VALUE self)
|
79
|
+
{
|
80
|
+
}
|
81
|
+
|
82
|
+
/*
|
83
|
+
return nil.
|
84
|
+
*/
|
85
|
+
static
|
86
|
+
VALUE return_nil(VALUE self)
|
87
|
+
{
|
88
|
+
return Qnil;
|
89
|
+
}
|
90
|
+
|
91
|
+
/*
|
92
|
+
return int.
|
93
|
+
*/
|
94
|
+
static
|
95
|
+
VALUE return_int(VALUE self)
|
96
|
+
{
|
97
|
+
return value(1);
|
98
|
+
}
|
99
|
+
|
100
|
+
/*
|
101
|
+
return flaot.
|
102
|
+
*/
|
103
|
+
static
|
104
|
+
VALUE return_float(VALUE self)
|
105
|
+
{
|
106
|
+
return value(1.0f);
|
107
|
+
}
|
108
|
+
|
109
|
+
/*
|
110
|
+
return string.
|
111
|
+
*/
|
112
|
+
static
|
113
|
+
VALUE return_string(VALUE self)
|
114
|
+
{
|
115
|
+
return value("");
|
116
|
+
}
|
117
|
+
|
118
|
+
/*
|
119
|
+
raise ruby's exception.
|
120
|
+
*/
|
121
|
+
static
|
122
|
+
VALUE raise_ruby_exception(VALUE self)
|
123
|
+
{
|
124
|
+
throw RubyException(rb_eStandardError, "raise_ruby_exception");
|
125
|
+
}
|
126
|
+
|
127
|
+
/*
|
128
|
+
raise in eval.
|
129
|
+
*/
|
130
|
+
static
|
131
|
+
VALUE raise_in_eval(VALUE self)
|
132
|
+
{
|
133
|
+
eval("raise 'raise_in_eval'");
|
134
|
+
}
|
135
|
+
|
136
|
+
/*
|
137
|
+
throw nothing.
|
138
|
+
*/
|
139
|
+
static
|
140
|
+
VALUE throw_nothing(VALUE self)
|
141
|
+
{
|
142
|
+
throw;
|
143
|
+
}
|
144
|
+
|
145
|
+
/*
|
146
|
+
throw std::exception.
|
147
|
+
*/
|
148
|
+
static
|
149
|
+
VALUE throw_std_exception(VALUE self)
|
150
|
+
{
|
151
|
+
throw std::exception();
|
152
|
+
}
|
153
|
+
|
154
|
+
/*
|
155
|
+
throw std::runtime_error.
|
156
|
+
*/
|
157
|
+
static
|
158
|
+
VALUE throw_std_runtime_error(VALUE self)
|
159
|
+
{
|
160
|
+
throw std::runtime_error("std::runtime_error");
|
161
|
+
}
|
162
|
+
|
163
|
+
struct MyException : public std::runtime_error
|
164
|
+
{
|
165
|
+
MyException() : runtime_error("") {}
|
166
|
+
};
|
167
|
+
|
168
|
+
/*
|
169
|
+
throw custom exception class.
|
170
|
+
*/
|
171
|
+
static
|
172
|
+
VALUE throw_custom_exception(VALUE self)
|
173
|
+
{
|
174
|
+
throw MyException();
|
175
|
+
}
|
176
|
+
|
177
|
+
/*
|
178
|
+
throw std::string.
|
179
|
+
*/
|
180
|
+
static
|
181
|
+
VALUE throw_std_string(VALUE self)
|
182
|
+
{
|
183
|
+
throw std::string("std::string");
|
184
|
+
}
|
185
|
+
|
186
|
+
/*
|
187
|
+
throw char*.
|
188
|
+
*/
|
189
|
+
static
|
190
|
+
VALUE throw_cstring(VALUE self)
|
191
|
+
{
|
192
|
+
throw "cstring";
|
193
|
+
}
|
194
|
+
|
195
|
+
|
196
|
+
extern "C" void
|
197
|
+
Init_tester ()
|
198
|
+
{
|
199
|
+
if (!init()) return;
|
200
|
+
|
201
|
+
Module m = rb_define_module("Rucy");
|
202
|
+
|
203
|
+
Class c = rb_define_class_under(m, "Tester", rb_cObject);
|
204
|
+
cTester = c;
|
205
|
+
|
206
|
+
rb_define_alloc_func(c, alloc);
|
207
|
+
rb_define_method(c, "value", RUBY_METHOD_FUNC(get_value), 0);
|
208
|
+
rb_define_method(c, "value=", RUBY_METHOD_FUNC(set_value), 1);
|
209
|
+
rb_define_method(c, "do_nothing", RUBY_METHOD_FUNC(do_nothing), -1);
|
210
|
+
rb_define_method(c, "return_nil", RUBY_METHOD_FUNC(return_nil), 0);
|
211
|
+
rb_define_method(c, "return_int", RUBY_METHOD_FUNC(return_int), 0);
|
212
|
+
rb_define_method(c, "return_float", RUBY_METHOD_FUNC(return_float), 0);
|
213
|
+
rb_define_method(c, "return_string", RUBY_METHOD_FUNC(return_string), 0);
|
214
|
+
rb_define_method(c, "raise_ruby_exception", RUBY_METHOD_FUNC(raise_ruby_exception), 0);
|
215
|
+
rb_define_method(c, "raise_in_eval", RUBY_METHOD_FUNC(raise_in_eval), 0);
|
216
|
+
rb_define_method(c, "throw_nothing", RUBY_METHOD_FUNC(throw_nothing), 0);
|
217
|
+
rb_define_method(c, "throw_std_exception", RUBY_METHOD_FUNC(throw_std_exception), 0);
|
218
|
+
rb_define_method(c, "throw_std_runtime_error", RUBY_METHOD_FUNC(throw_std_runtime_error), 0);
|
219
|
+
rb_define_method(c, "throw_custom_exception", RUBY_METHOD_FUNC(throw_custom_exception), 0);
|
220
|
+
rb_define_method(c, "throw_std_string", RUBY_METHOD_FUNC(throw_std_string), 0);
|
221
|
+
rb_define_method(c, "throw_cstring", RUBY_METHOD_FUNC(throw_cstring), 0);
|
222
|
+
}
|
data/ChangeLog
CHANGED
data/README
CHANGED
@@ -1,4 +1,31 @@
|
|
1
1
|
|
2
2
|
= Rucy - A Ruby C++ Extension Helper Library
|
3
3
|
|
4
|
-
|
4
|
+
by snori@xord.org
|
5
|
+
|
6
|
+
|
7
|
+
= What is this library?
|
8
|
+
|
9
|
+
This library helps you to develop Ruby C extension library with few useful
|
10
|
+
classes.
|
11
|
+
|
12
|
+
* Wrap VALUE for easy handling.
|
13
|
+
* Exception safe (Rucy/C++).
|
14
|
+
|
15
|
+
|
16
|
+
= How to use
|
17
|
+
|
18
|
+
$ gem install rucy
|
19
|
+
|
20
|
+
write C++ source like ext/rucy/tester.cpp.
|
21
|
+
|
22
|
+
|
23
|
+
= Examples
|
24
|
+
|
25
|
+
see ext/rucy/tester.cpp.
|
26
|
+
|
27
|
+
|
28
|
+
= Contact information.
|
29
|
+
|
30
|
+
Web: http://blog.xord.org/
|
31
|
+
Mail: snori@xord.org
|
data/Rakefile
CHANGED
@@ -1,55 +1,28 @@
|
|
1
1
|
# -*- mode: ruby; coding: utf-8 -*-
|
2
2
|
|
3
3
|
|
4
|
-
%w[.
|
4
|
+
%w[. ../xot].map {|s| "#{s}/lib"}.each do |path|
|
5
5
|
$: << File.expand_path(File.join File.dirname(__FILE__), *path.split('/'))
|
6
6
|
end
|
7
7
|
|
8
8
|
require 'rubygems'
|
9
|
-
require '
|
10
|
-
require '
|
9
|
+
require 'xot/rake/helpers'
|
10
|
+
require 'xot/module'
|
11
11
|
require 'rucy/module'
|
12
12
|
|
13
|
+
include Xot::Rake
|
13
14
|
|
14
|
-
MODULE = Rucy
|
15
|
-
NAME = MODULE.name.downcase
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
EXTEXT = RbConfig::CONFIG['DLEXT'] || 'so'
|
24
|
-
|
25
|
-
DEFS = %w[]
|
26
|
-
DEFS << 'WIN32' if win32?
|
27
|
-
DEFS << 'COCOA' if cocoa?
|
28
|
-
|
29
|
-
incroot = RbConfig::CONFIG['rubyhdrdir']
|
30
|
-
INCDIRS = [
|
31
|
-
File.expand_path('include'),
|
32
|
-
incroot,
|
33
|
-
"#{incroot}/#{RUBY_PLATFORM}",
|
34
|
-
'/opt/local/include',
|
35
|
-
'/opt/include'
|
36
|
-
]
|
37
|
-
|
38
|
-
RBS = glob '**/*.rb'
|
39
|
-
|
40
|
-
RUBY = ENV['RUBY'] || 'ruby'
|
41
|
-
GEM = ENV['GEM'] || 'gem'
|
42
|
-
GIT = ENV['GIT'] || 'git'
|
43
|
-
MAKE = ENV['MAKE'] || 'make'
|
44
|
-
CC = RbConfig::CONFIG['CC'] || ENV['CC'] || 'g++'
|
45
|
-
CFLAGS = '-Wall -O' + DEFS.map{|s| " -D#{s}"}.join
|
46
|
-
AR = ENV['AR'] || 'ar'
|
47
|
-
ARFLAGS = 'crs'
|
16
|
+
MODULE = Rucy
|
17
|
+
INCDIRS = [Rucy].map {|m| m.include_dirs}.flatten
|
18
|
+
RUCY2RDOC = 'bin/rucy2rdoc'
|
19
|
+
NPARAM_MAX = 8
|
20
|
+
NTIMES = (0..NPARAM_MAX)
|
48
21
|
|
49
22
|
|
50
23
|
task :default => :build
|
51
24
|
|
52
|
-
task :build => :
|
25
|
+
task :build => :lib
|
53
26
|
|
54
27
|
task :rebuild => [:clean, :build]
|
55
28
|
|
@@ -57,6 +30,8 @@ task :lib => 'lib:build'
|
|
57
30
|
|
58
31
|
task :ext => 'ext:build'
|
59
32
|
|
33
|
+
task :doc => 'ext:doc'
|
34
|
+
|
60
35
|
task :gem => 'gem:build'
|
61
36
|
|
62
37
|
task :install => 'gem:install'
|
@@ -72,4 +47,4 @@ task :test => :ext do
|
|
72
47
|
end
|
73
48
|
|
74
49
|
|
75
|
-
|
50
|
+
[Xot, Rucy].each {|m| m.load_tasks}
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/bin/rucy2rdoc
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
class Parser
|
5
|
+
|
6
|
+
def initialize (lines)
|
7
|
+
@funs = {}
|
8
|
+
@lines = lines
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse ()
|
12
|
+
parse_functions @lines
|
13
|
+
parse_Init @lines
|
14
|
+
@lines
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def process_lines (lines, regexp, &block)
|
20
|
+
lines.gsub! regexp do |str|
|
21
|
+
params = $~[1..-1]
|
22
|
+
params.unshift str
|
23
|
+
block.call *params
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_functions (lines)
|
28
|
+
re = %r{
|
29
|
+
(?:RUBY_)?DEF(\d+|N|_ALLOC)\( (\w+) \s* ((?:\, \s* \w+)*) \s* \) \s*
|
30
|
+
(\{ \s*
|
31
|
+
.*?
|
32
|
+
\}) \s*
|
33
|
+
(?:RUBY_)?END
|
34
|
+
}mx
|
35
|
+
process_lines lines, re do |all, type, name, params, body|
|
36
|
+
type = '-1' if type == 'N'
|
37
|
+
params.gsub! /\,/, ', VALUE'
|
38
|
+
params = '' unless params
|
39
|
+
if type == '_ALLOC'
|
40
|
+
params.gsub! /^\,\s*/, ''
|
41
|
+
else
|
42
|
+
params = 'VALUE self' + params
|
43
|
+
end
|
44
|
+
@funs[name] = {
|
45
|
+
:type => type,
|
46
|
+
:params => params,
|
47
|
+
:body => body
|
48
|
+
}
|
49
|
+
"VALUE #{name}(#{params})\n#{body}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse_Init (lines)
|
54
|
+
re = %r{
|
55
|
+
Init_(\w*) \s* \( \s* \) \s*
|
56
|
+
\{ \s*
|
57
|
+
.*?
|
58
|
+
\} \s*
|
59
|
+
}mx
|
60
|
+
process_lines lines, re do |all, name|
|
61
|
+
parse_module_and_class all
|
62
|
+
parse_methods all
|
63
|
+
all
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_module_and_class (lines)
|
68
|
+
re = %r{
|
69
|
+
(\w+) \s* \= \s*
|
70
|
+
(?: (\w+) \s* \. )? \s* (define_(?:module|class)) \s*
|
71
|
+
\( \s* (\"\w+\") \s* (?: \, \s* (\w+) )? \s* \) \s* ;
|
72
|
+
}mx
|
73
|
+
process_lines lines, re do |all, var, recv, define, name, super_|
|
74
|
+
define += '_under' if recv
|
75
|
+
recv += ", " if recv
|
76
|
+
super_ = 'rb_cObject' if !super_ && define =~ /class/
|
77
|
+
super_ = ', ' + super_ if super_
|
78
|
+
"#{var} = rb_#{define}(#{recv}#{name}#{super_});"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def parse_methods (lines)
|
83
|
+
re = %r{
|
84
|
+
(\w+) \s* \. \s* (define_\w+) \s*
|
85
|
+
\( \s* (?: (\"\w+(?:\=|\?\!)?\") \s* \, \s* )? (\w+) \s* \) \s* ;
|
86
|
+
}mx
|
87
|
+
process_lines lines, re do |all, obj, define, symbol, name|
|
88
|
+
type = @funs[name][:type]
|
89
|
+
if type == '_ALLOC'
|
90
|
+
"rb_#{define}(#{obj}, #{name});"
|
91
|
+
else
|
92
|
+
"rb_#{define}(#{obj}, #{symbol}, RUBY_METHOD_FUNC(#{name}), #{type});"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end# Parser
|
98
|
+
|
99
|
+
|
100
|
+
def usage ()
|
101
|
+
"rucy2rdoc FILE"
|
102
|
+
end
|
103
|
+
|
104
|
+
def main (argv)
|
105
|
+
if path = argv.shift
|
106
|
+
print Parser.new(File.read path).parse
|
107
|
+
else
|
108
|
+
puts usage
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
main ARGV.dup
|
data/ext/rucy/extconf.rb
CHANGED
@@ -1,48 +1,57 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
|
4
|
-
%w[
|
4
|
+
%w[. ../xot].map {|s| "../../#{s}/lib"}.each do |path|
|
5
5
|
$: << File.expand_path(File.join File.dirname(__FILE__), *path.split('/'))
|
6
6
|
end
|
7
7
|
|
8
8
|
require 'rubygems'
|
9
9
|
require 'mkmf'
|
10
|
+
require 'xot/rake/helpers'
|
11
|
+
require 'xot/module'
|
10
12
|
require 'rucy/module'
|
11
13
|
|
14
|
+
include Xot::Rake
|
12
15
|
|
13
|
-
|
16
|
+
|
17
|
+
DEBUG = env :DEBUG, false
|
14
18
|
|
15
19
|
DEFS = []
|
16
|
-
INCDIRS = %w[
|
20
|
+
INCDIRS = %w[
|
21
|
+
/opt/local/include
|
22
|
+
/opt/include
|
23
|
+
]
|
17
24
|
LIBDIRS = []
|
18
25
|
|
19
26
|
HEADERS = %w[
|
20
27
|
boost/noncopyable.hpp
|
21
28
|
ruby.h
|
29
|
+
xot.h
|
22
30
|
rucy.h
|
23
31
|
]
|
24
|
-
LIBS = %w[
|
32
|
+
LIBS = %w[
|
33
|
+
stdc++
|
34
|
+
xot
|
35
|
+
rucy
|
36
|
+
]
|
25
37
|
|
26
38
|
|
27
39
|
DEFS << '_DEBUG' if DEBUG
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
DEFS << 'WINDOWS' << 'WIN32' << $~[0].upcase
|
32
|
-
when /darwin/
|
33
|
-
DEFS << 'COCOA'
|
34
|
-
end
|
40
|
+
DEFS << 'WINDOWS' << 'WIN32' if win32?
|
41
|
+
DEFS << 'COCOA' if cocoa?
|
42
|
+
DEFS << $~[0].upcase if RUBY_PLATFORM =~ /mswin|ming|cygwin|darwin/i
|
35
43
|
|
36
44
|
$CPPFLAGS << DEFS.map {|s| " -D#{s}"}.join
|
37
45
|
$CPPFLAGS << INCDIRS.map {|s| " -I#{s}"}.join
|
38
46
|
$LDFLAGS << LIBDIRS.map {|s| " -L#{s}"}.join
|
39
47
|
$LOCAL_LIBS << ' -lrucy'
|
40
48
|
|
41
|
-
|
42
|
-
dir_config 'rucy', Rucy.root_dir
|
49
|
+
Config::CONFIG.each {|key, val| val.gsub!(/gcc/, 'g++')}
|
43
50
|
|
44
51
|
|
45
|
-
|
52
|
+
dir_config 'boost'
|
53
|
+
dir_config 'xot', Xot.root_dir
|
54
|
+
dir_config 'rucy', Rucy.root_dir
|
46
55
|
|
47
56
|
exit 1 unless HEADERS.all? {|s| have_header(s)}
|
48
57
|
exit 1 unless LIBS.all? {|s| have_library(s)}
|