mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Use automatic allocation and std::move for RPN bytes (#1336)
This commit is contained in:
@@ -29,7 +29,7 @@ static void initExpression(Expression &expr) {
|
||||
expr.reason.clear();
|
||||
expr.isKnown = true;
|
||||
expr.isSymbol = false;
|
||||
expr.rpn = nullptr;
|
||||
expr.rpn.clear();
|
||||
expr.rpnPatchSize = 0;
|
||||
}
|
||||
|
||||
@@ -42,21 +42,14 @@ static void makeUnknown(Expression &expr, Ts... parts) {
|
||||
}
|
||||
|
||||
static uint8_t *reserveSpace(Expression &expr, uint32_t size) {
|
||||
if (!expr.rpn) {
|
||||
expr.rpn = new (std::nothrow) std::vector<uint8_t>();
|
||||
if (!expr.rpn)
|
||||
fatalerror("Failed to allocate RPN expression: %s\n", strerror(errno));
|
||||
}
|
||||
size_t curSize = expr.rpn.size();
|
||||
|
||||
size_t curSize = expr.rpn->size();
|
||||
|
||||
expr.rpn->resize(curSize + size);
|
||||
return &(*expr.rpn)[curSize];
|
||||
expr.rpn.resize(curSize + size);
|
||||
return &expr.rpn[curSize];
|
||||
}
|
||||
|
||||
// Free the RPN expression
|
||||
void rpn_Free(Expression &expr) {
|
||||
delete expr.rpn;
|
||||
initExpression(expr);
|
||||
}
|
||||
|
||||
@@ -220,8 +213,7 @@ void rpn_StartOfSectionType(Expression &expr, SectionType type) {
|
||||
*ptr++ = type;
|
||||
}
|
||||
|
||||
void rpn_CheckHRAM(Expression &expr, const Expression &src) {
|
||||
expr = src;
|
||||
void rpn_CheckHRAM(Expression &expr) {
|
||||
expr.isSymbol = false;
|
||||
|
||||
if (!expr.isKnown) {
|
||||
@@ -235,9 +227,7 @@ void rpn_CheckHRAM(Expression &expr, const Expression &src) {
|
||||
}
|
||||
}
|
||||
|
||||
void rpn_CheckRST(Expression &expr, const Expression &src) {
|
||||
expr = src;
|
||||
|
||||
void rpn_CheckRST(Expression &expr) {
|
||||
if (expr.isKnown) {
|
||||
// A valid RST address must be masked with 0x38
|
||||
if (expr.val & ~0x38)
|
||||
@@ -251,7 +241,7 @@ void rpn_CheckRST(Expression &expr, const Expression &src) {
|
||||
}
|
||||
|
||||
// Checks that an RPN expression's value fits within N bits (signed or unsigned)
|
||||
void rpn_CheckNBit(Expression const &expr, uint8_t n) {
|
||||
void rpn_CheckNBit(const Expression &expr, uint8_t n) {
|
||||
assert(n != 0); // That doesn't make sense
|
||||
assert(n < CHAR_BIT * sizeof(int)); // Otherwise `1 << n` is UB
|
||||
|
||||
@@ -273,8 +263,8 @@ int32_t Expression::getConstVal() const {
|
||||
return val;
|
||||
}
|
||||
|
||||
void rpn_LOGNOT(Expression &expr, const Expression &src) {
|
||||
expr = src;
|
||||
void rpn_LOGNOT(Expression &expr, Expression &&src) {
|
||||
expr = std::move(src);
|
||||
expr.isSymbol = false;
|
||||
|
||||
if (expr.isKnown) {
|
||||
@@ -288,7 +278,7 @@ void rpn_LOGNOT(Expression &expr, const Expression &src) {
|
||||
Symbol const *Expression::symbolOf() const {
|
||||
if (!isSymbol)
|
||||
return nullptr;
|
||||
return sym_FindScopedSymbol((char const *)&(*rpn)[1]);
|
||||
return sym_FindScopedSymbol((char const *)&rpn[1]);
|
||||
}
|
||||
|
||||
bool Expression::isDiffConstant(Symbol const *sym) const {
|
||||
@@ -343,7 +333,7 @@ static int32_t tryConstMask(Expression const &lhs, Expression const &rhs) {
|
||||
return (symbolOfs + sect.alignOfs) & ~unknownBits;
|
||||
}
|
||||
|
||||
void rpn_BinaryOp(RPNCommand op, Expression &expr, const Expression &src1, const Expression &src2) {
|
||||
void rpn_BinaryOp(RPNCommand op, Expression &expr, Expression &&src1, const Expression &src2) {
|
||||
initExpression(expr);
|
||||
expr.isSymbol = false;
|
||||
int32_t constMaskVal;
|
||||
@@ -515,7 +505,7 @@ void rpn_BinaryOp(RPNCommand op, Expression &expr, const Expression &src1, const
|
||||
(uint8_t)(lval >> 24),
|
||||
};
|
||||
expr.rpnPatchSize = sizeof(bytes);
|
||||
expr.rpn = nullptr;
|
||||
expr.rpn.clear();
|
||||
memcpy(reserveSpace(expr, sizeof(bytes)), bytes, sizeof(bytes));
|
||||
|
||||
// Use the other expression's un-const reason
|
||||
@@ -523,7 +513,7 @@ void rpn_BinaryOp(RPNCommand op, Expression &expr, const Expression &src1, const
|
||||
} else {
|
||||
// Otherwise just reuse its RPN buffer
|
||||
expr.rpnPatchSize = src1.rpnPatchSize;
|
||||
expr.rpn = src1.rpn;
|
||||
std::swap(expr.rpn, src1.rpn);
|
||||
expr.reason = src1.reason;
|
||||
}
|
||||
|
||||
@@ -546,8 +536,8 @@ void rpn_BinaryOp(RPNCommand op, Expression &expr, const Expression &src1, const
|
||||
len = sizeof(bytes);
|
||||
patchSize = sizeof(bytes);
|
||||
} else {
|
||||
ptr = src2.rpn->data(); // Pointer to the right RPN
|
||||
len = src2.rpn->size(); // Size of the right RPN
|
||||
ptr = src2.rpn.data(); // Pointer to the right RPN
|
||||
len = src2.rpn.size(); // Size of the right RPN
|
||||
patchSize = src2.rpnPatchSize;
|
||||
}
|
||||
// Copy the right RPN and append the operator
|
||||
@@ -558,13 +548,12 @@ void rpn_BinaryOp(RPNCommand op, Expression &expr, const Expression &src1, const
|
||||
memcpy(buf, ptr, len);
|
||||
buf[len] = op;
|
||||
|
||||
delete src2.rpn; // If there was none, this is `delete nullptr`
|
||||
expr.rpnPatchSize += patchSize + 1;
|
||||
}
|
||||
}
|
||||
|
||||
void rpn_HIGH(Expression &expr, const Expression &src) {
|
||||
expr = src;
|
||||
void rpn_HIGH(Expression &expr, Expression &&src) {
|
||||
expr = std::move(src);
|
||||
expr.isSymbol = false;
|
||||
|
||||
if (expr.isKnown) {
|
||||
@@ -576,8 +565,8 @@ void rpn_HIGH(Expression &expr, const Expression &src) {
|
||||
}
|
||||
}
|
||||
|
||||
void rpn_LOW(Expression &expr, const Expression &src) {
|
||||
expr = src;
|
||||
void rpn_LOW(Expression &expr, Expression &&src) {
|
||||
expr = std::move(src);
|
||||
expr.isSymbol = false;
|
||||
|
||||
if (expr.isKnown) {
|
||||
@@ -597,8 +586,8 @@ void rpn_ISCONST(Expression &expr, const Expression &src) {
|
||||
expr.isSymbol = false;
|
||||
}
|
||||
|
||||
void rpn_NEG(Expression &expr, const Expression &src) {
|
||||
expr = src;
|
||||
void rpn_NEG(Expression &expr, Expression &&src) {
|
||||
expr = std::move(src);
|
||||
expr.isSymbol = false;
|
||||
|
||||
if (expr.isKnown) {
|
||||
@@ -609,8 +598,8 @@ void rpn_NEG(Expression &expr, const Expression &src) {
|
||||
}
|
||||
}
|
||||
|
||||
void rpn_NOT(Expression &expr, const Expression &src) {
|
||||
expr = src;
|
||||
void rpn_NOT(Expression &expr, Expression &&src) {
|
||||
expr = std::move(src);
|
||||
expr.isSymbol = false;
|
||||
|
||||
if (expr.isKnown) {
|
||||
|
||||
Reference in New Issue
Block a user