mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 09:46:02 +02:00
DSF - Added support for arrays in PDA example.
This commit is contained in:
parent
76b231ca15
commit
4d02730830
3 changed files with 87 additions and 5 deletions
|
@ -197,9 +197,55 @@ public class PDAVirtualMachine {
|
||||||
fPC = pc;
|
fPC = pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int parseArrayParam(String name) {
|
||||||
|
int lb = name.indexOf('[');
|
||||||
|
int rb = name.indexOf(']', lb);
|
||||||
|
if (rb < 0) return -1;
|
||||||
|
String paramStr = name.substring(lb + 1, rb);
|
||||||
|
if (paramStr.length() == 0) return -1;
|
||||||
|
|
||||||
|
try {
|
||||||
|
return Integer.parseInt(name.substring(lb + 1, rb));
|
||||||
|
} catch (NumberFormatException e) {} // Not a number
|
||||||
|
|
||||||
|
Object paramVar = fLocalVariables.get(paramStr);
|
||||||
|
if (paramVar instanceof Integer) {
|
||||||
|
return (Integer)paramVar;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void declare(String name) {
|
||||||
|
Object value = Integer.valueOf(0);
|
||||||
|
if (name.startsWith("$")) {
|
||||||
|
setRegisterValue(name, value);
|
||||||
|
} else if (name.indexOf('[') >= 0) {
|
||||||
|
int size = parseArrayParam(name);
|
||||||
|
if (size >= 0) {
|
||||||
|
String arrayName = name.substring(0, name.indexOf('['));
|
||||||
|
Object[] array = new Object[size];
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
array[i] = value;
|
||||||
|
}
|
||||||
|
fLocalVariables.put(arrayName, array);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fLocalVariables.put(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void set(String name, Object value) {
|
void set(String name, Object value) {
|
||||||
if (name.startsWith("$")) {
|
if (name.startsWith("$")) {
|
||||||
setRegisterValue(name, value);
|
setRegisterValue(name, value);
|
||||||
|
} else if (name.indexOf('[') >= 0) {
|
||||||
|
int index = parseArrayParam(name);
|
||||||
|
if (index >=0) {
|
||||||
|
String arrayName = name.substring(0, name.indexOf('['));
|
||||||
|
Object array = fLocalVariables.get(arrayName);
|
||||||
|
if (array instanceof Object[] && ((Object[])array).length > index) {
|
||||||
|
((Object[])array)[index] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fLocalVariables.put(name, value);
|
fLocalVariables.put(name, value);
|
||||||
}
|
}
|
||||||
|
@ -208,6 +254,16 @@ public class PDAVirtualMachine {
|
||||||
Object get(String name) {
|
Object get(String name) {
|
||||||
if (name.startsWith("$")) {
|
if (name.startsWith("$")) {
|
||||||
return getRegisterValue(name);
|
return getRegisterValue(name);
|
||||||
|
} else if (name.indexOf('[') >= 0) {
|
||||||
|
int index = parseArrayParam(name);
|
||||||
|
if (index >= 0) {
|
||||||
|
String arrayName = name.substring(0, name.indexOf('['));
|
||||||
|
Object array = fLocalVariables.get(arrayName);
|
||||||
|
if (array instanceof Object[] && ((Object[])array).length > index) {
|
||||||
|
return ((Object[])array)[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
} else {
|
} else {
|
||||||
return fLocalVariables.get(name);
|
return fLocalVariables.get(name);
|
||||||
}
|
}
|
||||||
|
@ -716,6 +772,14 @@ public class PDAVirtualMachine {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object value = frame.fLocalVariables.get(var);
|
||||||
|
if (value instanceof Object[]) {
|
||||||
|
int size = ((Object[])value).length;
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
children.add(var + "[" + Integer.toString(i) + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StringBuffer result = new StringBuffer();
|
StringBuffer result = new StringBuffer();
|
||||||
for (String child : children) {
|
for (String child : children) {
|
||||||
result.append(child);
|
result.append(child);
|
||||||
|
@ -1032,11 +1096,13 @@ public class PDAVirtualMachine {
|
||||||
buf.append('|');
|
buf.append('|');
|
||||||
buf.append(frame.fFunction);
|
buf.append(frame.fFunction);
|
||||||
for (String var : frame.fLocalVariables.keySet()) {
|
for (String var : frame.fLocalVariables.keySet()) {
|
||||||
if (var.indexOf('.') == -1) {
|
if (var.indexOf('.') >= 0) continue;
|
||||||
|
if (var.indexOf('[') >= 0) {
|
||||||
|
var = var.substring(0, var.indexOf('['));
|
||||||
|
}
|
||||||
buf.append('|');
|
buf.append('|');
|
||||||
buf.append(var);
|
buf.append(var);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1153,6 +1219,8 @@ public class PDAVirtualMachine {
|
||||||
Object val = frame.get(var);
|
Object val = frame.get(var);
|
||||||
if (val == null) {
|
if (val == null) {
|
||||||
sendCommandResponse("error: variable undefined\n");
|
sendCommandResponse("error: variable undefined\n");
|
||||||
|
} else if (val instanceof Object[]) {
|
||||||
|
sendCommandResponse("[" + Integer.toString(((Object[])val).length) + "]" + "\n");
|
||||||
} else {
|
} else {
|
||||||
sendCommandResponse(val.toString() + "\n");
|
sendCommandResponse(val.toString() + "\n");
|
||||||
}
|
}
|
||||||
|
@ -1362,7 +1430,7 @@ public class PDAVirtualMachine {
|
||||||
|
|
||||||
void iVar(PDAThread thread, Args args) {
|
void iVar(PDAThread thread, Args args) {
|
||||||
String var = args.getNextStringArg();
|
String var = args.getNextStringArg();
|
||||||
thread.fCurrentFrame.set(var, 0);
|
thread.fCurrentFrame.declare(var);
|
||||||
}
|
}
|
||||||
|
|
||||||
void iInternalEndEval(PDAThread thread, Args args) {
|
void iInternalEndEval(PDAThread thread, Args args) {
|
||||||
|
|
14
dsf/org.eclipse.cdt.examples.dsf.pda/samples/arrays.pda
Normal file
14
dsf/org.eclipse.cdt.examples.dsf.pda/samples/arrays.pda
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
var a[10000]
|
||||||
|
var i
|
||||||
|
push 10000
|
||||||
|
pop $i
|
||||||
|
:start
|
||||||
|
push $i
|
||||||
|
dec
|
||||||
|
pop $i
|
||||||
|
push $i
|
||||||
|
pop $a[i]
|
||||||
|
push $i
|
||||||
|
branch_not_zero start
|
||||||
|
halt
|
||||||
|
|
|
@ -316,7 +316,7 @@ public class PDAExpressions extends AbstractDsfService implements ICachingServic
|
||||||
int end = lengthArg > 0 ? (start + lengthArg) : getData().fValues.length;
|
int end = lengthArg > 0 ? (start + lengthArg) : getData().fValues.length;
|
||||||
IExpressionDMContext[] contexts = new IExpressionDMContext[end - start];
|
IExpressionDMContext[] contexts = new IExpressionDMContext[end - start];
|
||||||
for (int i = start; i < end && i < getData().fValues.length; i++) {
|
for (int i = start; i < end && i < getData().fValues.length; i++) {
|
||||||
contexts[i] = new ExpressionDMContext(
|
contexts[i - start] = new ExpressionDMContext(
|
||||||
getSession().getId(), frameCtx, getData().fValues[i]);
|
getSession().getId(), frameCtx, getData().fValues[i]);
|
||||||
}
|
}
|
||||||
rm.setData(contexts);
|
rm.setData(contexts);
|
||||||
|
|
Loading…
Add table
Reference in a new issue