66 lines
1.8 KiB
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 );
|
|
}
|
|
}
|
|
|