@SuppressWarnings("rawtypes") PolyglotLanguageContext findLanguageContext(Class<? extends TruffleLanguage> languageClazz, boolean failIfNotFound) { for (PolyglotLanguageContext lang : contexts) { if (lang.isInitialized()) { TruffleLanguage<?> language = VMAccessor.LANGUAGE.getLanguage(lang.env); if (languageClazz != TruffleLanguage.class && languageClazz.isInstance(language)) { return lang; } } } if (failIfNotFound) { Set<String> languageNames = new HashSet<>(); for (PolyglotLanguageContext lang : contexts) { if (lang.isInitialized()) { languageNames.add(lang.language.cache.getClassName()); } } throw new IllegalStateException("Cannot find language " + languageClazz + " among " + languageNames); } else { return null; } }
static <T extends TruffleLanguage<?>> T findLanguageByClass(Object vm, Class<T> languageClass) { Env env = SPI.findEnv(vm, languageClass, true); TruffleLanguage<?> language = API.getLanguage(env); return languageClass.cast(language); }
@SuppressWarnings("unchecked") @Override public <T extends TruffleLanguage<?>> T getCurrentLanguage(Class<T> languageClass) { CompilerAsserts.partialEvaluationConstant(languageClass); PolyglotContextImpl context = PolyglotContextImpl.requireContext(); Env env = context.getLanguageContext(languageClass).env; if (env == null) { CompilerDirectives.transferToInterpreter(); throw new IllegalStateException("Current context is not yet initialized or already disposed."); } return (T) VMAccessor.LANGUAGE.getLanguage(env); }
PolyglotLanguageContext.this.env = localEnv; PolyglotLanguageContext.this.lazy = localLazy; assert VMAccessor.LANGUAGE.getLanguage(env) != null;
@Override public <S> S lookup(LanguageInfo info, Class<S> serviceClass) { PolyglotLanguage language = (PolyglotLanguage) NODES.getEngineObject(info); PolyglotLanguageContext languageContext = PolyglotContextImpl.requireContext().getContextInitialized(language, language); return LANGUAGE.lookup(LANGUAGE.getLanguage(languageContext.env), serviceClass); }