aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2018-10-28 04:22:15 +0000
committers-ol <s-ol@users.noreply.github.com>2018-10-28 04:22:15 +0000
commitb0c4ec80d691ac3e71f964529695cf0ce0944f8e (patch)
tree805a79ff3258d1031363074b6a424efe6ec698fc /lib
parentadd some icons (diff)
downloadmmm-b0c4ec80d691ac3e71f964529695cf0ce0944f8e.tar.gz
mmm-b0c4ec80d691ac3e71f964529695cf0ce0944f8e.zip
move duct_tape to lib
Diffstat (limited to 'lib')
-rw-r--r--lib/duct_tape.server.moon130
-rw-r--r--lib/init.server.moon2
2 files changed, 131 insertions, 1 deletions
diff --git a/lib/duct_tape.server.moon b/lib/duct_tape.server.moon
new file mode 100644
index 0000000..b019ac8
--- /dev/null
+++ b/lib/duct_tape.server.moon
@@ -0,0 +1,130 @@
+package.noompath = './?.moon;./?/init.moon'
+
+export __FNDEF_NOOM_CACHE
+__FNDEF_NOOM_CACHE = setmetatable {}, __mode: 'k'
+
+assert MODE == 'SERVER', "duct_tape only works on the server"
+
+compile = require 'moonscript.compile'
+parse = require 'moonscript.parse'
+
+import smart_node, build from require 'moonscript.types'
+import dirsep from require 'moonscript.base'
+import get_options, unpack from require 'moonscript.util'
+
+line_tables = require 'moonscript.line_tables'
+lua = :loadstring, :load
+
+local *
+
+escape_str = (str) -> (str\gsub('\\', '\\\\')\gsub '"', '\\"'), nil
+
+deep_clone = (value) ->
+ if 'table' == type value
+ { deep_clone(k), deep_clone(v) for k,v in pairs value }
+ else -- number, string, boolean, etc
+ value
+
+transform_fndef = (fndef, parent, i) ->
+ -- compile the function to Lua separately
+ code, ltable, pos = compile.tree { deep_clone fndef }
+ if not code
+ return compile.format_error(ltable, pos, text)
+
+ code = "(function() #{code} end)()"
+
+ -- assign the lua code to __FNDEF_NOOM_CACHE[function] so it can be retrieved by `compile`
+ fn = -> { 'ref', 'fn' }
+ cache = build.chain {
+ base: '__FNDEF_NOOM_CACHE',
+ { 'index', fn! }
+ }
+
+ parent[i] = build.do {
+ { 'declare_with_shadows', { 'fn' } }
+ build.assign_one fn!, fndef
+ build.assign_one cache, { 'string', '"', escape_str code }
+ -- build.assign_one cache, { 'string', '[[', code }
+ fn!
+ }
+
+ nil
+
+find_fndefs = (node, p, i) ->
+ if node[1] == "fndef"
+ transform_fndef node, p, i
+ else
+ for i = 1,#node
+ v = node[i]
+ find_fndefs v, node, i if 'table' == type v
+
+to_lua = (text, options={}) ->
+ if "string" != type text
+ t = type text
+ return nil, "expecting string (got ".. t ..")"
+
+ tree, err = parse.string text
+ if not tree
+ return nil, err
+
+ find_fndefs tree
+
+ code, ltable, pos = compile.tree tree, options
+ if not code
+ return nil, compile.format_error(ltable, pos, text)
+
+ code, ltable
+
+noom_loader = (name, ...) ->
+ name_path = name\gsub "%.", dirsep
+
+ local file, file_path
+ for path in package.noompath\gmatch "[^;]+"
+ file_path = path\gsub "?", name_path
+ file = io.open file_path
+ break if file
+
+ if file
+ text = file\read "*a"
+ file\close!
+ res, err = loadstring text, "@#{file_path}"
+ if not res
+ error file_path .. ": " .. err
+
+ return res
+
+ return nil, "Could not find noom file"
+
+loadstring = (...) ->
+ options, str, chunk_name, mode, env = get_options ...
+ chunk_name or= "=(noom.loadstring)"
+
+ code, ltable_or_err = to_lua str, options
+ unless code
+ return nil, ltable_or_err
+
+ line_tables[chunk_name] = ltable_or_err if chunk_name
+
+ -- the unpack prevents us from passing nil
+ (lua.loadstring or lua.load) code, chunk_name, unpack { mode, env }
+
+do
+ local compile
+ insert_loader = (pos=2) ->
+ -- if not package.moonpath
+ -- package.moonpath = create_moonpath package.path
+
+ loaders = package.loaders or package.searchers
+ for loader in *loaders
+ return false if loader == noom_loader
+
+ table.insert loaders, pos, noom_loader
+ true
+
+ compile = (fn) -> with code = __FNDEF_NOOM_CACHE[fn]
+ assert code, 'cannot compile function not loaded from noomscript source.'
+
+ {
+ :insert_loader
+ :compile
+ }
diff --git a/lib/init.server.moon b/lib/init.server.moon
index 5e0cb30..a91bd52 100644
--- a/lib/init.server.moon
+++ b/lib/init.server.moon
@@ -25,7 +25,7 @@ buffer = ''
append = (val) ->
buffer ..= val
-import compile, insert_loader from require 'duct_tape'
+import compile, insert_loader from require 'lib.duct_tape'
insert_loader!
on_client = (fn, ...) ->