# HG changeset patch # User Michael Van De Vanter # Date 1447356919 28800 # Node ID 9a6f0c689576e8018c19e76a03abc351e6ce8168 # Parent b1c71f0c1a85c2155f8fe94738de9d22e4a77298 SL: add "mx slcoverage " as a temporary demo showing line counts; not yet PolyglotEngine integrated diff -r b1c71f0c1a85 -r 9a6f0c689576 mx.truffle/mx_truffle.py --- a/mx.truffle/mx_truffle.py Thu Nov 05 18:42:36 2015 +0100 +++ b/mx.truffle/mx_truffle.py Thu Nov 12 11:35:19 2015 -0800 @@ -44,6 +44,11 @@ vmArgs, slArgs = mx.extract_VM_args(args) mx.run_java(vmArgs + ['-cp', mx.classpath(["TRUFFLE_API", "com.oracle.truffle.sl"]), "com.oracle.truffle.sl.SLLanguage"] + slArgs) +def slcoverage(args): + """Demo: run an SL program with coverage counts printed when done""" + vmArgs, slArgs = mx.extract_VM_args(args) + mx.run_java(vmArgs + ['-cp', mx.classpath("com.oracle.truffle.sl.tools"), "com.oracle.truffle.sl.tools.SLCoverage"] + slArgs) + def sldebug(args): """run a simple command line debugger for the Simple Language""" vmArgs, slArgs = mx.extract_VM_args(args, useDoubleDash=True) @@ -58,4 +63,5 @@ mx.update_commands(_suite, { 'sl' : [sl, '[SL args|@VM options]'], 'sldebug' : [sldebug, '[SL args|@VM options]'], + 'slcoverage' : [slcoverage, '[SL args|@VM options]'], }) diff -r b1c71f0c1a85 -r 9a6f0c689576 truffle/com.oracle.truffle.sl.tools/src/com/oracle/truffle/sl/tools/SLCoverage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/truffle/com.oracle.truffle.sl.tools/src/com/oracle/truffle/sl/tools/SLCoverage.java Thu Nov 12 11:35:19 2015 -0800 @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.truffle.sl.tools; + +import java.io.IOException; +import java.lang.reflect.Field; + +import com.oracle.truffle.api.instrument.Instrumenter; +import com.oracle.truffle.api.source.Source; +import com.oracle.truffle.api.vm.PolyglotEngine; +import com.oracle.truffle.api.vm.PolyglotEngine.Value; +import com.oracle.truffle.tools.CoverageTracker; + +/** + * Temporary demonstration of code coverage counting. + *

+ * This reflective access will become unnecessary when tool-related PolyglotEngine APIs are in + * place. + */ +public class SLCoverage { + public static void main(String[] args) throws IOException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { + PolyglotEngine vm = PolyglotEngine.newBuilder().build(); + assert vm.getLanguages().containsKey("application/x-sl"); + final Field field = PolyglotEngine.class.getDeclaredField("instrumenter"); + field.setAccessible(true); + final Instrumenter instrumenter = (Instrumenter) field.get(vm); + final CoverageTracker coverageTracker = new CoverageTracker(); + instrumenter.install(coverageTracker); + + int repeats = 1; + if (args.length >= 2) { + repeats = Integer.parseInt(args[1]); + } + + if (args.length == 0) { + throw new IOException("No SL source file specified."); + } + final Source source = Source.fromFileName(args[0]); + + vm.eval(source); + Value main = vm.findGlobalSymbol("main"); + if (main == null) { + throw new IOException("No function main() defined in SL source file."); + } + while (repeats-- > 0) { + main.invoke(null); + } + coverageTracker.print(System.out); + } +}