Ruby
1.9.3p392(2013-02-22revision39386)
Main Page
Modules
Data Structures
Files
File List
Globals
ext
coverage
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
14
static
VALUE
rb_coverages
=
Qundef
;
15
16
/*
17
* call-seq:
18
* Coverage.start => nil
19
*
20
* Enables coverage measurement.
21
*/
22
static
VALUE
23
rb_coverage_start
(
VALUE
klass)
24
{
25
if
(!
RTEST
(
rb_get_coverages
())) {
26
if
(
rb_coverages
==
Qundef
) {
27
rb_coverages
=
rb_hash_new
();
28
RBASIC
(
rb_coverages
)->klass = 0;
29
}
30
rb_set_coverages
(
rb_coverages
);
31
}
32
return
Qnil
;
33
}
34
35
static
int
36
coverage_result_i
(
st_data_t
key
,
st_data_t
val,
st_data_t
h)
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
56
rb_coverage_result
(
VALUE
klass)
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);
65
rb_reset_coverages
();
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.
79
*
80
* = Example
81
*
82
* [foo.rb]
83
* s = 0
84
* 10.times do |x|
85
* s += x
86
* end
87
*
88
* if s == 45
89
* p :ok
90
* else
91
* p :ng
92
* end
93
* [EOF]
94
*
95
* require "coverage.so"
96
* Coverage.start
97
* require "foo.rb"
98
* p Coverage.result #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
99
*/
100
void
101
Init_coverage
(
void
)
102
{
103
VALUE
rb_mCoverage =
rb_define_module
(
"Coverage"
);
104
rb_define_module_function
(rb_mCoverage,
"start"
,
rb_coverage_start
, 0);
105
rb_define_module_function
(rb_mCoverage,
"result"
,
rb_coverage_result
, 0);
106
rb_gc_register_address
(&
rb_coverages
);
107
}
108
Generated on Tue Feb 26 2013 08:42:54 for Ruby by
1.8.3