Advertisement
Guest User

replaceclosure

a guest
Mar 8th, 2018
537
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.76 KB | None | 0 0
  1. -- OUTPUT: https://i.imgur.com/27QcbEF.png
  2.  
  3. local original
  4. local an_upvalue = "an upvalue"
  5.  
  6. local function dummy(a)
  7.     print("in dummy: " .. tostring(a))
  8.     return an_upvalue
  9. end
  10.  
  11. local old_dummy, old_printconsole = dummy, printconsole
  12.  
  13. -- lclosure -> lclosure
  14. print("lclosure -> lclosure")
  15.  
  16. original = assert(replaceclosure(dummy, function(a)
  17.     print("in hook: " .. tostring(a))
  18.     return original(a)
  19. end))
  20.  
  21. dummy("1")
  22. print(dummy == old_dummy)
  23. assert(replaceclosure(dummy, original))
  24. dummy("2")
  25.  
  26. -- lclosure -> cclosure
  27. print("lclosure -> cclosure")
  28.  
  29. original = assert(replaceclosure(dummy, print))
  30.  
  31. dummy("3")
  32. print(dummy == old_dummy)
  33. assert(replaceclosure(dummy, original))
  34. dummy("4")
  35.  
  36. -- cclosure -> lclosure
  37. print("cclosure -> lclosure")
  38.  
  39. original = assert(replaceclosure(printconsole, function(a, ...)
  40.     print("in hook: " .. a)
  41.     original(a, ...)
  42. end))
  43.  
  44. printconsole("5", 255, 0, 0)
  45. print(printconsole == old_printconsole)
  46. assert(replaceclosure(printconsole, original))
  47. printconsole("6", 255, 0, 0)
  48.  
  49. -- cclosure -> cclosure
  50. print("cclosure -> cclosure")
  51.  
  52. original = assert(replaceclosure(printconsole, warn))
  53.  
  54. printconsole("7", 255, 0, 0)
  55. print(printconsole == old_printconsole)
  56. assert(replaceclosure(printconsole, original))
  57. printconsole("8", 255, 0, 0)
  58.  
  59. -- error tests
  60. spawn(function()
  61.     assert(replaceclosure(dummy, function()
  62.         print(original, an_upvalue)
  63.     end)) -- replacing dummy, which has 1 upvalue (an_upvalue), with a function that has 2 upvalues (original & an_upvalue) will throw an error
  64. end)
  65.  
  66. spawn(function()
  67.     original = assert(replaceclosure(dummy, function() end))
  68.     assert(replaceclosure(dummy, function() end)) -- error here, cannot replace an already replaced closure with anything that isn't the original closure
  69. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement