소스 검색

add source line for debug

runningwater 2 년 전
부모
커밋
70d4f19c87
4개의 변경된 파일26개의 추가작업 그리고 6개의 파일을 삭제
  1. 5 1
      chunk.c
  2. 10 1
      chunk.h
  3. 8 1
      debug.c
  4. 3 3
      main.c

+ 5 - 1
chunk.c

@@ -9,23 +9,27 @@ void initChunk(Chunk *chunk) {
   chunk->count = 0;
   chunk->capacity = 0;
   chunk->code = NULL;
+  chunk->lines = NULL;
   initValueArray(&chunk->constants);
 }
 void freeChunk(Chunk *chunk) {
   FREE_ARRAY(uint8_t, chunk->code, chunk->capacity);
+  FREE_ARRAY(int, chunk->lines, chunk->capacity);
   freeValueArray(&chunk->constants);
   initChunk(chunk);
 }
-void writeChunk(Chunk *chunk, uint8_t byte) {
+void writeChunk(Chunk *chunk, uint8_t byte, int line) {
   // 容量不够
   if (chunk->capacity < chunk->count + 1) {
     int oldCapacity = chunk->capacity;
     chunk->capacity = GROW_CAPACITY(oldCapacity);
     chunk->code = GROW_ARRAY(uint8_t, chunk->code, oldCapacity, chunk->capacity);
+    chunk->lines = GROW_ARRAY(int, chunk->lines, oldCapacity, chunk->capacity);
   }
 
   // 赋值
   chunk->code[chunk->count] = byte;
+  chunk->lines[chunk->count] = line;
   chunk->count++;
 }
 int addConstant(Chunk *chunk, Value value) {

+ 10 - 1
chunk.h

@@ -34,11 +34,20 @@ typedef struct {
   int count;           // 使用量
   int capacity;        // 容量
   uint8_t *code;       // unsigned char*
+  int *lines;          // 源代码行数
   ValueArray constants;// 常量池
 } Chunk;
+/// 初始化 chunk
+/// \param chunk 对象
 void initChunk(Chunk *chunk);
+/// 释放 chunk
+/// \param chunk 对象
 void freeChunk(Chunk *chunk);
-void writeChunk(Chunk *chunk, uint8_t byte);
+/// 写入 chunk
+/// \param chunk 对象
+/// \param byte 命令或数据
+/// \param line 源代码行数
+void writeChunk(Chunk *chunk, uint8_t byte, int line);
 /// 添加常量
 /// \param chunk 指令数组
 /// \param value 值

+ 8 - 1
debug.c

@@ -16,7 +16,14 @@ void disassembleChunk(Chunk *chunk, const char *name) {
   }
 }
 int disassembleInstruction(Chunk *chunk, int offset) {
-  printf("%04d  ", 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) {

+ 3 - 3
main.c

@@ -13,10 +13,10 @@ int main(int argc, char *argv[]) {
   initChunk(&chunk);
 
   int constant = addConstant(&chunk, 1.2);
-  writeChunk(&chunk, OP_CONSTANT);
-  writeChunk(&chunk, constant);
+  writeChunk(&chunk, OP_CONSTANT, 123);
+  writeChunk(&chunk, constant, 123);
 
-  writeChunk(&chunk, OP_RETURN);
+  writeChunk(&chunk, OP_RETURN, 123);
 
   disassembleChunk(&chunk, "test chunk");
   freeChunk(&chunk);