rucy 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.doc/ext/rucy/class.cpp +244 -0
- data/.doc/ext/rucy/exception.cpp +99 -0
- data/.doc/ext/rucy/function.cpp +63 -0
- data/.doc/ext/rucy/struct.cpp +80 -0
- data/.doc/ext/rucy/tester.cpp +41 -184
- data/.doc/ext/rucy/value.cpp +42 -0
- data/.gitignore +22 -0
- data/Rakefile +4 -29
- data/VERSION +1 -1
- data/ext/rucy/class.cpp +262 -0
- data/ext/rucy/class.h +96 -0
- data/ext/rucy/exception.cpp +107 -0
- data/ext/rucy/extconf.rb +9 -8
- data/ext/rucy/function.cpp +68 -0
- data/ext/rucy/struct.cpp +83 -0
- data/ext/rucy/tester.cpp +41 -197
- data/ext/rucy/tester.h +10 -0
- data/ext/rucy/value.cpp +46 -0
- data/include/rucy/defs.h.erb +17 -0
- data/include/rucy/exception.h +2 -0
- data/include/rucy/extension.h +206 -0
- data/include/rucy/rucy.h +25 -2
- data/include/rucy/symbol.h +11 -0
- data/include/rucy/value.h.erb +66 -14
- data/include/rucy.h +1 -1
- data/lib/rucy/module.rb +9 -2
- data/rucy.gemspec +16 -40
- data/src/exception.cpp +17 -25
- data/src/rucy.cpp +2 -2
- data/src/symbol.cpp +24 -0
- data/src/value.cpp.erb +161 -25
- data/task/doc.rake +50 -0
- data/test/helpers.rb +7 -0
- data/test/test_class.rb +161 -0
- data/test/test_exception.rb +39 -0
- data/test/test_function.rb +31 -0
- data/test/test_struct.rb +30 -0
- data/test/test_value.rb +18 -0
- metadata +123 -74
- data/include/rucy/defs.h +0 -101
- data/include/rucy/function.h +0 -245
- data/include/rucy/gc.h +0 -59
- data/include/rucy/module.h +0 -98
- data/include/rucy/value.h +0 -291
- data/src/function.cpp +0 -158
- data/src/gc.cpp +0 -63
- data/src/module.cpp +0 -325
- data/src/value.cpp +0 -511
- data/task/ext.rake +0 -96
- data/test/test_rucy.rb +0 -73
data/ext/rucy/value.cpp
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#include <rucy.h>
|
2
|
+
|
3
|
+
|
4
|
+
using namespace Rucy;
|
5
|
+
|
6
|
+
|
7
|
+
static
|
8
|
+
RUBY_DEFN(true_to_value)
|
9
|
+
{
|
10
|
+
return value(true);
|
11
|
+
}
|
12
|
+
RUBY_END
|
13
|
+
|
14
|
+
static
|
15
|
+
RUBY_DEFN(false_to_value)
|
16
|
+
{
|
17
|
+
return value(false);
|
18
|
+
}
|
19
|
+
RUBY_END
|
20
|
+
|
21
|
+
static
|
22
|
+
RUBY_DEFN(NULL_to_value)
|
23
|
+
{
|
24
|
+
return nil();
|
25
|
+
}
|
26
|
+
RUBY_END
|
27
|
+
|
28
|
+
static
|
29
|
+
RUBY_DEFN(nil_value)
|
30
|
+
{
|
31
|
+
return nil();
|
32
|
+
}
|
33
|
+
RUBY_END
|
34
|
+
|
35
|
+
|
36
|
+
void
|
37
|
+
Init_value ()
|
38
|
+
{
|
39
|
+
Module mRucy = define_module("Rucy");
|
40
|
+
Module mTester = mRucy.define_module("Tester");
|
41
|
+
|
42
|
+
mTester.define_method("true_to_value", true_to_value);
|
43
|
+
mTester.define_method("false_to_value", false_to_value);
|
44
|
+
mTester.define_method("null_to_value", NULL_to_value);
|
45
|
+
mTester.define_method("nil_value", nil_value);
|
46
|
+
}
|
data/include/rucy/defs.h.erb
CHANGED
@@ -56,4 +56,21 @@ namespace Rucy
|
|
56
56
|
#endif
|
57
57
|
|
58
58
|
|
59
|
+
#define RUCY_CHECK_OBJ(obj, type, klass) \
|
60
|
+
do \
|
61
|
+
{ \
|
62
|
+
type* p = Rucy::get_type_ptr<type>(obj, klass); \
|
63
|
+
if (!p) Rucy::invalid_object_error(); \
|
64
|
+
} \
|
65
|
+
while(0)
|
66
|
+
|
67
|
+
#define RUCY_CHECK_OBJECT(obj, type, klass) \
|
68
|
+
do \
|
69
|
+
{ \
|
70
|
+
type* p = Rucy::get_type_ptr<type>(obj, klass); \
|
71
|
+
if (!p || !*p) Rucy::invalid_object_error(); \
|
72
|
+
} \
|
73
|
+
while(0)
|
74
|
+
|
75
|
+
|
59
76
|
#endif//EOH
|
data/include/rucy/exception.h
CHANGED
@@ -61,6 +61,8 @@ namespace Rucy
|
|
61
61
|
int n1 = -1, int n2 = -1, int n3 = -1, int n4 = -1, int n5 = -1,
|
62
62
|
int n6 = -1, int n7 = -1, int n8 = -1, int n9 = -1, int n10 = -1);
|
63
63
|
|
64
|
+
void index_error (const char* format = NULL, ...);
|
65
|
+
|
64
66
|
void not_implemented_error (const char* format = NULL, ...);
|
65
67
|
|
66
68
|
|
@@ -0,0 +1,206 @@
|
|
1
|
+
// -*- c++ -*-
|
2
|
+
#pragma once
|
3
|
+
#ifndef __RUCY_EXTENSION_H__
|
4
|
+
#define __RUCY_EXTENSION_H__
|
5
|
+
|
6
|
+
|
7
|
+
#include <boost/dynamic_bitset.hpp>
|
8
|
+
#include <xot/ref.h>
|
9
|
+
#include <rucy/module.h>
|
10
|
+
|
11
|
+
|
12
|
+
namespace Rucy
|
13
|
+
{
|
14
|
+
|
15
|
+
|
16
|
+
template <typename T>
|
17
|
+
class ClassWrapper : public T
|
18
|
+
{
|
19
|
+
|
20
|
+
typedef ClassWrapper This;
|
21
|
+
|
22
|
+
public:
|
23
|
+
|
24
|
+
typedef T Super;
|
25
|
+
|
26
|
+
GlobalValue value;
|
27
|
+
|
28
|
+
ClassWrapper ()
|
29
|
+
: value(Qnil, true)
|
30
|
+
{
|
31
|
+
}
|
32
|
+
|
33
|
+
virtual void retain ()
|
34
|
+
{
|
35
|
+
value.gc(false);
|
36
|
+
Super::retain();
|
37
|
+
}
|
38
|
+
|
39
|
+
virtual void release ()
|
40
|
+
{
|
41
|
+
Super::release();
|
42
|
+
value.gc(true);
|
43
|
+
}
|
44
|
+
|
45
|
+
virtual void clear_override_flags ()
|
46
|
+
{
|
47
|
+
override_flags.reset();
|
48
|
+
}
|
49
|
+
|
50
|
+
virtual bool is_overridden (const Value& klass, const Symbol& name, uint id) const
|
51
|
+
{
|
52
|
+
if (id <= OVERRIDE_ID_UNKNOWN)
|
53
|
+
return false;
|
54
|
+
|
55
|
+
bool checked = false, overridden = false;
|
56
|
+
get_override_flag(&checked, &overridden, id);
|
57
|
+
if (checked) return overridden;
|
58
|
+
|
59
|
+
overridden = check_overridden(klass, name);
|
60
|
+
if (!const_cast<This*>(this)->set_override_flag(id, true, overridden))
|
61
|
+
return false;
|
62
|
+
|
63
|
+
return overridden;
|
64
|
+
}
|
65
|
+
|
66
|
+
protected:
|
67
|
+
|
68
|
+
enum
|
69
|
+
{
|
70
|
+
|
71
|
+
OVERRIDE_ID_UNKNOWN = 0,
|
72
|
+
|
73
|
+
OVERRIDE_ID_LAST,
|
74
|
+
|
75
|
+
OVERRIDE_ID_MAX = 256
|
76
|
+
|
77
|
+
};
|
78
|
+
|
79
|
+
private:
|
80
|
+
|
81
|
+
boost::dynamic_bitset<> override_flags;
|
82
|
+
|
83
|
+
bool check_overridden (const Value& klass, const Symbol& name) const
|
84
|
+
{
|
85
|
+
SYM(method);
|
86
|
+
SYM(owner);
|
87
|
+
return this->value.call(method, name.value()).call(owner) != klass;
|
88
|
+
}
|
89
|
+
|
90
|
+
void get_override_flag (bool* checked, bool* overridden, uint id) const
|
91
|
+
{
|
92
|
+
assert(checked || overridden);
|
93
|
+
|
94
|
+
int checked_pos = id2index(id);
|
95
|
+
int overridden_pos = checked_pos + 1;
|
96
|
+
bool valid = 0 <= checked_pos && overridden_pos < (int) override_flags.size();
|
97
|
+
if (checked) *checked = valid ? override_flags[checked_pos] : false;
|
98
|
+
if (overridden) *overridden = valid ? override_flags[overridden_pos] : false;
|
99
|
+
}
|
100
|
+
|
101
|
+
bool set_override_flag (uint id, bool checked, bool overridden)
|
102
|
+
{
|
103
|
+
assert(id < OVERRIDE_ID_MAX);
|
104
|
+
|
105
|
+
int checked_pos = id2index(id);
|
106
|
+
if (checked_pos < 0) return true;
|
107
|
+
|
108
|
+
int overridden_pos = checked_pos + 1;
|
109
|
+
if (overridden_pos >= (int) override_flags.size())
|
110
|
+
override_flags.resize(overridden_pos + 1);
|
111
|
+
|
112
|
+
override_flags[checked_pos] = checked;
|
113
|
+
override_flags[overridden_pos] = overridden;
|
114
|
+
return true;
|
115
|
+
}
|
116
|
+
|
117
|
+
int id2index (uint id) const
|
118
|
+
{
|
119
|
+
return (id - 1) * 2;
|
120
|
+
}
|
121
|
+
|
122
|
+
};// ClassWrapper
|
123
|
+
|
124
|
+
|
125
|
+
template <typename T> inline void release_wrapper (void* p)
|
126
|
+
{
|
127
|
+
if (p) ((T*) p)->Xot::template RefCountable<>::release();
|
128
|
+
}
|
129
|
+
|
130
|
+
template <typename T> inline Value new_wrapper (
|
131
|
+
Value klass, T* ptr,
|
132
|
+
RUBY_DATA_FUNC mark = NULL,
|
133
|
+
RUBY_DATA_FUNC free = release_wrapper<T>)
|
134
|
+
{
|
135
|
+
if (ptr) ptr->Xot::template RefCountable<>::retain();
|
136
|
+
return new_type(klass, ptr, mark, free);
|
137
|
+
}
|
138
|
+
|
139
|
+
template <typename T> inline Value new_wrapper (
|
140
|
+
Value klass,
|
141
|
+
RUBY_DATA_FUNC mark = NULL,
|
142
|
+
RUBY_DATA_FUNC free = release_wrapper<T>)
|
143
|
+
{
|
144
|
+
return new_wrapper(klass, new T, mark, free);
|
145
|
+
}
|
146
|
+
|
147
|
+
|
148
|
+
}// Rucy
|
149
|
+
|
150
|
+
|
151
|
+
#define RUCY_WRAPPER_VALUE_FROM(wrapped_class, ruby_class) \
|
152
|
+
namespace Rucy \
|
153
|
+
{ \
|
154
|
+
inline Value \
|
155
|
+
value (wrapped_class* obj, Value klass = ruby_class) \
|
156
|
+
{ \
|
157
|
+
if (!obj) return Qnil; \
|
158
|
+
ClassWrapper<wrapped_class>* p = dynamic_cast<ClassWrapper<wrapped_class>*>(obj); \
|
159
|
+
if (!p) return new_ref(klass, obj); \
|
160
|
+
if (p->value.is_nil()) p->value = new_wrapper(klass, obj); \
|
161
|
+
return p->value; \
|
162
|
+
} \
|
163
|
+
}
|
164
|
+
|
165
|
+
#define RUCY_WRAPPER_VALUE_TO(wrapped_class, ruby_class) \
|
166
|
+
namespace Rucy \
|
167
|
+
{ \
|
168
|
+
template <> inline wrapped_class* \
|
169
|
+
value_to<wrapped_class*> (Value value, bool convert) \
|
170
|
+
{ \
|
171
|
+
return get_type_ptr<wrapped_class>(value, ruby_class); \
|
172
|
+
} \
|
173
|
+
}
|
174
|
+
|
175
|
+
#define RUCY_WRAPPER_VALUE_FROM_TO(wrapped_class, ruby_class) \
|
176
|
+
RUCY_WRAPPER_VALUE_FROM(wrapped_class, ruby_class) \
|
177
|
+
RUCY_WRAPPER_VALUE_TO(wrapped_class, ruby_class)
|
178
|
+
|
179
|
+
|
180
|
+
#define RUCY_WRAPPER_CALL(wrapper_class, obj, fun) \
|
181
|
+
(dynamic_cast<wrapper_class*>(obj) \
|
182
|
+
? reinterpret_cast<wrapper_class*>(obj)->Super::fun \
|
183
|
+
: (obj)->fun)
|
184
|
+
|
185
|
+
|
186
|
+
#define RUCY_OVERRIDE_ID_START(name) enum { OID_##name = Super::OVERRIDE_ID_LAST,
|
187
|
+
#define RUCY_OVERRIDE_ID(name) OID_##name,
|
188
|
+
#define RUCY_OVERRIDE_ID_LAST OVERRIDE_ID_LAST };
|
189
|
+
|
190
|
+
|
191
|
+
#define RUCY_IS_OVERRIDDEN(name, ruby_class) \
|
192
|
+
this->is_overridden(ruby_class, name, OID_##name)
|
193
|
+
|
194
|
+
#define RUCY_OVERRIDABLE_METHOD(name, ruby_class, suffix) \
|
195
|
+
SYM(name); \
|
196
|
+
return this->value.call(name) suffix ;
|
197
|
+
|
198
|
+
#define RUCY_OVERRIDABLE_METHOD_FAST(name, ruby_class, suffix) \
|
199
|
+
SYM(name); \
|
200
|
+
if (RUCY_IS_OVERRIDDEN(name, ruby_class)) \
|
201
|
+
return this->value.call(name) suffix ; \
|
202
|
+
else \
|
203
|
+
return this->Super::name();
|
204
|
+
|
205
|
+
|
206
|
+
#endif//EOH
|
data/include/rucy/rucy.h
CHANGED
@@ -33,7 +33,7 @@ namespace Rucy
|
|
33
33
|
|
34
34
|
template <typename T> inline void mark_type (void* p)
|
35
35
|
{
|
36
|
-
((T*) p)->mark();
|
36
|
+
if (p) ((T*) p)->mark();
|
37
37
|
}
|
38
38
|
|
39
39
|
template <typename T> inline void delete_type (void* p)
|
@@ -41,11 +41,17 @@ namespace Rucy
|
|
41
41
|
delete (T*) p;
|
42
42
|
}
|
43
43
|
|
44
|
+
template <typename T> inline void release_type (void* p)
|
45
|
+
{
|
46
|
+
if (p) ((T*) p)->release();
|
47
|
+
}
|
48
|
+
|
44
49
|
template <typename T> inline Value new_type (
|
45
50
|
Value klass, T* ptr,
|
46
51
|
RUBY_DATA_FUNC mark = NULL,
|
47
52
|
RUBY_DATA_FUNC free = delete_type<T>)
|
48
53
|
{
|
54
|
+
if (!ptr) return Qnil;
|
49
55
|
return Data_Wrap_Struct(klass, mark, free, ptr);
|
50
56
|
}
|
51
57
|
|
@@ -57,7 +63,24 @@ namespace Rucy
|
|
57
63
|
return new_type(klass, new T, mark, free);
|
58
64
|
}
|
59
65
|
|
60
|
-
template <typename T> inline
|
66
|
+
template <typename T> inline Value new_ref (
|
67
|
+
Value klass, T* ptr,
|
68
|
+
RUBY_DATA_FUNC mark = NULL,
|
69
|
+
RUBY_DATA_FUNC free = release_type<T>)
|
70
|
+
{
|
71
|
+
if (ptr) ptr->retain();
|
72
|
+
return new_type(klass, ptr, mark, free);
|
73
|
+
}
|
74
|
+
|
75
|
+
template <typename T> inline Value new_ref (
|
76
|
+
Value klass,
|
77
|
+
RUBY_DATA_FUNC mark = NULL,
|
78
|
+
RUBY_DATA_FUNC free = release_type<T>)
|
79
|
+
{
|
80
|
+
return new_ref(klass, new T, mark, free);
|
81
|
+
}
|
82
|
+
|
83
|
+
template <typename T> inline T* get_type_ptr (Value obj, Value klass = Qnil)
|
61
84
|
{
|
62
85
|
if (klass && !check_class(obj, klass)) return NULL;
|
63
86
|
T* p = NULL;
|
data/include/rucy/symbol.h
CHANGED
@@ -18,6 +18,9 @@ namespace Rucy
|
|
18
18
|
{
|
19
19
|
|
20
20
|
|
21
|
+
class Value;
|
22
|
+
|
23
|
+
|
21
24
|
class Symbol
|
22
25
|
{
|
23
26
|
|
@@ -27,16 +30,24 @@ namespace Rucy
|
|
27
30
|
|
28
31
|
Symbol (ID id);
|
29
32
|
|
33
|
+
Symbol (const Value& value);
|
34
|
+
|
30
35
|
Symbol (const char* str);
|
31
36
|
|
32
37
|
ID id () const;
|
33
38
|
|
39
|
+
VALUE value () const;
|
40
|
+
|
34
41
|
const char* c_str () const;
|
35
42
|
|
36
43
|
operator bool () const;
|
37
44
|
|
38
45
|
bool operator ! () const;
|
39
46
|
|
47
|
+
friend bool operator == (const Symbol& lhs, const Symbol& rhs);
|
48
|
+
|
49
|
+
friend bool operator != (const Symbol& lhs, const Symbol& rhs);
|
50
|
+
|
40
51
|
private:
|
41
52
|
|
42
53
|
ID id_;
|
data/include/rucy/value.h.erb
CHANGED
@@ -35,16 +35,16 @@ namespace Rucy
|
|
35
35
|
|
36
36
|
Value (VALUE v);
|
37
37
|
|
38
|
-
VALUE value () const;
|
39
|
-
|
40
38
|
void mark () const;
|
41
39
|
|
40
|
+
bool is_kind_of (Value klass) const;
|
41
|
+
|
42
|
+
VALUE value () const;
|
43
|
+
|
42
44
|
int type () const;
|
43
45
|
|
44
46
|
Value klass () const;
|
45
47
|
|
46
|
-
bool is_kind_of (Value klass) const;
|
47
|
-
|
48
48
|
int size () const;
|
49
49
|
|
50
50
|
int length () const;
|
@@ -57,6 +57,14 @@ namespace Rucy
|
|
57
57
|
|
58
58
|
Value to_sym () const;
|
59
59
|
|
60
|
+
int as_i (bool convert = false) const;
|
61
|
+
|
62
|
+
double as_f (bool convert = false) const;
|
63
|
+
|
64
|
+
const char* as_s (bool convert = false) const;
|
65
|
+
|
66
|
+
Symbol as_sym (bool convert = false) const;
|
67
|
+
|
60
68
|
bool is_i () const;
|
61
69
|
|
62
70
|
bool is_f () const;
|
@@ -67,13 +75,7 @@ namespace Rucy
|
|
67
75
|
|
68
76
|
bool is_a () const;
|
69
77
|
|
70
|
-
|
71
|
-
|
72
|
-
double as_f (bool convert = false) const;
|
73
|
-
|
74
|
-
const char* as_s (bool convert = false) const;
|
75
|
-
|
76
|
-
Symbol as_sym (bool convert = false) const;
|
78
|
+
bool is_nil () const;
|
77
79
|
|
78
80
|
% ["call", "operator ()"].each do |op|
|
79
81
|
Value <%= op %> (Symbol name, int argc, const Value* argv) const;
|
@@ -110,15 +112,61 @@ namespace Rucy
|
|
110
112
|
|
111
113
|
Value unshift (Value obj);
|
112
114
|
|
113
|
-
|
115
|
+
protected:
|
114
116
|
|
115
117
|
VALUE v;
|
116
118
|
|
117
|
-
friend class GCGuard;
|
118
|
-
|
119
119
|
};// Value
|
120
120
|
|
121
121
|
|
122
|
+
class GlobalValue : public Value
|
123
|
+
{
|
124
|
+
|
125
|
+
typedef Value Super;
|
126
|
+
|
127
|
+
public:
|
128
|
+
|
129
|
+
GlobalValue ();// gc = false
|
130
|
+
|
131
|
+
GlobalValue (bool b, bool gc = false);
|
132
|
+
|
133
|
+
GlobalValue (int i, bool gc = false);
|
134
|
+
|
135
|
+
GlobalValue (float f, bool gc = false);
|
136
|
+
|
137
|
+
GlobalValue (double d, bool gc = false);
|
138
|
+
|
139
|
+
GlobalValue (const char* s, bool tainted = false, bool gc = false);
|
140
|
+
|
141
|
+
GlobalValue (const char* s, size_t len, bool tainted = false, bool gc = false);
|
142
|
+
|
143
|
+
GlobalValue (size_t size, const Value* values, bool gc = false);
|
144
|
+
|
145
|
+
GlobalValue (VALUE v, bool gc = false);
|
146
|
+
|
147
|
+
GlobalValue (const Value& obj, bool gc = false);
|
148
|
+
|
149
|
+
GlobalValue (const GlobalValue& obj, bool gc = false);
|
150
|
+
|
151
|
+
GlobalValue& operator = (const Value& v);
|
152
|
+
|
153
|
+
~GlobalValue ();
|
154
|
+
|
155
|
+
void gc (bool enable = true);
|
156
|
+
|
157
|
+
private:
|
158
|
+
|
159
|
+
short gc_disable_count;
|
160
|
+
|
161
|
+
bool gc_guarded;
|
162
|
+
|
163
|
+
void init (bool gc);
|
164
|
+
|
165
|
+
void update_guard ();
|
166
|
+
|
167
|
+
};// GlobalValue
|
168
|
+
|
169
|
+
|
122
170
|
Value value (bool b);
|
123
171
|
|
124
172
|
Value value (char c);
|
@@ -153,6 +201,10 @@ namespace Rucy
|
|
153
201
|
|
154
202
|
Value value (Symbol sym);
|
155
203
|
|
204
|
+
Value value (void* ptr);
|
205
|
+
|
206
|
+
Value nil ();
|
207
|
+
|
156
208
|
|
157
209
|
template <typename T> T value_to (Value obj, bool convert = true);
|
158
210
|
|
data/include/rucy.h
CHANGED
data/lib/rucy/module.rb
CHANGED
@@ -22,8 +22,15 @@ module Rucy
|
|
22
22
|
File.join root_dir, 'task'
|
23
23
|
end
|
24
24
|
|
25
|
-
def load_tasks ()
|
26
|
-
|
25
|
+
def load_tasks (*names)
|
26
|
+
if names.empty?
|
27
|
+
Dir["#{task_dir}/**/*.rake"].each {|path| load path}
|
28
|
+
else
|
29
|
+
names.each do |name|
|
30
|
+
path = "#{task_dir}/#{name}.rake"
|
31
|
+
load path if File.exist? path
|
32
|
+
end
|
33
|
+
end
|
27
34
|
end
|
28
35
|
|
29
36
|
def version ()
|
data/rucy.gemspec
CHANGED
@@ -1,66 +1,42 @@
|
|
1
1
|
# -*- mode: ruby; coding: utf-8 -*-
|
2
2
|
|
3
3
|
|
4
|
-
$: << File.
|
4
|
+
$: << File.expand_path('../lib', __FILE__)
|
5
5
|
|
6
|
-
require 'rake'
|
7
6
|
require 'rucy/module'
|
8
7
|
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
FILES = FileList[*%W[
|
15
|
-
README
|
16
|
-
ChangeLog
|
17
|
-
Rakefile
|
18
|
-
#{NAME}.gemspec
|
19
|
-
VERSION
|
20
|
-
task/**/*.rake
|
21
|
-
ext/**/*.rb
|
22
|
-
ext/**/*.h
|
23
|
-
ext/**/*.cpp
|
24
|
-
include/**/*.erb
|
25
|
-
include/**/*.h
|
26
|
-
lib/**/*.rb
|
27
|
-
src/**/*.erb
|
28
|
-
src/**/*.h
|
29
|
-
src/**/*.cpp
|
30
|
-
test/**/*.rb
|
31
|
-
]]
|
32
|
-
|
33
|
-
RDOCS = FileList[*%W[
|
34
|
-
README
|
35
|
-
.doc/ext/**/*.cpp
|
36
|
-
]]
|
9
|
+
Gem::Specification.new do |s|
|
10
|
+
def glob (*patterns)
|
11
|
+
patterns.map {|pat| Dir.glob(pat).to_a}.flatten
|
12
|
+
end
|
37
13
|
|
14
|
+
mod = Rucy
|
15
|
+
name = mod.name.downcase
|
16
|
+
rdocs = glob *%w[README .doc/ext/**/*.cpp]
|
38
17
|
|
39
|
-
|
40
|
-
s.name = NAME
|
18
|
+
s.name = name
|
41
19
|
s.summary = 'A Ruby C++ Extension Helper Library.'
|
42
20
|
s.description = 'This library helps you to develop Ruby Extension by C++.'
|
43
|
-
s.version =
|
21
|
+
s.version = mod.version
|
44
22
|
|
45
23
|
s.authors = %w[snori]
|
46
24
|
s.email = 'snori@xord.org'
|
47
|
-
s.homepage = "http://github.com/xord/#{
|
25
|
+
s.homepage = "http://github.com/xord/#{name}"
|
48
26
|
|
49
27
|
s.platform = Gem::Platform::RUBY
|
50
28
|
s.required_ruby_version = '>=1.9.0'
|
51
|
-
s.require_paths << 'ext'
|
52
29
|
|
30
|
+
s.add_runtime_dependency 'bundler'
|
53
31
|
s.add_runtime_dependency 'xot'
|
54
32
|
s.add_development_dependency 'rake'
|
55
33
|
s.add_development_dependency 'gemcutter'
|
56
34
|
|
57
|
-
s.files
|
58
|
-
s.
|
59
|
-
|
35
|
+
s.files = `git ls-files`.split $/
|
36
|
+
s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
|
37
|
+
s.test_files = s.files.grep %r{^(test|spec|features)/}
|
38
|
+
s.extra_rdoc_files = rdocs.to_a
|
60
39
|
s.has_rdoc = true
|
61
|
-
s.extra_rdoc_files = RDOCS.to_a
|
62
|
-
|
63
|
-
s.executables << 'rucy2rdoc'
|
64
40
|
|
65
41
|
s.extensions << 'Rakefile'
|
66
42
|
end
|
data/src/exception.cpp
CHANGED
@@ -10,21 +10,6 @@
|
|
10
10
|
#endif
|
11
11
|
|
12
12
|
|
13
|
-
#define VA_STRING(format, result) \
|
14
|
-
String result; \
|
15
|
-
do \
|
16
|
-
{ \
|
17
|
-
if (format) \
|
18
|
-
{ \
|
19
|
-
va_list args; \
|
20
|
-
va_start(args, format); \
|
21
|
-
result = Xot::stringf(format, args); \
|
22
|
-
va_end(args); \
|
23
|
-
} \
|
24
|
-
} \
|
25
|
-
while (false)
|
26
|
-
|
27
|
-
|
28
13
|
namespace Rucy
|
29
14
|
{
|
30
15
|
|
@@ -37,7 +22,7 @@ namespace Rucy
|
|
37
22
|
RubyException::RubyException (Value type, const char* format, ...)
|
38
23
|
: Super(""), val(Qnil)
|
39
24
|
{
|
40
|
-
|
25
|
+
XOT_STRINGF(format, s);
|
41
26
|
val = rb_exc_new2(type, s.c_str());
|
42
27
|
}
|
43
28
|
|
@@ -66,29 +51,29 @@ namespace Rucy
|
|
66
51
|
{
|
67
52
|
if (!format) throw;
|
68
53
|
|
69
|
-
|
54
|
+
XOT_STRINGF(format, message);
|
70
55
|
throw message;
|
71
56
|
}
|
72
57
|
|
73
58
|
void
|
74
|
-
raise (
|
59
|
+
raise (VALUE exception, const char* format, ...)
|
75
60
|
{
|
76
|
-
|
77
|
-
throw RubyException(
|
61
|
+
XOT_STRINGF(format, message);
|
62
|
+
throw RubyException(exception, message.c_str());
|
78
63
|
}
|
79
64
|
|
80
65
|
|
81
66
|
void
|
82
67
|
type_error (const char* format, ...)
|
83
68
|
{
|
84
|
-
|
69
|
+
XOT_STRINGF(format, message);
|
85
70
|
raise(rb_eTypeError, message.c_str());
|
86
71
|
}
|
87
72
|
|
88
73
|
void
|
89
74
|
argument_error (const char* format, ...)
|
90
75
|
{
|
91
|
-
|
76
|
+
XOT_STRINGF(format, message);
|
92
77
|
raise(rb_eArgError, message.c_str());
|
93
78
|
}
|
94
79
|
|
@@ -110,10 +95,17 @@ namespace Rucy
|
|
110
95
|
argument_error(message.c_str());
|
111
96
|
}
|
112
97
|
|
98
|
+
void
|
99
|
+
index_error (const char* format, ...)
|
100
|
+
{
|
101
|
+
XOT_STRINGF(format, message);
|
102
|
+
raise(rb_eIndexError, message.c_str());
|
103
|
+
}
|
104
|
+
|
113
105
|
void
|
114
106
|
not_implemented_error (const char* format, ...)
|
115
107
|
{
|
116
|
-
|
108
|
+
XOT_STRINGF(format, message);
|
117
109
|
raise(rb_eNotImpError, message.c_str());
|
118
110
|
}
|
119
111
|
|
@@ -121,7 +113,7 @@ namespace Rucy
|
|
121
113
|
void
|
122
114
|
system_error (const char* format, ...)
|
123
115
|
{
|
124
|
-
|
116
|
+
XOT_STRINGF(format, message);
|
125
117
|
|
126
118
|
#ifdef WIN32
|
127
119
|
DWORD lasterror = GetLastError();
|
@@ -149,7 +141,7 @@ namespace Rucy
|
|
149
141
|
void
|
150
142
|
invalid_object_error (const char* format, ...)
|
151
143
|
{
|
152
|
-
|
144
|
+
XOT_STRINGF(format, message);
|
153
145
|
raise(invalid_object_error_class(), message.c_str());
|
154
146
|
}
|
155
147
|
|