diff agent/src/share/classes/sun/jvm/hotspot/bugspot/RegisterPanel.java @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children c18cbe5936b8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/agent/src/share/classes/sun/jvm/hotspot/bugspot/RegisterPanel.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2001 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package sun.jvm.hotspot.bugspot;
+
+import java.awt.*;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.table.*;
+
+import sun.jvm.hotspot.debugger.*;
+
+/** Displays registers in a window. FIXME: this will need more work to
+    understand and handle register windows. */
+
+public class RegisterPanel extends JPanel {
+  private java.util.List/*<RegisterInfo>*/ registers;
+  private AbstractTableModel dataModel;
+  private boolean valid;
+  private boolean editable;
+  private String nullAddressString;
+  private ThreadProxy curThread;
+  private JTable table;
+
+  static class RegisterInfo {
+    private String name;
+    private Address value;
+
+    RegisterInfo(String name, Address value) {
+      this.name = name;
+      this.value = value;
+    }
+
+    String  getName()  { return name;  }
+    Address getValue() { return value; }
+  }
+
+  public RegisterPanel() {
+    super();
+
+    registers = new ArrayList();
+
+    dataModel = new AbstractTableModel() {
+        public int getColumnCount() { return 2; }
+        public int getRowCount()    { return registers.size(); }
+        public String getColumnName(int col) {
+          switch (col) {
+          case 0:
+            return "Register Name";
+          case 1:
+            return "Register Value";
+          default:
+            throw new RuntimeException("Index " + col + " out of bounds");
+          }
+        }
+        public Object getValueAt(int row, int col) {
+          RegisterInfo info = (RegisterInfo) registers.get(row);
+
+          switch (col) {
+          case 0:
+            return info.getName();
+          case 1:
+            if (valid) {
+              Address val = info.getValue();
+              if (val != null) {
+                return val;
+              } else {
+                return nullAddressString;
+              }
+            } else {
+              return "-";
+            }
+          default:
+            throw new RuntimeException("Index (" + col + ", " + row + ") out of bounds");
+          }
+        }
+        public boolean isCellEditable(int row, int col) {
+          if (col == 0) return false;
+          if (!valid) return false;
+          if (curThread == null) return false;
+          if (!curThread.canSetContext()) return false;
+
+          // FIXME: add listener to watch for register changes
+          //          return true;
+          return false;
+        }
+      };
+
+    // Build user interface
+    setLayout(new BorderLayout());
+    table = new JTable(dataModel);
+    table.setCellSelectionEnabled(true);
+    table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
+    table.setDragEnabled(true);
+    JTableHeader header = table.getTableHeader();
+    header.setReorderingAllowed(false);
+    JScrollPane scrollPane = new JScrollPane(table);
+    add(scrollPane, BorderLayout.CENTER);
+  }
+
+
+  /** Updates the register panel with the register set from the
+      specified thread. Call this when the process has been suspended
+      and the current thread has been set. FIXME: this interface will
+      need to change to support register windows. */
+  public void update(ThreadProxy curThread) {
+    this.curThread = curThread;
+    ThreadContext context = curThread.getContext();
+    editable = curThread.canSetContext();
+    registers.clear();
+    for (int i = 0; i < context.getNumRegisters(); i++) {
+      String name = context.getRegisterName(i);
+      Address addr = context.getRegisterAsAddress(i);
+      if ((nullAddressString == null) && (addr != null)) {
+        String addrStr = addr.toString();
+        StringBuffer buf = new StringBuffer();
+        buf.append("0x");
+        int len = addrStr.length() - 2;
+        for (int j = 0; j < len; j++) {
+          buf.append("0");
+        }
+        nullAddressString = buf.toString();
+      }
+      registers.add(new RegisterInfo(name, addr));
+    }
+    valid = true;
+    SwingUtilities.invokeLater(new Runnable() {
+        public void run() {
+          dataModel.fireTableDataChanged();
+        }
+      });
+  }
+
+  /** Clears the registers' values. Call this when the processs has
+      been resumed. */
+  public void clear() {
+    valid = false;
+    nullAddressString = null;
+    SwingUtilities.invokeLater(new Runnable() {
+        public void run() {
+          dataModel.fireTableDataChanged();
+        }
+      });
+  }
+
+  public void setFont(Font font) {
+    super.setFont(font);
+    if (table != null) {
+      table.setFont(font);
+    }
+  }
+}