private String getMetaObjectString(LanguageInfo language, Object value) { boolean recursive = RECURSIVE.get() == Boolean.TRUE; if (!recursive) { // recursive objects should still be registered RECURSIVE.set(Boolean.TRUE); try { Object metaObject = env.findMetaObject(language, value); if (metaObject != null) { String toString = env.toString(language, metaObject); if (toString != null) { return toString; } } } finally { RECURSIVE.set(Boolean.FALSE); } } return "Unknown"; } }
@Override public <T> T as(Class<T> clazz) { if (!isReadable()) { throw new IllegalStateException("Value is not readable"); } if (clazz == String.class) { Object val = get(); LanguageInfo languageInfo = resolveLanguage(); String stringValue; if (languageInfo == null) { stringValue = val.toString(); } else { stringValue = debugger.getEnv().toString(languageInfo, val); } return clazz.cast(stringValue); } else if (clazz == Number.class || clazz == Boolean.class) { return convertToPrimitive(clazz); } throw new UnsupportedOperationException(); }
@Override public String getName() { String name = super.getName(); if (name != null) { return name; } checkValid(); Object propertyKey = property.getKey(); // non-String property key LanguageInfo languageInfo = resolveLanguage(); if (languageInfo != null) { name = getDebugger().getEnv().toString(languageInfo, propertyKey); } else { name = Objects.toString(propertyKey); } return name; }
@Override @TruffleBoundary public void onReturnValue(AllocationEvent event) { if (gettingMetaObject.get()) { return; } ShadowStack.ThreadLocalStack stack = shadowStack.getStack(Thread.currentThread()); if (stack == null || stack.getStackIndex() == -1) { // nothing on the stack return; } if (stack.hasStackOverflowed()) { stackOverflowed = true; return; } LanguageInfo languageInfo = event.getLanguage(); String metaObjectString; gettingMetaObject.set(true); Object metaObject = env.findMetaObject(languageInfo, event.getValue()); if (metaObject != null) { metaObjectString = env.toString(languageInfo, metaObject); } else { metaObjectString = "null"; } gettingMetaObject.set(false); AllocationEventInfo info = new AllocationEventInfo(languageInfo, event.getNewSize() - event.getOldSize(), event.getOldSize() != 0, metaObjectString); handleEvent(stack, info); }
@Override public <T> T as(Class<T> clazz) throws DebugException { if (!isReadable()) { throw new IllegalStateException("Value is not readable"); } try { if (clazz == String.class) { Object val = get(); LanguageInfo languageInfo = resolveLanguage(); String stringValue; if (languageInfo == null) { stringValue = val.toString(); } else { stringValue = getDebugger().getEnv().toString(languageInfo, val); } return clazz.cast(stringValue); } else if (clazz == Number.class || clazz == Boolean.class) { return convertToPrimitive(clazz); } } catch (ThreadDeath td) { throw td; } catch (Throwable ex) { throw new DebugException(getSession(), ex, resolveLanguage(), null, true, null); } throw new UnsupportedOperationException(); }
@Override public String getName() { String name = super.getName(); if (name != null) { return name; } checkValid(); Object propertyKey = property.getKey(); // non-String property key LanguageInfo languageInfo = resolveLanguage(); if (languageInfo != null) { name = getDebugger().getEnv().toString(languageInfo, propertyKey); } else { name = Objects.toString(propertyKey); } return name; }