# HG changeset patch # User Jaroslav Tulach # Date 1447923098 -3600 # Node ID e8397a39674bcd2e99022cc4d676f22f56350405 # Parent 086776aa7548ca16698f72c0ebb832325ba7a374 Ensuring SL does caching of its CallTarget across whole JVM diff -r 086776aa7548 -r e8397a39674b truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/ParsingCachedTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/ParsingCachedTest.java Thu Nov 19 09:51:38 2015 +0100 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2012, 2013, 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.test; + +import com.oracle.truffle.api.source.Source; +import com.oracle.truffle.api.vm.PolyglotEngine; +import com.oracle.truffle.sl.SLLanguage; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import org.junit.Test; + +public class ParsingCachedTest { + + @Test + public void stepInStepOver() throws Throwable { + Source nullSrc = Source.fromText("function main() {}", "yields null").withMimeType("application/x-sl"); + + PolyglotEngine engine = PolyglotEngine.newBuilder().build(); + int cnt = SLLanguage.parsingCount(); + Object res = engine.eval(nullSrc).get(); + assertNull("Is null", res); + assertEquals("One parsing happened", cnt + 1, SLLanguage.parsingCount()); + + Object res2 = engine.eval(nullSrc).get(); + assertNull("Still null", res2); + assertEquals("No more parsing happened", cnt + 1, SLLanguage.parsingCount()); + } + +} diff -r 086776aa7548 -r e8397a39674b truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLLanguage.java --- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLLanguage.java Thu Nov 19 09:40:21 2015 +0100 +++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLLanguage.java Thu Nov 19 09:51:38 2015 +0100 @@ -114,6 +114,8 @@ import com.oracle.truffle.sl.runtime.SLFunction; import com.oracle.truffle.sl.runtime.SLFunctionRegistry; import com.oracle.truffle.sl.runtime.SLNull; +import java.util.Map; +import java.util.WeakHashMap; /** * SL is a simple language to demonstrate and showcase features of Truffle. The implementation is as @@ -204,8 +206,12 @@ public static final String builtinKind = "SL builtin"; private static List> builtins = Collections.emptyList(); private static Visualizer visualizer = new SLDefaultVisualizer(); + private static int parsingCount; + + private final Map compiled; private SLLanguage() { + compiled = Collections.synchronizedMap(new WeakHashMap()); } public static final SLLanguage INSTANCE = new SLLanguage(); @@ -258,6 +264,10 @@ reportToolDemos(); } + public static int parsingCount() { + return parsingCount; + } + /** * Parse and run the specified SL source. Factored out in a separate method so that it can also * be used by the unit test harness. @@ -415,6 +425,11 @@ @Override protected CallTarget parse(Source code, final Node node, String... argumentNames) throws IOException { + CallTarget cached = compiled.get(code); + if (cached != null) { + return cached; + } + parsingCount++; final SLContext c = new SLContext(this); final Exception[] failed = {null}; try { @@ -455,7 +470,9 @@ return null; } }; - return Truffle.getRuntime().createCallTarget(rootNode); + cached = Truffle.getRuntime().createCallTarget(rootNode); + compiled.put(code, cached); + return cached; } @Override