From 3c1eaf165b7324beaf0249c255bf64beb0717ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Wed, 29 Jan 2014 20:37:41 +0100 Subject: [PATCH] properly handling errors in module loaders in package library (avoid lingering entry in "loading" table); throwing an error in robot library if its not a robot; automatically trying to load modules in interpreter (somewhat experimental) --- assets/opencomputers/lua/rom/bin/lua.lua | 9 ++++++++- assets/opencomputers/lua/rom/lib/package.lua | 15 +++++++++------ assets/opencomputers/lua/rom/lib/robot.lua | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/assets/opencomputers/lua/rom/bin/lua.lua b/assets/opencomputers/lua/rom/bin/lua.lua index f34c238d9..a19372e6e 100644 --- a/assets/opencomputers/lua/rom/bin/lua.lua +++ b/assets/opencomputers/lua/rom/bin/lua.lua @@ -3,9 +3,16 @@ local package = require("package") local term = require("term") local text = require("text") +local function optrequire(...) + local success, module = pcall(require, ...) + if success then + return module + end +end + local history = {} local env = setmetatable({}, {__index = function(t, k) - return _ENV[k] or package.loaded[k] + return _ENV[k] or optrequire(k) end}) component.gpu.setForeground(0xFFFFFF) diff --git a/assets/opencomputers/lua/rom/lib/package.lua b/assets/opencomputers/lua/rom/lib/package.lua index b86fdabda..2b9882417 100644 --- a/assets/opencomputers/lua/rom/lib/package.lua +++ b/assets/opencomputers/lua/rom/lib/package.lua @@ -74,12 +74,12 @@ table.insert(package.searchers, pathSearcher) function require(module) checkArg(1, module, "string") - if loaded[module] then + if loaded[module] ~= nil then return loaded[module] elseif not loading[module] then loading[module] = true local loader, value, errorMsg = nil, nil, {"module '" .. module .. "' not found:"} - for i=1, #package.searchers do + for i = 1, #package.searchers do local f, extra = package.searchers[i](module) if f and type(f) ~= "string" then loader = f @@ -90,20 +90,23 @@ function require(module) end end if loader then - local result = loader(module, value) + local success, result = pcall(loader, module, value) + loading[module] = false + if not success then + error(result, 2) + end if result then loaded[module] = result elseif not loaded[module] then loaded[module] = true end - loading[module] = false return loaded[module] else loading[module] = false - error(table.concat(errorMsg, "\n")) + error(table.concat(errorMsg, "\n"), 2) end else - error("already loading: " .. module) + error("already loading: " .. module, 2) end end diff --git a/assets/opencomputers/lua/rom/lib/robot.lua b/assets/opencomputers/lua/rom/lib/robot.lua index f991367e0..16d66b1f5 100644 --- a/assets/opencomputers/lua/rom/lib/robot.lua +++ b/assets/opencomputers/lua/rom/lib/robot.lua @@ -3,7 +3,7 @@ local computer = require("computer") local sides = require("sides") if not computer.isRobot() then - return nil, "not a robot" + error("not a robot") end local robot = {}