clox/chunk.c

66 lines
1.8 KiB
C

#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 );
}
}