diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2018-09-18 05:44:26 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2018-09-18 05:44:26 +0000 |
| commit | 2319b4d0729bcb5643c3cf8e645b15fedec11b2e (patch) | |
| tree | 43f1d2ca685089c9a663769e167a170c70191bbf | |
| parent | tape (diff) | |
| download | mmm-2319b4d0729bcb5643c3cf8e645b15fedec11b2e.tar.gz mmm-2319b4d0729bcb5643c3cf8e645b15fedec11b2e.zip | |
tape test
| -rw-r--r-- | duct_tape.moon | 92 | ||||
| -rw-r--r-- | server.moon | 6 |
2 files changed, 59 insertions, 39 deletions
diff --git a/duct_tape.moon b/duct_tape.moon index f6e2a84..35b6b5b 100644 --- a/duct_tape.moon +++ b/duct_tape.moon @@ -1,46 +1,60 @@ -package.noompath = './?.noom;./?/init.noom' +-- package.noompath = './?.noom;./?/init.noom' +package.noompath = './?.moon;./?/init.moon' -local * +export __FNDEF_NOOM_CACHE +__FNDEF_NOOM_CACHE = {} + +assert MODE == 'SERVER', "duct_tape only works on the server" -compile = require "moonscript.compile" -parse = require "moonscript.parse" +compile = require 'moonscript.compile' +parse = require 'moonscript.parse' -import smart_node, build from require "moonscript.types" -import dirsep from require "moonscript.base" --- import split, get_options, unpack from require "moonscript.util" -import get_options, unpack from require "moonscript.util" +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" +line_tables = require 'moonscript.line_tables' lua = :loadstring, :load import p from require 'moon' -matches = (chain) -> - return unless chain[1] == "chain" - ref, call = chain[2], chain[3] - return unless ref[1] == "ref" and call[1] == "call" - ref[2] == "COMPILE" +local * +clone = (a) -> { k,v for k,v in pairs a } transform_extract = (node) -> - { _, ref, call } = node - { _, call_args } = call - fndef = smart_node call_args[1] + fndef = clone node - if #fndef.whitelist > 1 - return 'cannot COMPILE function with whitelist!' + -- if #fndef.whitelist > 1 + -- return "cannot COMPILE function with whitelist!" - code, ltable, pos = compile.tree { fndef } + -- compile the function to Lua separately + code, ltable, pos = compile.tree { clone fndef } if not code return compile.format_error(ltable, pos, text) - node[1] = "string" - node[2] = "'" - node[3] = code - node[-1] = nil + -- mutate the node in-place + node[1] = 'do' + for i=2,5 + node[i] = nil + + -- assign the lua code to __FNDEF_NOOM_CACHE[function] so it can be retrieved by `compile` + fn = { 'ref', 'fn' } + reference = build.chain { + base: '__FNDEF_NOOM_CACHE', + { 'index', fn } + } + + node[2] = { + { 'declare_with_shadows', { 'fn' } } + build.assign_one fn, fndef + build.assign_one reference, { 'string', '[[', code } + fn + } + nil transform_extracts = (node) -> - if matches node + if node[1] == "fndef" transform_extract node else err = nil @@ -99,17 +113,23 @@ loadstring = (...) -> -- the unpack prevents us from passing nil (lua.loadstring or lua.load) code, chunk_name, unpack { mode, env } -insert_loader = (pos=2) -> - -- if not package.moonpath - -- package.moonpath = create_moonpath package.path +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 - loaders = package.loaders or package.searchers - for loader in *loaders - return false if loader == noom_loader + table.insert loaders, pos, noom_loader + true - 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 -} + { + :insert_loader + :compile + } diff --git a/server.moon b/server.moon index 0253faf..283672e 100644 --- a/server.moon +++ b/server.moon @@ -1,8 +1,5 @@ package.moonpath = './?.server.moon;' .. package.moonpath -import insert_loader from require 'duct_tape' -insert_loader! - export MODE, warn, append MODE = 'SERVER' warn = (...) -> @@ -17,6 +14,9 @@ flush = -> with x = buffer buffer = '' +import insert_loader from require 'duct_tape' +insert_loader! + error "please specify the module to build as an argumnet" unless arg[1] require "app.#{arg[1]}" |
