From 3e18d577789fcbed89f29025a75006f9fbb7c374 Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Mon, 25 Jan 2016 21:23:50 +0000 Subject: [PATCH 1/6] Add Env#getSupportedMimeTypes() --- .../oracle/truffle/api/vm/PolyglotEngine.java | 14 ++++++++++++++ .../oracle/truffle/api/TruffleLanguage.java | 18 ++++++++++++++++++ .../com/oracle/truffle/api/impl/Accessor.java | 4 ++++ 3 files changed, 36 insertions(+) diff --git a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java index 5427dc54c011..e84db06782b1 100644 --- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java +++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java @@ -886,6 +886,14 @@ TruffleLanguage findLanguage(Class languageClazz) return null; } + String[] getSupportedMimeTypes() { + final Set mimeTypes = new HashSet<>(); + for (PolyglotEngine.Language language : langs.values()) { + mimeTypes.addAll(language.getMimeTypes()); + } + return mimeTypes.toArray(new String[mimeTypes.size()]); + } + TruffleLanguage findLanguage(String mimeType) { Language languageDescription = this.langs.get(mimeType); if (languageDescription != null) { @@ -980,6 +988,12 @@ protected Instrumenter getInstrumenter(Object obj) { return vm.instrumenter; } + @Override + protected String[] getSupportedMimeTypes(Object obj) { + final PolyglotEngine vm = (PolyglotEngine) obj; + return vm.getSupportedMimeTypes(); + } + @Override protected Class findLanguage(Probe probe) { return super.findLanguage(probe); diff --git a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java index a68cbec38e09..1f7d212e1bba 100644 --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java @@ -387,6 +387,19 @@ public Object importSymbol(String globalName) { return API.importSymbol(vm, lang, globalName); } + /** + * Produces an array of strings for the MIME types supported by this {@link PolyglotEngine}. + * There may be multiple MIME types for a single language. Each MIME type will appear only + * once, even if multiple language declare it. + * + * MIME types from this array can be used in methods such as {@link #parse}. + * + * @return a non-null array of a string for each supported MIME type + */ + public String[] getSupportedMimeTypes() { + return API.getSupportedMimeTypes(vm); + } + /** * Evaluates source of (potentially different) language. The {@link Source#getMimeType() * MIME type} is used to identify the {@link TruffleLanguage} to use to perform the @@ -525,6 +538,11 @@ protected Object findExportedSymbol(TruffleLanguage.Env env, String globalName, return env.langCtx.findExportedSymbol(globalName, onlyExplicit); } + @Override + protected String[] getSupportedMimeTypes(Object obj) { + return super.getSupportedMimeTypes(obj); + } + @Override protected Env findLanguage(Object vm, Class languageClass) { return super.findLanguage(vm, languageClass); diff --git a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java index a623d7e76ecb..c1b0c7632f9e 100644 --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java @@ -204,6 +204,10 @@ protected WrapperNode createWrapperNode(Node node, TruffleLanguage language) return API.createWrapperNode(node, language); } + protected String[] getSupportedMimeTypes(Object obj) { + return SPI.getSupportedMimeTypes(obj); + } + @SuppressWarnings("rawtypes") protected Class findLanguage(RootNode n) { return NODES.findLanguage(n); From 9dcaf3cf3efe97980745e9517dd749112a1bc1e5 Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Tue, 26 Jan 2016 14:28:09 +0000 Subject: [PATCH 2/6] Switch from getSupportedMimeTypes to isMimeTypeSupported. --- .../oracle/truffle/api/vm/PolyglotEngine.java | 10 ++++----- .../oracle/truffle/api/TruffleLanguage.java | 22 +++++++++---------- .../com/oracle/truffle/api/impl/Accessor.java | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java index e84db06782b1..92c337f608ef 100644 --- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java +++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java @@ -989,14 +989,14 @@ protected Instrumenter getInstrumenter(Object obj) { } @Override - protected String[] getSupportedMimeTypes(Object obj) { - final PolyglotEngine vm = (PolyglotEngine) obj; - return vm.getSupportedMimeTypes(); + protected Class findLanguage(Probe probe) { + return super.findLanguage(probe); } @Override - protected Class findLanguage(Probe probe) { - return super.findLanguage(probe); + protected boolean isMimeTypeSupported(Object obj, String mimeType) { + final PolyglotEngine vm = (PolyglotEngine) obj; + return vm.findLanguage(mimeType) != null; } @Override diff --git a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java index 1f7d212e1bba..249173b1e9dc 100644 --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java @@ -232,8 +232,8 @@ protected void disposeContext(C context) { protected abstract Visualizer getVisualizer(); /** - * Returns {@code true} for a node can be "instrumented" by - * {@linkplain Instrumenter#probe(Node) probing}. + * Returns {@code true} for a node can be "instrumented" by {@linkplain Instrumenter#probe(Node) + * probing}. *

