Debugger: Simplify expression error handling.

This commit is contained in:
Unknown W. Brackets committed 2023-04-29 09:15:14 -07:00
1 parent 46101581c0
commit 2f3a0ea0b5
4 files changed
+28 -24

No files matched your search

+20 -18
View File
@@ -1,3 +1,4 @@
#include "Common/StringUtils.h"
#include "expression_parser.h"
#include <ctype.h>
#include <cstring>
@@ -14,7 +15,7 @@ typedef enum {
typedef enum { EXCOMM_CONST, EXCOMM_CONST_FLOAT, EXCOMM_REF, EXCOMM_OP } ExpressionCommand;
static char expressionError[512];
static std::string expressionError;
typedef struct {
char Name[4];
@@ -219,7 +220,7 @@ bool isAlphaNum(char c)
bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, PostfixExpression& dest)
{
expressionError[0] = 0;
expressionError.clear();
int infixPos = 0;
int infixLen = (int)strlen(infix);
@@ -253,7 +254,7 @@ bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, Postf
isFloat = true;
else if (parseNumber(subStr,16,subPos,value) == false)
{
snprintf(expressionError, sizeof(expressionError), "Invalid number \"%s\"",subStr);
expressionError = StringFromFormat("Invalid number \"%s\"", subStr);
return false;
}
@@ -282,14 +283,14 @@ bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, Postf
continue;
}
snprintf(expressionError, sizeof(expressionError), "Invalid symbol \"%s\"",subStr);
expressionError = StringFromFormat("Invalid symbol \"%s\"", subStr);
return false;
} else {
int len;
ExpressionOpcodeType type = getExpressionOpcode(&infix[infixPos],len,lastOpcode);
if (type == EXOP_NONE)
{
snprintf(expressionError, sizeof(expressionError), "Invalid operator at \"%s\"",&infix[infixPos]);
expressionError = StringFromFormat("Invalid operator at \"%s\"", &infix[infixPos]);
return false;
}
@@ -304,7 +305,7 @@ bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, Postf
{
if (opcodeStack.empty())
{
snprintf(expressionError, sizeof(expressionError), "Closing parenthesis without opening one");
expressionError = "Closing parenthesis without opening one";
return false;
}
ExpressionOpcodeType t = opcodeStack[opcodeStack.size()-1];
@@ -318,7 +319,7 @@ bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, Postf
{
if (opcodeStack.empty())
{
snprintf(expressionError, sizeof(expressionError), "Closing bracket without opening one");
expressionError = "Closing bracket without opening one";
return false;
}
ExpressionOpcodeType t = opcodeStack[opcodeStack.size()-1];
@@ -371,7 +372,7 @@ bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, Postf
if (t == EXOP_BRACKETL) // opening bracket without closing one
{
snprintf(expressionError, sizeof(expressionError), "Parenthesis not closed");
expressionError = "Parenthesis not closed";
return false;
}
dest.push_back(ExpressionPair(EXCOMM_OP,t));
@@ -430,7 +431,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs,
opcode = exp[num++].second;
if (valueStack.size() < ExpressionOpcodes[opcode].args)
{
snprintf(expressionError, sizeof(expressionError), "Not enough arguments");
expressionError = "Not enough arguments";
return false;
}
for (int l = 0; l < ExpressionOpcodes[opcode].args; l++)
@@ -446,12 +447,12 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs,
case EXOP_MEMSIZE: // must be followed by EXOP_MEM
if (exp[num++].second != EXOP_MEM)
{
snprintf(expressionError, sizeof(expressionError), "Invalid memsize operator");
expressionError = "Invalid memsize operator";
return false;
}
uint32_t val;
if(funcs->getMemoryValue(arg[1],arg[0],val,expressionError, sizeof(expressionError)) == false)
if (funcs->getMemoryValue(arg[1], arg[0], val, &expressionError) == false)
{
return false;
}
@@ -460,7 +461,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs,
case EXOP_MEM:
{
uint32_t val;
if (funcs->getMemoryValue(arg[0],4,val,expressionError, sizeof(expressionError)) == false)
if (funcs->getMemoryValue(arg[0], 4, val, &expressionError) == false)
{
return false;
}
@@ -490,7 +491,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs,
case EXOP_DIV: // a/b
if (arg[0] == 0)
{
snprintf(expressionError, sizeof(expressionError), "Division by zero");
expressionError = "Division by zero";
return false;
}
if (useFloat)
@@ -501,7 +502,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs,
case EXOP_MOD: // a%b
if (arg[0] == 0)
{
snprintf(expressionError, sizeof(expressionError), "Modulo by zero");
expressionError = "Modulo by zero";
return false;
}
valueStack.push_back(arg[1]%arg[0]);
@@ -574,7 +575,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs,
case EXOP_TERTELSE: // exp ? exp : exp, else muss zuerst kommen!
if (exp[num++].second != EXOP_TERTIF)
{
snprintf(expressionError, sizeof(expressionError), "Invalid tertiary operator");
expressionError = "Invalid tertiary operator";
return false;
}
valueStack.push_back(arg[2]?arg[1]:arg[0]);
@@ -595,8 +596,9 @@ bool parseExpression(const char *exp, IExpressionFunctions *funcs, uint32_t &des
return parsePostfixExpression(postfix,funcs,dest);
}
const char* getExpressionError()
const char *getExpressionError()
{
if (expressionError[0] == 0) snprintf(expressionError, sizeof(expressionError), "Invalid expression");
return expressionError;
if (expressionError.empty())
expressionError = "Invalid expression";
return expressionError.c_str();
}
+2 -1
View File
@@ -2,6 +2,7 @@
#include <cstdint>
#include <cstddef>
#include <string>
#include <vector>
typedef std::pair<uint32_t, uint32_t> ExpressionPair;
@@ -21,7 +22,7 @@ public:
virtual bool parseSymbol(char* str, uint32_t& symbolValue) = 0;
virtual uint32_t getReferenceValue(uint32_t referenceIndex) = 0;
virtual ExpressionType getReferenceType(uint32_t referenceIndex) = 0;
virtual bool getMemoryValue(uint32_t address, int size, uint32_t& dest, char *error, size_t errorBufSize) = 0;
virtual bool getMemoryValue(uint32_t address, int size, uint32_t& dest, std::string *error) = 0;
};
bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, PostfixExpression& dest);
+2 -2
View File
@@ -159,7 +159,7 @@ public:
return EXPR_TYPE_UINT;
}
bool getMemoryValue(uint32_t address, int size, uint32_t& dest, char* error, size_t errorBufSize) override {
bool getMemoryValue(uint32_t address, int size, uint32_t& dest, std::string *error) override {
// We allow, but ignore, bad access.
// If we didn't, log/condition statements that reference registers couldn't be configured.
uint32_t valid = Memory::ValidSize(address, size);
@@ -179,7 +179,7 @@ public:
return true;
}
snprintf(error, errorBufSize, "Unexpected memory access size %d", size);
*error = StringFromFormat("Unexpected memory access size %d", size);
return false;
}
+4 -3
View File
@@ -17,6 +17,7 @@
#include "Common/Log.h"
#include "Common/Math/expression_parser.h"
#include "Common/StringUtils.h"
#include "Core/Debugger/SymbolMap.h"
#include "GPU/Common/GPUDebugInterface.h"
#include "GPU/Debugger/Debugger.h"
@@ -516,7 +517,7 @@ public:
bool parseSymbol(char *str, uint32_t &symbolValue) override;
uint32_t getReferenceValue(uint32_t referenceIndex) override;
ExpressionType getReferenceType(uint32_t referenceIndex) override;
bool getMemoryValue(uint32_t address, int size, uint32_t &dest, char *error, size_t errorBufSize) override;
bool getMemoryValue(uint32_t address, int size, uint32_t &dest, std::string *error) override;
private:
bool parseFieldReference(const char *ref, const char *field, uint32_t &referenceIndex);
@@ -926,7 +927,7 @@ ExpressionType GEExpressionFunctions::getFieldType(GECmdFormat fmt, GECmdField f
return EXPR_TYPE_UINT;
}
bool GEExpressionFunctions::getMemoryValue(uint32_t address, int size, uint32_t &dest, char *error, size_t errorBufSize) {
bool GEExpressionFunctions::getMemoryValue(uint32_t address, int size, uint32_t &dest, std::string *error) {
// We allow, but ignore, bad access.
// If we didn't, log/condition statements that reference registers couldn't be configured.
uint32_t valid = Memory::ValidSize(address, size);
@@ -946,7 +947,7 @@ bool GEExpressionFunctions::getMemoryValue(uint32_t address, int size, uint32_t
return true;
}
snprintf(error, errorBufSize, "Unexpected memory access size %d", size);
*error = StringFromFormat("Unexpected memory access size %d", size);
return false;
}