From 8ddf9dd725e12427cbb2862be61fffaf0b3a37e8 Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Sat, 3 May 2014 19:39:50 -0400 Subject: [PATCH] ide/debugger: (#209) Fixed + operator on arrays and string --- ide/src/debugger/debugTools.ec | 56 +++++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/ide/src/debugger/debugTools.ec b/ide/src/debugger/debugTools.ec index 6f0eb5d..eba1e65 100644 --- a/ide/src/debugger/debugTools.ec +++ b/ide/src/debugger/debugTools.ec @@ -526,22 +526,55 @@ void DebugComputeExpression(Expression exp) // TODO: Do pointer operations if(exp1.expType && exp1.expType.type) { - uint size = ComputeTypeSize(exp1.expType.type); - if(size) + if(exp1.type == stringExp) { - op1.ui /= exp1.expType.type.size; - CallOperator(exp, exp1, exp2, op1, op2); - if(exp.type == constantExp) + int len = exp1.string ? strlen(exp1.string)-2 : 0; + uint64 offset = (exp.op.op == '+') ? op2.i64 : -op2.i64; + String newString = null; + if(len >= 0 && offset <= len) { - exp.address = _strtoui64(exp.constant, null, 0); - exp.address *= size; + newString = new char[3 + len - offset]; + newString[0] = '\"'; + memcpy(newString + 1, exp1.string + 1 + offset, len - offset); + newString[1 + len - offset] = '\"'; + newString[1 + len - offset + 1] = 0; + } + FreeExpContents(exp); + if(newString) + { + exp.type = stringExp; + exp.string = newString; + } + else + exp.type = dereferenceErrorExp; + } + else + { + uint size = ComputeTypeSize(exp1.expType.type); + if(size) + { + op1.ui64 /= exp1.expType.type.size; + CallOperator(exp, exp1, exp2, op1, op2); + if(exp.type == constantExp) + { + exp.address = _strtoui64(exp.constant, null, 0); + exp.address *= size; + if(op1.type.kind == arrayType) + exp.hasAddress = true; + } } } } } else { - CallOperator(exp, exp1, exp2, op1, op2); + if((exp1 && exp1.type == stringExp) || (exp2 && exp2.type == stringExp)) + { + FreeExpContents(exp); + exp.type = unknownErrorExp; // We should have an invalid operands error + } + else + CallOperator(exp, exp1, exp2, op1, op2); } if(op1.type) FreeType(op1.type); if(op2.type) FreeType(op2.type); @@ -604,8 +637,13 @@ void DebugComputeExpression(Expression exp) // 0 == size = ComputeTypeSize(exp.expType.arrayType); // 4 == size = ComputeTypeSize(exp.index.exp.expType); // 0 == size = ComputeTypeSize(exp.index.exp.expType.arrayType); + size = ComputeTypeSize(exp.expType); - format = GetGdbFormatChar(exp.expType); + if(exp.expType && exp.expType.type && exp.expType.kind == arrayType) + // For multilevels arrays + format = 'x'; + else + format = GetGdbFormatChar(exp.expType); for(e = exp.index.index->first; e; e = e.next) { -- 1.8.3.1