rucy 0.1.11 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
  %w[../xot .]
5
- .map {|s| File.expand_path "../../../#{s}/lib", __FILE__}
5
+ .map {|s| File.expand_path "../../#{s}/lib", __dir__}
6
6
  .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
7
7
 
8
8
  require 'mkmf'
@@ -13,10 +13,9 @@ require 'rucy/module'
13
13
 
14
14
  Xot::ExtConf.new Xot, Rucy do
15
15
  setup do
16
- headers << 'boost/noncopyable.hpp' << 'ruby.h'
16
+ headers << 'ruby.h'
17
17
  local_libs << 'rucy'
18
18
  end
19
19
 
20
- dir_config 'boost'
21
20
  create_makefile 'rucy/tester'
22
21
  end
@@ -56,8 +56,8 @@ Init_tester ()
56
56
  Module mRucy = define_module("Rucy");
57
57
  Module mTester = mRucy.define_module("Tester");
58
58
 
59
- mTester.define_function("all_logs", all_logs);
60
- mTester.define_function("clear_logs", clear_logs);
59
+ mTester.define_module_function("all_logs", all_logs);
60
+ mTester.define_module_function("clear_logs", clear_logs);
61
61
 
62
62
  Init_value();
63
63
  Init_exception();
@@ -6,12 +6,15 @@
6
6
 
7
7
  #include <rucy/ruby.h>
8
8
  #include <rucy/rucy.h>
9
- #include <rucy/value.h>
10
9
  #include <rucy/exception.h>
10
+ #include <rucy/debug.h>
11
+
12
+ #include <rucy/value.h>
11
13
  #include <rucy/function.h>
12
14
  #include <rucy/module.h>
13
15
  #include <rucy/class.h>
14
16
  #include <rucy/symbol.h>
17
+
15
18
  #include <rucy/extension.h>
16
19
 
17
20
 
@@ -0,0 +1,22 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __RUCY_DEBUG_H__
4
+ #define __RUCY_DEBUG_H__
5
+
6
+
7
+ #include <xot/debug.h>
8
+
9
+
10
+ namespace Rucy
11
+ {
12
+
13
+
14
+ using Xot::dout;
15
+
16
+ using Xot::doutln;
17
+
18
+
19
+ }// Rucy
20
+
21
+
22
+ #endif//EOH
@@ -47,31 +47,51 @@ namespace Rucy
47
47
  };// RubyJumpTag
48
48
 
49
49
 
50
+ [[noreturn]]
50
51
  void raise (const char* format = NULL, ...);
51
52
 
53
+ [[noreturn]]
52
54
  void raise (RubyValue exception, const char* format = NULL, ...);
53
55
 
54
56
 
55
- void rucy_error (const char* file, int line, const char* format = NULL, ...);
57
+ [[noreturn]]
58
+ void rucy_error (
59
+ const char* file, int line, const char* format = NULL, ...);
56
60
 
57
- void type_error (const char* file, int line, const char* format = NULL, ...);
61
+ [[noreturn]]
62
+ void type_error (
63
+ const char* file, int line, const char* format = NULL, ...);
58
64
 
59
- void argument_error (const char* file, int line, const char* format = NULL, ...);
65
+ [[noreturn]]
66
+ void argument_error (
67
+ const char* file, int line, const char* format = NULL, ...);
60
68
 
