rucy 0.1.11 → 0.1.16

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.
@@ -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