Mercurial > hg > truffle
comparison truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java @ 22219:1c0f490984d5
Merge with f47b601edbc626dcfe8b3636933b4834c89f7779
author | Michael Van De Vanter <michael.van.de.vanter@oracle.com> |
---|---|
date | Wed, 16 Sep 2015 15:36:22 -0700 |
parents | dc83cc1f94f2 7c8c03389f0f |
children | 20380d1d41f2 |
comparison
equal
deleted
inserted
replaced
22160:0599e2df6a9f | 22219:1c0f490984d5 |
---|---|
22 * or visit www.oracle.com if you need additional information or have any | 22 * or visit www.oracle.com if you need additional information or have any |
23 * questions. | 23 * questions. |
24 */ | 24 */ |
25 package com.oracle.truffle.api.vm; | 25 package com.oracle.truffle.api.vm; |
26 | 26 |
27 import com.oracle.truffle.api.CallTarget; | |
28 import com.oracle.truffle.api.TruffleLanguage; | |
29 import com.oracle.truffle.api.TruffleLanguage.Env; | |
30 import com.oracle.truffle.api.TruffleLanguage.Registration; | |
31 import com.oracle.truffle.api.debug.DebugSupportProvider; | |
32 import com.oracle.truffle.api.debug.Debugger; | |
33 import com.oracle.truffle.api.debug.ExecutionEvent; | |
34 import com.oracle.truffle.api.debug.SuspendedEvent; | |
35 import com.oracle.truffle.api.impl.Accessor; | |
36 import com.oracle.truffle.api.instrument.Probe; | |
37 import com.oracle.truffle.api.instrument.ToolSupportProvider; | |
38 import com.oracle.truffle.api.interop.TruffleObject; | |
39 import com.oracle.truffle.api.interop.java.JavaInterop; | |
40 import com.oracle.truffle.api.source.Source; | |
41 import java.io.Closeable; | 27 import java.io.Closeable; |
42 import java.io.File; | 28 import java.io.File; |
43 import java.io.IOException; | 29 import java.io.IOException; |
44 import java.io.InputStreamReader; | 30 import java.io.InputStreamReader; |
45 import java.io.InterruptedIOException; | 31 import java.io.InterruptedIOException; |
62 import java.util.Set; | 48 import java.util.Set; |
63 import java.util.concurrent.CountDownLatch; | 49 import java.util.concurrent.CountDownLatch; |
64 import java.util.concurrent.Executor; | 50 import java.util.concurrent.Executor; |
65 import java.util.logging.Level; | 51 import java.util.logging.Level; |
66 import java.util.logging.Logger; | 52 import java.util.logging.Logger; |
53 | |
54 import com.oracle.truffle.api.CallTarget; | |
55 import com.oracle.truffle.api.TruffleLanguage; | |
56 import com.oracle.truffle.api.TruffleLanguage.Env; | |
57 import com.oracle.truffle.api.TruffleLanguage.Registration; | |
58 import com.oracle.truffle.api.debug.DebugSupportProvider; | |
59 import com.oracle.truffle.api.debug.Debugger; | |
60 import com.oracle.truffle.api.debug.ExecutionEvent; | |
61 import com.oracle.truffle.api.debug.SuspendedEvent; | |
62 import com.oracle.truffle.api.impl.Accessor; | |
63 import com.oracle.truffle.api.instrument.ASTProber; | |
64 import com.oracle.truffle.api.instrument.Instrumenter; | |
65 import com.oracle.truffle.api.instrument.Probe; | |
66 import com.oracle.truffle.api.instrument.ToolSupportProvider; | |
67 import com.oracle.truffle.api.interop.TruffleObject; | |
68 import com.oracle.truffle.api.interop.java.JavaInterop; | |
69 import com.oracle.truffle.api.source.Source; | |
67 | 70 |
68 /** | 71 /** |
69 * <em>Virtual machine</em> for Truffle based languages. Term virtual machine is a bit overloaded, | 72 * <em>Virtual machine</em> for Truffle based languages. Term virtual machine is a bit overloaded, |
70 * so don't think of <em>Java virtual machine</em> here - while we are running and using | 73 * so don't think of <em>Java virtual machine</em> here - while we are running and using |
71 * {@link TruffleVM} inside of a <em>JVM</em> there can be multiple instances (some would say | 74 * {@link TruffleVM} inside of a <em>JVM</em> there can be multiple instances (some would say |
107 private final Reader in; | 110 private final Reader in; |
108 private final Writer err; | 111 private final Writer err; |
109 private final Writer out; | 112 private final Writer out; |
110 private final EventConsumer<?>[] handlers; | 113 private final EventConsumer<?>[] handlers; |
111 private final Map<String, Object> globals; | 114 private final Map<String, Object> globals; |
115 private final Instrumenter instrumenter; | |
112 private Debugger debugger; | 116 private Debugger debugger; |
113 | 117 |
114 /** | 118 /** |
115 * Private & temporary only constructor. | 119 * Private & temporary only constructor. |
116 */ | 120 */ |
121 this.out = null; | 125 this.out = null; |
122 this.langs = null; | 126 this.langs = null; |
123 this.handlers = null; | 127 this.handlers = null; |
124 this.globals = null; | 128 this.globals = null; |
125 this.executor = null; | 129 this.executor = null; |
130 this.instrumenter = null; | |
126 } | 131 } |
127 | 132 |
128 /** | 133 /** |
129 * Real constructor used from the builder. | 134 * Real constructor used from the builder. |
130 */ | 135 */ |
134 this.err = err; | 139 this.err = err; |
135 this.in = in; | 140 this.in = in; |
136 this.handlers = handlers; | 141 this.handlers = handlers; |
137 this.initThread = Thread.currentThread(); | 142 this.initThread = Thread.currentThread(); |
138 this.globals = new HashMap<>(globals); | 143 this.globals = new HashMap<>(globals); |
144 this.instrumenter = SPI.createInstrumenter(); | |
139 Map<String, Language> map = new HashMap<>(); | 145 Map<String, Language> map = new HashMap<>(); |
140 for (Map.Entry<String, LanguageCache> en : LanguageCache.languages().entrySet()) { | 146 for (Map.Entry<String, LanguageCache> en : LanguageCache.languages().entrySet()) { |
141 map.put(en.getKey(), new Language(en.getValue())); | 147 map.put(en.getKey(), new Language(en.getValue())); |
142 } | 148 } |
143 this.langs = map; | 149 this.langs = map; |
434 @SuppressWarnings("try") | 440 @SuppressWarnings("try") |
435 private void evalImpl(Debugger[] fillIn, TruffleLanguage<?>[] fillLang, Source s, Object[] result, Language l, CountDownLatch ready) { | 441 private void evalImpl(Debugger[] fillIn, TruffleLanguage<?>[] fillLang, Source s, Object[] result, Language l, CountDownLatch ready) { |
436 try (Closeable d = SPI.executionStart(this, fillIn, s)) { | 442 try (Closeable d = SPI.executionStart(this, fillIn, s)) { |
437 TruffleLanguage<?> langImpl = l.getImpl(true); | 443 TruffleLanguage<?> langImpl = l.getImpl(true); |
438 fillLang[0] = langImpl; | 444 fillLang[0] = langImpl; |
439 TruffleVM.findDebuggerSupport(langImpl); | |
440 if (debugger == null) { | 445 if (debugger == null) { |
441 debugger = fillIn[0]; | 446 debugger = fillIn[0]; |
442 } | 447 } |
443 result[0] = SPI.eval(langImpl, s); | 448 result[0] = SPI.eval(langImpl, s); |
444 } catch (IOException ex) { | 449 } catch (IOException ex) { |
596 /** | 601 /** |
597 * Obtains Java view of the object represented by this symbol. The method basically | 602 * Obtains Java view of the object represented by this symbol. The method basically |
598 * delegates to | 603 * delegates to |
599 * {@link JavaInterop#asJavaObject(java.lang.Class, com.oracle.truffle.api.interop.TruffleObject)} | 604 * {@link JavaInterop#asJavaObject(java.lang.Class, com.oracle.truffle.api.interop.TruffleObject)} |
600 * just handles primitive types as well. | 605 * just handles primitive types as well. |
601 * | 606 * |
602 * @param <T> the type of the view one wants to obtain | 607 * @param <T> the type of the view one wants to obtain |
603 * @param representation the class of the view interface (it has to be an interface) | 608 * @param representation the class of the view interface (it has to be an interface) |
604 * @return instance of the view wrapping the object of this symbol | 609 * @return instance of the view wrapping the object of this symbol |
605 * @throws IOException in case it is not possible to obtain the value of the object | 610 * @throws IOException in case it is not possible to obtain the value of the object |
606 * @throws ClassCastException if the value cannot be converted to desired view | 611 * @throws ClassCastException if the value cannot be converted to desired view |
767 return getName() + "(" + getVersion() + ")"; | 772 return getName() + "(" + getVersion() + ")"; |
768 } | 773 } |
769 | 774 |
770 TruffleLanguage<?> getImpl(boolean create) { | 775 TruffleLanguage<?> getImpl(boolean create) { |
771 getEnv(create); | 776 getEnv(create); |
772 return info.getImpl(false); | 777 TruffleLanguage<?> impl = info.getImpl(false); |
778 if (impl != null) { | |
779 ASTProber prober = SPI.getDefaultASTProber(impl); | |
780 if (prober != null) { | |
781 instrumenter.registerASTProber(prober); | |
782 } | |
783 } | |
784 return impl; | |
773 } | 785 } |
774 | 786 |
775 TruffleLanguage.Env getEnv(boolean create) { | 787 TruffleLanguage.Env getEnv(boolean create) { |
776 if (env == null && create) { | 788 if (env == null && create) { |
777 env = SPI.attachEnv(TruffleVM.this, info.getImpl(true), out, err, in); | 789 env = SPI.attachEnv(TruffleVM.this, info.getImpl(true), out, err, in); |
787 | 799 |
788 // | 800 // |
789 // Accessor helper methods | 801 // Accessor helper methods |
790 // | 802 // |
791 | 803 |
792 TruffleLanguage<?> findLanguage(Probe probe) { | 804 TruffleLanguage<?> findLanguage(Class<? extends TruffleLanguage> languageClazz) { |
793 Class<? extends TruffleLanguage> languageClazz = SPI.findLanguage(probe); | |
794 for (Map.Entry<String, Language> entrySet : langs.entrySet()) { | 805 for (Map.Entry<String, Language> entrySet : langs.entrySet()) { |
795 Language languageDescription = entrySet.getValue(); | 806 Language languageDescription = entrySet.getValue(); |
796 final TruffleLanguage<?> impl = languageDescription.getImpl(false); | 807 final TruffleLanguage<?> impl = languageDescription.getImpl(false); |
797 if (languageClazz.isInstance(impl)) { | 808 if (languageClazz.isInstance(impl)) { |
798 return impl; | 809 return impl; |
799 } | 810 } |
800 } | 811 } |
801 throw new IllegalStateException("Cannot find language " + languageClazz + " among " + langs); | 812 throw new IllegalStateException("Cannot find language " + languageClazz + " among " + langs); |
813 } | |
814 | |
815 TruffleLanguage<?> findLanguage(Probe probe) { | |
816 return findLanguage(SPI.findLanguage(probe)); | |
802 } | 817 } |
803 | 818 |
804 Env findEnv(Class<? extends TruffleLanguage> languageClazz) { | 819 Env findEnv(Class<? extends TruffleLanguage> languageClazz) { |
805 for (Map.Entry<String, Language> entrySet : langs.entrySet()) { | 820 for (Map.Entry<String, Language> entrySet : langs.entrySet()) { |
806 Language languageDescription = entrySet.getValue(); | 821 Language languageDescription = entrySet.getValue(); |
810 } | 825 } |
811 } | 826 } |
812 throw new IllegalStateException("Cannot find language " + languageClazz + " among " + langs); | 827 throw new IllegalStateException("Cannot find language " + languageClazz + " among " + langs); |
813 } | 828 } |
814 | 829 |
815 static DebugSupportProvider findDebuggerSupport(TruffleLanguage<?> l) { | |
816 return SPI.getDebugSupport(l); | |
817 } | |
818 | |
819 private static class SPIAccessor extends Accessor { | 830 private static class SPIAccessor extends Accessor { |
820 @Override | 831 @Override |
821 public Object importSymbol(Object vmObj, TruffleLanguage<?> ownLang, String globalName) { | 832 public Object importSymbol(Object vmObj, TruffleLanguage<?> ownLang, String globalName) { |
822 TruffleVM vm = (TruffleVM) vmObj; | 833 TruffleVM vm = (TruffleVM) vmObj; |
823 Object g = vm.globals.get(globalName); | 834 Object g = vm.globals.get(globalName); |
869 @Override | 880 @Override |
870 protected Object languageGlobal(TruffleLanguage.Env env) { | 881 protected Object languageGlobal(TruffleLanguage.Env env) { |
871 return super.languageGlobal(env); | 882 return super.languageGlobal(env); |
872 } | 883 } |
873 | 884 |
885 @SuppressWarnings("deprecation") | |
874 @Override | 886 @Override |
875 public ToolSupportProvider getToolSupport(TruffleLanguage<?> l) { | 887 public ToolSupportProvider getToolSupport(TruffleLanguage<?> l) { |
876 return super.getToolSupport(l); | 888 throw new UnsupportedOperationException(); |
877 } | 889 } |
878 | 890 |
891 @SuppressWarnings("deprecation") | |
879 @Override | 892 @Override |
880 public DebugSupportProvider getDebugSupport(TruffleLanguage<?> l) { | 893 public DebugSupportProvider getDebugSupport(TruffleLanguage<?> l) { |
881 return super.getDebugSupport(l); | 894 throw new UnsupportedOperationException(); |
895 } | |
896 | |
897 @Override | |
898 protected Instrumenter createInstrumenter() { | |
899 return super.createInstrumenter(); | |
900 } | |
901 | |
902 @Override | |
903 protected ASTProber getDefaultASTProber(TruffleLanguage impl) { | |
904 return super.getDefaultASTProber(impl); | |
905 } | |
906 | |
907 @Override | |
908 protected Instrumenter getInstrumenter(Object obj) { | |
909 final TruffleVM vm = (TruffleVM) obj; | |
910 return vm.instrumenter; | |
882 } | 911 } |
883 | 912 |
884 @Override | 913 @Override |
885 protected Class<? extends TruffleLanguage> findLanguage(Probe probe) { | 914 protected Class<? extends TruffleLanguage> findLanguage(Probe probe) { |
886 return super.findLanguage(probe); | 915 return super.findLanguage(probe); |
891 TruffleVM vm = (TruffleVM) obj; | 920 TruffleVM vm = (TruffleVM) obj; |
892 return vm.findEnv(languageClass); | 921 return vm.findEnv(languageClass); |
893 } | 922 } |
894 | 923 |
895 @Override | 924 @Override |
925 protected TruffleLanguage findLanguageImpl(Object obj, Class<? extends TruffleLanguage> languageClazz) { | |
926 final TruffleVM vm = (TruffleVM) obj; | |
927 return vm.findLanguage(languageClazz); | |
928 } | |
929 | |
930 @Override | |
896 protected Closeable executionStart(Object obj, Debugger[] fillIn, Source s) { | 931 protected Closeable executionStart(Object obj, Debugger[] fillIn, Source s) { |
897 TruffleVM vm = (TruffleVM) obj; | 932 TruffleVM vm = (TruffleVM) obj; |
898 return super.executionStart(vm, fillIn, s); | 933 return super.executionStart(vm, fillIn, s); |
899 } | 934 } |
900 | 935 |