61
- void arg_count_error (const char* file, int line,
69
+ [[noreturn]]
70
+ void arg_count_error (
71
+ const char* file, int line,
62
72
  const char* method, int nargs, int nargs_expected,
63
73
  int n1 = -1, int n2 = -1, int n3 = -1, int n4 = -1, int n5 = -1,
64
74
  int n6 = -1, int n7 = -1, int n8 = -1, int n9 = -1, int n10 = -1);
65
75
 
66
- void invalid_state_error (const char* file, int line, const char* format = NULL, ...);
76
+ [[noreturn]]
77
+ void invalid_state_error (
78
+ const char* file, int line, const char* format = NULL, ...);
67
79
 
68
- void invalid_object_error (const char* file, int line, const char* format = NULL, ...);
80
+ [[noreturn]]
81
+ void invalid_object_error (
82
+ const char* file, int line, const char* format = NULL, ...);
69
83
 
70
- void index_error (const char* file, int line, const char* format = NULL, ...);
84
+ [[noreturn]]
85
+ void index_error (
86
+ const char* file, int line, const char* format = NULL, ...);
71
87
 
72
- void not_implemented_error (const char* file, int line, const char* format = NULL, ...);
88
+ [[noreturn]]
89
+ void not_implemented_error (
90
+ const char* file, int line, const char* format = NULL, ...);
73
91
 
74
- void system_error (const char* file, int line, const char* format = NULL, ...);
92
+ [[noreturn]]
93
+ void system_error (
94
+ const char* file, int line, const char* format = NULL, ...);
75
95
 
76
96
 
77
97
  }// Rucy
@@ -4,8 +4,6 @@
4
4
  #define __RUCY_EXTENSION_H__
5
5
 
6
6
 
7
- #include <typeinfo>
8
- #include <boost/dynamic_bitset.hpp>
9
7
  #include <xot/ref.h>
10
8
  #include <xot/string.h>
11
9
  #include <rucy/rucy.h>
@@ -23,11 +21,26 @@
23
21
  #define RUCY_DECLARE_VALUE_TO(native_class) \
24
22
  namespace Rucy \
25
23
  { \
26
- template <> native_class* value_to<native_class*> (Value value, bool); \
27
- template <> native_class& value_to<native_class&> (Value value, bool convert); \
28
- template <> native_class value_to<native_class> (Value value, bool convert); \
24
+ template <> native_class* value_to< native_class*> (Value value, bool); \
25
+ template <> const native_class* value_to<const native_class*> (Value value, bool); \
26
+ template <> native_class& value_to< native_class&> (Value value, bool convert); \
27
+ template <> const native_class& value_to<const native_class&> (Value value, bool convert); \
29
28
  }
30
29
 
30
+ #define RUCY_DECLARE_ARRAY_TO(native_class) \
31
+ namespace Rucy \
32
+ { \
33
+ template <> native_class value_to<native_class> (Value value, bool convert); \
34
+ template <> native_class value_to<native_class> (int argc, const Value* argv, bool convert); \
35
+ }
36
+
37
+ #define RUCY_DECLARE_CONVERT_TO(native_type) \
38
+ RUCY_DECLARE_ARRAY_TO(native_type)
39
+
40
+ #define RUCY_DECLARE_VALUE_OR_ARRAY_TO(native_class) \
41
+ RUCY_DECLARE_VALUE_TO(native_class) \
42
+ RUCY_DECLARE_ARRAY_TO(native_class)
43
+
31
44
  #define RUCY_DECLARE_WRAPPER_VALUE_FROM(native_class) \
32
45
  namespace Rucy \
