summaryrefslogtreecommitdiffstats
path: root/insns.def
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-01 16:55:30 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-01 16:55:30 +0000
commita57949b140170cec7776d3e073fa8607e4cdcbb7 (patch)
tree3bd25f3a413a1637a826552181c1568b3bbeb9c0 /insns.def
parentd3962a1594c33f9be051659e251d9a7964705722 (diff)
downloadruby-a57949b140170cec7776d3e073fa8607e4cdcbb7.tar.gz
ruby-a57949b140170cec7776d3e073fa8607e4cdcbb7.tar.xz
ruby-a57949b140170cec7776d3e073fa8607e4cdcbb7.zip
* Add coverage measurement constant COVERAGE__. This constant is not
for casual use. Usage: (1) assign {} to COVERAGE__, (2) require or load Ruby source file, and (3) COVERAGE__["sourcefilepath"] will return an array whose elements represent number of executions per line of source code. * vm_core.h: add field of coverage array to iseq. * iseq.c (prepare_iseq_build): ditto. * insns.def (trace): update coverage array. * parse.y (coverage): create and initialize coverage array. * compile.h (ADD_TRACE): add trace instruction to update covearge array. * thread.c (clear_coverage): delete coverage array when forking. Otherwise, double count of coverage may occur. * lib/coverage.rb: sample coverage measurement tool. * error.c: distinguish explicitly between parse_in_eval and mild_compile_error. * load.c: ditto. * vm_eval.c: ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@17781 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insns.def')
-rw-r--r--insns.def12
1 files changed, 11 insertions, 1 deletions
diff --git a/insns.def b/insns.def
index 161dc38e2..96023a4ad 100644
--- a/insns.def
+++ b/insns.def
@@ -847,11 +847,21 @@ defined
*/
DEFINE_INSN
trace
-(rb_num_t nf)
+(rb_num_t nf, VALUE coverage)
()
()
{
rb_event_flag_t flag = nf;
+ if (coverage) {
+ long line = rb_sourceline() - 1;
+ if (RARRAY_PTR(coverage)[line] == Qnil) {
+ rb_bug("bug");
+ }
+ long count = FIX2LONG(RARRAY_PTR(coverage)[line]) + 1;
+ if (POSFIXABLE(count)) {
+ RARRAY_PTR(coverage)[line] = LONG2FIX(count);
+ }
+ }
EXEC_EVENT_HOOK(th, flag, GET_SELF(), 0, 0 /* TODO: id, klass */);
}