From 95d69dfa2c95bf571998561bc43115be3ab471cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Tue, 9 Jan 2024 17:23:26 +0100 Subject: [PATCH] Add Struct:get_strict --- anselme/ast/Environment.lua | 12 ++++-------- anselme/ast/Struct.lua | 10 ++++++++-- anselme/ast/Table.lua | 4 ++++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/anselme/ast/Environment.lua b/anselme/ast/Environment.lua index ad44153..336babc 100644 --- a/anselme/ast/Environment.lua +++ b/anselme/ast/Environment.lua @@ -157,16 +157,14 @@ local Environment = ast.abstract.Runtime { -- returns nil if undefined _lookup = function(self, state, identifier) local _cache = self._lookup_cache - local var - if not _cache:has(state, identifier) then + local var = _cache:get_strict(state, identifier) + if not var then if self.variables:has(state, identifier) then var = self.variables:get(state, identifier) elseif self.parent then var = self.parent:_lookup(state, identifier) end if var then _cache:set(state, identifier, var) end - else - var = _cache:get(state, identifier) end if var and not var:undefined(state) then return var @@ -177,8 +175,8 @@ local Environment = ast.abstract.Runtime { _lookup_in_current = function(self, state, symbol) local identifier = symbol:to_identifier() local _cache = self._lookup_cache_current - local var - if not _cache:has(state, identifier) then + local var = _cache:get_strict(state, identifier) + if not var then local name = symbol.string if self.variables:has(state, identifier) then var = self.variables:get(state, identifier) @@ -188,8 +186,6 @@ local Environment = ast.abstract.Runtime { end end if var then _cache:set(state, identifier, var) end - else - var = _cache:get(state, identifier) end if var and not var:undefined(state) then return var diff --git a/anselme/ast/Struct.lua b/anselme/ast/Struct.lua index 7680156..b7da15b 100644 --- a/anselme/ast/Struct.lua +++ b/anselme/ast/Struct.lua @@ -109,11 +109,17 @@ Struct = ast.abstract.Runtime { end, get = function(self, key) + local v = self:get_strict(key) + if v ~= nil then + return v + else + return Nil:new() + end + end, + get_strict = function(self, key) local hash = key:hash() if self.table[hash] then return self.table[hash][2] - else - return Nil:new() end end, has = function(self, key) diff --git a/anselme/ast/Table.lua b/anselme/ast/Table.lua index e3e2056..16914c7 100644 --- a/anselme/ast/Table.lua +++ b/anselme/ast/Table.lua @@ -41,6 +41,10 @@ Table = ast.abstract.Runtime { return self.branched:get(state) end, + get_strict = function(self, state, key) + local s = self.branched:get(state) + return s:get_strict(key) + end, get = function(self, state, key) local s = self.branched:get(state) return s:get(key)