aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/timeout.nom8
-rw-r--r--nomsu.lua19
-rwxr-xr-xnomsu.moon12
3 files changed, 25 insertions, 14 deletions
diff --git a/lib/timeout.nom b/lib/timeout.nom
deleted file mode 100644
index dc5212d..0000000
--- a/lib/timeout.nom
+++ /dev/null
@@ -1,8 +0,0 @@
-require "lib/core.nom"
-rule [cap at %num instructions] =:
- lua code ".."
- |print("capped at", \(%num))
- |local f = function()
- | nomsu:error("Execution quota exceeded. Your code took too long.")
- |end
- |debug.sethook(f, "", \(%num))
diff --git a/nomsu.lua b/nomsu.lua
index 69e17ca..0dd9d5f 100644
--- a/nomsu.lua
+++ b/nomsu.lua
@@ -332,7 +332,17 @@ do
end
return tree
end,
- run = function(self, src, filename)
+ run = function(self, src, filename, max_operations)
+ if max_operations == nil then
+ max_operations = nil
+ end
+ if max_operations then
+ local timeout
+ timeout = function()
+ return self:error("Execution quota exceeded. Your code took too long.")
+ end
+ debug.sethook(timeout, "", max_operations)
+ end
local tree = self:parse(src, filename)
assert(tree, "Tree failed to compile: " .. tostring(src))
assert(tree.type == "File", "Attempt to run non-file: " .. tostring(tree.type))
@@ -388,6 +398,9 @@ do
%s
return ret;
end);]]):format(concat(buffer, "\n"))
+ if max_operations then
+ debug.sethook()
+ end
return return_value, lua_code
end,
tree_to_value = function(self, tree, vars)
@@ -896,7 +909,7 @@ if arg then
end
end
if not args.input or args.flags["-i"] then
- c:run('require "lib/core.nom"')
+ c:run('require "lib/core.nom"', "stdin")
while true do
local buff = ""
while true do
@@ -911,7 +924,7 @@ if arg then
break
end
local ok, ret = pcall(function()
- return c:run(buff)
+ return c:run(buff, "stdin")
end)
if ok and ret ~= nil then
print("= " .. repr(ret))
diff --git a/nomsu.moon b/nomsu.moon
index 7c96f81..4728c91 100755
--- a/nomsu.moon
+++ b/nomsu.moon
@@ -274,7 +274,11 @@ class NomsuCompiler
@print_tree tree, " "
return tree
- run: (src, filename)=>
+ run: (src, filename, max_operations=nil)=>
+ if max_operations
+ timeout = ->
+ @error "Execution quota exceeded. Your code took too long."
+ debug.sethook timeout, "", max_operations
tree = @parse(src, filename)
assert tree, "Tree failed to compile: #{src}"
assert tree.type == "File", "Attempt to run non-file: #{tree.type}"
@@ -321,6 +325,8 @@ class NomsuCompiler
%s
return ret;
end);]])\format(concat(buffer, "\n"))
+ if max_operations
+ debug.sethook!
return return_value, lua_code
tree_to_value: (tree, vars)=>
@@ -635,7 +641,7 @@ if arg
if not args.input or args.flags["-i"]
-- REPL
- c\run('require "lib/core.nom"')
+ c\run('require "lib/core.nom"', "stdin")
while true
buff = ""
while true
@@ -646,7 +652,7 @@ if arg
buff ..= line
if #buff == 0
break
- ok, ret = pcall(-> c\run(buff))
+ ok, ret = pcall(-> c\run(buff, "stdin"))
if ok and ret != nil
print "= "..repr(ret)