DebuggerExecutionLifecycle(Debugger debugger) { this.debugger = debugger; this.lifecycleInstrumenter = debugger.getEnv().getInstrumenter(); }
@Override public Set<Map.Entry<String, DebugValue>> entrySet() { Set<Map.Entry<String, DebugValue>> entries = new LinkedHashSet<>(); for (Map.Entry<String, ? extends Object> symbol : debugger.getEnv().getExportedSymbols().entrySet()) { DebugValue value = new DebugValue.HeapValue(DebuggerSession.this, symbol.getKey(), symbol.getValue()); entries.add(new SimpleImmutableEntry<>(symbol.getKey(), value)); } return Collections.unmodifiableSet(entries); }
@Override public Set<Map.Entry<String, DebugValue>> entrySet() { Set<Map.Entry<String, DebugValue>> entries = new LinkedHashSet<>(); for (Map.Entry<String, ? extends Object> symbol : debugger.getEnv().getExportedSymbols().entrySet()) { DebugValue value = new DebugValue.HeapValue(debugger, symbol.getKey(), symbol.getValue()); entries.add(new SimpleImmutableEntry<>(symbol.getKey(), value)); } return Collections.unmodifiableSet(entries); }
@Override public DebugValue get(Object key) { if (!(key instanceof String)) { return null; } String name = (String) key; Object value = debugger.getEnv().getExportedSymbols().get(name); if (value == null) { return null; } return new DebugValue.HeapValue(debugger, name, value); } };
/** * Returns a language top scope. The top scopes have global validity and unlike * {@link DebugStackFrame#getScope()} have no relation to the suspended location. * * @since 0.30 */ public DebugScope getTopScope(String languageId) { LanguageInfo info = debugger.getEnv().getLanguages().get(languageId); if (info == null) { return null; } Iterable<Scope> scopes = debugger.getEnv().findTopScopes(languageId); Iterator<Scope> it = scopes.iterator(); if (!it.hasNext()) { return null; } return new DebugScope(it.next(), it, debugger, info); }
@Override public DebugValue get(Object key) { if (!(key instanceof String)) { return null; } String name = (String) key; Object value = debugger.getEnv().getExportedSymbols().get(name); if (value == null) { return null; } return new DebugValue.HeapValue(DebuggerSession.this, name, value); } };
@Override public SuspendedContext get() { return SuspendedContext.create(source.getContext(), debugger.getEnv()); } });
DebuggerExecutionLifecycle(DebuggerSession session) { this.session = session; this.lifecycleInstrumenter = session.getDebugger().getEnv().getInstrumenter(); }
/** * {@inheritDoc} * * @since 1.0 */ @Override public void printStackTrace() { printStackTrace(new PrintStream(session.getDebugger().getEnv().err())); }
@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 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; }
static boolean isEvalRootStackFrame(DebuggerSession session, FrameInstance instance) { CallTarget target = instance.getCallTarget(); RootNode root = null; if (target instanceof RootCallTarget) { root = ((RootCallTarget) target).getRootNode(); } if (root != null && session.getDebugger().getEnv().isEngineRoot(root)) { return true; } return false; }
static boolean isEvalRootStackFrame(DebuggerSession session, FrameInstance instance) { CallTarget target = instance.getCallTarget(); RootNode root = null; if (target instanceof RootCallTarget) { root = ((RootCallTarget) target).getRootNode(); } if (root != null && session.getDebugger().getEnv().isEngineRoot(root)) { return true; } return false; }
@Override boolean step(DebuggerSession steppingSession, EventContext context, SuspendAnchor suspendAnchor) { boolean hit = current.step(steppingSession, context, suspendAnchor); if (hit) { if (current == last) { return true; } else { current = current.next; current.initialize(SuspendedContext.create(context, steppingSession.getDebugger().getEnv()), suspendAnchor); } } return false; }
/** * Get the original language that created the value, if any. This method will return * <code>null</code> for values representing a primitive value, or objects that are not * associated with any language. * * @return the language, or <code>null</code> when no language can be identified as the creator * of the value. * @throws DebugException when guest language code throws an exception * @since 0.27 */ public final LanguageInfo getOriginalLanguage() throws DebugException { if (!isReadable()) { return null; } Object obj = get(); if (obj == null) { return null; } return getDebugger().getEnv().findLanguage(obj); }
/** * Get the original language that created the value, if any. This method will return * <code>null</code> for values representing a primitive value, or objects that are not * associated with any language. * * @return the language, or <code>null</code> when no language can be identified as the creator * of the value. * @since 0.27 */ public final LanguageInfo getOriginalLanguage() { if (!isReadable()) { return null; } Object obj = get(); if (obj == null) { return null; } return getDebugger().getEnv().findLanguage(obj); }
@Override public void onExecute(ExecuteSourceEvent event) { if (sourceResolved[0]) { return; } sourceResolved[0] = true; synchronized (Breakpoint.this) { if (sourceBinding != null) { sourceBinding.dispose(); } } Source source = event.getSource(); SourceSection location = locationKey.adjustLocation(source, debugger.getEnv(), suspendAnchor); if (location != null) { resolveBreakpoint(location); } SourceSectionFilter locationFilter = locationKey.createLocationFilter(source, suspendAnchor); breakpointBinding = createBinding(locationFilter); } }, true);
private static Object evalInContext(SuspendedEvent ev, Node node, MaterializedFrame frame, String code) { RootNode rootNode = node.getRootNode(); if (rootNode == null) { throw new IllegalArgumentException("Cannot evaluate in context using a node that is not yet adopated using a RootNode."); } LanguageInfo info = rootNode.getLanguageInfo(); if (info == null) { throw new IllegalArgumentException("Cannot evaluate in context using a without an associated TruffleLanguage."); } if (!info.isInteractive()) { throw new IllegalStateException("Can not evaluate in a non-interactive language."); } final Source source = Source.newBuilder(info.getId(), code, "eval in context").build(); ExecutableNode fragment = ev.getSession().getDebugger().getEnv().parseInline(source, node, frame); if (fragment != null) { ev.getInsertableNode().setParentOf(fragment); return fragment.execute(frame); } else { return Debugger.ACCESSOR.evalInContext(source, node, frame); } }
@Override public void onExecute(ExecuteSourceEvent event) { if (sourceResolved[0]) { return; } sourceResolved[0] = true; synchronized (Breakpoint.this) { if (sourceBinding != null) { sourceBinding.dispose(); } } Source source = event.getSource(); SourceSection location = locationKey.adjustLocation(source, debugger.getEnv(), suspendAnchor); if (location != null) { resolveBreakpoint(location); } SourceSectionFilter locationFilter = locationKey.createLocationFilter(source, suspendAnchor); breakpointBinding = debugger.getInstrumenter().attachExecutionEventFactory(locationFilter, new BreakpointNodeFactory()); } }, true);