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 }, {