Hi, This is a new patch. It adds getSymbol(task, name) method to SymbolFactory. The BreakpointManager and FunctionBreakpoint are changed to use this method instead of using the one defined by themselves. Any suggestions are welcomed. Pearly On Wed, 2007-09-12 at 08:33 -0500, PEARLY.ZHAO@oracle.com wrote: > Actually, retrieving symbol addresses in the classes implementing the disssembly and memory windows is a wrong way to implement this functionality. Maybe it should be designed at core. The classes handling the windows merely use it to obtain the information. > > Pearly > > > Hi, > > > > This patch can make the disassembly/memory window accept symbol > > name in > > spin Button. > > > > Here is what it does: > > - When input a available symbol name at fromBox, the window > > would > > display the disassembly/memory of this symbol. The fromBox/fromSpin > > would be set the start address of this symbol and the toBox/toSpin > > would > > be set the end address of this symbol. > > - When input a available symbol name at toBox, it would do as > > same as > > when input at fromBox. > > - When input a unavailable symbol name, the fromBox/fromSpin > > or > > toBox/toSpin would be reset to the lastKnownFrom or lastKnownTo. > > > > Any suggestions are welcomed. > > > > Pearly Zhao > > > > --------Index: disassembler/DisassemblyWindow.java > > =================================================================== > > RCS file: /cvs/frysk/frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java,v > > retrieving revision 1.31 > > diff -u -r1.31 DisassemblyWindow.java > > --- disassembler/DisassemblyWindow.java 7 Sep 2007 03:18:50 > > -0000 1.31 > > +++ disassembler/DisassemblyWindow.java 12 Sep 2007 07:43:28 > > -0000 > > @@ -42,6 +42,7 @@ > > package frysk.gui.disassembler; > > > > import java.util.prefs.Preferences; > > +import java.util.LinkedList; > > import java.util.List; > > import java.util.Iterator; > > import java.util.ListIterator; > > @@ -74,6 +75,7 @@ > > import org.gnu.gtk.event.SpinEvent; > > import org.gnu.gtk.event.SpinListener; > > > > +import frysk.dwfl.DwflCache; > > import frysk.gui.common.IconManager; > > import frysk.gui.prefs.PreferenceManager; > > import frysk.gui.monitor.Saveable; > > @@ -81,7 +83,12 @@ > > import frysk.proc.Task; > > import frysk.stepping.TaskStepEngine; > > import frysk.proc.MemoryMap; > > +import frysk.symtab.Symbol; > > +import frysk.symtab.SymbolFactory; > > > > +import lib.dwfl.Dwfl; > > +import lib.dwfl.DwflModule; > > +import lib.dwfl.SymbolBuilder; > > import lib.opcodes.Disassembler; > > import lib.opcodes.Instruction; > > > > @@ -379,28 +386,42 @@ > > return; > > > > String str = fromBox.getText(); > > - str = str.substring(2); > > - try > > + > > + if (str.startsWith("0x")) > > { > > - double d = (double) Long.parseLong(str, 16); > > - if (!addressAccessible((long)d)) > > - fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > - else > > - { > > - if (d > lastKnownTo) > > + str = str.substring(2); > > + try > > + { > > + double d = (double) Long.parseLong(str, > > 16); > > + if (!addressAccessible((long)d)) > > + fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > + else > > { > > - if (lastKnownTo == lastKnownFrom) > > - handleFromSpin(lastKnownTo); > > + if (d > lastKnownTo) > > + { > > + if (lastKnownTo == lastKnownFrom) > > + handleFromSpin(lastKnownTo); > > + else > > + fromSpin.setValue(lastKnownTo); > > + } > > else > > - fromSpin.setValue(lastKnownTo); > > + fromSpin.setValue(d); > > } > > - else > > - fromSpin.setValue(d); > > - } > > + } > > + catch (NumberFormatException nfe) > > + { > > + fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > + } > > } > > - catch (NumberFormatException nfe) > > - { > > - fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > + else > > + { > > + try > > + { > > + handleSymbol(str); > > + } > > + catch (RuntimeException e){ > > + fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > + } > > } > > } > > } > > @@ -416,28 +437,41 @@ > > return; > > > > String str = toBox.getText(); > > - str = str.substring(2); > > - try > > + if (str.startsWith("0x")) > > { > > - double d = (double) Long.parseLong(str, 16); > > - if (!(addressAccessible((long)d))) > > - toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > - else > > - { > > - if (d < lastKnownFrom) > > + str = str.substring(2); > > + try > > + { > > + double d = (double) Long.parseLong(str, > > 16); > > + if (!(addressAccessible((long)d))) > > + toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > + else > > { > > - if (lastKnownFrom == lastKnownTo) > > - handleToSpin(lastKnownFrom); > > + if (d < lastKnownFrom) > > + { > > + if (lastKnownFrom == lastKnownTo) > > + handleToSpin(lastKnownFrom); > > + else > > + toSpin.setValue(lastKnownFrom); > > + } > > else > > - toSpin.setValue(lastKnownFrom); > > + toSpin.setValue(d); > > } > > - else > > - toSpin.setValue(d); > > - } > > + } > > + catch (NumberFormatException nfe) > > + { > > + toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > + } > > } > > - catch (NumberFormatException nfe) > > - { > > - toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > + else > > + { > > + try > > + { > > + handleSymbol(str); > > + } > > + catch (RuntimeException e){ > > + toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > + } > > } > > } > > } > > @@ -539,6 +573,32 @@ > > } > > this.refreshList(); > > } > > + > > + /** > > + * Get the address list from symbol name; > > + * @param name > > + * @return address list > > + */ > > + private LinkedList addressesForSymbol(String name) { > > + Dwfl dwfl = DwflCache.getDwfl(this.myTask); > > + DwflModule[] modules = dwfl.getModules(); > > + final LinkedList addrs = new LinkedList(); > > + SymbolBuilder builder = new SymbolBuilder() { > > + public void symbol(String name, long value, long size, > > + int type, int bind, int visibility) { > > + addrs.add(new Long(value)); > > + } > > + }; > > + for (int i = 0; i < modules.length; i++) > > + { > > + DwflModule module = modules[i]; > > + module.getSymbolByName(name, builder); > > + } > > + if (addrs.size() == 0) > > + throw new RuntimeException("Couldn't find symbol " + > > name); > > + else > > + return addrs; > > + } > > /** > > * return a boolean indicating whether or not this address > > is accessible. > > * > > @@ -640,16 +700,17 @@ > > * By default append rows to the end. > > * > > * @param i The address to be displayed > > + * @param numIns The Instructions that maybe be added > > * @param iter The TreeIter representing the row to be > > added. > > */ > > - public synchronized void rowAppend (long i, TreeIter iter) > > + public synchronized void rowAppend (long i, int numIns, > > TreeIter iter) > > { > > // if (iter == null) > > // iter = model.appendRow(); > > > > List instructionsList > > = diss.disassembleInstructions((long) this.lastKnownTo, > > - numInstructions); > > + numInstructions+numIns); > > Iterator li = instructionsList.listIterator(0); > > Instruction ins = (Instruction) li.next(); > > > > @@ -661,8 +722,10 @@ > > this.lastPath.next(); > > if (ins != null) > > { > > - if (li.hasNext()) > > + if (li.hasNext()){ > > ins = (Instruction) li.next(); > > + this.numInstructions++; > > + } > > else > > { > > this.toSpin.setValue((double) ins.address); > > @@ -858,10 +921,11 @@ > > > > if (val > this.lastKnownTo) > > { > > - for (long i = (long) lastKnownTo + 1; i < val + 1; > > i++) > > - ++this.numInstructions; > > + int numIns = 0; > > + for (long i = (long) lastKnownTo + 1; i < val + 1; i++) > > + ++numIns; > > > > - rowAppend((long) val, null); > > + rowAppend((long) val, numIns, null); > > > > return; > > } > > @@ -895,6 +959,48 @@ > > refreshList(); > > } > > } > > + > > + /** > > + * When the box is inputed a symbol, update the displayed > > information to the symbol. > > + * @param symbolName > > + */ > > + private synchronized void handleSymbol(String symbolName) > > + { > > + LinkedList addressList = addressesForSymbol(symbolName); > > + long startAddress = ((Long)addressList.getFirst()).longValue(); > > + Symbol symbol = SymbolFactory.getSymbol(this.myTask, > > startAddress); > > + long endAddress = symbol.getAddress() + symbol.getSize(); > > + > > + List instructionsList > > + = diss.disassembleInstructionsStartEnd((long)startAddress, > > (long)endAddress); > > + Iterator li = instructionsList.listIterator(0); > > + int insnum = 1; > > + Instruction ins = (Instruction)li.next(); > > + this.lastKnownFrom = (double)ins.address; > > + while (li.hasNext()){ > > + ins = (Instruction)li.next(); > > + insnum++; > > + } > > + this.lastKnownTo = (double)ins.address; > > + > > + TreeIter iter = this.model.getFirstIter(); > > + while (insnum < numInstructions) > > + { > > + this.model.removeRow(iter); > > + this.lastPath.previous(); > > + numInstructions--; > > + } > > + while(insnum > numInstructions) > > + { > > + this.model.appendRow(); > > + this.lastPath.next(); > > + numInstructions++; > > + } > > + > > + refreshList(); > > + fromBox.setText("0x" + Long.toHexString((long)lastKnownFrom)); > > + fromSpin.setValue(lastKnownFrom); > > + } > > > > /**************************************************************************** > > * Save and Load > > Index: memory/MemoryWindow.java > > =================================================================== > > RCS file: /cvs/frysk/frysk-gui/frysk/gui/memory/MemoryWindow.java,v > > retrieving revision 1.46 > > diff -u -r1.46 MemoryWindow.java > > --- memory/MemoryWindow.java 7 Sep 2007 03:18:50 -0000 1.46 > > +++ memory/MemoryWindow.java 12 Sep 2007 07:43:29 -0000 > > @@ -42,6 +42,7 @@ > > package frysk.gui.memory; > > > > import java.util.prefs.Preferences; > > +import java.util.LinkedList; > > import java.util.List; > > import java.util.Iterator; > > import java.util.Observable; > > @@ -78,6 +79,7 @@ > > import org.gnu.gtk.event.SpinEvent; > > import org.gnu.gtk.event.SpinListener; > > > > +import frysk.dwfl.DwflCache; > > import frysk.gui.common.IconManager; > > import frysk.gui.prefs.PreferenceManager; > > import frysk.gui.monitor.GuiObject; > > @@ -87,8 +89,13 @@ > > import frysk.proc.Proc; > > import frysk.proc.Task; > > import frysk.stepping.TaskStepEngine; > > +import frysk.symtab.Symbol; > > +import frysk.symtab.SymbolFactory; > > import frysk.proc.MemoryMap; > > > > +import lib.dwfl.Dwfl; > > +import lib.dwfl.DwflModule; > > +import lib.dwfl.SymbolBuilder; > > import lib.opcodes.Disassembler; > > import lib.opcodes.Instruction; > > > > @@ -511,28 +518,41 @@ > > return; > > > > String str = fromBox.getText(); > > - str = str.substring(2); > > - try > > + if (str.startsWith("0x")) > > { > > - double d = (double) Long.parseLong(str, 16); > > - if (!addressAccessible((long)d)) > > - fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > - else > > - { > > - if (d > lastKnownTo) > > + str = str.substring(2); > > + try > > + { > > + double d = (double) Long.parseLong(str, > > 16); > > + if (!addressAccessible((long)d)) > > + fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > + else > > { > > - if (lastKnownTo == lastKnownFrom) > > - handleFromSpin(lastKnownTo); > > + if (d > lastKnownTo) > > + { > > + if (lastKnownTo == lastKnownFrom) > > + handleFromSpin(lastKnownTo); > > + else > > + fromSpin.setValue(lastKnownTo); > > + } > > else > > - fromSpin.setValue(lastKnownTo); > > > > + fromSpin.setValue(d); > > } > > - else > > - fromSpin.setValue(d); > > - } > > + } > > + catch (NumberFormatException nfe) > > + { > > + fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > + } > > } > > - catch (NumberFormatException nfe) > > - { > > - fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > + else > > + { > > + try > > + { > > + handleSymbol(str); > > + } > > + catch (RuntimeException e){ > > + fromBox.setText("0x" + Long.toHexString((long) > > lastKnownFrom)); > > + } > > } > > } > > } > > @@ -548,23 +568,41 @@ > > return; > > > > String str = toBox.getText(); > > - str = str.substring(2); > > - try > > + if (str.startsWith("0x")) > > { > > - double d = (double) Long.parseLong(str, 16); > > - if (d < lastKnownFrom) > > - { > > - if (lastKnownFrom == lastKnownTo) > > - handleToSpin(lastKnownFrom); > > - else > > - toSpin.setValue(lastKnownFrom); > > - } > > - else > > - toSpin.setValue(d); > > + str = str.substring(2); > > + try > > + { > > + double d = (double) Long.parseLong(str, > > 16); > > + if (!(addressAccessible((long)d))) > > + toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > + else > > + { > > + if (d < lastKnownFrom) > > + { > > + if (lastKnownFrom == lastKnownTo) > > + handleToSpin(lastKnownFrom); > > + else > > + toSpin.setValue(lastKnownFrom); > > + } > > + else > > + toSpin.setValue(d); > > + } > > + } > > + catch (NumberFormatException nfe) > > + { > > + toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > + } > > } > > - catch (NumberFormatException nfe) > > - { > > - toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > + else > > + { > > + try > > + { > > + handleSymbol(str); > > + } > > + catch (RuntimeException e){ > > + toBox.setText("0x" + Long.toHexString((long) > > lastKnownTo)); > > + } > > } > > } > > } > > @@ -573,6 +611,32 @@ > > } > > > > /** > > + * Get the address list from symbol name; > > + * @param name > > + * @return address list > > + */ > > + private LinkedList addressesForSymbol(String name) { > > + Dwfl dwfl = DwflCache.getDwfl(this.myTask); > > + DwflModule[] modules = dwfl.getModules(); > > + final LinkedList addrs = new LinkedList(); > > + SymbolBuilder builder = new SymbolBuilder() { > > + public void symbol(String name, long value, long size, > > + int type, int bind, int visibility) { > > + addrs.add(new Long(value)); > > + } > > + }; > > + for (int i = 0; i < modules.length; i++) > > + { > > + DwflModule module = modules[i]; > > + module.getSymbolByName(name, builder); > > + } > > + if (addrs.size() == 0) > > + throw new RuntimeException("Couldn't find symbol " + > > name); > > + else > > + return addrs; > > + } > > + > > + /** > > * return a boolean indicating whether or not this address > > is accessible. > > * > > * @return whether or not this address is accessible > > @@ -612,6 +676,7 @@ > > this.refreshLock = false; > > } > > > > + > > /***************************************************************************** > > * Calculation, memory reading, and information display > > methods > > ****************************************************************************/ > > @@ -1011,6 +1076,47 @@ > > this.lastKnownTo = val; > > refreshList(); > > } > > + > > + /** > > + * When the box is inputed a symbol, update the displayed > > information to the symbol. > > + * @param symbolName > > + */ > > + private synchronized void handleSymbol(String symbolName) > > + { > > + LinkedList addressList = addressesForSymbol(symbolName); > > + long startAddress = ((Long)addressList.getFirst()).longValue(); > > + Symbol symbol = SymbolFactory.getSymbol(this.myTask, > > startAddress); > > + long endAddress = symbol.getAddress() + symbol.getSize(); > > + long size = endAddress - startAddress + 1; > > + long modelSize = (long)lastKnownTo - (long)lastKnownFrom > > + 1; > > + TreeIter iter = this.model.getFirstIter(); > > + while (size < modelSize) > > + { > > + this.model.removeRow(iter); > > + this.lastPath.previous(); > > + modelSize--; > > + } > > + while(size > modelSize) > > + { > > + this.model.appendRow(); > > + this.lastPath.next(); > > + modelSize++; > > + } > > + this.lastKnownFrom = (double)startAddress; > > + this.lastKnownTo = (double)endAddress; > > + iter = this.model.getFirstIter(); > > + this.lastPath = iter.getPath(); > > + for(long i= startAddress; i < endAddress+1; i++) > > + { > > + rowAppend(i, iter); > > + iter = iter.getNextIter(); > > + } > > + refreshList(); > > + fromBox.setText("0x" + Long.toHexString((long)lastKnownFrom)); > > + fromSpin.setValue(lastKnownFrom); > > + toBox.setText("0x" + Long.toHexString((long)lastKnownTo)); > > + toSpin.setValue(lastKnownTo); > > + } > > > > /**************************************************************************** > > * Save and Load > > >