From 730d211888c6f4b6ad4cf27ac6fae7de651b2839 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Thu, 18 Feb 2010 11:44:02 +0000 Subject: [PATCH] [302348] [dis] Expression support in DSF Disassembly view is too limited --- .../ui/disassembly/DisassemblyBackendDsf.java | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java index 5debefba91e..af35f3387e9 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java @@ -39,6 +39,7 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl; import org.eclipse.cdt.dsf.debug.service.ISourceLookup; import org.eclipse.cdt.dsf.debug.service.IStack; import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext; +import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMAddress; import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData; @@ -822,27 +823,45 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL if (expressions == null) { return; } - IExpressionDMContext exprDmc= expressions.createExpression(fTargetContext, '&'+symbol); - final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT); - expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor(executor, null) { + final IExpressionDMContext exprDmc= expressions.createExpression(fTargetContext, symbol); + // first, try to get l-value address + expressions.getExpressionAddressData(exprDmc, new DataRequestMonitor(executor, null) { @Override protected void handleSuccess() { - FormattedValueDMData data= getData(); - final String value= data.getFormattedValue(); - final BigInteger address= DisassemblyUtils.decodeAddress(value); + IExpressionDMAddress data = getData(); + final IAddress address = data.getAddress(); if (address != null) { fCallback.asyncExec(new Runnable() { public void run() { - fCallback.gotoAddress(address); + fCallback.gotoAddress(address.getValue()); }}); } } @Override protected void handleError() { - fCallback.asyncExec(new Runnable() { - public void run() { - ErrorDialog.openError(fCallback.getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$ - }}); + // not an l-value, evaluate expression + final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT); + expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor(executor, null) { + @Override + protected void handleSuccess() { + FormattedValueDMData data= getData(); + final String value= data.getFormattedValue(); + final BigInteger address= DisassemblyUtils.decodeAddress(value); + if (address != null) { + fCallback.asyncExec(new Runnable() { + public void run() { + fCallback.gotoAddress(address); + }}); + } + } + @Override + protected void handleError() { + fCallback.asyncExec(new Runnable() { + public void run() { + ErrorDialog.openError(fCallback.getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$ + }}); + } + }); } }); }});