efl

Форк
0
/
module.lua 
126 строк · 3.2 Кб
1
-- elua module system
2

3
local M = {}
4

5
local cutil = select(2, ...)
6

7
local preload = {
8
    ffi   = package.preload["ffi"],
9
    cutil = function() return cutil end
10
}
11

12
local loaded = {
13
}
14

15
M.loaded  = loaded
16
M.preload = preload
17

18
for k, v in pairs(package.loaded) do loaded[k] = v end
19

20
M.path  = "./?.lua;./?/init.lua"
21
M.cpath = ""
22
M.apath = "./?.lua"
23

24
local loadlib = package.loadlib
25

26
local cloader_load = function(soname, modname)
27
    local hyp = modname:find("%-")
28
    if hyp then modname = modname:sub(hyp + 1) end
29
    local  f, err = loadlib(soname, "luaopen_" .. (modname:gsub("%.", "_")))
30
    if not f then
31
        error("error loading module '" .. modname .. "' from file '"
32
            .. fname .. "':\n" .. err, 3)
33
    end
34
    return f
35
end
36

37
local loaders = {
38
    function(modname)
39
        local  v = preload[modname]
40
        if not v then
41
            return ("\no field preload['%s']"):format(modname)
42
        end
43
        return v
44
    end,
45
    function(modname)
46
        local  fname, err = package.searchpath(modname, M.path)
47
        if not fname then return err end
48
        local  f, err = loadfile(fname)
49
        if not f then
50
            error("error loading module '" .. modname .. "' from file '"
51
                .. fname .. "':\n" .. err, 2)
52
        end
53
        return f
54
    end,
55
    function(modname)
56
        local  fname, err = package.searchpath(modname, M.cpath)
57
        if not fname then return err end
58
        local hyp = modname:find("%-")
59
        if hyp then modname = modname:sub(hyp + 1) end
60
        return cloader_load(fname, modname)
61
    end,
62
    function(modname)
63
        local rootname, dot = modname, modname:find("%.")
64
        if dot then
65
            rootname = rootname:sub(dot + 1)
66
        end
67
        local  fname, err = package.searchpath(rootname, M.cpath)
68
        if not fname then return err end
69
        return cloader_load(fname, modname)
70
    end
71
}
72
M.loaders = loaders
73

74
local find_loader = function(modname, env)
75
    env = env or _G
76
    local err = { ("module '%s' not found\n"):format(modname) }
77
    for i = 1, #loaders do
78
        local v = loaders[i](modname)
79
        if type(v) == "function" then
80
            local status, ret = pcall(function() return setfenv(v, env) end)
81
            return status and ret or v
82
        elseif type(v) == "string" then
83
            err[#err + 1] = v
84
        end
85
    end
86
    return nil, table.concat(err)
87
end
88

89
M.require = function(modname, ...)
90
    local v = loaded[modname]
91
    if v ~= nil then return v end
92
    local  loader, err = find_loader(modname)
93
    if not loader then error(err, 2) end
94
    local ret = loader(modname, ...)
95
    if ret ~= nil then
96
        loaded[modname] = ret
97
        return ret
98
    elseif loaded[modname] == nil then
99
        loaded[modname] = true
100
        return true
101
    end
102
    return loaded[modname]
103
end
104

105
M.load_app = function(appname)
106
    local  fname, err = package.searchpath(appname, M.apath)
107
    if not fname then return nil, err end
108
    local f, err = loadfile(fname)
109
    if not f then return nil, err end
110
    return f
111
end
112

113
M.preload = preload
114
M.loaded  = loaded
115

116
-- register require
117
M.path, M.apath = (...)(M.require, M.load_app, M.path, M.apath)
118

119
M.config     = package.config
120
M.searchpath = package.searchpath
121
M.loadlib    = package.loadlib
122

123
_G["require"] = M.require
124
_G["package"] = M
125

126
return M
127

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.