From 95a0a3e4a49c17a5465f15a975b526b8707df778 Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Wed, 2 Jun 2004 18:17:37 +0000 Subject: [PATCH] Fix for bug 65112: Debug Registers view is empty. --- debug/org.eclipse.cdt.debug.core/ChangeLog | 8 + .../debug/internal/core/CRegisterManager.java | 7 + .../internal/core/model/CDebugTarget.java | 3 +- .../debug/internal/core/model/CRegister.java | 13 +- .../internal/core/model/CRegisterGroup.java | 162 ++++++++---------- .../debug/internal/core/model/CVariable.java | 8 + 6 files changed, 108 insertions(+), 93 deletions(-) diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog index 0dfd608af9c..553f8551022 100644 --- a/debug/org.eclipse.cdt.debug.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.core/ChangeLog @@ -1,3 +1,11 @@ +2004-06-02 Mikhail Khodjaiants + Fix for bug 65112: Debug Registers view is empty. + * CRegisterManager.java + * CDebugTarget.java + * CRegister.java + * CRegisterGroup.java + * CVariable.java + 2004-05-28 Mikhail Khodjaiants Support for the "Skip All Breakpoints" action. * CBreakpointManager.java diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java index fab66bec753..e9e7ed78a79 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java @@ -148,4 +148,11 @@ public class CRegisterManager extends CUpdateManager implements ICRegisterManage } return null; } + + public void targetSuspended() { + Iterator it = fRegisterGroups.iterator(); + while( it.hasNext() ) { + ((CRegisterGroup)it.next()).targetSuspended(); + } + } } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java index c8e246fe6dc..1abcf487821 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java @@ -1320,6 +1320,8 @@ public class CDebugTarget extends CDebugElement ICDISessionObject reason = event.getReason(); setCurrentStateInfo( reason ); setRunningInfo( null ); + // Reset the registers that have errors. + getRegisterManager().targetSuspended(); setSuspensionThread(); List newThreads = refreshThreads(); if ( event.getSource() instanceof ICDITarget ) @@ -1365,7 +1367,6 @@ public class CDebugTarget extends CDebugElement { handleSuspendedBySolibEvent( (ICDISharedLibraryEvent)reason ); } - } /* private boolean handleInternalSuspendedEvent( ICDISuspendedEvent event ) diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java index 66a811eacd9..77587835347 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegister.java @@ -54,10 +54,15 @@ public class CRegister extends CGlobalVariable implements IRegister */ public boolean hasValueChanged() throws DebugException { - IValue value = getValue(); - if ( value != null ) - { - return ( value.hasVariables() ) ? false : fChanged; + try { + IValue value = getValue(); + if ( value != null ) + { + return ( value.hasVariables() ) ? false : fChanged; + } + } + catch( DebugException e ) { + // ignore to prevent logging. } return false; } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterGroup.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterGroup.java index 8e896567227..009d6351eac 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterGroup.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CRegisterGroup.java @@ -1,127 +1,113 @@ -/* - *(c) Copyright QNX Software Systems Ltd. 2002. - * All Rights Reserved. +/********************************************************************** + * Copyright (c) 2004 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html * - */ + * Contributors: + * QNX Software Systems - Initial API and implementation +***********************************************************************/ package org.eclipse.cdt.debug.internal.core.model; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.model.ICDIRegister; import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterObject; import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.model.IRegister; import org.eclipse.debug.core.model.IRegisterGroup; /** - * - * Enter type comment. - * - * @since Sep 16, 2002 + * Represents a group of registers of a debug target. */ -public class CRegisterGroup extends CDebugElement implements IRegisterGroup -{ +public class CRegisterGroup extends CDebugElement implements IRegisterGroup { + private String fName; + private ICDIRegisterObject[] fRegisterObjects; - private List fRegisters; + + private IRegister[] fRegisters; /** * Constructor for CRegisterGroup. - * @param target */ - public CRegisterGroup( CDebugTarget target, String name, ICDIRegisterObject[] regObjects ) - { + public CRegisterGroup( CDebugTarget target, String name, ICDIRegisterObject[] regObjects ) { super( target ); fName = name; fRegisterObjects = regObjects; - fRegisters = new ArrayList(); + fRegisters = new IRegister[regObjects.length]; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.debug.core.model.IRegisterGroup#getName() */ - public String getName() throws DebugException - { + public String getName() throws DebugException { return fName; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.debug.core.model.IRegisterGroup#getRegisters() */ - public IRegister[] getRegisters() throws DebugException - { - List list = getRegisters0(); - return (IRegister[])list.toArray( new IRegister[list.size()] ); - } - - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IRegisterGroup#hasRegisters() - */ - public boolean hasRegisters() throws DebugException - { - return fRegisterObjects.length > 0; - } - - private List getRegisters0() throws DebugException - { - if ( fRegisters == null || fRegisters.size() == 0 ) - { - ICDIRegister[] regs = getCDIRegisters(); - fRegisters = new ArrayList( regs.length ); - for ( int i = 0; i < regs.length; ++i ) - { - fRegisters.add( new CRegister( this, regs[i] ) ); + public IRegister[] getRegisters() throws DebugException { + for ( int i = 0; i < fRegisters.length; ++i ) { + if ( fRegisters[i] == null ) { + fRegisters[i] = new CRegister( this, getCDIRegister( fRegisterObjects[i] ) ); } } return fRegisters; } - - public void dispose() - { - Iterator it = fRegisters.iterator(); - while( it.hasNext() ) - { - ((CRegister)it.next()).dispose(); - } - fRegisters.clear(); + + /* + * (non-Javadoc) + * + * @see org.eclipse.debug.core.model.IRegisterGroup#hasRegisters() + */ + public boolean hasRegisters() throws DebugException { + return fRegisterObjects.length > 0; } - private ICDIRegister[] getCDIRegisters() throws DebugException - { - ICDIRegister[] results = new ICDIRegister[fRegisterObjects.length]; - for ( int i = 0; i < fRegisterObjects.length; ++i ) - { - try - { - results[i] = ((CDebugTarget)getDebugTarget()).getCDISession().getRegisterManager().createRegister( fRegisterObjects[i] ); + public void dispose() { + for ( int i = 0; i < fRegisters.length; ++i ) { + if ( fRegisters[i] != null ) { + ((CRegister)fRegisters[i]).dispose(); + fRegisters[i] = null; } - catch( CDIException e ) - { - results[i] = new CRegister.ErrorRegister( fRegisterObjects[i], e ); - } - } - return results; - } - - public void resetChangeFlags() - { - if ( fRegisters == null ) - return; - try - { - Iterator it = fRegisters.iterator(); - while( it.hasNext() ) - { - ((CVariable)it.next()).setChanged( false ); - } - } - catch( DebugException e ) - { - CDebugCorePlugin.log( e ); } } -} + + private ICDIRegister getCDIRegister( ICDIRegisterObject ro ) throws DebugException { + try { + return ((CDebugTarget)getDebugTarget()).getCDISession().getRegisterManager().createRegister( ro ); + } + catch( CDIException e ) { + return new CRegister.ErrorRegister( ro, e ); + } + } + + public void resetChangeFlags() { + for ( int i = 0; i < fRegisters.length; ++i ) { + if ( fRegisters[i] != null ) { + try { + ((CRegister)fRegisters[i]).setChanged( false ); + } + catch( DebugException e ) { + DebugPlugin.log( e ); + } + } + } + } + + public void targetSuspended() { + for ( int i = 0; i < fRegisters.length; ++i ) { + if ( fRegisters[i] != null && ((CRegister)fRegisters[i]).hasErrors() ) { + ((CRegister)fRegisters[i]).dispose(); + fRegisters[i] = null; + } + } + } +} \ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CVariable.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CVariable.java index 0ae7386dfc7..0eff2806ead 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CVariable.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CVariable.java @@ -307,6 +307,10 @@ public abstract class CVariable extends CDebugElement } return fQualifiedName; } + + public boolean hasErrors() { + return ( fCDIVariable instanceof ErrorVariable ); + } } /** @@ -1043,4 +1047,8 @@ public abstract class CVariable extends CDebugElement { return getInternalVariable().sizeof(); } + + public boolean hasErrors() { + return ( getShadow() != null ) ? getShadow().hasErrors() : fOriginal.hasErrors(); + } }