cgen 0.16.0 → 0.16.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,6 @@ pkg/*
3
3
  doc/*
4
4
  junk/*
5
5
  tmp/*
6
+ tmp
7
+ */tmp
8
+ */junk
data/README.txt CHANGED
@@ -1,34 +1,75 @@
1
+ = Overview
1
2
 
2
- high level overview
3
+ Ruby has a C interface for defining extensions to the language. Using this interface, you define functions in C and add them as methods that are callable from ruby code. You may also define classes, modules, globals, and so on.
3
4
 
4
- purpose and history
5
+ CGen is a library that makes it relatively easy to code, build, and load extensions from within a ruby program, rather than using a typical C development process. In this way, the construction of the extension is driven by the ruby program. The extension is also available for execution from the program. CGen is a kind of "inline" tool.
5
6
 
6
- getting started
7
+ The CShadow module is for the special case of T_DATA objects, particularly those whose data is defined by a C struct. A class of such objects can be defined only through the ruby C API. Unlike normal ruby objects such as arrays and strings, a T_DATA object contains a "blob" of data that can only be accessed through methods defined in a C extension.
7
8
 
8
- - will need compiler
9
+ Including the CShadow module in a class lets you define the structure of the data blob by using simple attribute declarations (no C code needed). CShadow uses these declarations to generate the essential functions: accessors with type conversion and checking, mark/free, marshal, yaml, and initialization. Additional methods can be defined in ruby or using CGenerator. CShadow also manages inheritance of the structure from parent class to child class; the child class may define further attributes.
9
10
 
10
- advanced
11
+ See the CGenerator, CShadow, and CShadow::Attribute pages for details.
11
12
 
12
- ==Object attributes
13
+ = Purpose and history
13
14
 
14
- ===class CShadow::ObjectAttribute
15
+ The intended use of cgen is managing a complex library that may change from one run of the program to the next. The reason for the change might be that the program is written in a DSL (domain-specific language), and that the library functions are generated based on the statements of the DSL.
15
16
 
