#include "chunk.h" #include "memory.h" #include "value.h" void initChunk( Chunk* chunk ) { chunk->capacity = 0; chunk->count = 0; chunk->bDebug = true; chunk->code = NULL; chunk->lines = NULL; initValueArray( &chunk->constants ); } void freeChunk( Chunk* chunk ) { FREE_ARRAY( uint8_t, chunk->code, chunk->capacity ); FREE_ARRAY( uint16_t, chunk->lines, chunk->capacity ); freeValueArray( &chunk->constants ); initChunk( chunk ); } void writeChunk( Chunk* chunk, uint8_t byte, uint16_t line ) { if ( chunk->capacity < chunk->count + 1 ) { int oldCap = chunk->capacity; chunk->capacity = GROW_CAPACITY( oldCap ); chunk->code = GROW_ARRAY( chunk->code, uint8_t, oldCap, chunk->capacity ); if ( chunk->bDebug ) { chunk->lines = GROW_ARRAY( chunk->lines, uint16_t, oldCap, chunk->capacity ); } } chunk->code[chunk->count] = byte; if ( chunk->bDebug ) chunk->lines[chunk->count] = line; chunk->count++; } // unsigned 16bit write void writeChunk16( Chunk* chunk, uint16_t word, uint16_t line ) { writeChunk( chunk, word & 255, line ); writeChunk( chunk, word >> 8, line ); } // unsigned 16bit read uint16_t readChunk16( Chunk* chunk, int offset ) { uint16_t val = chunk->code[offset]; return ((val) | (chunk->code[offset + 1] << 8)); } uint16_t addConstant( Chunk* chunk, Value val ) { writeValueArray( &chunk->constants, val ); return chunk->constants.count - 1; } // high level for adding and writing a chunk constant void writeConstant( Chunk* chunk, Value val, uint16_t line ) { uint16_t cont = addConstant( chunk, val ); // more than 256 constants, use 16bit operand if ( cont > 255 ) { writeChunk( chunk, OP_CONSTANT_LONG, line ); writeChunk16( chunk, cont, line ); } else { writeChunk( chunk, OP_CONSTANT, line ); writeChunk( chunk, cont, line ); } }