cgen 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/.gitignore +5 -0
  2. data/History.txt +199 -0
  3. data/README.txt +34 -0
  4. data/examples/bench.rb +14 -0
  5. data/examples/complex.rb +63 -0
  6. data/examples/complex2.rb +48 -0
  7. data/examples/cshadow-example.rb +55 -0
  8. data/examples/cshadow-point.rb +58 -0
  9. data/examples/ctest.rb +34 -0
  10. data/examples/ctest2.rb +32 -0
  11. data/examples/ctest3.rb +179 -0
  12. data/examples/ctest4.rb +18 -0
  13. data/examples/ctest5.rb +27 -0
  14. data/examples/example-ruby-talk-30April2004.rb +65 -0
  15. data/examples/fixed-array.rb +221 -0
  16. data/examples/inherit-example.rb +26 -0
  17. data/examples/inherit-example.txt +80 -0
  18. data/examples/instance-eval.rb +66 -0
  19. data/examples/ivset.rb +55 -0
  20. data/examples/marshal-test.rb +19 -0
  21. data/examples/matrix.rb +91 -0
  22. data/examples/modular-def.rb +87 -0
  23. data/examples/objattr.rb +46 -0
  24. data/examples/opaque-struct-test.rb +36 -0
  25. data/examples/sample.rb +184 -0
  26. data/examples/struct.rb +103 -0
  27. data/examples/test.rb +24 -0
  28. data/examples/yaml.rb +56 -0
  29. data/install.rb +1015 -0
  30. data/lib/cgen/attribute.rb +414 -0
  31. data/lib/cgen/cgen.rb +2041 -0
  32. data/lib/cgen/cshadow.rb +1037 -0
  33. data/lib/cgen/inherit.rb +46 -0
  34. data/rakefile +42 -0
  35. data/tasks/ann.rake +80 -0
  36. data/tasks/bones.rake +20 -0
  37. data/tasks/gem.rake +201 -0
  38. data/tasks/git.rake +40 -0
  39. data/tasks/notes.rake +27 -0
  40. data/tasks/post_load.rake +34 -0
  41. data/tasks/rdoc.rake +51 -0
  42. data/tasks/rubyforge.rake +55 -0
  43. data/tasks/setup.rb +292 -0
  44. data/tasks/spec.rake +54 -0
  45. data/tasks/svn.rake +47 -0
  46. data/tasks/test.rake +40 -0
  47. data/tasks/zentest.rake +36 -0
  48. data/test/test-attribute.rb +430 -0
  49. data/test/test-cgen.rb +127 -0
  50. data/test/test-cshadow.rb +289 -0
  51. data/test/test.rb +17 -0
  52. metadata +123 -0