33
46
  { \
@@ -38,7 +51,8 @@
38
51
  #define RUCY_DECLARE_WRAPPER_VALUE_TO(native_class) \
39
52
  namespace Rucy \
40
53
  { \
41
- template <> native_class* value_to<native_class*> (Value value, bool convert); \
54
+ template <> native_class* value_to< native_class*> (Value value, bool convert); \
55
+ template <> const native_class* value_to<const native_class*> (Value value, bool convert); \
42
56
  }
43
57
 
44
58
  #define RUCY_DEFINE_VALUE_FROM(native_class) \
@@ -64,6 +78,11 @@
64
78
  { \
65
79
  return get_type_ptr<native_class>(value, get_ruby_class<native_class>()); \
66
80
  } \
81
+ template <> const native_class* \
82
+ value_to<const native_class*> (Value value, bool convert) \
83
+ { \
84
+ return (const native_class*) value_to<native_class*>(value, convert); \
85
+ } \
67
86
  template <> native_class& \
68
87
  value_to<native_class&> (Value value, bool convert) \
69
88
  { \
@@ -72,8 +91,33 @@
72
91
  rucy_error(__FILE__, __LINE__, "failed to convert from/to %s.", #native_class); \
73
92
  return *obj; \
74
93
  } \
94
+ template <> const native_class& \
95
+ value_to<const native_class&> (Value value, bool convert) \
96
+ { \
97
+ return (const native_class&) value_to<native_class&>(value, convert); \
98
+ } \
99
+ }
100
+
101
+ #define RUCY_DEFINE_ARRAY_TO(native_class) \
102
+ namespace Rucy \
103
+ { \
104
+ template <> native_class \
105
+ value_to<native_class> (Value value, bool convert) \
106
+ { \
107
+ if (value.is_array()) \
108
+ return value_to<native_class>(value.size(), value.as_array(), convert); \
109
+ else \
110
+ return value_to<native_class>(1, &value, convert); \
111
+ } \
75
112
  }
76
113
 
114
+ #define RUCY_DEFINE_CONVERT_TO(native_type) \
115
+ RUCY_DEFINE_ARRAY_TO(native_type)
116
+
117
+ #define RUCY_DEFINE_VALUE_OR_ARRAY_TO(native_class) \
118
+ RUCY_DEFINE_VALUE_TO(native_class) \
119
+ RUCY_DEFINE_ARRAY_TO(native_class)
120
+
77
121
  #define RUCY_DEFINE_WRAPPER_VALUE_FROM(native_class) \
78
122
  namespace Rucy \
79
123
  { \
@@ -86,10 +130,10 @@
86
130
  value (native_class* obj, Value klass) \
87
131
  { \
88
132
  if (!obj) return nil(); \
89
- Value* pval = (Value*) obj->rucy_value(); \
90
- if (!pval) return new_ref(klass, obj); \
91
- if (pval->is_nil()) *pval = new_wrapper(klass, obj); \
92
- return *pval; \
133
+ GlobalValue* wrapped = (GlobalValue*) obj->rucy_wrapper_value(); \
134
+ if (!wrapped) return new_ref(klass, obj); \
135
+ if (wrapped->is_nil()) *wrapped = new_wrapper(klass, obj); \
136
+ return *wrapped; \
93
137
  } \
94
138
  }
95
139
 
@@ -97,10 +141,15 @@
97
141
  namespace Rucy \
98
142
  { \
99
143
  template <> native_class* \
100
- value_to<native_class*> (Value value, bool convert) \
144
+ value_to<native_class*> (Value value, bool) \
101
145
  { \
102
146
  return get_type_ptr<native_class>(value, get_ruby_class<native_class>()); \
103
147
  } \
148
+ template <> const native_class* \
149
+ value_to<const native_class*> (Value value, bool convert) \
150
+ { \
151
+ return (const native_class*) value_to<native_class*>(value, convert); \
152
+ } \
104
153
  }
105
154
 
106
155
  #define RUCY_DECLARE_VALUE_FROM_TO(native_class) \
@@ -115,6 +164,18 @@
115
164
  RUCY_DECLARE_VALUE_FROM_TO(native_class) \
116
165
  RUCY_DEFINE_VALUE_FROM_TO(native_class)
117
166
 
167
+ #define RUCY_DECLARE_VALUE_OR_ARRAY_FROM_TO(native_class) \
168
+ RUCY_DECLARE_VALUE_FROM(native_class) \
169
+ RUCY_DECLARE_VALUE_OR_ARRAY_TO(native_class)
170
+
171
+ #define RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(native_class) \
172
+ RUCY_DEFINE_VALUE_FROM(native_class) \
173
+ RUCY_DEFINE_VALUE_OR_ARRAY_TO(native_class)
174
+
175
+ #define RUCY_VALUE_OR_ARRAY_FROM_TO(native_class) \
176
+ RUCY_DECLARE_VALUE_OR_ARRAY_FROM_TO(native_class) \
177
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(native_class)
178
+
118
179
  #define RUCY_DECLARE_WRAPPER_VALUE_FROM_TO(native_class) \
119
180
  RUCY_DECLARE_WRAPPER_VALUE_FROM(native_class) \
120
181
  RUCY_DECLARE_WRAPPER_VALUE_TO(native_class)
@@ -128,25 +189,8 @@
128
189
  RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(native_class)
129
190
 
130
191
 
131
- #define RUCY_OVERRIDE_BEGIN(super_class) \
132
- typedef super_class Super; \
133
- enum { OVERRIDE_ID_FIRST = super_class::OVERRIDE_ID_LAST - 1,
134
-
135
- #define RUCY_OVERRIDE_END \
136
- OVERRIDE_ID_LAST };
137
-
138
- #define RUCY_OVERRIDE_ID(name) \
139
- OID_##name,
140
-
141
- #define RUCY_IS_OVERRIDABLE() \
142
- this->is_overridable()
143
-
144
- #define RUCY_IS_OVERRIDDEN(name) \
145
- this->is_overridden(name, OID_##name)
146
-
147
-
148
192
  #define RUCY_TRY \
149
- RubyValue RUCY__rubyexception__ = nil(); \
193
+ Rucy::RubyValue RUCY__rubyexception__ = Rucy::nil(); \
150
194
  int RUCY__rubyjumptag__ = 0; \
151
195
  \
152
196
  goto RUCY__ruby_try_start__; \
@@ -207,35 +251,25 @@
207
251
 
208
252
 
209
253
  #define RUCY_DEF_ALLOC(name, klass) \
210
- RubyValue name (Value klass) \
254
+ Rucy::RubyValue name (Rucy::Value klass) \
211
255
  { \
212
256
  RUCY_TRY
213
257
 
214
258
  #define RUCY_DEFN(name) \
215
- RubyValue name (int argc, const Value* argv, Value self) \
259
+ Rucy::RubyValue name (int argc, const Rucy::Value* argv, Rucy::Value self) \
216
260
  { \
217
261
  RUCY_TRY
218
262
 
219
263
  % NTIMES.each do |n|
220
264
  #define RUCY_DEF<%= n %>(name<%= params(n) {|i| ", v#{i}"} %>) \
221
- RubyValue name (Value self<%= params(n) {|i| ", Value v#{i}"} %>) \
265
+ Rucy::RubyValue name (Rucy::Value self<%= params(n) {|i| ", Rucy::Value v#{i}"} %>) \
222
266
  { \
223
267
  RUCY_TRY
224
268
  % end
225
269
 
226
- #define RUCY_DEF_clear_override_flags(name, native_class) \
227
- RUCY_DEF0(name) \
228
- { \
229
- RUCY_CHECK_OBJ(native_class, self); \
230
- ClassWrapper<native_class>* obj = \
231
- dynamic_cast<ClassWrapper<native_class>*>(to<native_class*>(self)); \
232
- if (obj) obj->clear_override_flags(); \
233
- } \
234
- RUCY_END
235
-
236
270
  #define RUCY_END \
237
271
  RUCY_CATCH \
238
- return nil(); \
272
+ return Rucy::nil(); \
239
273
  }
240
274
 
241
275
 
@@ -251,12 +285,13 @@
251
285
  #define RUCY_CHECK_OBJECT(native_class, obj) \
252
286
  do \
253
287
  { \
254
- native_class* p = Rucy::get_type_ptr<native_class>(obj, get_ruby_class<native_class>()); \
288
+ native_class* p = \
289
+ Rucy::get_type_ptr<native_class>(obj, Rucy::get_ruby_class<native_class>()); \
255
290
  if (!p || !*p) Rucy::invalid_object_error(__FILE__, __LINE__); \
256
291
  } \
257
292
  while(0)
258
293
 
259
- #define RUCY_WRAPPER_CALL(native_class, obj, fun) \
294
+ #define RUCY_CALL_SUPER(obj, fun) \
260
295
  ((obj)->rucy_disable_override() ? (obj)->fun : (obj)->fun)
261
296
 
262
297
 
@@ -276,15 +311,15 @@ namespace Rucy
276
311
  template <typename T> Class get_ruby_class ();
277
312
 
278
313
 
279
- template <typename T>
280
- class ClassWrapper : public T
314
+ template <typename RefCountableT>
315
+ class ClassWrapper : public RefCountableT
281
316
  {
282
317
 
283
- typedef ClassWrapper This;
318
+ typedef ClassWrapper This;
284
319
 
285
- public:
320
+ typedef RefCountableT RucyWrapped;
286
321
 
287
- typedef T RucyWrapped;
322
+ public:
288
323
 
289
324
  GlobalValue value;
290
325
 
@@ -293,47 +328,21 @@ namespace Rucy
293
328
  {
294
329
  }
295
330
 
296
- virtual void retain (void* by_ruby_value = NULL) const
331
+ void retain (intptr_t by_ruby) const override
297
332
  {
298
- if (!by_ruby_value)
299
- {
300
- refc_set_aux(refc_aux() + 1);
301
- if (refc_aux() == 1) value.gc(false);
302
- }
303
-
333
+ if (!by_ruby) value.disable_gc();
304
334
  RucyWrapped::retain();
305
335
  }
306
336
 
307
- virtual void release (void* by_ruby_value = NULL) const
337
+ void release (intptr_t by_ruby) const override
308
338
  {
309
- if (!by_ruby_value && refc_aux() > 0)
310
- {
311
- refc_set_aux(refc_aux() - 1);
312
- if (refc_aux() == 0) value.gc(true);
313
- }
314
-
339
+ if (!by_ruby) value.enable_gc();
315
340
  RucyWrapped::release();
316
341
  }
317
342
 
318
- virtual void clear_override_flags ()
319
- {
320
- override_flags.reset();
321
- }
322
-
323
343
  virtual bool is_overridable () const
324
344
  {
325
- if (!overridable)
326
- {
327
- overridable = true;
328
- return false;
329
- }
330
-
331
- return true;
332
- }
333
-
334
- virtual bool is_overridden (const Symbol& name, uint id) const
335
- {
336
- if (id <= OVERRIDE_ID_UNKNOWN)
345
+ if (value.is_nil())
337
346
  return false;
338
347
 
339
348
  if (!overridable)
@@ -342,111 +351,27 @@ namespace Rucy
342
351
  return false;
343
352
  }
344
353
 
345
- bool checked = false, overridden = false;
346
- get_override_flag(&checked, &overridden, id);
347
- if (checked) return overridden;
348
-
349
- overridden = check_overridden(name);
350
- if (!set_override_flag(id, true, overridden))
351
- return false;
352
-
353
- return overridden;
354
+ return true;
354
355
  }
355
356
 
356
- virtual void* rucy_value () const
357
+ void* rucy_wrapper_value () const override
357
358
  {
358
359
  return (void*) &value;
359
360
  }
360
361
 
361
- virtual bool rucy_disable_override () const
362
+ bool rucy_disable_override () const override
362
363
  {
363
364
  overridable = false;
364
365
  return true;
365
366
  }
366
367
 
367
- protected:
368
-
369
- enum
370
- {
371
-
372
- OVERRIDE_ID_UNKNOWN = 0,
373
-
374
- OVERRIDE_ID_LAST,
375
-
376
- OVERRIDE_ID_MAX = 256
377
-
378
- };
379
-
380
- virtual ushort refc_aux () const
381
- {
382
- return RucyWrapped::refc_aux();
383
- }
384
-
385
- virtual void refc_set_aux (ushort aux) const
386
- {
387
- RucyWrapped::refc_set_aux(aux);
388
- }
389
-
390
368
  private:
391
369
 
392
- mutable boost::dynamic_bitset<> override_flags;
393
-
394
370
  mutable bool overridable;
395
371
 
396
- bool check_overridden (const Symbol& name) const
397
- {
398
- RUCY_SYM(method);
399
- RUCY_SYM(owner);
400
- RUCY_SYM(instance_methods);
401
- RUCY_SYM_Q(include);
402
- RUCY_SYM(clear_override_flags);
403
- return !value
404
- .call(method, name.value())
405
- .call(owner)
406
- .call(instance_methods, false)
407
- .call(include, clear_override_flags.value());
408
- }
409
-
410
- void get_override_flag (bool* checked, bool* overridden, uint id) const
411
- {
412
- assert(checked || overridden);
413
-
414
- int checked_pos = id2index(id);
415
- int overridden_pos = checked_pos + 1;
416
- bool valid = 0 <= checked_pos && overridden_pos < (int) override_flags.size();
417
- if (checked) *checked = valid ? override_flags[checked_pos] : false;
418
- if (overridden) *overridden = valid ? override_flags[overridden_pos] : false;
419
- }
420
-
421
- bool set_override_flag (uint id, bool checked, bool overridden) const
422
- {
423
- assert(id < OVERRIDE_ID_MAX);
424
-
425
- int checked_pos = id2index(id);
426
- if (checked_pos < 0) return true;
427
-
428
- int overridden_pos = checked_pos + 1;
429
- if (overridden_pos >= (int) override_flags.size())
430
- override_flags.resize(overridden_pos + 1);
431
-
432
- override_flags[checked_pos] = checked;
433
- override_flags[overridden_pos] = overridden;
434
- return true;
435
- }
436
-
437
- int id2index (uint id) const
438
- {
439
- return (id - 1) * 2;
440
- }
441
-
442
372
  };// ClassWrapper
443
373
 
444
374
 
445
- template <typename T> inline void mark_type (void* p)
446
- {
447
- if (p) ((T*) p)->mark();
448
- }
449
-
450
375
  template <typename T> inline void delete_type (void* p)
451
376
  {
452
377
  delete (T*) p;
@@ -454,12 +379,12 @@ namespace Rucy
454
379
 
455
380
  template <typename T> inline void release_ref (void* p)
456
381
  {
457
- if (p) ((T*) p)->release((void*) true);// 'true' means by-ruby-value.
382
+ if (p) ((T*) p)->release();
458
383
  }
459
384
 
460
385
  template <typename T> inline void release_wrapper (void* p)
461
386
  {
462
- if (p) ((T*) p)->Xot::template RefCountable<>::release();
387
+ if (p) ((T*) p)->release(true);
463
388
  }
464
389
 
465
390
 
@@ -485,7 +410,7 @@ namespace Rucy
485
410
  RUBY_DATA_FUNC mark = NULL,
486
411
  RUBY_DATA_FUNC free = release_ref<T>)
487
412
  {
488
- if (ptr) ptr->retain((void*) true);// 'true' means by-ruby-value
413
+ if (ptr) ptr->retain();
489
414
  return new_type(klass, ptr, mark, free);
490
415
  }
491
416
 
@@ -502,7 +427,7 @@ namespace Rucy
502
427
  RUBY_DATA_FUNC mark = NULL,
503
428
  RUBY_DATA_FUNC free = release_wrapper<T>)
504
429
  {
505
- if (ptr) ptr->Xot::template RefCountable<>::retain();
430
+ if (ptr) ptr->retain(true);
506
431
  return new_type(klass, ptr, mark, free);
507
432
  }
508
433