Mercurial > hg > truffle
diff graal/com.oracle.truffle.api/src/com/oracle/truffle/api/vm/TruffleVM.java @ 21716:2f9e4d984d16
Give languages a chance to do implicit exports. Prefer explicit exports over implicit ones.
author | Jaroslav Tulach <jaroslav.tulach@oracle.com> |
---|---|
date | Thu, 04 Jun 2015 08:08:05 +0200 |
parents | 1c76a5662753 |
children | 45083be8a812 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/vm/TruffleVM.java Thu Jun 04 01:00:44 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/vm/TruffleVM.java Thu Jun 04 08:08:05 2015 +0200 @@ -104,9 +104,15 @@ LOG.log(Level.CONFIG, "Cannot process " + u + " as language definition", ex); continue; } - Language l = new Language(p); - for (String mimeType : l.getMimeTypes()) { - langs.put(mimeType, l); + for (int cnt = 1;; cnt++) { + String prefix = "language" + cnt + "."; + if (p.getProperty(prefix + "name") == null) { + break; + } + Language l = new Language(prefix, p); + for (String mimeType : l.getMimeTypes()) { + langs.put(mimeType, l); + } } } } @@ -327,12 +333,22 @@ Object global = null; for (Language dl : langs.values()) { TruffleLanguage l = dl.getImpl(); - obj = SPI.findExportedSymbol(l, globalName); + obj = SPI.findExportedSymbol(l, globalName, true); if (obj != null) { global = SPI.languageGlobal(l); break; } } + if (obj == null) { + for (Language dl : langs.values()) { + TruffleLanguage l = dl.getImpl(); + obj = SPI.findExportedSymbol(l, globalName, false); + if (obj != null) { + global = SPI.languageGlobal(l); + break; + } + } + } return obj == null ? null : new Symbol(obj, global); } @@ -399,8 +415,10 @@ public final class Language { private final Properties props; private TruffleLanguage impl; + private final String prefix; - Language(Properties props) { + Language(String prefix, Properties props) { + this.prefix = prefix; this.props = props; } @@ -412,7 +430,7 @@ public Set<String> getMimeTypes() { TreeSet<String> ts = new TreeSet<>(); for (int i = 0;; i++) { - String mt = props.getProperty("mimeType." + i); + String mt = props.getProperty(prefix + "mimeType." + i); if (mt == null) { break; } @@ -427,12 +445,12 @@ * @return string giving the language a name */ public String getName() { - return props.getProperty("name"); + return props.getProperty(prefix + "name"); } TruffleLanguage getImpl() { if (impl == null) { - String n = props.getProperty("className"); + String n = props.getProperty(prefix + "className"); try { Class<?> langClazz = Class.forName(n, true, loader()); Constructor<?> constructor = langClazz.getConstructor(Env.class); @@ -459,7 +477,17 @@ if (l == ownLang) { continue; } - Object obj = SPI.findExportedSymbol(l, globalName); + Object obj = SPI.findExportedSymbol(l, globalName, true); + if (obj != null) { + return obj; + } + } + for (Language dl : uniqueLang) { + TruffleLanguage l = dl.getImpl(); + if (l == ownLang) { + continue; + } + Object obj = SPI.findExportedSymbol(l, globalName, false); if (obj != null) { return obj; } @@ -478,8 +506,8 @@ } @Override - public Object findExportedSymbol(TruffleLanguage l, String globalName) { - return super.findExportedSymbol(l, globalName); + public Object findExportedSymbol(TruffleLanguage l, String globalName, boolean onlyExplicit) { + return super.findExportedSymbol(l, globalName, onlyExplicit); } @Override