aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2018-09-18 05:44:26 +0000
committers-ol <s-ol@users.noreply.github.com>2018-09-18 05:44:26 +0000
commit2319b4d0729bcb5643c3cf8e645b15fedec11b2e (patch)
tree43f1d2ca685089c9a663769e167a170c70191bbf
parenttape (diff)
downloadmmm-2319b4d0729bcb5643c3cf8e645b15fedec11b2e.tar.gz
mmm-2319b4d0729bcb5643c3cf8e645b15fedec11b2e.zip
tape test
-rw-r--r--duct_tape.moon92
-rw-r--r--server.moon6
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]}"