# HG changeset patch # User Jaroslav Tulach # Date 1447921764 -3600 # Node ID 0e86a9f324bf95e219c3905d6075a358cad67f38 # Parent 2acc64b458480a8005de0eed9890c02cf212bfda Capturing the current state of Source->CallTarget caching in a test diff -r 2acc64b45848 -r 0e86a9f324bf truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/vm/EngineTest.java --- a/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/vm/EngineTest.java Thu Nov 19 08:53:40 2015 +0100 +++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/vm/EngineTest.java Thu Nov 19 09:29:24 2015 +0100 @@ -24,8 +24,10 @@ import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.vm.PolyglotEngine; +import java.io.IOException; import java.util.List; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import org.junit.Test; @@ -47,6 +49,39 @@ assertNotNull(res); } + @Test + public void checkCachingOfNodes() throws IOException { + PolyglotEngine vm1 = createBuilder().build(); + PolyglotEngine vm2 = createBuilder().build(); + + PolyglotEngine.Language language1 = vm1.getLanguages().get("application/x-test-hash"); + PolyglotEngine.Language language2 = vm2.getLanguages().get("application/x-test-hash"); + PolyglotEngine.Language alt1 = vm1.getLanguages().get("application/x-test-hash-alt"); + PolyglotEngine.Language alt2 = vm2.getLanguages().get("application/x-test-hash-alt"); + final Source sharedSource = Source.fromText("anything", "something"); + + Object hashIn1Round1 = language1.eval(sharedSource).get(); + Object hashIn2Round1 = language2.eval(sharedSource).get(); + Object hashIn1Round2 = language1.eval(sharedSource).get(); + Object hashIn2Round2 = language2.eval(sharedSource).get(); + + Object altIn1Round1 = alt1.eval(sharedSource).get(); + Object altIn2Round1 = alt2.eval(sharedSource).get(); + Object altIn1Round2 = alt1.eval(sharedSource).get(); + Object altIn2Round2 = alt2.eval(sharedSource).get(); + + assertEquals("Two executions in 1st engine share the nodes", hashIn1Round1, hashIn1Round2); + assertEquals("Two executions in 2nd engine share the nodes", hashIn2Round1, hashIn2Round2); + + assertEquals("Two alternative executions in 1st engine share the nodes", altIn1Round1, altIn1Round2); + assertEquals("Two alternative executions in 2nd engine share the nodes", altIn2Round1, altIn2Round2); + + assertNotEquals("Two executions in different languages don't share the nodes", hashIn1Round1, altIn1Round1); + assertNotEquals("Two executions in different languages don't share the nodes", hashIn1Round1, altIn2Round1); + assertNotEquals("Two executions in different languages don't share the nodes", hashIn2Round2, altIn1Round2); + assertNotEquals("Two executions in different languages don't share the nodes", hashIn2Round2, altIn2Round2); + } + protected Thread forbiddenThread() { return null; } diff -r 2acc64b45848 -r 0e86a9f324bf truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/vm/HashLanguage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/vm/HashLanguage.java Thu Nov 19 09:29:24 2015 +0100 @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.truffle.api.test.vm; + +import com.oracle.truffle.api.CallTarget; +import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.TruffleLanguage; +import com.oracle.truffle.api.TruffleLanguage.Env; +import com.oracle.truffle.api.frame.MaterializedFrame; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.instrument.Visualizer; +import com.oracle.truffle.api.instrument.WrapperNode; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.RootNode; +import com.oracle.truffle.api.source.Source; +import java.io.IOException; + +@TruffleLanguage.Registration(name = "Hash", mimeType = "application/x-test-hash", version = "1.0") +public class HashLanguage extends TruffleLanguage { + public static final HashLanguage INSTANCE = new HashLanguage(); + + @Override + protected Env createContext(Env env) { + return env; + } + + @Override + protected CallTarget parse(Source code, Node context, String... argumentNames) throws IOException { + return Truffle.getRuntime().createCallTarget(new HashNode(this, code)); + } + + @Override + protected Object findExportedSymbol(Env context, String globalName, boolean onlyExplicit) { + return null; + } + + @Override + protected Object getLanguageGlobal(Env context) { + return null; + } + + @Override + protected boolean isObjectOfLanguage(Object object) { + return false; + } + + @Override + protected Visualizer getVisualizer() { + return null; + } + + @Override + protected boolean isInstrumentable(Node node) { + return false; + } + + @Override + protected WrapperNode createWrapperNode(Node node) { + throw new UnsupportedOperationException(); + } + + @Override + protected Object evalInContext(Source source, Node node, MaterializedFrame mFrame) throws IOException { + throw new UnsupportedOperationException("Not supported yet."); // To change body of + // generated methods, choose + // Tools | Templates. + } + + private static class HashNode extends RootNode { + private static int counter; + private final Source code; + private final int id; + + public HashNode(HashLanguage hash, Source code) { + super(hash.getClass(), null, null); + this.code = code; + id = ++counter; + } + + @Override + public Object execute(VirtualFrame frame) { + return System.identityHashCode(this) + "@" + code.getCode() + " @ " + id; + } + } + + @TruffleLanguage.Registration(name = "AltHash", mimeType = "application/x-test-hash-alt", version = "1.0") + public static final class SubLang extends HashLanguage { + public static final SubLang INSTANCE = new SubLang(); + } +}