16
- ===class CShadow::ShadowObjectAttribute
17
+ In fact, the original use of cgen was to support a DSL for designing and simulating dynamic networks of hybrid automata.[RedShift, formerly hosted at redshift.sourceforge.net, now at http://rubyforge.org/projects/redshift]
17
18
 
19
+ Cgen was introduced in 2001 with this post:
18
20
 
19
- examples
21
+ http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/24443
20
22
 
21
- more docs
23
+ = Getting started
22
24
 
25
+ == Installing
23
26
 
24
- ==web site
27
+ Cgen is available from http://rubyforge.org/projects/cgen.
25
28
 
26
- ==license
29
+ Install either as gem:
27
30
 
28
- ==author
29
- Copyright 2001-2009
30
- Joel VanderWerf,
31
- mailto:vjoel@users.sourceforge.net
31
+ gem install cgen
32
32
 
33
- http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/24443
33
+ or from tarball, by unpacking and then:
34
+
35
+ ruby install.rb config
36
+ ruby install.rb setup
37
+ ruby install.rb install
38
+
39
+ === System Requirements
40
+
41
+ Cgen is pure ruby, so you don't need a compiler to install it. However, you do need a C compiler to do anything useful with it.
42
+
43
+ On Unix and GNU/Linux, the gcc compiler works fine. The Sun C compiler has also been tested.
44
+
45
+ On Windows, you should use a compiler that is compatible with your ruby interpreter. The following compilers have been tested:
46
+
47
+ * MSVC 6.0 (with the traditional one-click ruby installer--the OCI)
48
+ * MSVC 2003
49
+ * Mingw32 (gcc; the foundation of the new OCI by Luis Lavena)
50
+
51
+ = Examples
52
+
53
+ The cgen package comes with a substantial examples directory, but it is not yet very well organized. Here are the best ones to start with:
54
+
55
+ sample.rb::
56
+ introduction to CGenerator
57
+
58
+ complex.rb::
59
+ introduction to CShadow
60
+
61
+ matrix.rb::
62
+ second example of CShadow
63
+
64
+ = Web site
65
+
66
+ http://rubyforge.org/projects/cgen
67
+ http://cgen.rubyforge.org/
68
+
69
+ = License
70
+
71
+ Ruby license.
72
+
73
+ = Author
34
74
 
75
+ Copyright 2001-2009, Joel VanderWerf, mailto:vjoel@users.sourceforge.net.
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'cgen/cshadow'
4
2
 
5
3
  class MyComplex < Numeric
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'cgen/cshadow'
4
2
 
5
3
  class MyComplex2 < Numeric
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'cgen/cshadow'
4
2
 
5
3
  class MyMatrix
@@ -1,27 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
- =begin
4
-
5
- Sample for CGenerator.
6
-
7
- ==version
8
-
9
- CGenerator 0.14
10
-
11
- The current version of this software can be found at
12
- ((<"http://redshift.sourceforge.net/cgen
13
- "|URL:http://redshift.sourceforge.net/cgen>)).
14
-
15
- ==license
16
- This software is distributed under the Ruby license.
17
- See ((<"http://www.ruby-lang.org"|URL:http://www.ruby-lang.org>)).
18
-
19
- ==author
20
- Joel VanderWerf,
21
- ((<vjoel@users.sourceforge.net|URL:mailto:vjoel@users.sourceforge.net>))
22
-
23
- =end
24
-
25
1
  require 'cgen/cgen'
26
2
  require 'fileutils'
27
3
 
File without changes
@@ -27,7 +27,7 @@ module CShadow
27
27
  #
28
28
  # The subclass hierarchy has two branches: ObjectAttribute and
29
29
  # CNativeAttribute. The former is a reference to a Ruby object (in other
30
- # words, a struct member of type +VALUE+. The latter has subclasses for
30
+ # words, a struct member of type +VALUE+). The latter has subclasses for
31
31
  # various C data types, such as +double+ and <tt>char *</tt>.
32
32
  #
33
33
  # ==Adding new attribute classes
@@ -178,366 +178,6 @@ require 'cgen/inherit'
178
178
  # It is useful to keep a reference to +lib+ around to send define and declare
179
179
  # messages to.
180
180
  #
181
- # ===Templates
182
- #
183
- # All templates respond to #library and #file methods, which return the library
184
- # or file object which contains the template. (The library itself does not
185
- # respond to #file.) They also respond to #name and #parent.
186
- #
187
- # ===Library
188
- #
189
- # ---Library#use_work_dir dir_name
190
- #
191
- # Changes into +dir_name+, creating it first if necessary. Does nothing if
192
- # alread in a diredctory of that name. Often used with +"tmp"+.
193
- #
194
- # ---Library#commit
195
- #
196
- # Writes the files to disk, and makes and loads the library.
197
- #
198
- # Note that #commit must be called after all C code definitions for the library,
199
- # but before instantiation of any objects that use those definitions. If a
200
- # definition occurs after commit, or if instantiation occurs before commit, then
201
- # a CGenerator::Library::CommitError is raised, with an appropriate message.
202
- # Sometimes, this forces you to use many small libraries, each committed just in
203
- # time for use. See examples/fixed-array.rb.
204
- #
205
- # ---Library#committed?
206
- #
207
- # True if the library has been committed.
208
- #
209
- # ---Library#before_commit(&block)
210
- # ---Library#after_commit(&block)
211
- #
212
- # Schedules block to run before or after Library#commit. The before blocks are
213
- # run in the same order in which they were scheduled; the after blocks run in
214
- # the reverse order (analogously with +BEGIN+/+END+). Each block is evaluated in
215
- # the context in which it was created (instance_eval is *not* used), and it is
216
- # passed the library as an argument.
217
- #
218
- # ---Library#empty?
219
- #
220
- # True if no content has been added to the library.
221
- #
222
- # ---Library#add_file name
223
- #
224
- # Creates templates for two files, a source (.c) file and an include (.h) file
225
- # that will be generated in the same dir as the library. The base file name is
226
- # taken from the argument. Returns an array containing the include file template
227
- # and the source file template, in that order.
228
- #
229
- # Functions can be added to the source file by calling #define_method and
230
- # similar methods on the source file template. Their +rb_init+ calls are done in
231
- # #init_library_function in the main library source file. The new source file
232
- # automatically #includes the library's main header file, as well as its own
233
- # header file, and the library's main source file also #includes the new header
234
- # file. Declarations can be added to the header file by calling #declare on it,
235
- # but in many cases this is taken care of automatically.
236
- #
237
- # ---Library#extconf
238
- #
239
- # Override #extconf if you want to do more than just #create_makefile. Note that
240
- # #create_makefile recognizes all .c files in the library directory, and
241
- # generates a makefile that compiles them and links them into the dynamic
242
- # library.
243
- #
244
- # ---Library#write
245
- # ---Library#makedepend
246
- # ---Library#mkmf
247
- # ---Library#make arg = nil
248
- #
249
- # Internal methods called, in sequence, by #commit:
250
- #
251
- # * #write dumps each file template to disk, if needed
252
- # * #makedepend executes +makedepend+
253
- # * #mkmf calls Library#extconf
254
- # * #make executes the system's +make+ program.
255
- #
256
- # These methods can be overridden, but are more typically called directly. The
257
- # argument to #make is interpolated into the system call as a command line
258
- # argument to the +make+ program. If the argument is 'clean' or 'distclean' then
259
- # the make log is deleted; if the argument is 'distclean' then all .c and .h
260
- # files generated by #write are deleted (additional user-supplied .c and .h
261
- # files in the library dir are not affected).
262
- #
263
- # ---Library#update_file f, template
264
- #
265
- # Called by write on each .c and .h file to actually write +template+ to the
266
- # open file +f+. The default behavior is to compare the existing data with the
267
- # generated data, and leave the file untouched if nothing changed. Subclasses
268
- # may have more efficient ways of doing this. (For instance, check a version
269
- # indicator in the file on disk, perhaps stored using the file's preamble
270
- # accumulator. It is even possible to defer some entries in the template until
271
- # after this check has been made: code that only needs to be regenerated if some
272
- # specification has changed)
273
- #
274
- # ---Library#purge_source_dir
275
- # ---Library#purge_source_dir= flag
276
- #
277
- # Access the #purge_source_dir attribute of a library, which controls what
278
- # happens to .c, .h, and .o files in the source dir of the library that are not
279
- # among those generated as part of the library. If this is set to +:delete+,
280
- # then those files are deleted. Other true values cause the .c, .h, and .o files
281
- # to be renamed with the .hide extension. (Note that this makes it difficult to
282
- # keep manually written C files in the same dir.) False +flag+ values (the
283
- # default) cause CGen to leave the files untouched.
284
- #
285
- # Note that, regardless of this setting, #mkmf will construct a Makefile which
286
- # lists all .c files that are in the source dir. If you do not delete obsolete
287
- # files, they will be compiled into your library!
288
- #
289
- # ---Library#init_library_function
290
- #
291
- # Returns a Function template object; see below. This function is called when
292
- # the library is loaded. Method definitions put stuff here to register methods
293
- # with Ruby. Usually, there is no need to bother this guy directly. Use
294
- # Library#setup instead.
295
- #
296
- # ---Library#setup key => "statements", ...
297
- #
298
- # Inserts code in the #init_library_function, which is called when the library
299
- # is loaded. The +key+ is used for redundancy checking, as in the #declare
300
- # accumulators. Note that hashes are unordered, so constructs like
301
- #
302
- # setup :x => "...", :y => "..."
303
- #
304
- # can result in unpredictable order. To avoid this, use several #setup calls.
305
- #
306
- # ---Library#source_file ---Library#include_file
307
- #
308
- # Returns the template for the main source or include file of the library.
309
- # Usually, there is no need to access these directly.
310
- #
311
- # ---Library#define_c_function name, type
312
- #
313
- # Defines a plain ol' C function. Returns a Function template (see below), or a
314
- # template of the specified +type+, if given.
315
- #
316
- # ---Library#define_c_method mod, name, subclass
317
- # ---Library#define_c_module_function mod, name, subclass
318
- # ---Library#define_c_global_function name, subclass
319
- # ---Library#define_c_singleton_method mod, name, subclass
320
- # ---Library#define_c_class_method mod, name, subclass
321
- #
322
- # Defines a function of the specified name and type in the given class/module
323
- # (or in the global scope), and returns the function template (often used with
324
- # #instance_eval to add arguments, code, etc.). The +subclass+ argument is
325
- # optional and allows the template to belong to a subclass of the function
326
- # template it would normally belong to.
327
- #
328
- # For example,
329
- #
330
- # define_c_method String, "reverse"
331
- #
332
- # The arguments accepted by the method automatically include +self+. By default,
333
- # arguments are passed as individual C arguments, but the can be passed in a
334
- # Ruby or C array. The latter has the advantage of argument parsing (based on
335
- # rb_scan_args), defaults, and typechecking. See Method#c_array_args.
336
- # #define_c_class_method is just an alias for #define_c_singleton_method.
337
- #
338
- # ---Library#include "file1.h", "<file2.h>", ...
339
- #
340
- # Insert the include statement(s) at the top of the library's main .c file. For
341
- # convenience, <ruby.h> is included automatically, as is the header file of the
342
- # library itself.
343
- #
344
- # ---Library#declare :x => "int x", ... ---Library#declare_extern :x => "int x",
345
- # ...
346
- #
347
- # Puts the string in the declaration area of the .c or .h file, respectively.
348
- # The declaration area is before the function definitions, and after the
349
- # structure declarations.
350
- #
351
- # ---Library#declare_struct name, attributes=nil
352
- # ---Library#declare_extern_struct name, attributes=nil
353
- #
354
- # Returns a Structure template, which generates to a typedefed C struct in the
355
- # .c or .h file. The #declare method of this template is used to add members.
356
- #
357
- # ---Library#declare_class cl ---Library#declare_module mod
358
- # ---Library#declare_symbol sym
359
- #
360
- # Define a C variable which will be initialized to refer to the class, module,
361
- # or symbol. These accumulators return the name of the C variable which will be
362
- # generated and initialized to the ID of the symbol, and this return value can
363
- # be interpolated into C calls to the Ruby API. (The arguments are the actual
364
- # Ruby objects.) This is very useful in #rb_ivar_get/#rb_ivar_set calls, and it
365
- # avoids doing the lookup more than once:
366
- #
367
- # ...
368
- # declare :my_ivar => "VALUE my_ivar"
369
- # body %{
370
- # my_ivar = rb_ivar_get(shadow->self, #{declare_symbol :@my_ivar});
371
- # rb_ivar_set(shadow->self, #{declare_symbol :@my_ivar}, Qnil);
372
- # }
373
- #
374
- # The second declaration notices that the library already has a variable that
375
- # will be initialized to the ID of the symbol, and uses it.
376
- #
377
- # ---Library#literal_symbol sym
378
- #
379
- # Like Library#declare_symbol, but converts the ID to a VALUE at library
380
- # initialization time. Useful for looking up hash values keyed by symbol
381
- # objects, for example. +sym+ is a string or symbol.
382
- #
383
- # ---Library#show_times message
384
- #
385
- # If the attribute #show_times_flag is set to true, print the user and system
386
- # times (and child user and child system on some platforms) and real time for
387
- # each major step of the commit process. Display +message+.
388
- #
389
- # ===File
390
- #
391
- # File templates are managed by the Library, and most users do not need to
392
- # interact with them directly. They are structured into four sections: includes,
393
- # structure declarations, variable and function declarations, and function
394
- # definitions. Each source file automatically includes its corresponding header
395
- # file and the main header file for the library (which includes ruby.h). The
396
- # main source file for the library includes each additional header file.
397
- #
398
- # ---File#define_c_method
399
- # ---File#define_c_module_function
400
- # ---File#define_c_global_function
401
- # ---File#define_c_singleton_method
402
- #
403
- # As for the Library, but can be used on any source file within the library.
404
- # Used to break large projects up into many files.
405
- #
406
- # ---File#preamble
407
- #
408
- # An accumulator that wraps its input in C comments and places it at the head of
409
- # the source file.
410
- #
411
- # ===Function
412
- #
413
- # ---Funtion#scope :static ---Funtion#scope :extern ---Funtion#arguments 'int
414
- # x', 'double y', 'VALUE obj', ... ---Funtion#return_type 'void'
415
- #
416
- # These accumulators affect the prototype of the function, which will be placed
417
- # in the declaration section of either the .h or the .c file, depending on the
418
- # scope setting. The default scope is static. The default return type is 'void'.
419
- #
420
- # For the Method subclasses of Function, argument and return types can be
421
- # omitted, in which case they default to 'VALUE'.
422
- #
423
- # ---Funtion#declare :x => "static double x", ... ---Funtion#init "x = 0", ...
424
- # ---Funtion#setup 'x' => "x += 1", ... ---Funtion#body 'y = sin(x);
425
- # printf("%d\n", y)', ...
426
- #
427
- # These four accumulators determine the contents of the function between the
428
- # opening and closing braces. The #init code is executed once when the function
429
- # first runs; it's useful for initializing static data. The #setup code runs
430
- # each time the function is called, as does the #body. Distinguishing #setup
431
- # from #body is useful for two reasons: first, #setup is guaranteed to execute
432
- # before #body, and, second, one can avoid setting up the same variable twice,
433
- # because of the key.
434
- #
435
- # ---Funtion#returns "2*x"
436
- #
437
- # Specifies the string used in the final return statement of the function.
438
- # Subsequent uses of this method clobber the previous value. Alternately, one
439
- # can simply insert a "return" manually in the body.
440
- #
441
- # ===Method ===ModuleFunction ===GlobalFunction ===SingletonMethod
442
- #
443
- # These subclasses of the Function template are designed for coding Ruby
444
- # methods. The necessary registration (+rb_define_method+, etc.) is handled
445
- # automatically. Defaults are different from Function: +'VALUE self'+ is
446
- # automatically an argument, and argument and return types are assumed to be
447
- # +'VALUE'+ and can be omitted by the caller. The return value is +nil+ by
448
- # default.
449
- #
450
- # ---Method#arguments :arg1, :arg2, ...
451
- #
452
- # The default way of specifying arguments. Allows a fixed number of VALUE
453
- # arguments.
454
- #
455
- # ---Method#c_array_args argc_name = 'argc', argv_name = 'argv', &block
456
- # ---Method#rb_array_args args_name = 'args'
457
- #
458
- # Specifies that arguments are to be collected and passed in a C or Ruby array,
459
- # instead of individually (which is the default). In each case, the array of
460
- # actual arguments will be bound to a C parameter with the name specified. See
461
- # the Ruby API documentation for details.
462
- #
463
- # If a block is given to Method#c_array_args, it will be used to specify a call
464
- # to the API function +rb_scan_args+ and to declare the associated variables.
465
- # For example:
466
- #
467
- # c_array_args('argc', 'argv') {
468
- # required :arg0, :arg1
469
- # optional :arg2, :arg3, :arg4
470
- # rest :rest
471
- # block :block
472
- # }
473
- #
474
- # declares all the listed symbols as variables of type +VALUE+ in function
475
- # scope, and arranges for the following to be called in the #setup clause (i.e.,
476
- # before the #body):
477
- #
478
- # rb_scan_args(argc, argv, "23*&", &arg0, &arg1, &arg2, &arg3, &arg4, &rest, &block);
479
- #
480
- # The <tt>'argc', 'argv'</tt> are the default values and are usually omitted.
481
- #
482
- # The lines in the block can occur in any order, and any line can be omitted.
483
- # However, only one line of each kind should be used. In addition, each optional
484
- # argument can be associated with a fragment of C code that will be executed to
485
- # assign it a default value, if needed. For example, one can add the following
486
- # lines to the above block:
487
- #
488
- # default :arg3 => "INT2NUM(7)",
489
- # :arg4 => "INT2NUM(NUM2INT(arg2) + NUM2INT(arg3))"
490
- #
491
- # Otherwise, optional arguments are assigned nil.
492
- #
493
- # In this case, if +arg4+ is not provided by +argv+, then it is initialized
494
- # using the code given. If, in addition, +arg3+ is not provided, then it too is
495
- # initialized. These initializations happen in the #setup clause of the Function
496
- # template and are executed in the same order as the arguments are given in the
497
- # +optional+ line.
498
- #
499
- # Finally, argument types can be checked automatically:
500
- #
501
- # typecheck :arg2 => Numeric, :arg3 => Numeric
502
- #
503
- # The value passed to the function must either be +nil+ or match the type. Note
504
- # that type checking happens *before* default assignment, so that default
505
- # calculation code can assume types are correct. No typechecking code is
506
- # generated if the type is Object.
507
- #
508
- # ===Structure
509
- #
510
- # ---Structure#declare :x => "int x"
511
- #
512
- # Adds the specified string to define a structure member.
513
- #
514
- # ===Utility functions
515
- #
516
- # ---CGenerator.make_c_name s
517
- #
518
- # Geenrates a unique C itentifier from the given Ruby identifier, which may
519
- # include +/[@$?!]/+, +'::'+, and even +'.'+. (Some special globals are not yet
520
- # supported: +$:+ and +$-I+, for example.)
521
- #
522
- # It is unique in the sense that distinct Ruby identifiers map to distinct C
523
- # identifiers. (Not completely checked. Might fail for some really obscure
524
- # cases.)
525
- #
526
- # ---String.tab n
527
- #
528
- # Tabs left or right by n chars, using spaces.
529
- #
530
- # ---String.tabto n
531
- #
532
- # The first non-empty line is adjusted to have n spaces before the first
533
- # nonspace. Additional lines are changed to preserve relative tabbing.
534
- #
535
- # ---String.taballto n
536
- #
537
- # Aligns each line to have n spaces before the first non-space.
538
- #
539
- # (These routines probably don't work well, if at all, with "hard" tabs.)
540
- #
541
181
  # ==Example
542
182
  #
543
183
  # require 'cgen'
@@ -778,7 +418,7 @@ require 'cgen/inherit'
778
418
  # way that makes clear that the problem is really with commit.
779
419
  module CGenerator
780
420
 
781
- VERSION = '0.16.0'
421
+ VERSION = '0.16.1'
782
422
 
783
423
  class Accumulator ## should be a mixin? "Cumulative"?
784
424
 
@@ -889,6 +529,9 @@ module KeyAccumulator
889
529
  end
890
530
  end
891
531
 
532
+ # All templates respond to #library and #file methods, which return the library
533
+ # or file object which contains the template. (The library itself does not
534
+ # respond to #file.) They also respond to #name and #parent.
892
535
  class Template < Accumulator
893
536
 
894
537
  def initialize name = "", parent = nil, &block
@@ -926,9 +569,35 @@ class Library < Template
926
569
 
927
570
  class CommitError < RuntimeError; end
928
571
 
929
- attr_reader :init_library_function, :include_file, :source_file
930
- attr_accessor :purge_source_dir, :show_times_flag
572
+ # Returns a Function template object. This function is called when the library
573
+ # is loaded. Method definitions put stuff here to register methods with Ruby.
574
+ # Usually, there is no need to bother this guy directly. Use Library#setup
575
+ # instead.
576
+ attr_reader :init_library_function
931
577
 
578
+ # Returns the template for the main include file of the library.
579
+ # Usually, there is no need to access this directly.
580
+ attr_reader :include_file
581
+
582
+ # Returns the template for the main source file of the library.
583
+ # Usually, there is no need to access this directly.
584
+ attr_reader :source_file
585
+
586
+ attr_accessor :show_times_flag
587
+
588
+ # The #purge_source_dir attribute controls what happens to .c, .h, and .o
589
+ # files in the source dir of the library that are not among those generated as
590
+ # part of the library. If this is set to +:delete+, then those files are
591
+ # deleted. Other true values cause the .c, .h, and .o files to be renamed with
592
+ # the .hide extension. (Note that this makes it difficult to keep manually
593
+ # written C files in the same dir.) False +flag+ values (the default) cause
594
+ # CGen to leave the files untouched.
595
+ #
596
+ # Note that, regardless of this setting, #mkmf will construct a Makefile which
597
+ # lists all .c files that are in the source dir. If you do not delete obsolete
598
+ # files, they will be compiled into your library!
599
+ attr_accessor :purge_source_dir
600
+
932
601
  def initialize name
933
602
  super name
934
603
 
@@ -960,6 +629,8 @@ class Library < Template
960
629
  ## a template which is not the parent
961
630
  end
962
631
 
632
+ # Changes into +dir_name+, creating it first if necessary. Does nothing if
633
+ # already in a directory of that name. Often used with +"tmp"+.
963
634
  def use_work_dir dir_name
964
635
  if File.basename(Dir.pwd) == dir_name
965
636
  yield
@@ -972,6 +643,19 @@ class Library < Template
972
643
  end
973
644
  end
974
645
 
646
+ # Creates templates for two files, a source (.c) file and an include (.h) file
647
+ # that will be generated in the same dir as the library. The base file name is
648
+ # taken from the argument. Returns an array containing the include file
649
+ # template and the source file template, in that order.
650
+ #
651
+ # Functions can be added to the source file by calling #define_method and
652
+ # similar methods on the source file template. Their +rb_init+ calls are done
653
+ # in
654
+ # #init_library_function in the main library source file. The new source file
655
+ # automatically #includes the library's main header file, as well as its own
656
+ # header file, and the library's main source file also #includes the new
657
+ # header file. Declarations can be added to the header file by calling
658
+ # #declare on it, but in many cases this is taken care of automatically.
975
659
  def add_file name, opts = {}
976
660
  pair = @pile.detect {|p| p[0].name == name + ".h"}
977
661
 
@@ -998,22 +682,42 @@ class Library < Template
998
682
  end
999
683
  end
1000
684
 
685
+ # True if the library has been committed.
1001
686
  def committed?
1002
687
  @committed
1003
688
  end
1004
689
 
690
+ # True if no content has been added to the library.
1005
691
  def empty?
1006
692
  @init_library_function.empty? ## is this enough?
1007
693
  end
1008
694
 
695
+ # Schedules block to run before Library#commit. The before blocks are run in
696
+ # the same order in which they were scheduled; the after blocks run in the
697
+ # reverse order (analogously with +BEGIN+/+END+). Each block is evaluated in
698
+ # the context in which it was created (instance_eval is *not* used), and it is
699
+ # passed the library as an argument.
1009
700
  def before_commit(&block)
1010
701
  (@before_commit ||= []) << block
1011
702
  end
1012
703
 
704
+ # Schedules block to run after Library#commit. The before blocks are run in
705
+ # the same order in which they were scheduled; the after blocks run in the
706
+ # reverse order (analogously with +BEGIN+/+END+). Each block is evaluated in
707
+ # the context in which it was created (instance_eval is *not* used), and it is
708
+ # passed the library as an argument.
1013
709
  def after_commit(&block)
1014
710
  (@after_commit ||= []) << block
1015
711
  end
1016
712
 
713
+ # Writes the files to disk, and makes and loads the library.
714
+ #
715
+ # Note that #commit must be called after all C code definitions for the
716
+ # library, but before instantiation of any objects that use those definitions.
717
+ # If a definition occurs after commit, or if instantiation occurs before
718
+ # commit, then a CGenerator::Library::CommitError is raised, with an
719
+ # appropriate message. Sometimes, this forces you to use many small libraries,
720
+ # each committed just in time for use. See examples/fixed-array.rb.
1017
721
  def commit(build = true)
1018
722
  assert_uncommitted
1019
723
 
@@ -1042,10 +746,34 @@ class Library < Template
1042
746
  end
1043
747
  end
1044
748
 
749
+ #----------------
750
+ # :section: Build methods
751
+ #
752
+ # Methods used during commit to control the build chain.
753
+ # In sequence, #commit calls these methods:
754
+ #
755
+ # * #write dumps each file template to disk, if needed
756
+ # * #makedepend executes +makedepend+
757
+ # * #mkmf calls Library#extconf
758
+ # * #make executes the system's +make+ program
759
+ # * #loadlib load the library that has been built
760
+ #
761
+ # These methods can be overridden, but are more typically called via commit or
762
+ # sometimes directly. The argument to #make is interpolated into the system
763
+ # call as a command line argument to the +make+ program. If the argument is
764
+ # 'clean' or 'distclean' then the make log is deleted; if the argument is
765
+ # 'distclean' then all .c and .h files generated by #write are deleted
766
+ # (additional user-supplied .c and .h files in the library dir are not
767
+ # affected).
768
+ #----------------
769
+
1045
770
  def process_times
1046
771
  RUBY_VERSION.to_f >= 1.7 ? Process.times : Time.times
1047
772
  end
1048
773
 
774
+ # If the attribute #show_times_flag is set to true, print the user and system
775
+ # times (and child user and child system on some platforms) and real time for
776
+ # each major step of the commit process. Display +message+.
1049
777
  def show_times message
1050
778
  yield if block_given?
1051
779
  if @show_times_flag
@@ -1094,6 +822,14 @@ class Library < Template
1094
822
  end
1095
823
  end
1096
824
 
825
+ # Called by write on each .c and .h file to actually write +template+ to the
826
+ # open file +f+. The default behavior is to compare the existing data with the
827
+ # generated data, and leave the file untouched if nothing changed. Subclasses
828
+ # may have more efficient ways of doing this. (For instance, check a version
829
+ # indicator in the file on disk, perhaps stored using the file's preamble
830
+ # accumulator. It is even possible to defer some entries in the template until
831
+ # after this check has been made: code that only needs to be regenerated if
832
+ # some specification has changed)
1097
833
  def update_file f, template
1098
834
  template_str = template.to_s
1099
835
  file_data = f.gets(nil) ## sysread is faster?
@@ -1256,6 +992,11 @@ class Library < Template
1256
992
  ### this is fragile--should record abs path when Lib is created
1257
993
  end
1258
994
 
995
+ # Override #extconf if you want to do more than just #create_makefile. Note
996
+ # that #create_makefile recognizes all .c files in the library directory, and
997
+ # generates a makefile that compiles them and links them into the dynamic
998
+ # library.
999
+ #
1259
1000
  # Yields the array of lines being constructed so that additional configuration
1260
1001
  # can be added. See the ruby documentation on mkmf.
1261
1002
  def extconf # :yields: lines_array
@@ -1332,27 +1073,67 @@ class Library < Template
1332
1073
  :rb_define_global_function,
1333
1074
  :rb_define_singleton_method) {RbDefineAccumulator}
1334
1075
 
1076
+ # call-seq:
1077
+ # define_c_method mod, name, subclass
1078
+ # define_c_module_function mod, name, subclass
1079
+ # define_c_global_function name, subclass
1080
+ # define_c_singleton_method mod, name, subclass
1081
+ # define_c_class_method mod, name, subclass
1082
+ #
1083
+ # Defines a function of the specified name and type in the given class/module
1084
+ # (or in the global scope), and returns the function template (often used with
1085
+ # #instance_eval to add arguments, code, etc.). The +subclass+ argument is
1086
+ # optional and allows the template to belong to a subclass of the function
1087
+ # template it would normally belong to.
1088
+ #
1089
+ # For example,
1090
+ #
1091
+ # define_c_method String, "reverse"
1092
+ #
1093
+ # The arguments accepted by the method automatically include +self+. By
1094
+ # default, arguments are passed as individual C arguments, but the can be
1095
+ # passed in a Ruby or C array. The latter has the advantage of argument
1096
+ # parsing (based on rb_scan_args), defaults, and typechecking. See
1097
+ # Method#c_array_args. #define_c_class_method is just an alias for
1098
+ # #define_c_singleton_method.
1099
+ #
1335
1100
  def define_c_method(*args)
1336
1101
  @source_file.define_c_method(*args)
1337
1102
  end
1338
1103
 
1104
+ # See #define_c_method.
1339
1105
  def define_c_module_function(*args)
1340
1106
  @source_file.define_c_module_function(*args)
1341
1107
  end
1342
1108
 
1109
+ # See #define_c_method.
1343
1110
  def define_c_global_function(*args)
1344
1111
  @source_file.define_c_global_function(*args)
1345
1112
  end
1346
1113
 
1114
+ # See #define_c_method.
1347
1115
  def define_c_singleton_method(*args)
1348
1116
  @source_file.define_c_singleton_method(*args)
1349
1117
  end
1350
1118
  alias define_c_class_method define_c_singleton_method
1351
1119
 
1120
+ # call-seq:
1121
+ # include "file1.h", "<file2.h>", ...
1122
+ #
1123
+ # Insert the include statement(s) at the top of the library's main .c file.
1124
+ # For convenience, <ruby.h> is included automatically, as is the header file
1125
+ # of the library itself.
1352
1126
  def include(*args)
1353
1127
  @source_file.include(*args)
1354
1128
  end
1355
1129
 
1130
+ # call-seq:
1131
+ # declare :x => "int x", ...
1132
+ # declare_extern :x => "int x", ...
1133
+ #
1134
+ # Puts the string in the declaration area of the .c or .h file, respectively.
1135
+ # The declaration area is before the function definitions, and after the
1136
+ # structure declarations.
1356
1137
  def declare(*args)
1357
1138
  @source_file.declare(*args)
1358
1139
  end
@@ -1362,20 +1143,53 @@ class Library < Template
1362
1143
  @include_file.declare(*args)
1363
1144
  end
1364
1145
 
1146
+ # call-seq:
1147
+ # declare_struct name, attributes=nil
1148
+ # declare_extern_struct name, attributes=nil
1149
+ #
1150
+ # Returns a Structure template, which generates to a typedefed C struct in the
1151
+ # .c or .h file. The #declare method of this template is used to add members.
1365
1152
  def declare_struct struct_name, *rest
1366
1153
  @source_file.declare_struct struct_name, *rest
1367
1154
  end
1368
1155
  alias declare_static_struct declare_struct
1369
1156
 
1157
+ # See #declare_struct.
1370
1158
  def declare_extern_struct struct_name, *rest
1371
1159
  @include_file.declare_struct struct_name, *rest
1372
1160
  end
1373
1161
 
1162
+ # call-seq:
1163
+ # define_c_function
1164
+ #
1165
+ # Defines a plain ol' C function. Returns a Function template (see below), or
1166
+ # a template of the specified +type+, if given.
1374
1167
  def define(*args)
1375
1168
  @source_file.define(*args)
1376
1169
  end
1377
1170
  alias define_c_function define
1378
1171
 
1172
+ # call-seq:
1173
+ # declare_class cl
1174
+ # declare_module mod
1175
+ # declare_symbol sym
1176
+ #
1177
+ # Define a C variable which will be initialized to refer to the class, module,
1178
+ # or symbol. These accumulators return the name of the C variable which will
1179
+ # be generated and initialized to the ID of the symbol, and this return value
1180
+ # can be interpolated into C calls to the Ruby API. (The arguments are the
1181
+ # actual Ruby objects.) This is very useful in #rb_ivar_get/#rb_ivar_set
1182
+ # calls, and it avoids doing the lookup more than once:
1183
+ #
1184
+ # ...
1185
+ # declare :my_ivar => "VALUE my_ivar"
1186
+ # body %{
1187
+ # my_ivar = rb_ivar_get(shadow->self, #{declare_symbol :@my_ivar});
1188
+ # rb_ivar_set(shadow->self, #{declare_symbol :@my_ivar}, Qnil);
1189
+ # }
1190
+ #
1191
+ # The second declaration notices that the library already has a variable that
1192
+ # will be initialized to the ID of the symbol, and uses it.
1379
1193
  def declare_module mod
1380
1194
  c_name = "module_#{CGenerator::make_c_name mod.to_s}"
1381
1195
  declare mod => "VALUE #{c_name}"
@@ -1385,6 +1199,7 @@ class Library < Template
1385
1199
  end
1386
1200
  alias declare_class declare_module
1387
1201
 
1202
+ # See #declare_module.
1388
1203
  def declare_symbol sym
1389
1204
  c_name = "ID_#{CGenerator::make_c_name sym}"
1390
1205
  declare sym => "ID #{c_name}"
@@ -1393,6 +1208,9 @@ class Library < Template
1393
1208
  c_name.intern
1394
1209
  end
1395
1210
 
1211
+ # Like Library#declare_symbol, but converts the ID to a VALUE at library
1212
+ # initialization time. Useful for looking up hash values keyed by symbol
1213
+ # objects, for example. +sym+ is a string or symbol.
1396
1214
  def literal_symbol sym
1397
1215
  c_name = "SYM_#{CGenerator::make_c_name sym}"
1398
1216
  declare sym => "VALUE #{c_name}"
@@ -1401,6 +1219,16 @@ class Library < Template
1401
1219
  c_name.intern
1402
1220
  end
1403
1221
 
1222
+ # call-seq:
1223
+ # setup key => "statements", ...
1224
+ #
1225
+ # Inserts code in the #init_library_function, which is called when the library
1226
+ # is loaded. The +key+ is used for redundancy checking, as in the #declare
1227
+ # accumulators. Note that hashes are unordered, so constructs like
1228
+ #
1229
+ # setup :x => "...", :y => "..."
1230
+ #
1231
+ # can result in unpredictable order. To avoid this, use several #setup calls.
1404
1232
  def setup(*args)
1405
1233
  @init_library_function.setup(*args)
1406
1234
  end
@@ -1472,6 +1300,15 @@ class CFragment < Template
1472
1300
  end # class CFragment
1473
1301
 
1474
1302
 
1303
+ # File templates are managed by the Library, and most users do not need to
1304
+ # interact with them directly. They are structured into four sections: includes,
1305
+ # structure declarations, variable and function declarations, and function
1306
+ # definitions. Each source file automatically includes its corresponding header
1307
+ # file and the main header file for the library (which includes ruby.h). The
1308
+ # main source file for the library includes each additional header file.
1309
+ #
1310
+ # The File#preamble accumulator wraps its input in C comments and places it at
1311
+ # the head of the source file.
1475
1312
  class CFile < CFragment
1476
1313
 
1477
1314
  attr_reader :include_file
@@ -1552,10 +1389,14 @@ class CFile < CFragment
1552
1389
  accumulator(:declare) {StatementKeyAccumulator}
1553
1390
  accumulator(:define) {FunctionAccumulator}
1554
1391
 
1392
+ # As for the Library, but can be used on any source file within the library.
1393
+ # Used to break large projects up into many files.
1555
1394
  def define_c_function c_name, subclass = Function
1556
1395
  define c_name, subclass
1557
1396
  end
1558
1397
 
1398
+ # As for the Library, but can be used on any source file within the library.
1399
+ # Used to break large projects up into many files.
1559
1400
  def define_c_method mod, name, subclass = Method
1560
1401
  unless subclass <= Method ## should use assert
1561
1402
  raise "#{subclass.name} is not <= Method"
@@ -1564,18 +1405,24 @@ class CFile < CFragment
1564
1405
  define c_name, subclass
1565
1406
  end
1566
1407
 
1408
+ # As for the Library, but can be used on any source file within the library.
1409
+ # Used to break large projects up into many files.
1567
1410
  def define_c_module_function mod, name, subclass = ModuleFunction
1568
1411
  raise unless subclass <= ModuleFunction
1569
1412
  c_name = library.rb_define_module_function :mod => mod, :rb_name => name
1570
1413
  define c_name, subclass
1571
1414
  end
1572
1415
 
1416
+ # As for the Library, but can be used on any source file within the library.
1417
+ # Used to break large projects up into many files.
1573
1418
  def define_c_global_function name, subclass = GlobalFunction
1574
1419
  raise unless subclass <= GlobalFunction
1575
1420
  c_name = library.rb_define_global_function :rb_name => name
1576
1421
  define c_name, subclass
1577
1422
  end
1578
1423
 
1424
+ # As for the Library, but can be used on any source file within the library.
1425
+ # Used to break large projects up into many files.
1579
1426
  def define_c_singleton_method mod, name, subclass = SingletonMethod
1580
1427
  raise unless subclass <= SingletonMethod
1581
1428
  c_name = library.rb_define_singleton_method :mod => mod, :rb_name => name
@@ -1583,7 +1430,6 @@ class CFile < CFragment
1583
1430
  end
1584
1431
  alias define_c_class_method define_c_singleton_method
1585
1432
 
1586
- # For ruby 1.7/1.8 after 20Dec2002
1587
1433
  def define_alloc_func klass
1588
1434
  klass_c_name = declare_class klass
1589
1435
  c_name = "alloc_func_#{klass_c_name}"
@@ -1657,6 +1503,121 @@ class Prototype < CFragment
1657
1503
 
1658
1504
  end # class Prototype
1659
1505
 
1506
+ # The Function class manages all kinds of functions and methods.
1507
+ #
1508
+ # === Function Prototype
1509
+ #
1510
+ # scope :static
1511
+ # scope :extern
1512
+ # arguments 'int x', 'double y', 'VALUE obj', ...
1513
+ # return_type 'void'
1514
+ #
1515
+ # These accumulators affect the prototype of the function, which will be placed
1516
+ # in the declaration section of either the .h or the .c file, depending on the
1517
+ # scope setting. The default scope is static. The default return type is 'void'.
1518
+ #
1519
+ # For the Method subclasses of Function, argument and return types can be
1520
+ # omitted, in which case they default to 'VALUE'.
1521
+ #
1522
+ # === Function Body
1523
+ #
1524
+ # declare :x => "static double x", ...
1525
+ # init "x = 0", ...
1526
+ # setup 'x' => "x += 1", ...
1527
+ # body 'y = sin(x); printf("%d\n", y)', ...
1528
+ #
1529
+ # These four accumulators determine the contents of the function between the
1530
+ # opening and closing braces. The #init code is executed once when the function
1531
+ # first runs; it's useful for initializing static data. The #setup code runs
1532
+ # each time the function is called, as does the #body. Distinguishing #setup
1533
+ # from #body is useful for two reasons: first, #setup is guaranteed to execute
1534
+ # before #body, and, second, one can avoid setting up the same variable twice,
1535
+ # because of the key.
1536
+ #
1537
+ # returns "2*x"
1538
+ #
1539
+ # Specifies the string used in the final return statement of the function.
1540
+ # Subsequent uses of this method clobber the previous value. Alternately, one
1541
+ # can simply insert a "return" manually in the body.
1542
+ #
1543
+ # === Method Classes
1544
+ #
1545
+ # Method
1546
+ # ModuleFunction
1547
+ # GlobalFunction
1548
+ # SingletonMethod
1549
+ #
1550
+ # These subclasses of the Function template are designed for coding
1551
+ # Ruby-callable methods in C. The necessary registration (+rb_define_method+,
1552
+ # etc.) is handled automatically. Defaults are different from Function: +'VALUE
1553
+ # self'+ is automatically an argument, and argument and return types are assumed
1554
+ # to be +'VALUE'+ and can be omitted by the caller. The return value is +nil+ by
1555
+ # default.
1556
+ #
1557
+ # === Method Arguments
1558
+ #
1559
+ # There are three ways to declare arguments, corresponding to the three ways
1560
+ # provided by the Ruby interpreter's C API.
1561
+ #
1562
+ # arguments :arg1, :arg2, ...
1563
+ #
1564
+ # The default way of specifying arguments. Allows a fixed number of VALUE
1565
+ # arguments.
1566
+ #
1567
+ # c_array_args argc_name = 'argc', argv_name = 'argv', &block
1568
+ #
1569
+ # rb_array_args args_name = 'args'
1570
+ #
1571
+ # Specifies that arguments are to be collected and passed in a C or Ruby array,
1572
+ # instead of individually (which is the default). In each case, the array of
1573
+ # actual arguments will be bound to a C parameter with the name specified. See
1574
+ # the Ruby API documentation for details.
1575
+ #
1576
+ # If a block is given to Method#c_array_args, it will be used to specify a call
1577
+ # to the API function +rb_scan_args+ and to declare the associated variables.
1578
+ # For example:
1579
+ #
1580
+ # c_array_args('argc', 'argv') {
1581
+ # required :arg0, :arg1
1582
+ # optional :arg2, :arg3, :arg4
1583
+ # rest :rest
1584
+ # block :block
1585
+ # }
1586
+ #
1587
+ # declares all the listed symbols as variables of type +VALUE+ in function
1588
+ # scope, and arranges for the following to be called in the #setup clause (i.e.,
1589
+ # before the #body):
1590
+ #
1591
+ # rb_scan_args(argc, argv, "23*&", &arg0, &arg1, &arg2,
1592
+ # &arg3, &arg4, &rest, &block);
1593
+ #
1594
+ # The <tt>'argc', 'argv'</tt> are the default values and are usually omitted.
1595
+ #
1596
+ # The lines in the block can occur in any order, and any line can be omitted.
1597
+ # However, only one line of each kind should be used. In addition, each optional
1598
+ # argument can be associated with a fragment of C code that will be executed to
1599
+ # assign it a default value, if needed. For example, one can add the following
1600
+ # lines to the above block:
1601
+ #
1602
+ # default :arg3 => "INT2NUM(7)",
1603
+ # :arg4 => "INT2NUM(NUM2INT(arg2) + NUM2INT(arg3))"
1604
+ #
1605
+ # Otherwise, optional arguments are assigned nil.
1606
+ #
1607
+ # In this case, if +arg4+ is not provided by +argv+, then it is initialized
1608
+ # using the code given. If, in addition, +arg3+ is not provided, then it too is
1609
+ # initialized. These initializations happen in the #setup clause of the Function
1610
+ # template and are executed in the same order as the arguments are given in the
1611
+ # +optional+ line.
1612
+ #
1613
+ # Finally, argument types can be checked automatically:
1614
+ #
1615
+ # typecheck :arg2 => Numeric, :arg3 => Numeric
1616
+ #
1617
+ # The value passed to the function must either be +nil+ or match the type. Note
1618
+ # that type checking happens *before* default assignment, so that default
1619
+ # calculation code can assume types are correct. No typechecking code is
1620
+ # generated if the type is Object.
1660
1621
  class Function < CFragment
1661
1622
 
1662
1623
  def initialize name, parent
@@ -1932,7 +1893,11 @@ class SingletonMethod < RubyFunction
1932
1893
  end
1933
1894
  end
1934
1895
 
1935
-
1896
+ # A Structure instance keeps track of data members added to a struct.
1897
+ #
1898
+ # declare :x => "int x"
1899
+ #
1900
+ # Adds the specified string to define a structure member.
1936
1901
  class Structure < CFragment
1937
1902
 
1938
1903
  class InheritAccumulator < Accumulator; include SetAccumulator; end
@@ -1964,6 +1929,13 @@ OpName= {
1964
1929
  '==' => :op_eqeq
1965
1930
  }
1966
1931
 
1932
+ # Generates a unique C itentifier from the given Ruby identifier, which may
1933
+ # include +/[@$?!]/+, +'::'+, and even +'.'+. (Some special globals are not yet
1934
+ # supported: +$:+ and +$-I+, for example.)
1935
+ #
1936
+ # It is unique in the sense that distinct Ruby identifiers map to distinct C
1937
+ # identifiers. (Not completely checked. Might fail for some really obscure
1938
+ # cases.)
1967
1939
  def CGenerator.make_c_name s
1968
1940
  s = s.to_s
1969
1941
  OpName[s] || translate_ruby_identifier(s)
@@ -2014,7 +1986,7 @@ end # module CGenerator
2014
1986
 
2015
1987
  class String
2016
1988
 
2017
- # tabs left or right by n chars, using spaces
1989
+ # Tabs left or right by n chars, using spaces.
2018
1990
  def tab n
2019
1991
  if n >= 0
2020
1992
  gsub(/^/, ' ' * n)
@@ -2023,8 +1995,8 @@ class String
2023
1995
  end
2024
1996
  end
2025
1997
 
2026
- # preserves relative tabbing
2027
- # the first non-empty line ends up with n spaces before nonspace
1998
+ # The first non-empty line is adjusted to have n spaces before the first
1999
+ # nonspace. Additional lines are changed to preserve relative tabbing.
2028
2000
  def tabto n
2029
2001
  if self =~ /^( *)\S/
2030
2002
  tab(n - $1.length)
@@ -2033,7 +2005,7 @@ class String
2033
2005
  end
2034
2006
  end
2035
2007
 
2036
- # aligns each line
2008
+ # Aligns each line to have n spaces before the first non-space.
2037
2009
  def taballto n
2038
2010
  gsub(/^ */, ' ' * n)
2039
2011
  end
@@ -712,7 +712,6 @@ module CShadow
712
712
 
713
713
  private
714
714
 
715
- # :stopdoc:
716
715
  def check_overwrite_shadow_attrs(*symbols)
717
716
  for attr in shadow_attrs
718
717
  for sym in symbols
@@ -737,20 +736,19 @@ module CShadow
737
736
  check_overwrite_shadow_attrs(*args)
738
737
  super
739
738
  end
740
- # :startdoc:
741
739
 
742
740
  # Same as #shadow_attr with the +:reader+ and +:writer+ options.
743
- def shadow_attr_accessor(*args)
741
+ def shadow_attr_accessor(*args) # :doc:
744
742
  shadow_attr :reader, :writer, *args
745
743
  end
746
744
 
747
745
  # Same as #shadow_attr with the +:reader+ option.
748
- def shadow_attr_reader(*args)
746
+ def shadow_attr_reader(*args) # :doc:
749
747
  shadow_attr :reader, *args
750
748
  end
751
749
 
752
750
  # Same as #shadow_attr with the +:writer+ option.
753
- def shadow_attr_writer(*args)
751
+ def shadow_attr_writer(*args) # :doc:
754
752
  shadow_attr :writer, *args
755
753
  end
756
754
 
@@ -783,7 +781,7 @@ module CShadow
783
781
  #
784
782
  # Typically, #shadow_attr_accessor and so on are called instead.
785
783
  #
786
- def shadow_attr(*args)
784
+ def shadow_attr(*args) # :doc:
787
785
  attr_persists = true
788
786
  for arg in args
789
787
  case arg
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.16.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel VanderWerf