@@ -0,0 +1,47 @@
1
+
2
+ if HAVE_SVN
3
+
4
+ unless PROJ.svn.root
5
+ info = %x/svn info ./
6
+ m = %r/^Repository Root:\s+(.*)$/.match(info)
7
+ PROJ.svn.root = (m.nil? ? '' : m[1])
8
+ end
9
+ PROJ.svn.root = File.join(PROJ.svn.root, PROJ.svn.path) unless PROJ.svn.path.empty?
10
+
11
+ namespace :svn do
12
+
13
+ # A prerequisites task that all other tasks depend upon
14
+ task :prereqs
15
+
16
+ desc 'Show tags from the SVN repository'
17
+ task :show_tags => 'svn:prereqs' do |t|
18
+ tags = %x/svn list #{File.join(PROJ.svn.root, PROJ.svn.tags)}/
19
+ tags.gsub!(%r/\/$/, '')
20
+ tags = tags.split("\n").sort {|a,b| b <=> a}
21
+ puts tags
22
+ end
23
+
24
+ desc 'Create a new tag in the SVN repository'
25
+ task :create_tag => 'svn:prereqs' do |t|
26
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
27
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
28
+
29
+ svn = PROJ.svn
30
+ trunk = File.join(svn.root, svn.trunk)
31
+ tag = "%s-%s" % [PROJ.name, PROJ.version]
32
+ tag = File.join(svn.root, svn.tags, tag)
33
+ msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
34
+
35
+ puts "Creating SVN tag '#{tag}'"
36
+ unless system "svn cp -m '#{msg}' #{trunk} #{tag}"
37
+ abort "Tag creation failed"
38
+ end
39
+ end
40
+
41
+ end # namespace :svn
42
+
43
+ task 'gem:release' => 'svn:create_tag'
44
+
45
+ end # if PROJ.svn.path
46
+
47
+ # EOF
@@ -0,0 +1,40 @@
1
+
2
+ if test(?e, PROJ.test.file) or not PROJ.test.files.to_a.empty?
3
+ require 'rake/testtask'
4
+
5
+ namespace :test do
6
+
7
+ Rake::TestTask.new(:run) do |t|
8
+ t.libs = PROJ.libs
9
+ t.test_files = if test(?f, PROJ.test.file) then [PROJ.test.file]
10
+ else PROJ.test.files end
11
+ t.ruby_opts += PROJ.ruby_opts
12
+ t.ruby_opts += PROJ.test.opts
13
+ end
14
+
15
+ if HAVE_RCOV
16
+ desc 'Run rcov on the unit tests'
17
+ task :rcov => :clobber_rcov do
18
+ opts = PROJ.rcov.opts.dup << '-o' << PROJ.rcov.dir
19
+ opts = opts.join(' ')
20
+ files = if test(?f, PROJ.test.file) then [PROJ.test.file]
21
+ else PROJ.test.files end
22
+ files = files.join(' ')
23
+ sh "#{RCOV} #{files} #{opts}"
24
+ end
25
+
26
+ task :clobber_rcov do
27
+ rm_r 'coverage' rescue nil
28
+ end
29
+ end
30
+
31
+ end # namespace :test
32
+
33
+ desc 'Alias to test:run'
34
+ task :test => 'test:run'
35
+
36
+ task :clobber => 'test:clobber_rcov' if HAVE_RCOV
37
+
38
+ end
39
+
40
+ # EOF
@@ -0,0 +1,36 @@
1
+ if HAVE_ZENTEST
2
+
3
+ # --------------------------------------------------------------------------
4
+ if test(?e, PROJ.test.file) or not PROJ.test.files.to_a.empty?
5
+ require 'autotest'
6
+
7
+ namespace :test do
8
+ task :autotest do
9
+ Autotest.run
10
+ end
11
+ end
12
+
13
+ desc "Run the autotest loop"
14
+ task :autotest => 'test:autotest'
15
+
16
+ end # if test
17
+
18
+ # --------------------------------------------------------------------------
19
+ if HAVE_SPEC_RAKE_SPECTASK and not PROJ.spec.files.to_a.empty?
20
+ require 'autotest/rspec'
21
+
22
+ namespace :spec do
23
+ task :autotest do
24
+ load '.autotest' if test(?f, '.autotest')
25
+ Autotest::Rspec.run
26
+ end
27
+ end
28
+
29
+ desc "Run the autotest loop"
30
+ task :autotest => 'spec:autotest'
31
+
32
+ end # if rspec
33
+
34
+ end # if HAVE_ZENTEST
35
+
36
+ # EOF
@@ -0,0 +1,430 @@
1
+ require 'test/unit'
2
+ require 'cgen/cshadow'
3
+
4
+ #
5
+ # Tests in this file focus on the behavior of individual attributes:
6
+ # accessors, initial values, type conversion and checking,
7
+ # garbage collection (mark and free functions), etc.
8
+ #
9
+
10
+ class AttributeSample
11
+ include CShadow
12
+ end
13
+
14
+ class AttributeTest < Test::Unit::TestCase
15
+ def default_test; end
16
+ end
17
+
18
+ class ObjectAttributeTest < AttributeTest
19
+ class ObjectAttributeSample < AttributeSample
20
+ def self.foo; end
21
+ shadow_attr_accessor :x => Object, :y => String,
22
+ :z => ObjectAttributeSample
23
+ end
24
+
25
+ def test__initial
26
+ @oas = ObjectAttributeSample.new
27
+ assert_equal(nil, @oas.x)
28
+ assert_equal(nil, @oas.y)
29
+ end
30
+
31
+ def test_accessor
32
+ @oas = ObjectAttributeSample.new
33
+ @oas.x = lx = Object.new
34
+ @oas.y = ly = "A string"
35
+ @oas.z = @oas
36
+ assert_same(lx, @oas.x)
37
+ assert_same(ly, @oas.y)
38
+ assert_same(@oas, @oas.z)
39
+
40
+ @oas.x = nil
41
+ @oas.y = nil
42
+ assert_equal(nil, @oas.x)
43
+ assert_equal(nil, @oas.y)
44
+ end
45
+
46
+ def test_typecheck
47
+ @oas = ObjectAttributeSample.new
48
+ assert_raises(TypeError) {
49
+ @oas.y = 5
50
+ }
51
+ end
52
+
53
+ def make_thing c
54
+ @oas.x = c.new
55
+ end
56
+
57
+ def trash_thing
58
+ @oas.x = nil
59
+ end
60
+
61
+ def test_gc
62
+ @oas = ObjectAttributeSample.new
63
+ c = Class.new
64
+
65
+ 10.times do
66
+ make_thing c
67
+ end
68
+ GC.start
69
+ assert_equal(1, ObjectSpace.each_object(c) {})
70
+ end
71
+
72
+ def test_marshal_uninitialized
73
+ @oas = ObjectAttributeSample.new
74
+ s = Marshal.dump @oas
75
+ t = Marshal.load s
76
+ assert_equal(nil, t.x)
77
+ end
78
+
79
+ def test_marshal_nil
80
+ @oas = ObjectAttributeSample.new
81
+ @oas.x = nil
82
+ s = Marshal.dump @oas
83
+ t = Marshal.load s
84
+ assert_equal(nil, t.x)
85
+ end
86
+
87
+ def test_marshal
88
+ @oas = ObjectAttributeSample.new
89
+
90
+ @oas.x = "fred"
91
+ copy = Marshal.load(Marshal.dump(@oas))
92
+ assert_equal("fred", copy.x)
93
+
94
+ @oas.x = nil
95
+ copy = Marshal.load(Marshal.dump(@oas))
96
+ assert_equal(nil, copy.x)
97
+ end
98
+ end
99
+
100
+ class ShadowObjectAttributeTest < AttributeTest
101
+ class ShadowObjectAttributeSample < AttributeSample
102
+ shadow_attr_accessor :x => [ShadowObjectAttributeSample]
103
+ shadow_attr_accessor :z => "int z"
104
+ end
105
+
106
+ class Sub < ShadowObjectAttributeSample
107
+ shadow_attr_accessor :y => "int y"
108
+ end
109
+
110
+ def test__initial
111
+ @sas = ShadowObjectAttributeSample.new
112
+ assert_equal(nil, @sas.x)
113
+ end
114
+
115
+ def test_accessor
116
+ @sas = ShadowObjectAttributeSample.new
117
+ @sas.x = lx = ShadowObjectAttributeSample.new
118
+ assert_same(lx, @sas.x)
119
+ @sas.x = nil
120
+ assert_equal(nil, @sas.x)
121
+ end
122
+
123
+ def test_typecheck
124
+ @sas = ShadowObjectAttributeSample.new
125
+ assert_raises(TypeError) {
126
+ @sas.x = 5
127
+ }
128
+ end
129
+
130
+ def make_thing c
131
+ @sas.x = c.new
132
+ end
133
+
134
+ def trash_thing
135
+ @sas.x = nil
136
+ end
137
+
138
+ def test_gc
139
+ @sas = ShadowObjectAttributeSample.new
140
+ c = ShadowObjectAttributeSample
141
+
142
+ GC.start
143
+ n = ObjectSpace.each_object(c) {}
144
+ 10.times do
145
+ make_thing c
146
+ end
147
+ GC.start
148
+ assert_equal(n+1, ObjectSpace.each_object(c) {})
149
+ end
150
+
151
+ def test_marshal_uninitialized
152
+ @sas = ShadowObjectAttributeSample.new
153
+ s = Marshal.dump @sas
154
+ t = Marshal.load s
155
+ assert_equal(nil, t.x)
156
+ end
157
+
158
+ def test_marshal_nil
159
+ @sas = ShadowObjectAttributeSample.new
160
+ @sas.x = nil
161
+ s = Marshal.dump @sas
162
+ t = Marshal.load s
163
+ assert_equal(nil, t.x)
164
+ end
165
+
166
+ def test_marshal
167
+ @sas1 = ShadowObjectAttributeSample.new
168
+ @sas2 = ShadowObjectAttributeSample.new
169
+
170
+ @sas1.x = @sas2
171
+ @sas2.x = @sas1
172
+ s = Marshal.dump @sas1
173
+ t = Marshal.load s
174
+ assert_same(t, t.x.x)
175
+
176
+ @sas1.x = nil
177
+ @sas1.z = 3
178
+ s = Marshal.dump @sas1
179
+ t = Marshal.load s
180
+ assert_equal(nil, t.x)
181
+ assert_equal(3, t.z)
182
+ end
183
+
184
+ def test_sub
185
+ @sas = ShadowObjectAttributeSample.new
186
+ sub = Sub.new
187
+ sub.y = 3
188
+ @sas.x = sub
189
+ assert_equal(3, @sas.x.y)
190
+
191
+ s = Marshal.dump sub
192
+ t = Marshal.load s
193
+ assert_equal(3, t.y)
194
+
195
+ s = Marshal.dump @sas
196
+ t = Marshal.load s
197
+ assert_equal(3, t.x.y)
198
+ end
199
+ end
200
+
201
+ class IntAttributeTest < AttributeTest
202
+ class IntAttributeSample < AttributeSample
203
+ shadow_attr_accessor :x => "int x"
204
+ end
205
+
206
+ def test__initial
207
+ @ias = IntAttributeSample.new
208
+ assert_equal(0, @ias.x)
209
+ end
210
+
211
+ def test_accessor
212
+ @ias = IntAttributeSample.new
213
+ @ias.x = 5
214
+ assert_equal(5, @ias.x)
215
+ @ias.x = -5.1
216
+ assert_equal(-5, @ias.x)
217
+ @ias.x = 2**31-1
218
+ assert_equal(2**31-1, @ias.x)
219
+ assert_raises(RangeError) {@ias.x = 2**31}
220
+ @ias.x = -2**31
221
+ assert_equal(-2**31, @ias.x)
222
+ assert_raises(RangeError) {@ias.x = -2**31 - 1}
223
+ end
224
+
225
+ def test_conversion
226
+ @ias = IntAttributeSample.new
227
+ @ias.x = 5.1
228
+ assert_equal(5, @ias.x)
229
+ end
230
+
231
+ def test_typecheck
232
+ @ias = IntAttributeSample.new
233
+ assert_raises(TypeError) {
234
+ @ias.x = "Foo"
235
+ }
236
+ end
237
+
238
+ def test_marshal
239
+ @ias = IntAttributeSample.new
240
+ @ias.x = -11
241
+ s = Marshal.dump @ias
242
+ t = Marshal.load s
243
+ assert_equal(@ias.x, t.x)
244
+
245
+ @ias.x = 2**31-1
246
+ s = Marshal.dump @ias
247
+ t = Marshal.load s
248
+ assert_equal(@ias.x, t.x)
249
+ end
250
+ end
251
+
252
+ class LongAttributeTest < AttributeTest
253
+ class LongAttributeSample < AttributeSample
254
+ shadow_attr_accessor :x => "long x"
255
+ end
256
+
257
+ def test__initial
258
+ @las = LongAttributeSample.new
259
+ assert_equal(0, @las.x)
260
+ end
261
+
262
+ def test_accessor
263
+ @las = LongAttributeSample.new
264
+ @las.x = 5
265
+ assert_equal(5, @las.x)
266
+ @las.x = -5.1
267
+ assert_equal(-5, @las.x)
268
+ @las.x = 2**31-1
269
+ assert_equal(2**31-1, @las.x)
270
+ assert_raises(RangeError) {@las.x = 2**31}
271
+ @las.x = -2**31
272
+ assert_equal(-2**31, @las.x)
273
+ assert_raises(RangeError) {@las.x = -2**31 - 1}
274
+ end
275
+
276
+ def test_conversion
277
+ @las = LongAttributeSample.new
278
+ @las.x = 5.1
279
+ assert_equal(5, @las.x)
280
+ end
281
+
282
+ def test_typecheck
283
+ @las = LongAttributeSample.new
284
+ assert_raises(TypeError) {
285
+ @las.x = "Foo"
286
+ }
287
+ end
288
+
289
+ def test_marshal
290
+ @las = LongAttributeSample.new
291
+ @las.x = -11
292
+ s = Marshal.dump @las
293
+ t = Marshal.load s
294
+ assert_equal(@las.x, t.x)
295
+
296
+ @las.x = 2**31-1
297
+ s = Marshal.dump @las
298
+ t = Marshal.load s
299
+ assert_equal(@las.x, t.x)
300
+ end
301
+ end
302
+
303
+ class DoubleAttributeTest < AttributeTest
304
+ class DoubleAttributeSample < AttributeSample
305
+ shadow_attr_accessor :x => "double x"
306
+ end
307
+
308
+ def test__initial
309
+ @das = DoubleAttributeSample.new
310
+ assert_equal(0, @das.x)
311
+ end
312
+
313
+ def test_accessor
314
+ @das = DoubleAttributeSample.new
315
+ @das.x = 5.1
316
+ assert_equal(5.1, @das.x)
317
+ end
318
+
319
+ def test_conversion
320
+ @das = DoubleAttributeSample.new
321
+ @das.x = 5
322
+ assert_equal(5, @das.x)
323
+ end
324
+
325
+ def test_typecheck
326
+ @das = DoubleAttributeSample.new
327
+ assert_raises(TypeError) {
328
+ @das.x = "Foo"
329
+ }
330
+ end
331
+
332
+ def test_marshal
333
+ @das = DoubleAttributeSample.new
334
+ @das.x = -11.8
335
+ s = Marshal.dump @das
336
+ t = Marshal.load s
337
+ assert_equal(@das.x, t.x)
338
+ end
339
+ end
340
+
341
+ class CharPointerAttributeTest < AttributeTest
342
+ class CharPointerSample < AttributeSample
343
+ shadow_attr_accessor :x => "char *x"
344
+ end
345
+
346
+ def test__initial
347
+ @cps = CharPointerSample.new
348
+ assert_equal(nil, @cps.x)
349
+ end
350
+
351
+ def test_accessor
352
+ @cps = CharPointerSample.new
353
+ str = "foo"
354
+ @cps.x = str
355
+ assert_equal("foo", @cps.x)
356
+ assert(str.object_id != @cps.x.object_id)
357
+
358
+ @cps.x = nil
359
+ assert_equal(nil, @cps.x)
360
+ end
361
+
362
+ def test_typecheck
363
+ @cps = CharPointerSample.new
364
+ assert_raises(TypeError) {
365
+ @cps.x = 5
366
+ }
367
+ end
368
+
369
+ def test_marshal
370
+ @cps = CharPointerSample.new
371
+ @cps.x = "a string"
372
+ s = Marshal.dump @cps
373
+ t = Marshal.load s
374
+ assert_equal(@cps.x, t.x)
375
+ end
376
+ end
377
+
378
+ # General test of marshaling shadow objects.
379
+ class MarshalSample < AttributeSample
380
+ shadow_attr_accessor :x => Object, :y => String
381
+ attr_accessor :t
382
+ end
383
+
384
+ class MarshalTest < Test::Unit::TestCase
385
+ def test_marshal_ivars
386
+ ms = MarshalSample.new
387
+ ms.x = ["a", :b]
388
+ ms.y = "fuzz"
389
+ ms.t = {3.79 => "zap"}
390
+ ms.instance_eval {@u = 4}
391
+
392
+ str = Marshal.dump ms
393
+ copy = Marshal.load str
394
+
395
+ assert_equal(ms.class, copy.class)
396
+ assert_equal(ms.x, copy.x)
397
+ assert_equal(ms.y, copy.y)
398
+ assert_equal(ms.t, copy.t)
399
+ assert_equal(ms.instance_eval {@u}, copy.instance_eval {@u})
400
+ end
401
+
402
+ def test_link_and_proc
403
+ ms1 = MarshalSample.new
404
+ ms2 = MarshalSample.new
405
+ ms3 = MarshalSample.new
406
+
407
+ ms1.x = ms3
408
+ ms1.t = ms2
409
+
410
+ ms2.x = ms3
411
+ ms3.x = ms1
412
+
413
+ count = 0
414
+ str = Marshal.dump ms1
415
+ copy = Marshal.load str, proc { |x|
416
+ if x.class == MarshalSample then count += 1 end
417
+ }
418
+
419
+ assert_same(copy.x, copy.t.x)
420
+ assert_same(copy.x.x, copy)
421
+ assert_equal(3, count)
422
+ end
423
+ end
424
+
425
+ require 'fileutils'
426
+ dir = File.join("tmp", RUBY_VERSION)
427
+ FileUtils.mkpath dir
428
+ Dir.chdir dir do
429
+ AttributeSample.commit
430
+ end