From 289f10b3c5b137c61e93a5f1c2910654ffc1c61b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Wed, 3 Jan 2024 17:46:29 +0100 Subject: [PATCH] Branch serialization only keep current branch --- anselme/ast/Branched.lua | 13 ++++++++++++- anselme/state/State.lua | 7 ++++++- anselme/stdlib/closure.lua | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/anselme/ast/Branched.lua b/anselme/ast/Branched.lua index b4d1857..563f7fd 100644 --- a/anselme/ast/Branched.lua +++ b/anselme/ast/Branched.lua @@ -4,7 +4,8 @@ local ast = require("anselme.ast") -local Branched = ast.abstract.Runtime { +local Branched +Branched = ast.abstract.Runtime { type = "branched", mutable = true, @@ -53,6 +54,16 @@ local Branched = ast.abstract.Runtime { _eval = function(self, state) return self:get(state) + end, + + -- serialize/deserialize in current branch and discard other branches + _serialize = function(self) + local state = require("anselme.serializer_state") + return self:get(state) + end, + _deserialize = function(self) + local state = require("anselme.serializer_state") + return Branched:new(state, self) end } diff --git a/anselme/state/State.lua b/anselme/state/State.lua index 5d9390c..18b670b 100644 --- a/anselme/state/State.lua +++ b/anselme/state/State.lua @@ -114,13 +114,18 @@ State = class { -- This can be loaded back later using `:load`. save = function(self) local struct = persistent_manager:get_struct(self) - return binser.serialize(anselme.versions.save, struct) + package.loaded["anselme.serializer_state"] = self + local r = binser.serialize(anselme.versions.save, struct) + package.loaded["anselme.serializer_state"] = nil + return r end, --- Load a string generated by `:save`. -- -- Variables that already exist will be overwritten with the loaded data. load = function(self, save) + package.loaded["anselme.serializer_state"] = self local version, struct = binser.deserializeN(save, 2) + package.loaded["anselme.serializer_state"] = nil if version ~= anselme.versions.save then print("Loading a save file generated by a different Anselme version, things may break!") end for key, val in struct:iter() do persistent_manager:set(self, key, val) diff --git a/anselme/stdlib/closure.lua b/anselme/stdlib/closure.lua index 5e5e010..7265c80 100644 --- a/anselme/stdlib/closure.lua +++ b/anselme/stdlib/closure.lua @@ -10,7 +10,7 @@ return { { "defined", "(c::function, s::string)", function(state, c, s) - return Boolean:new(c.scope:defined_in_current_strict(state, s:to_identifier())) + return Boolean:new(c.scope:defined_in_current(state, s:to_identifier())) end }, {