diff --git a/src/clox/chunk.d b/src/clox/chunk.d index 333feee..95eb218 100644 --- a/src/clox/chunk.d +++ b/src/clox/chunk.d @@ -23,8 +23,10 @@ enum OpCode : ubyte{ @(OpColour("255", "200", "100")) False, @(OpColour("000", "200", "100")) Pop, - @OpStack @(OpColour("060", "200", "150")) GetLocal, + @OpStack @(OpColour("060", "210", "150")) GetLocal, @OpStack @(OpColour("060", "200", "150")) SetLocal, + @OpStack @(OpColour("080", "210", "150")) GetUpvalue, + @OpStack @(OpColour("080", "200", "150")) SetUpvalue, @OpConst @(OpColour("000", "200", "150")) GetGlobal, @OpConst @(OpColour("000", "200", "150")) DefineGlobal, @@ -51,6 +53,8 @@ enum OpCode : ubyte{ @(OpColour("000", "200", "100")) Print, @OpCall @(OpColour("250", "200", "250")) Call, + @(OpColour("250", "200", "250")) Closure, + @(OpColour("250", "200", "050")) CloseUpvalue, @(OpColour("250", "190", "200")) Return, } diff --git a/src/clox/compiler.d b/src/clox/compiler.d index a9e4153..f5080c6 100644 --- a/src/clox/compiler.d +++ b/src/clox/compiler.d @@ -7,7 +7,7 @@ import clox.parser; import clox.chunk; import clox.dbg; import clox.vm; -import clox.object; +import clox.obj; import clox.value; import clox.container.dynarray; import clox.container.varint; @@ -15,17 +15,22 @@ import clox.container.varint; Parser parser; Compiler* currentCompiler; +struct Upvalue{ + int index; + bool isLocal; +} struct Compiler{ Compiler* enclosing; Obj.Function* func; enum FunctionType{ None, Function, Script } FunctionType ftype = FunctionType.Script; struct Local{ - enum Uninitialised = -1; Token name; int depth; + bool isCaptured; } DynArray!Local locals; + DynArray!Upvalue upvalues; int scopeDepth; private Chunk* compilingChunk; Chunk* currentChunk() => &func.chunk; @@ -42,7 +47,7 @@ struct Compiler{ Local local = Local(); local.depth = 0; - local.name.lexeme = ""; + local.name.lexeme = "<>"; locals ~= local; } Obj.Function* compile(){ @@ -61,10 +66,13 @@ struct Compiler{ if(!parser.hadError) currentChunk.disassembleChunk(func.name !is null ? func.name.chars.ptr : "