* Note: instrumentation requires a appropriate {@link WrapperNode} * @@ -388,16 +388,16 @@ public Object importSymbol(String globalName) { } /** - * Produces an array of strings for the MIME types supported by this {@link PolyglotEngine}. - * There may be multiple MIME types for a single language. Each MIME type will appear only - * once, even if multiple language declare it. + * Allows it to be determined if this {@link PolyglotEngine} can execute code written in a + * language with a given MIME type. * - * MIME types from this array can be used in methods such as {@link #parse}. + * @see Source#withMimeType() + * @see #parse() * - * @return a non-null array of a string for each supported MIME type + * @return a boolean that indicates if the MIME type is supported */ - public String[] getSupportedMimeTypes() { - return API.getSupportedMimeTypes(vm); + public boolean isMimeTypeSupported(String mimeType) { + return API.isMimeTypeSupported(vm, mimeType); } /** @@ -539,8 +539,8 @@ protected Object findExportedSymbol(TruffleLanguage.Env env, String globalName, } @Override - protected String[] getSupportedMimeTypes(Object obj) { - return super.getSupportedMimeTypes(obj); + protected boolean isMimeTypeSupported(Object vm, String mimeType) { + return super.isMimeTypeSupported(vm, mimeType); } @Override diff --git a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java index c1b0c7632f9e..46d61d701d65 100644 --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java @@ -204,8 +204,8 @@ protected WrapperNode createWrapperNode(Node node, TruffleLanguage language) return API.createWrapperNode(node, language); } - protected String[] getSupportedMimeTypes(Object obj) { - return SPI.getSupportedMimeTypes(obj); + protected boolean isMimeTypeSupported(Object vm, String mimeType) { + return SPI.isMimeTypeSupported(vm, mimeType); } @SuppressWarnings("rawtypes") From 222f5dcc82f0005df688b8c566551d82e2b0d40b Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Tue, 26 Jan 2016 14:33:51 +0000 Subject: [PATCH 3/6] Remove dead code. --- .../src/com/oracle/truffle/api/vm/PolyglotEngine.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java index 92c337f608ef..cb9c5394666b 100644 --- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java +++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java @@ -886,14 +886,6 @@ TruffleLanguage findLanguage(Class languageClazz) return null; } - String[] getSupportedMimeTypes() { - final Set mimeTypes = new HashSet<>(); - for (PolyglotEngine.Language language : langs.values()) { - mimeTypes.addAll(language.getMimeTypes()); - } - return mimeTypes.toArray(new String[mimeTypes.size()]); - } - TruffleLanguage findLanguage(String mimeType) { Language languageDescription = this.langs.get(mimeType); if (languageDescription != null) { From 3b1dc69ee5225b7bf29fdbe7118622ea65dfada0 Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Thu, 28 Jan 2016 14:42:20 +0000 Subject: [PATCH 4/6] Test for Env#isMimeTypeSupported(). --- .../api/vm/IsMimeTypeSupportedTest.java | 44 +++++++++ .../vm/IsMimeTypeSupportedTestLanguage.java | 94 +++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/vm/IsMimeTypeSupportedTest.java create mode 100644 truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/vm/IsMimeTypeSupportedTestLanguage.java diff --git a/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/vm/IsMimeTypeSupportedTest.java b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/vm/IsMimeTypeSupportedTest.java new file mode 100644 index 000000000000..f32fb7ef58ae --- /dev/null +++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/vm/IsMimeTypeSupportedTest.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016, 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.vm; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.junit.Test; + +import com.oracle.truffle.api.source.Source; + +public class IsMimeTypeSupportedTest { + + private static final String MIME_TYPE = "application/x-test-mime-type-supported"; + + @Test + public void isMimeSupported() throws IOException { + PolyglotEngine vm = PolyglotEngine.newBuilder().build(); + assertEquals(true, vm.eval(Source.fromText(MIME_TYPE, "supported").withMimeType(MIME_TYPE)).as(Boolean.class)); + assertEquals(false, vm.eval(Source.fromText("application/x-this-language-does-not-exist", "unsupported").withMimeType(MIME_TYPE)).as(Boolean.class)); + } + +} diff --git a/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/vm/IsMimeTypeSupportedTestLanguage.java b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/vm/IsMimeTypeSupportedTestLanguage.java new file mode 100644 index 000000000000..d6ebe01b5e73 --- /dev/null +++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/vm/IsMimeTypeSupportedTestLanguage.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2016, 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.vm; + +import java.io.IOException; + +import com.oracle.truffle.api.CallTarget; +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.instrument.Visualizer; +import com.oracle.truffle.api.instrument.WrapperNode; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.source.Source; + +@TruffleLanguage.Registration(name = "Hash", mimeType = "application/x-test-mime-type-supported", version = "1.0") +public class IsMimeTypeSupportedTestLanguage extends TruffleLanguage { + + public static final IsMimeTypeSupportedTestLanguage INSTANCE = new IsMimeTypeSupportedTestLanguage(); + + @Override + protected Env createContext(com.oracle.truffle.api.TruffleLanguage.Env env) { + return env; + } + + @Override + protected CallTarget parse(final Source code, Node context, String... argumentNames) throws IOException { + final String mimeType = code.getCode(); + + return new CallTarget() { + + public Object call(Object... arguments) { + return findContext(createFindContextNode()).isMimeTypeSupported(mimeType); + } + + }; + } + + @Override + protected Object findExportedSymbol(Env context, String globalName, boolean onlyExplicit) { + throw new UnsupportedOperationException(); + } + + @Override + protected Object getLanguageGlobal(Env context) { + throw new UnsupportedOperationException(); + } + + @Override + protected boolean isObjectOfLanguage(Object object) { + throw new UnsupportedOperationException(); + } + + @Override + protected Visualizer getVisualizer() { + throw new UnsupportedOperationException(); + } + + @Override + protected boolean isInstrumentable(Node node) { + throw new UnsupportedOperationException(); + } + + @Override + protected WrapperNode createWrapperNode(Node node) { + throw new UnsupportedOperationException(); + } + + @Override + protected Object evalInContext(Source source, Node node, MaterializedFrame mFrame) throws IOException { + throw new UnsupportedOperationException(); + } + +} From f0896f85bbfeba55cc92321b987fe2470e81ba3b Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Thu, 28 Jan 2016 16:12:38 +0000 Subject: [PATCH 5/6] Reverse formatting change. --- .../src/com/oracle/truffle/api/TruffleLanguage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java index 249173b1e9dc..67a59e5c531a 100644 --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java @@ -232,8 +232,8 @@ protected void disposeContext(C context) { protected abstract Visualizer getVisualizer(); /** - * Returns {@code true} for a node can be "instrumented" by {@linkplain Instrumenter#probe(Node) - * probing}. + * Returns {@code true} for a node can be "instrumented" by + * {@linkplain Instrumenter#probe(Node) probing}. *

* Note: instrumentation requires a appropriate {@link WrapperNode} * From d96e5e0b00ee4e263311a56358763cc3a481a6aa Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Thu, 28 Jan 2016 17:24:07 +0000 Subject: [PATCH 6/6] Explicit links in JavaDoc. --- .../src/com/oracle/truffle/api/TruffleLanguage.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java index 67a59e5c531a..24985bbfa8ba 100644 --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java @@ -388,11 +388,11 @@ public Object importSymbol(String globalName) { } /** - * Allows it to be determined if this {@link PolyglotEngine} can execute code written in a - * language with a given MIME type. + * Allows it to be determined if this {@link com.oracle.truffle.api.vm.PolyglotEngine} can + * execute code written in a language with a given MIME type. * - * @see Source#withMimeType() - * @see #parse() + * @see Source#withMimeType(String) + * @see #parse(Source, String...) * * @return a boolean that indicates if the MIME type is supported */