// // Created by 李晓明 on 2023/8/16. // #include "debug.h" #include #include "value.h" static int constantInstruction(const char *, Chunk *, int); static int simpleInstruction(const char *name, int offset); void disassembleChunk(Chunk *chunk, const char *name) { printf("== %s ==\n", name); for (int offset = 0; offset < chunk->count;) { offset = disassembleInstruction(chunk, offset); } } int disassembleInstruction(Chunk *chunk, int offset) { printf("%04d ", offset); if (offset > 0 && chunk->lines[offset] == chunk->lines[offset - 1]) { printf(" | "); } else { printf("%4d ", chunk->lines[offset]); } uint8_t instruction = chunk->code[offset]; switch (instruction) { case OP_CONSTANT:return constantInstruction("OP_CONSTANT", chunk, offset); case OP_RETURN:return simpleInstruction("OP_RETURN", offset); default:printf("Unknown opcode %d\n", instruction); return offset + 1; } } /** * @brief 打印常量指令 * @param name * @param chunk * @param offset * @return */ static int constantInstruction(const char *name, Chunk *chunk, int offset) { uint8_t constant = chunk->code[offset + 1]; printf("%-16s %4d '", name, constant); printValue(chunk->constants.values[constant]); printf("'\n"); return offset + 2; } /** * @brief 打印指令 * @param name 名称 * @param offset 偏移 * @return */ static int simpleInstruction(const char *name, int offset) { printf("%s\n", name); return offset + 1; }