diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-02-05 15:34:57 -0800 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-02-05 15:35:06 -0800 |
| commit | e8d5d2a24061347a96ae9feda45ceb0d6dca09be (patch) | |
| tree | 51f97cfeb21af11a598c000a4758262e2082e8c1 /nomsu.lua | |
| parent | d02b4b8718fd06116a52b2be57c81f3f44a4ba33 (diff) | |
Added check for circular imports.
Diffstat (limited to 'nomsu.lua')
| -rw-r--r-- | nomsu.lua | 24 |
1 files changed, 21 insertions, 3 deletions
@@ -416,9 +416,26 @@ do return error("Invalid filetype for " .. tostring(filename), 0) end end, - require_file = function(self, filename) + use_file = function(self, filename) local loaded = self.environment.LOADED if not loaded[filename] then + for i, f in ipairs(self.use_stack) do + if f == filename then + local loop + do + local _accum_0 = { } + local _len_0 = 1 + for j = i, #self.use_stack do + _accum_0[_len_0] = self.use_stack[j] + _len_0 = _len_0 + 1 + end + loop = _accum_0 + end + insert(loop, filename) + error("Circular import, this loops forever: " .. tostring(concat(loop, " -> "))) + end + end + insert(self.use_stack, filename) loaded[filename] = self:run_file(filename) or true end return loaded[filename] @@ -1358,9 +1375,9 @@ do end) return self:define_compile_action("use %filename", get_line_no(), function(_filename) local filename = nomsu:tree_to_value(_filename) - nomsu:require_file(filename) + nomsu:use_file(filename) return { - expr = "nomsu:require_file(" .. tostring(repr(filename)) .. ");" + expr = "nomsu:use_file(" .. tostring(repr(filename)) .. ");" } end) end @@ -1383,6 +1400,7 @@ do return id end }) + self.use_stack = { } self.compilestack = { } self.debug = false self.environment = { |
