9 #include "../runner/common/Platform.h"
10 #include "../runner/common/FileFormat.h"
11 #include "../runner/common/Memory.h"
12 #include "../runner/common/Noncopyable.h"
33 void Add(
const T value);
50 std::unique_ptr<void, decltype(&std::free)>
Copy()
const;
57 static T
Raw(
const void* program,
const address_t address);
64 void Replace(
const address_t address,
const T value);
75 : mCode(
static_cast<uint8_t
>(code))
76 , mNextCommand(nextCommand)
80 Command(
const uint8_t data,
const address_t nextCommand) noexcept
82 , mNextCommand(nextCommand)
88 mCode =
static_cast<uint8_t
>(code);
91 void Replace(
const uint8_t data) noexcept
97 std::vector<Command> mCommand;
100 template <
typename T>
106 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
107 AddCommand(
reinterpret_cast<const uint8_t*
>(&value)[i], InvalidAddress);
111 for (int_fast8_t i =
static_cast<uint_fast8_t
>(
sizeof(T) - 1); i >= 0; --i)
112 AddCommand(
reinterpret_cast<const uint8_t*
>(&value)[i], InvalidAddress);
116 template <
typename T>
117 void CodeBuffer::Replace(
const address_t address,
const T value){
118 const uint8_t* pointer =
reinterpret_cast<const uint8_t*
>(&value);
122 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
123 mCommand[address + i].mCode = pointer[i];
127 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
128 mCommand[address + i].mCode = pointer[
static_cast<uint_fast8_t
>(
sizeof(T) - 1) - i];
135 template <
typename T>
139 uint8_t* pointer =
reinterpret_cast<uint8_t*
>(&value);
143 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
144 pointer[i] = mCommand[address + i].mCode;
148 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
149 pointer[i] = mCommand[address +
static_cast<uint_fast8_t
>(
sizeof(T) - 1) - i].mCode;
154 template <
typename T>
158 uint8_t* pointer =
reinterpret_cast<uint8_t*
>(&value);
159 const uint8_t* source =
static_cast<const uint8_t*
>(program) + address;
163 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
164 pointer[i] = source[i];
168 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
169 pointer[i] = source[
static_cast<int_fast16_t
>(
sizeof(T) - 1) - i];
Definition: CodeBuffer.h:25
void AddOpecode(const IntermediateLanguage code)
Definition: CodeBuffer.cpp:18
std::unique_ptr< void, decltype(&std::free)> Copy() const
Definition: CodeBuffer.cpp:62
void Reduce(const address_t reduceSize)
Definition: CodeBuffer.cpp:13
static T Raw(const void *program, const address_t address)
Definition: CodeBuffer.h:155
void ReplaceOpecode(const address_t address, const IntermediateLanguage code)
Definition: CodeBuffer.cpp:40
address_t GetSize() const
Definition: CodeBuffer.cpp:76
address_t AddOpecodeAndTwoOperands(const IntermediateLanguage code, const address_t address, const address_t size)
Definition: CodeBuffer.cpp:31
void ReplaceAddressAll(const address_t baseAddress, const address_t newAddress)
Definition: CodeBuffer.cpp:50
void ReplaceAddress(const address_t address, const address_t newAddress)
Definition: CodeBuffer.cpp:45
void Add(const T value)
Definition: CodeBuffer.h:101
address_t AddOpecodeAndOperand(const IntermediateLanguage code, const address_t address=InvalidAddress)
Definition: CodeBuffer.cpp:23
T Get(const address_t address) const
Definition: CodeBuffer.h:136
void Write(OutputStream &stream) const
Definition: CodeBuffer.cpp:81
Definition: OutputStream.h:15
Definition: CodeBuffer.cpp:12
std::uint32_t address_t
Definition: Type.h:30
IntermediateLanguage
Definition: FileFormat.h:79
bool IsBigEndian()
Definition: Memory.h:17
Definition: Noncopyable.h:18