Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenRegisters.java')
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenRegisters.java87
1 files changed, 87 insertions, 0 deletions
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenRegisters.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenRegisters.java
new file mode 100644
index 000000000..86dc0a30c
--- /dev/null
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenRegisters.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tm.internal.tcf.debug.ui.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.tm.tcf.protocol.IToken;
+import org.eclipse.tm.tcf.services.IRegisters;
+
+
+public class TCFChildrenRegisters extends TCFChildren {
+
+ TCFChildrenRegisters(TCFNode node) {
+ super(node, 128);
+ }
+
+ void onSuspended() {
+ for (TCFNode n : getNodes()) ((TCFNodeRegister)n).onSuspended();
+ }
+
+ void onParentValueChanged() {
+ for (TCFNode n : getNodes()) ((TCFNodeRegister)n).onParentValueChanged();
+ }
+
+ void onRegistersChanged() {
+ for (TCFNode n : getNodes()) ((TCFNodeRegister)n).onRegistersChanged();
+ reset();
+ }
+
+ @Override
+ void onNodeDisposed(String id) {
+ super.onNodeDisposed(id);
+ if (node instanceof TCFNodeExecContext) {
+ // CPU register nodes are special case:
+ // they have executable node as parent,
+ // but they are also referenced as children of stack frames
+ for (TCFNode n : ((TCFNodeExecContext)node).getStackTrace().getNodes()) {
+ ((TCFNodeStackFrame)n).getRegisters().onNodeDisposed(id);
+ }
+ }
+ }
+
+ @Override
+ protected boolean startDataRetrieval() {
+ IRegisters regs = node.model.getLaunch().getService(IRegisters.class);
+ if (regs == null) {
+ set(null, null, new HashMap<String,TCFNode>());
+ return true;
+ }
+ if (node instanceof TCFNodeStackFrame) {
+ TCFChildrenStackTrace stack_trace_cache = ((TCFNodeExecContext)node.parent).getStackTrace();
+ if (!stack_trace_cache.validate(this)) return false; // node.getFrameNo() is not valid
+ final int frame_no = ((TCFNodeStackFrame)node).getFrameNo();
+ if (frame_no < 0) {
+ set(null, null, new HashMap<String,TCFNode>());
+ return true;
+ }
+ }
+ assert command == null;
+ command = regs.getChildren(node.id, new IRegisters.DoneGetChildren() {
+ public void doneGetChildren(IToken token, Exception error, String[] contexts) {
+ Map<String,TCFNode> data = null;
+ if (command == token && error == null) {
+ int index = 0;
+ data = new HashMap<String,TCFNode>();
+ for (String id : contexts) {
+ TCFNodeRegister n = (TCFNodeRegister)node.model.getNode(id);
+ if (n == null) n = new TCFNodeRegister(node, id);
+ n.setIndex(index++);
+ data.put(id, n);
+ }
+ }
+ set(token, error, data);
+ }
+ });
+ return false;
+ }
+}

Back to the top