Software /
code /
prosody
Annotate
util/require.lua @ 1994:9cc9b096c8f5
modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sun, 18 Oct 2009 05:17:07 +0500 |
parent | 1965:f641e7ee171c |
rev | line source |
---|---|
1965
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 -- Prosody IM |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 -- Copyright (C) 2008-2009 Matthew Wild |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2008-2009 Waqas Hussain |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 -- This project is MIT/X11 licensed. Please see the |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 -- COPYING file in the source package for more information. |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 -- Based on Kepler Compat-5.1 code |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 -- Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/compat) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 -- $Id: compat-5.1.lua,v 1.22 2006/02/20 21:12:47 carregal Exp $ |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 local LUA_DIRSEP = '/' |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 local LUA_OFSEP = '_' |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 local OLD_LUA_OFSEP = '' |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 local POF = 'luaopen_' |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 local LUA_PATH_MARK = '?' |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 local LUA_IGMARK = ':' |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 local assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type = assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 local find, format, gfind, gsub, sub = string.find, string.format, string.gfind, string.gsub, string.sub |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 if package.nonglobal_module then return; end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 package.nonglobal_module = true; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 local _PACKAGE = package |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 local _LOADED = package.loaded |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 local _PRELOAD = package.preload |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 -- looks for a file `name' in given path |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 local function findfile (name, pname) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 name = gsub (name, "%.", LUA_DIRSEP) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 local path = _PACKAGE[pname] |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 assert (type(path) == "string", format ("package.%s must be a string", pname)) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 for c in gfind (path, "[^;]+") do |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 c = gsub (c, "%"..LUA_PATH_MARK, name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 local f = io.open (c) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 if f then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 f:close () |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 return c |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 return nil -- not found |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 -- check whether library is already loaded |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 local function loader_preload (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 assert (type(name) == "string", format ( |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 "bad argument #1 to `require' (string expected, got %s)", type(name))) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 assert (type(_PRELOAD) == "table", "`package.preload' must be a table") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 return _PRELOAD[name] |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 -- Lua library loader |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 local function loader_Lua (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 assert (type(name) == "string", format ( |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 "bad argument #1 to `require' (string expected, got %s)", type(name))) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 local filename = findfile (name, "path") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 if not filename then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 return false |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 local f, err = loadfile (filename) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 if not f then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 error (format ("error loading module `%s' (%s)", name, err)) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 return f |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 local function mkfuncname (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 name = gsub (name, "^.*%"..LUA_IGMARK, "") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 name = gsub (name, "%.", LUA_OFSEP) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 return POF..name |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 local function old_mkfuncname (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 --name = gsub (name, "^.*%"..LUA_IGMARK, "") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 name = gsub (name, "%.", OLD_LUA_OFSEP) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 return POF..name |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 -- C library loader |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 local function loader_C (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 assert (type(name) == "string", format ( |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 "bad argument #1 to `require' (string expected, got %s)", type(name))) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 local filename = findfile (name, "cpath") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 if not filename then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 return false |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 local funcname = mkfuncname (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 local f, err = loadlib (filename, funcname) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 if not f then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 funcname = old_mkfuncname (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 f, err = loadlib (filename, funcname) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 if not f then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 error (format ("error loading module `%s' (%s)", name, err)) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 return f |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 local function loader_Croot (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 local p = gsub (name, "^([^.]*).-$", "%1") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 if p == "" then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 return |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 local filename = findfile (p, "cpath") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 if not filename then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 return |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 local funcname = mkfuncname (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 local f, err, where = loadlib (filename, funcname) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 if f then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 return f |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 elseif where ~= "init" then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 error (format ("error loading module `%s' (%s)", name, err)) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 -- create `loaders' table |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 package.loaders = package.loaders or { loader_preload, loader_Lua, loader_C, loader_Croot, } |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 local _LOADERS = package.loaders |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 -- iterate over available loaders |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 local function load (name, loaders) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 -- iterate over available loaders |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 assert (type (loaders) == "table", "`package.loaders' must be a table") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 for i, loader in ipairs (loaders) do |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 local f = loader (name) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 if f then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 return f |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 error (format ("module `%s' not found", name)) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 -- sentinel |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 local sentinel = function () end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 local old_require = _G.require; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 local dep_path = {}; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 local current_env = nil; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 function _G.require(modname) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 --table.insert(dep_path, modname); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 --if getfenv(2) == getfenv(0) --[[and rawget(_G, "__locked")]] then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 -- print("**** Uh-oh, require called from locked global env at "..table.concat(dep_path, "->"), debug.traceback()); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 --end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 if not current_env and rawget(_G, "__locked") then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 _G.prosody.unlock_globals(); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 _G.__locked = false; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 local old_current_env; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 old_current_env, current_env = current_env, getfenv(2); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 local ok, ret = pcall(old_require, modname); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 current_env = old_current_env; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 if not current_env and rawget(_G, "__locked") == false then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 _G.prosody.lock_globals(); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 --table.remove(dep_path); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 if not ok then error(ret, 0); end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 return ret; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 -- findtable |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 local function findtable (t, f) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 assert (type(f)=="string", "not a valid field name ("..tostring(f)..")") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 local ff = f.."." |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 local ok, e, w = find (ff, '(.-)%.', 1) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 while ok do |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 local nt = rawget (t, w) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 if not nt then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 nt = {} |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 t[w] = nt |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 elseif type(t) ~= "table" then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
190 return sub (f, e+1) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
191 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 t = nt |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 ok, e, w = find (ff, '(.-)%.', e+1) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 return t |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 -- new package.seeall function |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
201 function _PACKAGE.seeall (module) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 local t = type(module) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 assert (t == "table", "bad argument #1 to package.seeall (table expected, got "..t..")") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 local meta = getmetatable (module) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
205 if not meta then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 meta = {} |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 setmetatable (module, meta) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 meta.__index = _G |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 -- new module function |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
215 -- |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
216 function _G.module (modname, ...) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 local ns = _LOADED[modname]; |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
218 if type(ns) ~= "table" then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
219 --if not current_env then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
220 -- print("module outside require for "..modname.." at "..debug.traceback()); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
221 --end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
222 ns = findtable (current_env or getfenv(2), modname); |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
223 if not ns then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
224 error (string.format ("name conflict for module '%s'", modname)) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
225 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
226 _LOADED[modname] = ns |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
227 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
228 if not ns._NAME then |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
229 ns._NAME = modname |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
230 ns._M = ns |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
231 ns._PACKAGE = gsub (modname, "[^.]*$", "") |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
232 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
233 setfenv (2, ns) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
234 for i, f in ipairs (arg) do |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
235 f (ns) |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
236 end |
f641e7ee171c
util.require: A replacement for Lua's require/module that doesn't load into the global environment by default (C modules still get past this)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
237 end |