private void assertIsObjectOfLanguage(Object obj) throws Exception { enterTCK(); // hack to ensure entered PolyglotRuntime.Instrument instr = vm().getRuntime().getInstruments().get(TckInstrument.ID); TruffleLanguage.Env env = TruffleTCKAccessor.engineAccess().getEnvForInstrument(instr, null, mimeType()); assertTrue(obj.toString(), TruffleTCKAccessor.langAccess().isObjectOfLanguage(env, obj)); }
@Override public Object findMetaObjectForLanguage(Object languageVMObject, Object value) { PolyglotLanguageContext languageContext = ((PolyglotLanguageContext) languageVMObject); Env currentLanguage = languageContext.env; assert currentLanguage != null : "current language is initialized"; Env foundLanguage = null; Env hostLanguage = languageContext.context.getHostContext().env; if (VMAccessor.LANGUAGE.isObjectOfLanguage(hostLanguage, value)) { foundLanguage = hostLanguage; } else if (VMAccessor.LANGUAGE.isObjectOfLanguage(currentLanguage, value)) { foundLanguage = currentLanguage; } else { for (PolyglotLanguageContext searchContext : languageContext.context.contexts) { if (searchContext.isInitialized() && searchContext != languageContext) { Env searchEnv = searchContext.env; if (VMAccessor.LANGUAGE.isObjectOfLanguage(searchEnv, value)) { foundLanguage = searchEnv; break; } } } } if (foundLanguage != null) { return VMAccessor.LANGUAGE.findMetaObject(foundLanguage, value); } else { return null; } }
static PolyglotLanguage findObjectLanguage(PolyglotContextImpl context, PolyglotLanguageContext currentlanguageContext, Object value) { PolyglotLanguage foundLanguage = null; final PolyglotLanguageContext hostLanguageContext = context.getHostContext(); // The HostLanguage might not have context created even when JavaObjects exist // Check it separately: if (currentlanguageContext != null && isPrimitive(value)) { return currentlanguageContext.language; } else if (VMAccessor.LANGUAGE.isObjectOfLanguage(hostLanguageContext.env, value)) { foundLanguage = hostLanguageContext.language; } else if (currentlanguageContext != null && VMAccessor.LANGUAGE.isObjectOfLanguage(currentlanguageContext.env, value)) { foundLanguage = currentlanguageContext.language; } else { for (PolyglotLanguageContext searchContext : context.contexts) { if (searchContext.isInitialized() && searchContext != currentlanguageContext) { final Env searchEnv = searchContext.env; if (VMAccessor.LANGUAGE.isObjectOfLanguage(searchEnv, value)) { foundLanguage = searchContext.language; break; } } } } return foundLanguage; }
static PolyglotLanguage findObjectLanguage(PolyglotContextImpl context, Object value) { PolyglotLanguageContext[] contexts = context.contexts; for (PolyglotLanguageContext languageContext : contexts) { PolyglotLanguage language = languageContext.language; if (!language.isInitialized()) { continue; } if (language.cache.singletonLanguage instanceof HostLanguage) { // The HostLanguage might not have context created even when JavaObjects exist // Check it separately: if (((HostLanguage) language.cache.singletonLanguage).isObjectOfLanguage(value)) { return language; } else { continue; } } Env env = languageContext.env; if (env != null && LANGUAGE.isObjectOfLanguage(env, value)) { return language; } } return null; }
@Override public LanguageInfo getObjectLanguage(Object obj, Object vmObject) { for (LanguageShared ls : ((Instrument) vmObject).getRuntime().getLanguages()) { if (!ls.initialized) { continue; } Env env = ls.currentLanguage().getEnv(false); if (env != null && LANGUAGE.isObjectOfLanguage(env, obj)) { return ls.language; } } return null; }