Ruby  2.0.0p594(2014-10-27revision48167)
coverage.c
Go to the documentation of this file.
1 /************************************************
2 
3  coverage.c -
4 
5  $Author: $
6 
7  Copyright (c) 2008 Yusuke Endoh
8 
9 ************************************************/
10 
11 #include "ruby.h"
12 #include "vm_core.h"
13 
15 
16 /*
17  * call-seq:
18  * Coverage.start => nil
19  *
20  * Enables coverage measurement.
21  */
22 static VALUE
24 {
25  if (!RTEST(rb_get_coverages())) {
26  if (rb_coverages == Qundef) {
28  RBASIC(rb_coverages)->klass = 0;
29  }
31  }
32  return Qnil;
33 }
34 
35 static int
37 {
38  VALUE path = (VALUE)key;
39  VALUE coverage = (VALUE)val;
40  VALUE coverages = (VALUE)h;
41  coverage = rb_ary_dup(coverage);
42  rb_ary_clear((VALUE)val);
43  rb_ary_freeze(coverage);
44  rb_hash_aset(coverages, path, coverage);
45  return ST_CONTINUE;
46 }
47 
48 /*
49  * call-seq:
50  * Coverage.result => hash
51  *
52  * Returns a hash that contains filename as key and coverage array as value
53  * and disables coverage measurement.
54  */
55 static VALUE
57 {
58  VALUE coverages = rb_get_coverages();
59  VALUE ncoverages = rb_hash_new();
60  if (!RTEST(coverages)) {
61  rb_raise(rb_eRuntimeError, "coverage measurement is not enabled");
62  }
63  st_foreach(RHASH_TBL(coverages), coverage_result_i, ncoverages);
64  rb_hash_freeze(ncoverages);
66  return ncoverages;
67 }
68 
69 /* Coverage provides coverage measurement feature for Ruby.
70  * This feature is experimental, so these APIs may be changed in future.
71  *
72  * = Usage
73  *
74  * 1. require "coverage.so"
75  * 2. do Coverage.start
76  * 3. require or load Ruby source file
77  * 4. Coverage.result will return a hash that contains filename as key and
78  * coverage array as value. A coverage array gives, for each line, the
79  * number of line execution by the interpreter. A +nil+ value means
80  * coverage is disabled for this line (lines like +else+ and +end+).
81  *
82  * = Example
83  *
84  * [foo.rb]
85  * s = 0
86  * 10.times do |x|
87  * s += x
88  * end
89  *
90  * if s == 45
91  * p :ok
92  * else
93  * p :ng
94  * end
95  * [EOF]
96  *
97  * require "coverage.so"
98  * Coverage.start
99  * require "foo.rb"
100  * p Coverage.result #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
101  */
102 void
104 {
105  VALUE rb_mCoverage = rb_define_module("Coverage");
106  rb_define_module_function(rb_mCoverage, "start", rb_coverage_start, 0);
107  rb_define_module_function(rb_mCoverage, "result", rb_coverage_result, 0);
109 }
static VALUE rb_coverage_result(VALUE klass)
Definition: coverage.c:56
VALUE rb_get_coverages(void)
Definition: thread.c:5185
VALUE rb_ary_freeze(VALUE ary)
Definition: array.c:330
static VALUE rb_coverage_start(VALUE klass)
Definition: coverage.c:23
void Init_coverage(void)
Definition: coverage.c:103
gz path
Definition: zlib.c:2277
VALUE rb_hash_freeze(VALUE)
Definition: hash.c:36
#define RHASH_TBL(h)
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:1788
VALUE rb_ary_clear(VALUE ary)
Definition: array.c:3208
static VALUE rb_coverages
Definition: coverage.c:14
unsigned long st_data_t
Definition: ripper.y:35
static VALUE coverage(VALUE fname, int n)
Definition: ripper.c:11805
#define Qnil
Definition: tcltklib.c:1895
#define val
Definition: tcltklib.c:1948
VALUE rb_eRuntimeError
Definition: error.c:515
static int VALUE key
Definition: tkutil.c:265
VALUE rb_hash_aset(VALUE, VALUE, VALUE)
#define RTEST(v)
void rb_define_module_function(VALUE module, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a module function for module.
Definition: class.c:1516
int st_foreach(st_table *, int(*)(ANYARGS), st_data_t)
Definition: st.c:1006
void rb_gc_register_address(VALUE *)
Definition: gc.c:2989
void rb_reset_coverages(void)
Definition: thread.c:5198
#define Qundef
#define RBASIC(obj)
klass
Definition: tcltklib.c:3503
VALUE rb_ary_dup(VALUE ary)
Definition: array.c:1766
VALUE rb_hash_new(void)
Definition: hash.c:234
unsigned long VALUE
Definition: ripper.y:104
VALUE rb_define_module(const char *name)
Definition: class.c:621
static int coverage_result_i(st_data_t key, st_data_t val, st_data_t h)
Definition: coverage.c:36
void rb_set_coverages(VALUE coverages)
Definition: thread.c:5191