From 2cd7a44bc741a9e7af6be469aade5564120164cc Mon Sep 17 00:00:00 2001 From: nazrin Date: Sun, 8 Jun 2025 06:11:10 +0000 Subject: [PATCH] Use UDAs for Op disassembly --- src/clox/chunk.d | 24 +++++++++++++++--------- src/clox/dbg.d | 6 +++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/clox/chunk.d b/src/clox/chunk.d index 701ba15..39a4f47 100644 --- a/src/clox/chunk.d +++ b/src/clox/chunk.d @@ -10,22 +10,28 @@ struct OpColour{ string r, g, b; } +enum OpConst; +enum OpStack; +enum OpJump; + enum OpCode : ubyte{ - @(OpColour("200", "200", "100")) Constant, + @OpConst @(OpColour("200", "200", "100")) Constant, + @(OpColour("255", "200", "100")) Nil, @(OpColour("255", "200", "100")) True, @(OpColour("255", "200", "100")) False, @(OpColour("000", "200", "100")) Pop, - @(OpColour("060", "200", "150")) GetLocal, - @(OpColour("000", "200", "150")) GetGlobal, - @(OpColour("000", "200", "150")) DefineGlobal, - @(OpColour("060", "200", "150")) SetLocal, - @(OpColour("000", "200", "150")) SetGlobal, + @OpStack @(OpColour("060", "200", "150")) GetLocal, + @OpStack @(OpColour("060", "200", "150")) SetLocal, - @(OpColour("000", "255", "000")) Jump, - @(OpColour("000", "200", "000")) JumpIfFalse, - @(OpColour("010", "255", "000")) Loop, + @OpConst @(OpColour("000", "200", "150")) GetGlobal, + @OpConst @(OpColour("000", "200", "150")) DefineGlobal, + @OpConst @(OpColour("000", "200", "150")) SetGlobal, + + @OpJump @(OpColour("000", "255", "000")) Jump, + @OpJump @(OpColour("000", "200", "000")) JumpIfFalse, + @OpJump @(OpColour("010", "255", "000")) Loop, @(OpColour("255", "100", "100")) Equal, @(OpColour("255", "100", "100")) Greater, diff --git a/src/clox/dbg.d b/src/clox/dbg.d index d33501a..c08b841 100644 --- a/src/clox/dbg.d +++ b/src/clox/dbg.d @@ -68,11 +68,11 @@ long disassembleInstruction(Chunk* chunk, long offset){ printf(colour!(" %02x ", Colour.Black).ptr, instruction); switch(instruction){ static foreach(e; EnumMembers!OpCode){ - static if(e == OpCode.Constant || e == OpCode.DefineGlobal || e == OpCode.GetGlobal || e == OpCode.SetGlobal){ + static if(hasUDA!(e, OpConst)){ case e: return constantInstruction!(e)(e.stringof, chunk, offset); - } else static if(e == OpCode.GetLocal || e == OpCode.SetLocal){ + } else static if(hasUDA!(e, OpStack)){ case e: return stackIndexInstruction!e(e.stringof, chunk, offset); - } else static if(e == OpCode.Jump || e == OpCode.JumpIfFalse || e == OpCode.Loop){ + } else static if(hasUDA!(e, OpJump)){ case e: return jumpInstruction!e(e.stringof, e == OpCode.Loop ? -1 : 1, chunk, offset); } else { case e: return simpleInstruction!e(e.stringof, offset);