mirror of
https://github.com/gbdev/rgbds.git
synced 2026-08-23 07:14:31 +00:00
Consistently handle negative shifted macro args (#2014)
Negative macro arguments count from the end, i.e. `\<-1>` is equivalent to `\<_NARG>`, even after `shift`ing them. Negative arguments cannot be used to access shifted values.
This commit is contained in:
@@ -13,7 +13,7 @@ struct MacroArgs {
|
||||
std::vector<std::shared_ptr<std::string>> args;
|
||||
|
||||
uint32_t nbArgs() const { return args.size() - shift; }
|
||||
std::shared_ptr<std::string> getArg(int32_t i) const;
|
||||
std::shared_ptr<std::string> getArg(int32_t num) const;
|
||||
std::shared_ptr<std::string> getAllArgs() const;
|
||||
|
||||
void appendArg(std::shared_ptr<std::string> arg);
|
||||
|
||||
+17
-9
@@ -8,18 +8,26 @@
|
||||
#include <string.h>
|
||||
#include <string>
|
||||
|
||||
#include "helpers.hpp" // assume
|
||||
|
||||
#include "asm/warning.hpp"
|
||||
|
||||
std::shared_ptr<std::string> MacroArgs::getArg(int32_t i) const {
|
||||
// Bracketed macro arguments adjust negative indexes such that -1 is the last argument.
|
||||
if (i < 0) {
|
||||
i += args.size() + 1;
|
||||
std::shared_ptr<std::string> MacroArgs::getArg(int32_t num) const {
|
||||
assume(num != 0);
|
||||
if (num > 0) {
|
||||
// Macro arguments adjust 1-based indexes by the shift amount.
|
||||
if (size_t i = num - 1 + shift; i < args.size()) {
|
||||
return args[i];
|
||||
}
|
||||
} else {
|
||||
// Bracketed macro arguments adjust negative indexes such that -1 is the last argument.
|
||||
if (num == INT32_MIN || static_cast<size_t>(-num) > args.size()) {
|
||||
return nullptr;
|
||||
} else if (size_t i = args.size() - static_cast<size_t>(-num); i >= shift) {
|
||||
return args[i];
|
||||
}
|
||||
}
|
||||
|
||||
int32_t realIndex = i + shift - 1;
|
||||
|
||||
return realIndex < 0 || static_cast<uint32_t>(realIndex) >= args.size() ? nullptr
|
||||
: args[realIndex];
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<std::string> MacroArgs::getAllArgs() const {
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
MACRO test
|
||||
static_assert _NARG == 10
|
||||
println _NARG
|
||||
println \1, \<10>, \<-1>, \<-10>
|
||||
println \<999>
|
||||
println \<-999>
|
||||
shift 3
|
||||
println _NARG
|
||||
println \1, \7, \<-1>, \<-7>
|
||||
println \<8>
|
||||
println \<-8>
|
||||
println \<-999>
|
||||
shift 7
|
||||
println _NARG
|
||||
println \1
|
||||
println \<-1>
|
||||
shift -10
|
||||
println _NARG
|
||||
println \<-2_147_483_648>
|
||||
ENDM
|
||||
|
||||
test "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"
|
||||
@@ -0,0 +1,19 @@
|
||||
error: Macro argument `\<999>` not defined
|
||||
at negative-shifted-macro-args.asm::test(5) <- negative-shifted-macro-args.asm(22)
|
||||
error: Macro argument `\<-999>` not defined
|
||||
at negative-shifted-macro-args.asm::test(6) <- negative-shifted-macro-args.asm(22)
|
||||
error: Macro argument `\<8>` not defined
|
||||
at negative-shifted-macro-args.asm::test(10) <- negative-shifted-macro-args.asm(22)
|
||||
error: Macro argument `\<-8>` not defined
|
||||
at negative-shifted-macro-args.asm::test(11) <- negative-shifted-macro-args.asm(22)
|
||||
error: Macro argument `\<-999>` not defined
|
||||
at negative-shifted-macro-args.asm::test(12) <- negative-shifted-macro-args.asm(22)
|
||||
error: Macro argument `\1` not defined
|
||||
at negative-shifted-macro-args.asm::test(15) <- negative-shifted-macro-args.asm(22)
|
||||
error: Macro argument `\<-1>` not defined
|
||||
at negative-shifted-macro-args.asm::test(16) <- negative-shifted-macro-args.asm(22)
|
||||
error: Number in bracketed macro argument is too large
|
||||
at negative-shifted-macro-args.asm::test(19) <- negative-shifted-macro-args.asm(22)
|
||||
error: syntax error, unexpected >
|
||||
at negative-shifted-macro-args.asm::test(19) <- negative-shifted-macro-args.asm(22)
|
||||
Assembly aborted with 9 errors
|
||||
@@ -0,0 +1,13 @@
|
||||
$A
|
||||
ajja
|
||||
|
||||
|
||||
$7
|
||||
djjd
|
||||
|
||||
|
||||
|
||||
$0
|
||||
|
||||
|
||||
$A
|
||||
Reference in New Issue
Block a user