SHOW:
|
|
- or go back to the newest paste.
1 | - | local target = ... |
1 | + | --[[ this is an edit of something that WAS NOT MY IDEA. it's awesome though :) ]] |
2 | - | if not target then |
2 | + | |
3 | - | print("Usage: "..fs.getName(shell.getRunningProgram()).." [target]") |
3 | + | local level,maxlevel=1,0 |
4 | - | return |
4 | + | local resume,pR=coroutine.resume,os.pullEventRaw |
5 | ||
6 | getUp=function() | |
7 | - | local lastDumped = nil |
7 | + | local at,lastFunc,fileName=1 |
8 | - | getfenv(parallel.waitForAny).os = setmetatable({pullEventRaw = function(...) |
8 | + | while true do |
9 | - | local i = 2 |
9 | + | local ok,func=pcall(function() return setfenv(at,getfenv(at)) end) |
10 | - | while true do |
10 | + | local _,err=pcall(error,"err",at) |
11 | - | local success, result = pcall(function() |
11 | + | if ok then |
12 | - | local fn = setfenv(i, getfenv(i)) |
12 | + | lastFunc=func |
13 | - | return string.dump(fn) |
13 | + | fileName=err:match("(.-):") |
14 | - | end) |
14 | + | else |
15 | - | i = i + 1 |
15 | + | return lastFunc,fileName |
16 | - | if success then |
16 | + | end |
17 | - | lastDumped = result |
17 | + | at=at+1 |
18 | - | else |
18 | + | end |
19 | - | if result:find("invalid level") then |
19 | + | |
20 | - | break |
20 | + | |
21 | - | end |
21 | + | os.pullEventRaw=function(...) |
22 | - | end |
22 | + | if level>=maxlevel then |
23 | - | end |
23 | + | maxlevel=level |
24 | - | getfenv(parallel.waitForAny).os = nil |
24 | + | os.originator={getUp()} |
25 | - | return coroutine.yield(...) |
25 | + | end |
26 | - | end}, {__index = os}) |
26 | + | level=level+1 |
27 | return coroutine.yield(...) | |
28 | - | os.queueEvent("fake-event") |
28 | + | |
29 | - | os.pullEvent("fake-event") |
29 | + | coroutine.resume=function(...) |
30 | level=level-1 | |
31 | - | getfenv(parallel.waitForAny).os = nil |
31 | + | return resume(...) |
32 | end | |
33 | - | if lastDumped then |
33 | + | |
34 | - | print("Writing bios file...") |
34 | + | os.queueEvent("ohi") |
35 | os.pullEventRaw() | |
36 | - | local handle = fs.open(target, "wb") |
36 | + | |
37 | - | for i=1,lastDumped:len() do |
37 | + | coroutine.resume=resume |
38 | - | handle.write(lastDumped:byte(i)) |
38 | + | os.pullEventRaw=pR |