1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-05 08:46:02 +02:00

DSF - Added support for arrays in PDA example.

This commit is contained in:
Pawel Piech 2012-10-30 11:41:48 -07:00
parent 76b231ca15
commit 4d02730830
3 changed files with 87 additions and 5 deletions

View file

@ -197,9 +197,55 @@ public class PDAVirtualMachine {
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) {
if (name.startsWith("$")) {
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 {
fLocalVariables.put(name, value);
}
@ -208,6 +254,16 @@ public class PDAVirtualMachine {
Object get(String name) {
if (name.startsWith("$")) {
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 {
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();
for (String child : children) {
result.append(child);
@ -1032,10 +1096,12 @@ public class PDAVirtualMachine {
buf.append('|');
buf.append(frame.fFunction);
for (String var : frame.fLocalVariables.keySet()) {
if (var.indexOf('.') == -1) {
buf.append('|');
buf.append(var);
if (var.indexOf('.') >= 0) continue;
if (var.indexOf('[') >= 0) {
var = var.substring(0, var.indexOf('['));
}
buf.append('|');
buf.append(var);
}
return buf.toString();
}
@ -1153,6 +1219,8 @@ public class PDAVirtualMachine {
Object val = frame.get(var);
if (val == null) {
sendCommandResponse("error: variable undefined\n");
} else if (val instanceof Object[]) {
sendCommandResponse("[" + Integer.toString(((Object[])val).length) + "]" + "\n");
} else {
sendCommandResponse(val.toString() + "\n");
}
@ -1362,7 +1430,7 @@ public class PDAVirtualMachine {
void iVar(PDAThread thread, Args args) {
String var = args.getNextStringArg();
thread.fCurrentFrame.set(var, 0);
thread.fCurrentFrame.declare(var);
}
void iInternalEndEval(PDAThread thread, Args args) {

View 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

View file

@ -316,7 +316,7 @@ public class PDAExpressions extends AbstractDsfService implements ICachingServic
int end = lengthArg > 0 ? (start + lengthArg) : getData().fValues.length;
IExpressionDMContext[] contexts = new IExpressionDMContext[end - start];
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]);
}
rm.setData(contexts);