diff options
Diffstat (limited to '')
| -rw-r--r-- | src/MoonPlus.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/MoonPlus.h b/src/MoonPlus.h new file mode 100644 index 0000000..da5f3ac --- /dev/null +++ b/src/MoonPlus.h | |||
| @@ -0,0 +1,125 @@ | |||
| 1 | R"moonscript_codes( | ||
| 2 | import "moonp" | ||
| 3 | import concat, insert, remove from table | ||
| 4 | unpack = unpack or table.unpack | ||
| 5 | lua = :loadstring, :load | ||
| 6 | |||
| 7 | local * | ||
| 8 | |||
| 9 | dirsep = "/" | ||
| 10 | |||
| 11 | moonp.moon_compiled = {} | ||
| 12 | |||
| 13 | split = (str, delim) -> | ||
| 14 | return {} if str == "" | ||
| 15 | str ..= delim | ||
| 16 | [m for m in str\gmatch("(.-)"..delim)] | ||
| 17 | |||
| 18 | get_options = (...) -> | ||
| 19 | count = select "#", ... | ||
| 20 | opts = select count, ... | ||
| 21 | if type(opts) == "table" | ||
| 22 | opts, unpack {...}, nil, count - 1 | ||
| 23 | else | ||
| 24 | {}, ... | ||
| 25 | |||
| 26 | -- create moon path package from lua package path | ||
| 27 | create_moonpath = (package_path) -> | ||
| 28 | moonpaths = for path in *split package_path, ";" | ||
| 29 | prefix = path\match "^(.-)%.lua$" | ||
| 30 | continue unless prefix | ||
| 31 | prefix .. ".moon" | ||
| 32 | concat moonpaths, ";" | ||
| 33 | |||
| 34 | moon_loader = (name) -> | ||
| 35 | name_path = name\gsub "%.", dirsep | ||
| 36 | |||
| 37 | local file, file_path | ||
| 38 | for path in package.moonpath\gmatch "[^;]+" | ||
| 39 | file_path = path\gsub "?", name_path | ||
| 40 | file = io.open file_path | ||
| 41 | break if file | ||
| 42 | |||
| 43 | if file | ||
| 44 | text = file\read "*a" | ||
| 45 | file\close! | ||
| 46 | res, err = loadstring text, "@#{file_path}" | ||
| 47 | if not res | ||
| 48 | error file_path .. ": " .. err | ||
| 49 | |||
| 50 | return res | ||
| 51 | |||
| 52 | return nil, "Could not find moon file" | ||
| 53 | |||
| 54 | |||
| 55 | loadstring = (...) -> | ||
| 56 | options, str, chunk_name, mode, env = get_options ... | ||
| 57 | chunk_name or= "=(moonscript.loadstring)" | ||
| 58 | |||
| 59 | code, err = moonp.to_lua str, options | ||
| 60 | unless code | ||
| 61 | return nil, err | ||
| 62 | |||
| 63 | moonp.moon_compiled[chunk_name] = code if chunk_name | ||
| 64 | -- the unpack prevents us from passing nil | ||
| 65 | (lua.loadstring or lua.load) code, chunk_name, unpack { mode, env } | ||
| 66 | |||
| 67 | loadfile = (fname, ...) -> | ||
| 68 | file, err = io.open fname | ||
| 69 | return nil, err unless file | ||
| 70 | text = assert file\read "*a" | ||
| 71 | file\close! | ||
| 72 | loadstring text, "@#{fname}", ... | ||
| 73 | |||
| 74 | -- throws errros | ||
| 75 | dofile = (...) -> | ||
| 76 | f = assert loadfile ... | ||
| 77 | f! | ||
| 78 | |||
| 79 | insert_loader = (pos=2) -> | ||
| 80 | if not package.moonpath | ||
| 81 | package.moonpath = create_moonpath package.path | ||
| 82 | |||
| 83 | loaders = package.loaders or package.searchers | ||
| 84 | for loader in *loaders | ||
| 85 | return false if loader == moon_loader | ||
| 86 | |||
| 87 | insert loaders, pos, moon_loader | ||
| 88 | true | ||
| 89 | |||
| 90 | remove_loader = -> | ||
| 91 | loaders = package.loaders or package.searchers | ||
| 92 | |||
| 93 | for i, loader in ipairs loaders | ||
| 94 | if loader == moon_loader | ||
| 95 | remove loaders, i | ||
| 96 | return true | ||
| 97 | |||
| 98 | false | ||
| 99 | |||
| 100 | moon_require = (name)-> | ||
| 101 | insert_loader! | ||
| 102 | xpcall (-> require name), (err)-> | ||
| 103 | msg = moonp.stp.stacktrace err, 2 | ||
| 104 | print msg | ||
| 105 | |||
| 106 | setmetatable moonp, { | ||
| 107 | __index: (key)=> | ||
| 108 | return nil unless key == "stp" | ||
| 109 | stp = rawget moonp,"stp" | ||
| 110 | unless stp | ||
| 111 | stp = with moonp.load_stacktraceplus! | ||
| 112 | .dump_locals = false | ||
| 113 | .simplified = true | ||
| 114 | rawset moonp,"stp",stp | ||
| 115 | rawset moonp,"load_stacktraceplus",nil | ||
| 116 | stp | ||
| 117 | __call: (name)=> @.require name | ||
| 118 | } | ||
| 119 | |||
| 120 | moonp[k] = v for k,v in pairs { | ||
| 121 | :insert_loader, :remove_loader, :moon_loader, :dirsep, | ||
| 122 | :dofile, :loadfile, :loadstring, :create_moonpath, | ||
| 123 | require:moon_require | ||
| 124 | } | ||
| 125 | )moonscript_codes"; | ||
