local script = [[
print 'hello'
print 'world'
for i=0,3 do
local answer = 42
end
]]
local script_function = loadstring(script)
local function count_lines ()
local count = 0
for k,v in script:gmatch '\n' do count = count+1 end
return count
end
local function trace(total_lines)
local max_last_line = 0
return function(info,line_number)
if line_number > max_last_line then
print(tostring(line_number/total_lines*100)..'%')
max_last_line = line_number
end
end
end
local lines = count_lines()
local thread = coroutine.create( script_function )
debug.sethook(thread, trace(lines), "l")
coroutine.resume(thread)
bG9jYWwgc2NyaXB0ID0gW1sKCXByaW50ICdoZWxsbycKCXByaW50ICd3b3JsZCcKCWZvciBpPTAsMyBkbwoJCWxvY2FsIGFuc3dlciA9IDQyCgllbmQKXV0KCmxvY2FsIHNjcmlwdF9mdW5jdGlvbiA9IGxvYWRzdHJpbmcoc2NyaXB0KQoKbG9jYWwgZnVuY3Rpb24gY291bnRfbGluZXMgKCkKCWxvY2FsIGNvdW50ID0gMAoJZm9yIGssdiBpbiBzY3JpcHQ6Z21hdGNoICdcbicgZG8gY291bnQgPSBjb3VudCsxIGVuZAoJcmV0dXJuIGNvdW50CmVuZAoKbG9jYWwgZnVuY3Rpb24gdHJhY2UodG90YWxfbGluZXMpCglsb2NhbCBtYXhfbGFzdF9saW5lID0gMAoJcmV0dXJuIGZ1bmN0aW9uKGluZm8sbGluZV9udW1iZXIpCgkJaWYgbGluZV9udW1iZXIgPiBtYXhfbGFzdF9saW5lIHRoZW4KCQkJcHJpbnQodG9zdHJpbmcobGluZV9udW1iZXIvdG90YWxfbGluZXMqMTAwKS4uJyUnKQoJCQltYXhfbGFzdF9saW5lID0gbGluZV9udW1iZXIKCQllbmQKCWVuZAplbmQKCmxvY2FsIGxpbmVzID0gY291bnRfbGluZXMoKQoKbG9jYWwgdGhyZWFkID0gY29yb3V0aW5lLmNyZWF0ZSggc2NyaXB0X2Z1bmN0aW9uICkKCmRlYnVnLnNldGhvb2sodGhyZWFkLCB0cmFjZShsaW5lcyksICJsIikKY29yb3V0aW5lLnJlc3VtZSh0aHJlYWQp