diff --git a/src/zscript/vm.h b/src/zscript/vm.h index d3e4580ce..4bc8f01c0 100644 --- a/src/zscript/vm.h +++ b/src/zscript/vm.h @@ -682,6 +682,7 @@ struct VMFrame VMValue *GetParam() const { + assert(((size_t)this & 15) == 0 && "VM frame is unaligned"); return (VMValue *)(((size_t)(this + 1) + 15) & ~15); } @@ -789,6 +790,11 @@ private: VMFrame *LastFrame; VM_UBYTE *FreeSpace; int BlockSize; + + void InitFreeSpace() + { + FreeSpace = (VM_UBYTE *)(((size_t)(this + 1) + 15) & ~15); + } }; BlockHeader *Blocks; BlockHeader *UnusedBlocks; diff --git a/src/zscript/vmframe.cpp b/src/zscript/vmframe.cpp index 0c2cacfc2..82affc053 100644 --- a/src/zscript/vmframe.cpp +++ b/src/zscript/vmframe.cpp @@ -286,7 +286,7 @@ VMFrame *VMFrameStack::Alloc(int size) block = (BlockHeader *)new VM_UBYTE[blocksize]; block->BlockSize = blocksize; } - block->FreeSpace = (VM_UBYTE *)block + ((sizeof(BlockHeader) + 15) & ~15); + block->InitFreeSpace(); block->LastFrame = NULL; block->NextBlock = Blocks; Blocks = block; @@ -340,7 +340,7 @@ VMFrame *VMFrameStack::PopFrame() { assert(Blocks->NextBlock == NULL); Blocks->LastFrame = NULL; - Blocks->FreeSpace = (VM_UBYTE *)Blocks + ((sizeof(BlockHeader) + 15) & ~15); + Blocks->InitFreeSpace(); } return NULL; }