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