Skip to content

Commit

Permalink
Showing 3 changed files with 36 additions and 6 deletions.
8 changes: 7 additions & 1 deletion lib/ruby/truffle/truffle/coverage.rb
Original file line number Diff line number Diff line change
@@ -9,10 +9,16 @@
module Coverage

def self.start
Truffle::Coverage.start
Truffle::Coverage.enable
end

def self.result
result = peek_result
Truffle::Coverage.disable
result
end

def self.peek_result
Truffle::Coverage.result_array.to_h
end

Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.instrumentation.EventBinding;
import com.oracle.truffle.api.instrumentation.EventContext;
import com.oracle.truffle.api.instrumentation.ExecutionEventNode;
import com.oracle.truffle.api.instrumentation.ExecutionEventNodeFactory;
@@ -39,6 +40,7 @@ public class LineTag {
public static final long NO_CODE = -1;

private final Instrumenter instrumenter;
private EventBinding<?> binding;
private final Map<Source, AtomicLongArray> counters = new ConcurrentHashMap<>();
private final Map<Source, BitSet> linesHaveCode = new HashMap<>();

@@ -69,7 +71,7 @@ public synchronized void enable() {
return;
}

instrumenter.attachFactory(SourceSectionFilter.newBuilder()
binding = instrumenter.attachFactory(SourceSectionFilter.newBuilder()
.tagIs(LineTag.class)
.build(), new ExecutionEventNodeFactory() {

@@ -102,6 +104,17 @@ protected void onEnter(VirtualFrame frame) {
enabled = true;
}

@TruffleBoundary
public synchronized void disable() {
if (!enabled) {
return;
}

binding.dispose();

enabled = false;
}

private synchronized AtomicLongArray getCounters(Source source) {
if (source.getPath() == null) {
return null;
19 changes: 15 additions & 4 deletions truffle/src/main/java/org/jruby/truffle/stdlib/CoverageNodes.java
Original file line number Diff line number Diff line change
@@ -27,23 +27,34 @@
@CoreClass("Truffle::Coverage")
public abstract class CoverageNodes {

@CoreMethod(names = "start", onSingleton = true)
public abstract static class CoverageStartNode extends CoreMethodArrayArgumentsNode {
@CoreMethod(names = "enable", onSingleton = true)
public abstract static class CoverageEnableNode extends CoreMethodArrayArgumentsNode {

@Specialization
public DynamicObject coverageStart() {
public DynamicObject enable() {
getContext().getCoverageManager().enable();
return nil();
}

}

@CoreMethod(names = "disable", onSingleton = true)
public abstract static class CoverageDisableNode extends CoreMethodArrayArgumentsNode {

@Specialization
public DynamicObject disable() {
getContext().getCoverageManager().disable();
return nil();
}

}

@CoreMethod(names = "result_array", onSingleton = true)
public abstract static class CoverageResultNode extends CoreMethodArrayArgumentsNode {

@TruffleBoundary
@Specialization
public DynamicObject coverageResult() {
public DynamicObject resultArray() {
final List<DynamicObject> results = new ArrayList<>();

for (Map.Entry<Source, long[]> source : getContext().getCoverageManager().getCounts().entrySet()) {

0 comments on commit d90b07b

Please sign in to comment.