.
This commit is contained in:
@@ -18,6 +18,7 @@ The bytecode file is composed of the following sections:
|
|||||||
[0:3]: function pointer (counter start at the beginning of executable code)
|
[0:3]: function pointer (counter start at the beginning of executable code)
|
||||||
[4:5]: number of parameters
|
[4:5]: number of parameters
|
||||||
[6:7]: number of local variables
|
[6:7]: number of local variables
|
||||||
|
[8:b]: function size
|
||||||
* [0x2] Constants raw data
|
* [0x2] Constants raw data
|
||||||
* [0x3] Code: executable code
|
* [0x3] Code: executable code
|
||||||
* [0x4] Debugging info
|
* [0x4] Debugging info
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ Bytecode::Bytecode(ByteArray ba)
|
|||||||
cache_.constants_start_addr = byte_array_.get_uint32(TOC_START + (2 * TOC_RECORD_SZ));
|
cache_.constants_start_addr = byte_array_.get_uint32(TOC_START + (2 * TOC_RECORD_SZ));
|
||||||
uint32_t code_start = byte_array_.get_uint32(TOC_START + (3 * TOC_RECORD_SZ));
|
uint32_t code_start = byte_array_.get_uint32(TOC_START + (3 * TOC_RECORD_SZ));
|
||||||
for (uint32_t i = 0; i < cache_.n_functions; ++i) {
|
for (uint32_t i = 0; i < cache_.n_functions; ++i) {
|
||||||
cache_.function_addr.emplace_back(code_start + byte_array_.get_uint32(cache_.functions_idx_addr + (i * 8)));
|
cache_.function_addr.emplace_back(code_start + byte_array_.get_uint32(cache_.functions_idx_addr + (i * FUNCTION_RECORD_SZ)));
|
||||||
cache_.function_sz.emplace_back(0); // TODO
|
cache_.function_sz.emplace_back(code_start + byte_array_.get_uint32(cache_.functions_idx_addr + (i * FUNCTION_RECORD_SZ) + 8));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,6 +117,7 @@ ByteArray Bytecode::generate(BytecodePrototype const& bp)
|
|||||||
functions_indexes.set_uint32(idx_idx, code_idx);
|
functions_indexes.set_uint32(idx_idx, code_idx);
|
||||||
functions_indexes.set_uint16(idx_idx + 4, f.n_pars);
|
functions_indexes.set_uint16(idx_idx + 4, f.n_pars);
|
||||||
functions_indexes.set_uint16(idx_idx + 6, f.n_locals);
|
functions_indexes.set_uint16(idx_idx + 6, f.n_locals);
|
||||||
|
functions_indexes.set_uint32(idx_idx + 8, f.code.size());
|
||||||
raw_code.append_bytearray(f.code);
|
raw_code.append_bytearray(f.code);
|
||||||
code_idx = raw_code.size();
|
code_idx = raw_code.size();
|
||||||
idx_idx += FUNCTION_RECORD_SZ;
|
idx_idx += FUNCTION_RECORD_SZ;
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ private:
|
|||||||
TOC_SZ = TOC_N_RECORDS * TOC_RECORD_SZ;
|
TOC_SZ = TOC_N_RECORDS * TOC_RECORD_SZ;
|
||||||
static constexpr uint32_t CONST_IDX_START = TOC_START + TOC_SZ,
|
static constexpr uint32_t CONST_IDX_START = TOC_START + TOC_SZ,
|
||||||
CONST_RECORD_SZ = 4;
|
CONST_RECORD_SZ = 4;
|
||||||
static constexpr uint32_t FUNCTION_RECORD_SZ = 8;
|
static constexpr uint32_t FUNCTION_RECORD_SZ = 12;
|
||||||
|
|
||||||
enum Sections { SEC_CONST_IDX = 0, SEC_FUNC_IDX = 1, SEC_CONST_DATA = 2, SEC_CODE = 3 };
|
enum Sections { SEC_CONST_IDX = 0, SEC_FUNC_IDX = 1, SEC_CONST_DATA = 2, SEC_CODE = 3 };
|
||||||
|
|
||||||
|
|||||||
@@ -110,15 +110,15 @@ TEST(Bytecode, Code)
|
|||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // constant index
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // constant index
|
||||||
0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // variable index
|
0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // variable index
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // raw constants
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // raw constants
|
||||||
0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // raw code
|
0x68, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // raw code
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
// function definitions
|
// function definitions
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||||
0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00,
|
0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
// code
|
// code
|
||||||
0x68, 0x54, 0x42,
|
0x68, 0x54, 0x42,
|
||||||
|
|||||||
Reference in New Issue
Block a user