Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen Ryall2006-05-17 16:31:23 +0000
committerKen Ryall2006-05-17 16:31:23 +0000
commite99188230eb65f37a587624a9c442aca02a441a9 (patch)
tree76afa0a72f5f8caca627698aeae42c01408cf204 /debug/org.eclipse.cdt.debug.mi.core
parent9aacb5a271c6cabd8bae35d9c571156bdbd24566 (diff)
downloadorg.eclipse.cdt-e99188230eb65f37a587624a9c442aca02a441a9.tar.gz
org.eclipse.cdt-e99188230eb65f37a587624a9c442aca02a441a9.tar.xz
org.eclipse.cdt-e99188230eb65f37a587624a9c442aca02a441a9.zip
Bug 69522. Changes to accommodate Apple's gdb: Added gdb/mi command factory for Mac OS. Reviewed and applied Greg's patch that beefs up support for MI results containing tuples. Added one additional change in MIVarUpdateInfo. Debug sessions now startup and variables display correctly on Mac OS 10.4.6 with latest dev tools.
Ran before and after tests on Windows and saw no ill effects or changes in behavior for variable display.
Diffstat (limited to 'debug/org.eclipse.cdt.debug.mi.core')
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/macos/MacOSMIEnvironmentCD.java30
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/macos/StandardMacOSCommandFactory.java36
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIArg.java27
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIFrame.java2
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIParser.java25
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListArgumentsInfo.java14
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListLocalsInfo.java5
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MITuple.java16
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIVarUpdateInfo.java32
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/plugin.properties1
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/plugin.xml14
11 files changed, 183 insertions, 19 deletions
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/macos/MacOSMIEnvironmentCD.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/macos/MacOSMIEnvironmentCD.java
new file mode 100644
index 00000000000..b9905acb40b
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/macos/MacOSMIEnvironmentCD.java
@@ -0,0 +1,30 @@
+/**********************************************************************
+ * Copyright (c) 2006 Nokia 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:
+ * Nokia - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.debug.mi.core.command.factories.macos;
+
+import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentCD;
+
+public class MacOSMIEnvironmentCD extends MIEnvironmentCD {
+
+ public MacOSMIEnvironmentCD(String miVersion, String path) {
+ super(miVersion, path);
+ this.setOperation("cd");//$NON-NLS-1$
+ }
+
+ protected String parametersToString() {
+ String[] parameters = getParameters();
+ if (parameters != null && parameters.length == 1) {
+ return '"' + parameters[0] + '"';
+ }
+ return super.parametersToString();
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/macos/StandardMacOSCommandFactory.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/macos/StandardMacOSCommandFactory.java
new file mode 100644
index 00000000000..c4d3c6b0842
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/macos/StandardMacOSCommandFactory.java
@@ -0,0 +1,36 @@
+/**********************************************************************
+ * Copyright (c) 2006 Nokia 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:
+ * Nokia - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.debug.mi.core.command.factories.macos;
+
+import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentCD;
+import org.eclipse.cdt.debug.mi.core.command.factories.StandardCommandFactory;
+
+public class StandardMacOSCommandFactory extends StandardCommandFactory {
+
+ /**
+ * Constructor for StandardMacOSCommandFactory.
+ */
+ public StandardMacOSCommandFactory() {
+ super();
+ }
+
+ /**
+ * Constructor for StandardMacOSCommandFactory.
+ */
+ public StandardMacOSCommandFactory( String miVersion ) {
+ super( miVersion );
+ }
+
+ public MIEnvironmentCD createMIEnvironmentCD(String pathdir) {
+ return new MacOSMIEnvironmentCD(getMIVersion(), pathdir);
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIArg.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIArg.java
index d014125bc57..f6caa080784 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIArg.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIArg.java
@@ -65,6 +65,33 @@ public class MIArg {
/**
* Parsing a MITuple of the form:
+ * {{name="xxx",value="yyy"},{name="xxx",value="yyy"},..}
+ * {name="xxx",name="xxx",..}
+ * {{name="xxx"},{name="xxx"}}
+ */
+ public static MIArg[] getMIArgs(MITuple miTuple) {
+ List aList = new ArrayList();
+ MIValue[] values = miTuple.getMIValues();
+ for (int i = 0; i < values.length; i++) {
+ if (values[i] instanceof MITuple) {
+ MIArg arg = getMIArg((MITuple)values[i]);
+ if (arg != null) {
+ aList.add(arg);
+ }
+ }
+ }
+ MIResult[] results = miTuple.getMIResults();
+ for (int i = 0; i < results.length; i++) {
+ MIValue value = results[i].getMIValue();
+ if (value instanceof MIConst) {
+ String str = ((MIConst)value).getCString();
+ aList.add(new MIArg(str, "")); //$NON-NLS-1$
+ }
+ }
+ return ((MIArg[])aList.toArray(new MIArg[aList.size()]));
+ }
+ /**
+ * Parsing a MITuple of the form:
* {name="xxx",value="yyy"}
* {name="xxx"}
*/
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIFrame.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIFrame.java
index 69ed99344ad..0a0d71052a4 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIFrame.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIFrame.java
@@ -125,6 +125,8 @@ public class MIFrame {
} else if (var.equals("args")) { //$NON-NLS-1$
if (value instanceof MIList) {
args = MIArg.getMIArgs((MIList)value);
+ } else if (value instanceof MITuple) {
+ args = MIArg.getMIArgs((MITuple)value);
}
}
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIParser.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIParser.java
index 5f317ceb70b..b10ca591c9c 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIParser.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIParser.java
@@ -326,18 +326,31 @@ public class MIParser {
*/
private MIValue processMITuple(FSB buffer) {
MITuple tuple = new MITuple();
- MIResult[] results = null;
+ List valueList = new ArrayList();
+ List resultList = new ArrayList();
// Catch closing '}'
while (buffer.length() > 0 && buffer.charAt(0) != '}') {
- results = processMIResults(buffer);
+ // Try for the MIValue first
+ MIValue value = processMIValue(buffer);
+ if (value != null) {
+ valueList.add(value);
+ } else {
+ MIResult result = processMIResult(buffer);
+ if (result != null) {
+ resultList.add(result);
+ }
+ }
+ if (buffer.length() > 0 && buffer.charAt(0) == ',') {
+ buffer.deleteCharAt(0);
+ }
}
if (buffer.length() > 0 && buffer.charAt(0) == '}') {
buffer.deleteCharAt(0);
}
- if (results == null) {
- results = new MIResult[0];
- }
- tuple.setMIResults(results);
+ MIValue[] values = (MIValue[]) valueList.toArray(new MIValue[valueList.size()]);
+ MIResult[] res = (MIResult[]) resultList.toArray(new MIResult[resultList.size()]);
+ tuple.setMIValues(values);
+ tuple.setMIResults(res);
return tuple;
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListArgumentsInfo.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListArgumentsInfo.java
index ac3c21db5d6..bcc87e5270c 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListArgumentsInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListArgumentsInfo.java
@@ -46,6 +46,8 @@ public class MIStackListArgumentsInfo extends MIInfo {
MIValue val = results[i].getMIValue();
if (val instanceof MIList) {
parseStack((MIList)val, aList);
+ } else if (val instanceof MITuple) {
+ parseStack((MITuple)val, aList);
}
}
}
@@ -66,4 +68,16 @@ public class MIStackListArgumentsInfo extends MIInfo {
}
}
}
+ void parseStack(MITuple miTuple, List aList) {
+ MIResult[] results = miTuple.getMIResults();
+ for (int i = 0; i < results.length; i++) {
+ String var = results[i].getVariable();
+ if (var.equals("frame")) { //$NON-NLS-1$
+ MIValue value = results[i].getMIValue();
+ if (value instanceof MITuple) {
+ aList.add (new MIFrame((MITuple)value));
+ }
+ }
+ }
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListLocalsInfo.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListLocalsInfo.java
index d888061f8f4..e9f34b9ae44 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListLocalsInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIStackListLocalsInfo.java
@@ -17,6 +17,9 @@ package org.eclipse.cdt.debug.mi.core.output;
* GDB/MI stack list locals parsing.
* -stack-list-locals 1
* ^done,locals=[{name="p",value="0x8048600 \"ghislaine\""},{name="buf",value="\"'\", 'x' <repeats 24 times>, \"i,xxxxxxxxx\", 'a' <repeats 24 times>"},{name="buf2",value="\"\\\"?'\\\\()~\""},{name="buf3",value="\"alain\""},{name="buf4",value="\"\\t\\t\\n\\f\\r\""},{name="i",value="0"}]
+ *
+ * On MacOS X 10.4 this returns a tuple:
+ * ^done,locals={{name="p",value="0x8048600 \"ghislaine\""},{name="buf",value="\"'\", 'x' <repeats 24 times>, \"i,xxxxxxxxx\", 'a' <repeats 24 times>"},{name="buf2",value="\"\\\"?'\\\\()~\""},{name="buf3",value="\"alain\""},{name="buf4",value="\"\\t\\t\\n\\f\\r\""},{name="i",value="0"}}
*/
public class MIStackListLocalsInfo extends MIInfo {
@@ -46,6 +49,8 @@ public class MIStackListLocalsInfo extends MIInfo {
MIValue value = results[i].getMIValue();
if (value instanceof MIList) {
locals = MIArg.getMIArgs((MIList)value);
+ } else if (value instanceof MITuple) {
+ locals = MIArg.getMIArgs((MITuple)value);
}
}
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MITuple.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MITuple.java
index 7b90386caea..15bb034013c 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MITuple.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MITuple.java
@@ -16,7 +16,9 @@ package org.eclipse.cdt.debug.mi.core.output;
public class MITuple extends MIValue {
final static MIResult[] nullResults = new MIResult[0];
+ final static MIValue[] nullValues = new MIValue[0];
MIResult[] results = nullResults;
+ MIValue[] values = nullValues;
public MIResult[] getMIResults() {
return results;
@@ -26,6 +28,14 @@ public class MITuple extends MIValue {
results = res;
}
+ public MIValue[] getMIValues() {
+ return values;
+ }
+
+ public void setMIValues(MIValue[] vals) {
+ values = vals;
+ }
+
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append('{');
@@ -35,6 +45,12 @@ public class MITuple extends MIValue {
}
buffer.append(results[i].toString());
}
+ for (int i = 0; i < values.length; i++) {
+ if (i != 0) {
+ buffer.append(',');
+ }
+ buffer.append(values[i].toString());
+ }
buffer.append('}');
return buffer.toString();
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIVarUpdateInfo.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIVarUpdateInfo.java
index 66bf983cc5f..a7f2d65bdfb 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIVarUpdateInfo.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/output/MIVarUpdateInfo.java
@@ -76,21 +76,27 @@ public class MIVarUpdateInfo extends MIInfo {
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
MIValue value = results[i].getMIValue();
- String str = ""; //$NON-NLS-1$
- if (value instanceof MIConst) {
- str = ((MIConst)value).getString();
+ if (value instanceof MITuple) {
+ parseChangeList((MITuple)value, aList);
}
- if (var.equals("name")) { //$NON-NLS-1$
- change = new MIVarChange(str);
- aList.add(change);
- } else if (var.equals("in_scope")) { //$NON-NLS-1$
- if (change != null) {
- change.setInScope("true".equals(str)); //$NON-NLS-1$
- }
- } else if (var.equals("type_changed")) { //$NON-NLS-1$
- if (change != null) {
- change.setChanged("true".equals(str)); //$NON-NLS-1$
+ else
+ {
+ String str = ""; //$NON-NLS-1$
+ if (value instanceof MIConst) {
+ str = ((MIConst)value).getString();
}
+ if (var.equals("name")) { //$NON-NLS-1$
+ change = new MIVarChange(str);
+ aList.add(change);
+ } else if (var.equals("in_scope")) { //$NON-NLS-1$
+ if (change != null) {
+ change.setInScope("true".equals(str)); //$NON-NLS-1$
+ }
+ } else if (var.equals("type_changed")) { //$NON-NLS-1$
+ if (change != null) {
+ change.setChanged("true".equals(str)); //$NON-NLS-1$
+ }
+ }
}
}
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/plugin.properties b/debug/org.eclipse.cdt.debug.mi.core/plugin.properties
index 028c8d72d5e..3ce0d68d22e 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/plugin.properties
+++ b/debug/org.eclipse.cdt.debug.mi.core/plugin.properties
@@ -19,4 +19,5 @@ GDBMIDebugger.name=gdb/mi
StandardCommandFactory.name=Standard
StandardLinuxCommandFactory.name=Standard (Linux)
StandardWindowsCommandFactory.name=Standard (Windows)
+StandardMacOSCommandFactory.name=Standard (Mac OS)
CygWinCommandFactory.name=CygWin
diff --git a/debug/org.eclipse.cdt.debug.mi.core/plugin.xml b/debug/org.eclipse.cdt.debug.mi.core/plugin.xml
index 726e484115a..71d0be3bb76 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/plugin.xml
+++ b/debug/org.eclipse.cdt.debug.mi.core/plugin.xml
@@ -64,6 +64,13 @@
miVersions="mi,mi1,mi2"
name="%StandardLinuxCommandFactory.name"
platforms="linux"/>
+ <commandFactory
+ class="org.eclipse.cdt.debug.mi.core.command.factories.macos.StandardMacOSCommandFactory"
+ debuggerID="org.eclipse.cdt.debug.mi.core.CDebuggerNew"
+ id="org.eclipse.cdt.debug.mi.core.standardMacOSCommandFactory"
+ miVersions="mi,mi1,mi2"
+ name="%StandardMacOSCommandFactory.name"
+ platforms="macosx"/>
<commandFactory
class="org.eclipse.cdt.debug.mi.core.command.factories.StandardCommandFactory"
debuggerID="org.eclipse.cdt.debug.mi.core.GDBServerCDebugger"
@@ -92,6 +99,13 @@
miVersions="mi,mi1,mi2"
name="%StandardLinuxCommandFactory.name"
platforms="linux"/>
+ <commandFactory
+ class="org.eclipse.cdt.debug.mi.core.command.factories.macos.StandardMacOSCommandFactory"
+ debuggerID="org.eclipse.cdt.debug.mi.core.GDBServerCDebugger"
+ id="org.eclipse.cdt.debug.mi.core.standardMacOSCommandFactory"
+ miVersions="mi,mi1,mi2"
+ name="%StandardMacOSCommandFactory.name"
+ platforms="macosx"/>
</extension>
</plugin>

Back to the top