immunio 0.15.4 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +0 -27
  3. data/ext/immunio/Rakefile +9 -0
  4. data/lib/immunio/plugins/active_record.rb +1 -1
  5. data/lib/immunio/plugins/active_record_relation.rb +1 -1
  6. data/lib/immunio/plugins/environment_reporter.rb +20 -0
  7. data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
  8. data/lib/immunio/version.rb +1 -1
  9. data/lib/immunio/vm.rb +1 -2
  10. data/lua-hooks/Makefile +97 -0
  11. data/lua-hooks/ext/all.c +41 -52
  12. data/lua-hooks/ext/all.o +0 -0
  13. data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
  14. data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
  15. data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
  16. data/lua-hooks/ext/libinjection/lualib.c +2 -2
  17. data/lua-hooks/ext/lpeg/lpcap.c +2 -2
  18. data/lua-hooks/ext/lpeg/lpcap.o +0 -0
  19. data/lua-hooks/ext/lpeg/lpcode.c +2 -2
  20. data/lua-hooks/ext/lpeg/lpcode.h +1 -1
  21. data/lua-hooks/ext/lpeg/lpcode.o +0 -0
  22. data/lua-hooks/ext/lpeg/lpprint.o +0 -0
  23. data/lua-hooks/ext/lpeg/lptree.c +2 -2
  24. data/lua-hooks/ext/lpeg/lptypes.h +1 -1
  25. data/lua-hooks/ext/lpeg/lpvm.c +2 -2
  26. data/lua-hooks/ext/lpeg/lpvm.o +0 -0
  27. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
  28. data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
  29. data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
  30. data/lua-hooks/ext/luajit/Makefile +159 -0
  31. data/lua-hooks/ext/luajit/README +16 -0
  32. data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
  33. data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
  34. data/lua-hooks/ext/luajit/doc/changes.html +804 -0
  35. data/lua-hooks/ext/luajit/doc/contact.html +104 -0
  36. data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
  37. data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
  38. data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
  39. data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
  40. data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
  41. data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
  42. data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
  43. data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
  44. data/lua-hooks/ext/luajit/doc/faq.html +186 -0
  45. data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
  46. data/lua-hooks/ext/luajit/doc/install.html +659 -0
  47. data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
  48. data/lua-hooks/ext/luajit/doc/running.html +309 -0
  49. data/lua-hooks/ext/luajit/doc/status.html +118 -0
  50. data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
  51. data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
  52. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
  53. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
  54. data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
  55. data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
  56. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
  57. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
  58. data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
  59. data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
  60. data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
  61. data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
  62. data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
  63. data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
  64. data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
  65. data/lua-hooks/ext/luajit/src/Makefile +697 -0
  66. data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
  67. data/lua-hooks/ext/luajit/src/host/README +4 -0
  68. data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
  69. data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
  70. data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
  71. data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
  72. data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
  73. data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
  74. data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
  75. data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
  76. data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
  77. data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
  78. data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
  79. data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
  80. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
  81. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
  82. data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
  83. data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
  84. data/lua-hooks/ext/luajit/src/host/minilua +0 -0
  85. data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
  86. data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
  87. data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
  88. data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
  89. data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
  90. data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
  91. data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
  92. data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
  93. data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
  94. data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
  95. data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
  96. data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
  97. data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
  98. data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
  99. data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
  100. data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
  101. data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
  102. data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
  103. data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
  104. data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
  105. data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
  106. data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
  107. data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
  108. data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
  109. data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
  110. data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
  111. data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
  112. data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
  113. data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
  114. data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
  115. data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
  116. data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
  117. data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
  118. data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
  119. data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
  120. data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
  121. data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
  122. data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
  123. data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
  124. data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
  125. data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
  126. data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
  127. data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
  128. data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
  129. data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
  130. data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
  131. data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
  132. data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
  133. data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
  134. data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
  135. data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
  136. data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
  137. data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
  138. data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
  139. data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
  140. data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
  141. data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
  142. data/lua-hooks/ext/luajit/src/lj.supp +26 -0
  143. data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
  144. data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
  145. data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
  146. data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
  147. data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
  148. data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
  149. data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
  150. data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
  151. data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
  152. data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
  153. data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
  154. data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
  155. data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
  156. data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
  157. data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
  158. data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
  159. data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
  160. data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
  161. data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
  162. data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
  163. data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
  164. data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
  165. data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
  166. data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
  167. data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
  168. data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
  169. data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
  170. data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
  171. data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
  172. data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
  173. data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
  174. data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
  175. data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
  176. data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
  177. data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
  178. data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
  179. data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
  180. data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
  181. data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
  182. data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
  183. data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
  184. data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
  185. data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
  186. data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
  187. data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
  188. data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
  189. data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
  190. data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
  191. data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
  192. data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
  193. data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
  194. data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
  195. data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
  196. data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
  197. data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
  198. data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
  199. data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
  200. data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
  201. data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
  202. data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
  203. data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
  204. data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
  205. data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
  206. data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
  207. data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
  208. data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
  209. data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
  210. data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
  211. data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
  212. data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
  213. data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
  214. data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
  215. data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
  216. data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
  217. data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
  218. data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
  219. data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
  220. data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
  221. data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
  222. data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
  223. data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
  224. data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
  225. data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
  226. data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
  227. data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
  228. data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
  229. data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
  230. data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
  231. data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
  232. data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
  233. data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
  234. data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
  235. data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
  236. data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
  237. data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
  238. data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
  239. data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
  240. data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
  241. data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
  242. data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
  243. data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
  244. data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
  245. data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
  246. data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
  247. data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
  248. data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
  249. data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
  250. data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
  251. data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
  252. data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
  253. data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
  254. data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
  255. data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
  256. data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
  257. data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
  258. data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
  259. data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
  260. data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
  261. data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
  262. data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
  263. data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
  264. data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
  265. data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
  266. data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
  267. data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
  268. data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
  269. data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
  270. data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
  271. data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
  272. data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
  273. data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
  274. data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
  275. data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
  276. data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
  277. data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
  278. data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
  279. data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
  280. data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
  281. data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
  282. data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
  283. data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
  284. data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
  285. data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
  286. data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
  287. data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
  288. data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
  289. data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
  290. data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
  291. data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
  292. data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
  293. data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
  294. data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
  295. data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
  296. data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
  297. data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
  298. data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
  299. data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
  300. data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
  301. data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
  302. data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
  303. data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
  304. data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
  305. data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
  306. data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
  307. data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
  308. data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
  309. data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
  310. data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
  311. data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
  312. data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
  313. data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
  314. data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
  315. data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
  316. data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
  317. data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
  318. data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
  319. data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
  320. data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
  321. data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
  322. data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
  323. data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
  324. data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
  325. data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
  326. data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
  327. data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
  328. data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
  329. data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
  330. data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
  331. data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
  332. data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
  333. data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
  334. data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
  335. data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
  336. data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
  337. data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
  338. data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
  339. data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
  340. data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
  341. data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
  342. data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
  343. data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
  344. data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
  345. data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
  346. data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
  347. data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
  348. data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
  349. data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
  350. data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
  351. data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
  352. data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
  353. data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
  354. data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
  355. data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
  356. data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
  357. data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
  358. data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
  359. data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
  360. data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
  361. data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
  362. data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
  363. data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
  364. data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
  365. data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
  366. data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
  367. data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
  368. data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
  369. data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
  370. data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
  371. data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
  372. data/lua-hooks/ext/luajit/src/luajit +0 -0
  373. data/lua-hooks/ext/luajit/src/luajit.c +570 -0
  374. data/lua-hooks/ext/luajit/src/luajit.h +79 -0
  375. data/lua-hooks/ext/luajit/src/luajit.o +0 -0
  376. data/lua-hooks/ext/luajit/src/lualib.h +43 -0
  377. data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
  378. data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
  379. data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
  380. data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
  381. data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
  382. data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
  383. data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
  384. data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
  385. data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
  386. data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
  387. data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
  388. data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
  389. data/lua-hooks/lib/boot.lua +37 -2
  390. metadata +372 -69
  391. data/lua-hooks/ext/bitop/README +0 -22
  392. data/lua-hooks/ext/bitop/bit.c +0 -189
  393. data/lua-hooks/ext/extconf.rb +0 -38
  394. data/lua-hooks/ext/lua/COPYRIGHT +0 -34
  395. data/lua-hooks/ext/lua/lapi.c +0 -1087
  396. data/lua-hooks/ext/lua/lapi.h +0 -16
  397. data/lua-hooks/ext/lua/lauxlib.c +0 -652
  398. data/lua-hooks/ext/lua/lbaselib.c +0 -659
  399. data/lua-hooks/ext/lua/lcode.c +0 -831
  400. data/lua-hooks/ext/lua/lcode.h +0 -76
  401. data/lua-hooks/ext/lua/ldblib.c +0 -398
  402. data/lua-hooks/ext/lua/ldebug.c +0 -638
  403. data/lua-hooks/ext/lua/ldebug.h +0 -33
  404. data/lua-hooks/ext/lua/ldo.c +0 -519
  405. data/lua-hooks/ext/lua/ldo.h +0 -57
  406. data/lua-hooks/ext/lua/ldump.c +0 -164
  407. data/lua-hooks/ext/lua/lfunc.c +0 -174
  408. data/lua-hooks/ext/lua/lfunc.h +0 -34
  409. data/lua-hooks/ext/lua/lgc.c +0 -710
  410. data/lua-hooks/ext/lua/lgc.h +0 -110
  411. data/lua-hooks/ext/lua/linit.c +0 -38
  412. data/lua-hooks/ext/lua/liolib.c +0 -556
  413. data/lua-hooks/ext/lua/llex.c +0 -463
  414. data/lua-hooks/ext/lua/llex.h +0 -81
  415. data/lua-hooks/ext/lua/llimits.h +0 -128
  416. data/lua-hooks/ext/lua/lmathlib.c +0 -263
  417. data/lua-hooks/ext/lua/lmem.c +0 -86
  418. data/lua-hooks/ext/lua/lmem.h +0 -49
  419. data/lua-hooks/ext/lua/loadlib.c +0 -705
  420. data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
  421. data/lua-hooks/ext/lua/lobject.c +0 -214
  422. data/lua-hooks/ext/lua/lobject.h +0 -381
  423. data/lua-hooks/ext/lua/lopcodes.c +0 -102
  424. data/lua-hooks/ext/lua/lopcodes.h +0 -268
  425. data/lua-hooks/ext/lua/loslib.c +0 -243
  426. data/lua-hooks/ext/lua/lparser.c +0 -1339
  427. data/lua-hooks/ext/lua/lparser.h +0 -82
  428. data/lua-hooks/ext/lua/lstate.c +0 -214
  429. data/lua-hooks/ext/lua/lstate.h +0 -169
  430. data/lua-hooks/ext/lua/lstring.c +0 -111
  431. data/lua-hooks/ext/lua/lstring.h +0 -31
  432. data/lua-hooks/ext/lua/lstrlib.c +0 -871
  433. data/lua-hooks/ext/lua/ltable.c +0 -588
  434. data/lua-hooks/ext/lua/ltable.h +0 -40
  435. data/lua-hooks/ext/lua/ltablib.c +0 -287
  436. data/lua-hooks/ext/lua/ltm.c +0 -75
  437. data/lua-hooks/ext/lua/ltm.h +0 -54
  438. data/lua-hooks/ext/lua/lua.c +0 -392
  439. data/lua-hooks/ext/lua/lua.def +0 -131
  440. data/lua-hooks/ext/lua/lua.rc +0 -28
  441. data/lua-hooks/ext/lua/lua_dll.rc +0 -26
  442. data/lua-hooks/ext/lua/luac.c +0 -200
  443. data/lua-hooks/ext/lua/luac.rc +0 -1
  444. data/lua-hooks/ext/lua/luaconf.h +0 -763
  445. data/lua-hooks/ext/lua/luaconf.h.in +0 -724
  446. data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
  447. data/lua-hooks/ext/lua/lualib.h +0 -53
  448. data/lua-hooks/ext/lua/lundump.c +0 -227
  449. data/lua-hooks/ext/lua/lundump.h +0 -36
  450. data/lua-hooks/ext/lua/lvm.c +0 -767
  451. data/lua-hooks/ext/lua/lvm.h +0 -36
  452. data/lua-hooks/ext/lua/lzio.c +0 -82
  453. data/lua-hooks/ext/lua/lzio.h +0 -67
  454. data/lua-hooks/ext/lua/print.c +0 -227
@@ -0,0 +1,699 @@
1
+ /*
2
+ ** Debugging and introspection.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #define lj_debug_c
7
+ #define LUA_CORE
8
+
9
+ #include "lj_obj.h"
10
+ #include "lj_err.h"
11
+ #include "lj_debug.h"
12
+ #include "lj_buf.h"
13
+ #include "lj_tab.h"
14
+ #include "lj_state.h"
15
+ #include "lj_frame.h"
16
+ #include "lj_bc.h"
17
+ #include "lj_strfmt.h"
18
+ #if LJ_HASJIT
19
+ #include "lj_jit.h"
20
+ #endif
21
+
22
+ /* -- Frames -------------------------------------------------------------- */
23
+
24
+ /* Get frame corresponding to a level. */
25
+ cTValue *lj_debug_frame(lua_State *L, int level, int *size)
26
+ {
27
+ cTValue *frame, *nextframe, *bot = tvref(L->stack)+LJ_FR2;
28
+ /* Traverse frames backwards. */
29
+ for (nextframe = frame = L->base-1; frame > bot; ) {
30
+ if (frame_gc(frame) == obj2gco(L))
31
+ level++; /* Skip dummy frames. See lj_err_optype_call(). */
32
+ if (level-- == 0) {
33
+ *size = (int)(nextframe - frame);
34
+ return frame; /* Level found. */
35
+ }
36
+ nextframe = frame;
37
+ if (frame_islua(frame)) {
38
+ frame = frame_prevl(frame);
39
+ } else {
40
+ if (frame_isvarg(frame))
41
+ level++; /* Skip vararg pseudo-frame. */
42
+ frame = frame_prevd(frame);
43
+ }
44
+ }
45
+ *size = level;
46
+ return NULL; /* Level not found. */
47
+ }
48
+
49
+ /* Invalid bytecode position. */
50
+ #define NO_BCPOS (~(BCPos)0)
51
+
52
+ /* Return bytecode position for function/frame or NO_BCPOS. */
53
+ static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)
54
+ {
55
+ const BCIns *ins;
56
+ GCproto *pt;
57
+ BCPos pos;
58
+ lua_assert(fn->c.gct == ~LJ_TFUNC || fn->c.gct == ~LJ_TTHREAD);
59
+ if (!isluafunc(fn)) { /* Cannot derive a PC for non-Lua functions. */
60
+ return NO_BCPOS;
61
+ } else if (nextframe == NULL) { /* Lua function on top. */
62
+ void *cf = cframe_raw(L->cframe);
63
+ if (cf == NULL || (char *)cframe_pc(cf) == (char *)cframe_L(cf))
64
+ return NO_BCPOS;
65
+ ins = cframe_pc(cf); /* Only happens during error/hook handling. */
66
+ } else {
67
+ if (frame_islua(nextframe)) {
68
+ ins = frame_pc(nextframe);
69
+ } else if (frame_iscont(nextframe)) {
70
+ ins = frame_contpc(nextframe);
71
+ } else {
72
+ /* Lua function below errfunc/gc/hook: find cframe to get the PC. */
73
+ void *cf = cframe_raw(L->cframe);
74
+ TValue *f = L->base-1;
75
+ for (;;) {
76
+ if (cf == NULL)
77
+ return NO_BCPOS;
78
+ while (cframe_nres(cf) < 0) {
79
+ if (f >= restorestack(L, -cframe_nres(cf)))
80
+ break;
81
+ cf = cframe_raw(cframe_prev(cf));
82
+ if (cf == NULL)
83
+ return NO_BCPOS;
84
+ }
85
+ if (f < nextframe)
86
+ break;
87
+ if (frame_islua(f)) {
88
+ f = frame_prevl(f);
89
+ } else {
90
+ if (frame_isc(f) || (frame_iscont(f) && frame_iscont_fficb(f)))
91
+ cf = cframe_raw(cframe_prev(cf));
92
+ f = frame_prevd(f);
93
+ }
94
+ }
95
+ ins = cframe_pc(cf);
96
+ }
97
+ }
98
+ pt = funcproto(fn);
99
+ pos = proto_bcpos(pt, ins) - 1;
100
+ #if LJ_HASJIT
101
+ if (pos > pt->sizebc) { /* Undo the effects of lj_trace_exit for JLOOP. */
102
+ GCtrace *T = (GCtrace *)((char *)(ins-1) - offsetof(GCtrace, startins));
103
+ lua_assert(bc_isret(bc_op(ins[-1])));
104
+ pos = proto_bcpos(pt, mref(T->startpc, const BCIns));
105
+ }
106
+ #endif
107
+ return pos;
108
+ }
109
+
110
+ /* -- Line numbers -------------------------------------------------------- */
111
+
112
+ /* Get line number for a bytecode position. */
113
+ BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc)
114
+ {
115
+ const void *lineinfo = proto_lineinfo(pt);
116
+ if (pc <= pt->sizebc && lineinfo) {
117
+ BCLine first = pt->firstline;
118
+ if (pc == pt->sizebc) return first + pt->numline;
119
+ if (pc-- == 0) return first;
120
+ if (pt->numline < 256)
121
+ return first + (BCLine)((const uint8_t *)lineinfo)[pc];
122
+ else if (pt->numline < 65536)
123
+ return first + (BCLine)((const uint16_t *)lineinfo)[pc];
124
+ else
125
+ return first + (BCLine)((const uint32_t *)lineinfo)[pc];
126
+ }
127
+ return 0;
128
+ }
129
+
130
+ /* Get line number for function/frame. */
131
+ static BCLine debug_frameline(lua_State *L, GCfunc *fn, cTValue *nextframe)
132
+ {
133
+ BCPos pc = debug_framepc(L, fn, nextframe);
134
+ if (pc != NO_BCPOS) {
135
+ GCproto *pt = funcproto(fn);
136
+ lua_assert(pc <= pt->sizebc);
137
+ return lj_debug_line(pt, pc);
138
+ }
139
+ return -1;
140
+ }
141
+
142
+ /* -- Variable names ------------------------------------------------------ */
143
+
144
+ /* Get name of a local variable from slot number and PC. */
145
+ static const char *debug_varname(const GCproto *pt, BCPos pc, BCReg slot)
146
+ {
147
+ const char *p = (const char *)proto_varinfo(pt);
148
+ if (p) {
149
+ BCPos lastpc = 0;
150
+ for (;;) {
151
+ const char *name = p;
152
+ uint32_t vn = *(const uint8_t *)p;
153
+ BCPos startpc, endpc;
154
+ if (vn < VARNAME__MAX) {
155
+ if (vn == VARNAME_END) break; /* End of varinfo. */
156
+ } else {
157
+ do { p++; } while (*(const uint8_t *)p); /* Skip over variable name. */
158
+ }
159
+ p++;
160
+ lastpc = startpc = lastpc + lj_buf_ruleb128(&p);
161
+ if (startpc > pc) break;
162
+ endpc = startpc + lj_buf_ruleb128(&p);
163
+ if (pc < endpc && slot-- == 0) {
164
+ if (vn < VARNAME__MAX) {
165
+ #define VARNAMESTR(name, str) str "\0"
166
+ name = VARNAMEDEF(VARNAMESTR);
167
+ #undef VARNAMESTR
168
+ if (--vn) while (*name++ || --vn) ;
169
+ }
170
+ return name;
171
+ }
172
+ }
173
+ }
174
+ return NULL;
175
+ }
176
+
177
+ /* Get name of local variable from 1-based slot number and function/frame. */
178
+ static TValue *debug_localname(lua_State *L, const lua_Debug *ar,
179
+ const char **name, BCReg slot1)
180
+ {
181
+ uint32_t offset = (uint32_t)ar->i_ci & 0xffff;
182
+ uint32_t size = (uint32_t)ar->i_ci >> 16;
183
+ TValue *frame = tvref(L->stack) + offset;
184
+ TValue *nextframe = size ? frame + size : NULL;
185
+ GCfunc *fn = frame_func(frame);
186
+ BCPos pc = debug_framepc(L, fn, nextframe);
187
+ if (!nextframe) nextframe = L->top+LJ_FR2;
188
+ if ((int)slot1 < 0) { /* Negative slot number is for varargs. */
189
+ if (pc != NO_BCPOS) {
190
+ GCproto *pt = funcproto(fn);
191
+ if ((pt->flags & PROTO_VARARG)) {
192
+ slot1 = pt->numparams + (BCReg)(-(int)slot1);
193
+ if (frame_isvarg(frame)) { /* Vararg frame has been set up? (pc!=0) */
194
+ nextframe = frame;
195
+ frame = frame_prevd(frame);
196
+ }
197
+ if (frame + slot1+LJ_FR2 < nextframe) {
198
+ *name = "(*vararg)";
199
+ return frame+slot1;
200
+ }
201
+ }
202
+ }
203
+ return NULL;
204
+ }
205
+ if (pc != NO_BCPOS &&
206
+ (*name = debug_varname(funcproto(fn), pc, slot1-1)) != NULL)
207
+ ;
208
+ else if (slot1 > 0 && frame + slot1+LJ_FR2 < nextframe)
209
+ *name = "(*temporary)";
210
+ return frame+slot1;
211
+ }
212
+
213
+ /* Get name of upvalue. */
214
+ const char *lj_debug_uvname(GCproto *pt, uint32_t idx)
215
+ {
216
+ const uint8_t *p = proto_uvinfo(pt);
217
+ lua_assert(idx < pt->sizeuv);
218
+ if (!p) return "";
219
+ if (idx) while (*p++ || --idx) ;
220
+ return (const char *)p;
221
+ }
222
+
223
+ /* Get name and value of upvalue. */
224
+ const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp)
225
+ {
226
+ if (tvisfunc(o)) {
227
+ GCfunc *fn = funcV(o);
228
+ if (isluafunc(fn)) {
229
+ GCproto *pt = funcproto(fn);
230
+ if (idx < pt->sizeuv) {
231
+ *tvp = uvval(&gcref(fn->l.uvptr[idx])->uv);
232
+ return lj_debug_uvname(pt, idx);
233
+ }
234
+ } else {
235
+ if (idx < fn->c.nupvalues) {
236
+ *tvp = &fn->c.upvalue[idx];
237
+ return "";
238
+ }
239
+ }
240
+ }
241
+ return NULL;
242
+ }
243
+
244
+ /* Deduce name of an object from slot number and PC. */
245
+ const char *lj_debug_slotname(GCproto *pt, const BCIns *ip, BCReg slot,
246
+ const char **name)
247
+ {
248
+ const char *lname;
249
+ restart:
250
+ lname = debug_varname(pt, proto_bcpos(pt, ip), slot);
251
+ if (lname != NULL) { *name = lname; return "local"; }
252
+ while (--ip > proto_bc(pt)) {
253
+ BCIns ins = *ip;
254
+ BCOp op = bc_op(ins);
255
+ BCReg ra = bc_a(ins);
256
+ if (bcmode_a(op) == BCMbase) {
257
+ if (slot >= ra && (op != BC_KNIL || slot <= bc_d(ins)))
258
+ return NULL;
259
+ } else if (bcmode_a(op) == BCMdst && ra == slot) {
260
+ switch (bc_op(ins)) {
261
+ case BC_MOV:
262
+ if (ra == slot) { slot = bc_d(ins); goto restart; }
263
+ break;
264
+ case BC_GGET:
265
+ *name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_d(ins))));
266
+ return "global";
267
+ case BC_TGETS:
268
+ *name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_c(ins))));
269
+ if (ip > proto_bc(pt)) {
270
+ BCIns insp = ip[-1];
271
+ if (bc_op(insp) == BC_MOV && bc_a(insp) == ra+1+LJ_FR2 &&
272
+ bc_d(insp) == bc_b(ins))
273
+ return "method";
274
+ }
275
+ return "field";
276
+ case BC_UGET:
277
+ *name = lj_debug_uvname(pt, bc_d(ins));
278
+ return "upvalue";
279
+ default:
280
+ return NULL;
281
+ }
282
+ }
283
+ }
284
+ return NULL;
285
+ }
286
+
287
+ /* Deduce function name from caller of a frame. */
288
+ const char *lj_debug_funcname(lua_State *L, cTValue *frame, const char **name)
289
+ {
290
+ cTValue *pframe;
291
+ GCfunc *fn;
292
+ BCPos pc;
293
+ if (frame <= tvref(L->stack)+LJ_FR2)
294
+ return NULL;
295
+ if (frame_isvarg(frame))
296
+ frame = frame_prevd(frame);
297
+ pframe = frame_prev(frame);
298
+ fn = frame_func(pframe);
299
+ pc = debug_framepc(L, fn, frame);
300
+ if (pc != NO_BCPOS) {
301
+ GCproto *pt = funcproto(fn);
302
+ const BCIns *ip = &proto_bc(pt)[check_exp(pc < pt->sizebc, pc)];
303
+ MMS mm = bcmode_mm(bc_op(*ip));
304
+ if (mm == MM_call) {
305
+ BCReg slot = bc_a(*ip);
306
+ if (bc_op(*ip) == BC_ITERC) slot -= 3;
307
+ return lj_debug_slotname(pt, ip, slot, name);
308
+ } else if (mm != MM__MAX) {
309
+ *name = strdata(mmname_str(G(L), mm));
310
+ return "metamethod";
311
+ }
312
+ }
313
+ return NULL;
314
+ }
315
+
316
+ /* -- Source code locations ----------------------------------------------- */
317
+
318
+ /* Generate shortened source name. */
319
+ void lj_debug_shortname(char *out, GCstr *str, BCLine line)
320
+ {
321
+ const char *src = strdata(str);
322
+ if (*src == '=') {
323
+ strncpy(out, src+1, LUA_IDSIZE); /* Remove first char. */
324
+ out[LUA_IDSIZE-1] = '\0'; /* Ensures null termination. */
325
+ } else if (*src == '@') { /* Output "source", or "...source". */
326
+ size_t len = str->len-1;
327
+ src++; /* Skip the `@' */
328
+ if (len >= LUA_IDSIZE) {
329
+ src += len-(LUA_IDSIZE-4); /* Get last part of file name. */
330
+ *out++ = '.'; *out++ = '.'; *out++ = '.';
331
+ }
332
+ strcpy(out, src);
333
+ } else { /* Output [string "string"] or [builtin:name]. */
334
+ size_t len; /* Length, up to first control char. */
335
+ for (len = 0; len < LUA_IDSIZE-12; len++)
336
+ if (((const unsigned char *)src)[len] < ' ') break;
337
+ strcpy(out, line == ~(BCLine)0 ? "[builtin:" : "[string \""); out += 9;
338
+ if (src[len] != '\0') { /* Must truncate? */
339
+ if (len > LUA_IDSIZE-15) len = LUA_IDSIZE-15;
340
+ strncpy(out, src, len); out += len;
341
+ strcpy(out, "..."); out += 3;
342
+ } else {
343
+ strcpy(out, src); out += len;
344
+ }
345
+ strcpy(out, line == ~(BCLine)0 ? "]" : "\"]");
346
+ }
347
+ }
348
+
349
+ /* Add current location of a frame to error message. */
350
+ void lj_debug_addloc(lua_State *L, const char *msg,
351
+ cTValue *frame, cTValue *nextframe)
352
+ {
353
+ if (frame) {
354
+ GCfunc *fn = frame_func(frame);
355
+ if (isluafunc(fn)) {
356
+ BCLine line = debug_frameline(L, fn, nextframe);
357
+ if (line >= 0) {
358
+ GCproto *pt = funcproto(fn);
359
+ char buf[LUA_IDSIZE];
360
+ lj_debug_shortname(buf, proto_chunkname(pt), pt->firstline);
361
+ lj_strfmt_pushf(L, "%s:%d: %s", buf, line, msg);
362
+ return;
363
+ }
364
+ }
365
+ }
366
+ lj_strfmt_pushf(L, "%s", msg);
367
+ }
368
+
369
+ /* Push location string for a bytecode position to Lua stack. */
370
+ void lj_debug_pushloc(lua_State *L, GCproto *pt, BCPos pc)
371
+ {
372
+ GCstr *name = proto_chunkname(pt);
373
+ const char *s = strdata(name);
374
+ MSize i, len = name->len;
375
+ BCLine line = lj_debug_line(pt, pc);
376
+ if (pt->firstline == ~(BCLine)0) {
377
+ lj_strfmt_pushf(L, "builtin:%s", s);
378
+ } else if (*s == '@') {
379
+ s++; len--;
380
+ for (i = len; i > 0; i--)
381
+ if (s[i] == '/' || s[i] == '\\') {
382
+ s += i+1;
383
+ break;
384
+ }
385
+ lj_strfmt_pushf(L, "%s:%d", s, line);
386
+ } else if (len > 40) {
387
+ lj_strfmt_pushf(L, "%p:%d", pt, line);
388
+ } else if (*s == '=') {
389
+ lj_strfmt_pushf(L, "%s:%d", s+1, line);
390
+ } else {
391
+ lj_strfmt_pushf(L, "\"%s\":%d", s, line);
392
+ }
393
+ }
394
+
395
+ /* -- Public debug API ---------------------------------------------------- */
396
+
397
+ /* lua_getupvalue() and lua_setupvalue() are in lj_api.c. */
398
+
399
+ LUA_API const char *lua_getlocal(lua_State *L, const lua_Debug *ar, int n)
400
+ {
401
+ const char *name = NULL;
402
+ if (ar) {
403
+ TValue *o = debug_localname(L, ar, &name, (BCReg)n);
404
+ if (name) {
405
+ copyTV(L, L->top, o);
406
+ incr_top(L);
407
+ }
408
+ } else if (tvisfunc(L->top-1) && isluafunc(funcV(L->top-1))) {
409
+ name = debug_varname(funcproto(funcV(L->top-1)), 0, (BCReg)n-1);
410
+ }
411
+ return name;
412
+ }
413
+
414
+ LUA_API const char *lua_setlocal(lua_State *L, const lua_Debug *ar, int n)
415
+ {
416
+ const char *name = NULL;
417
+ TValue *o = debug_localname(L, ar, &name, (BCReg)n);
418
+ if (name)
419
+ copyTV(L, o, L->top-1);
420
+ L->top--;
421
+ return name;
422
+ }
423
+
424
+ int lj_debug_getinfo(lua_State *L, const char *what, lj_Debug *ar, int ext)
425
+ {
426
+ int opt_f = 0, opt_L = 0;
427
+ TValue *frame = NULL;
428
+ TValue *nextframe = NULL;
429
+ GCfunc *fn;
430
+ if (*what == '>') {
431
+ TValue *func = L->top - 1;
432
+ api_check(L, tvisfunc(func));
433
+ fn = funcV(func);
434
+ L->top--;
435
+ what++;
436
+ } else {
437
+ uint32_t offset = (uint32_t)ar->i_ci & 0xffff;
438
+ uint32_t size = (uint32_t)ar->i_ci >> 16;
439
+ lua_assert(offset != 0);
440
+ frame = tvref(L->stack) + offset;
441
+ if (size) nextframe = frame + size;
442
+ lua_assert(frame <= tvref(L->maxstack) &&
443
+ (!nextframe || nextframe <= tvref(L->maxstack)));
444
+ fn = frame_func(frame);
445
+ lua_assert(fn->c.gct == ~LJ_TFUNC);
446
+ }
447
+ for (; *what; what++) {
448
+ if (*what == 'S') {
449
+ if (isluafunc(fn)) {
450
+ GCproto *pt = funcproto(fn);
451
+ BCLine firstline = pt->firstline;
452
+ GCstr *name = proto_chunkname(pt);
453
+ ar->source = strdata(name);
454
+ lj_debug_shortname(ar->short_src, name, pt->firstline);
455
+ ar->linedefined = (int)firstline;
456
+ ar->lastlinedefined = (int)(firstline + pt->numline);
457
+ ar->what = (firstline || !pt->numline) ? "Lua" : "main";
458
+ } else {
459
+ ar->source = "=[C]";
460
+ ar->short_src[0] = '[';
461
+ ar->short_src[1] = 'C';
462
+ ar->short_src[2] = ']';
463
+ ar->short_src[3] = '\0';
464
+ ar->linedefined = -1;
465
+ ar->lastlinedefined = -1;
466
+ ar->what = "C";
467
+ }
468
+ } else if (*what == 'l') {
469
+ ar->currentline = frame ? debug_frameline(L, fn, nextframe) : -1;
470
+ } else if (*what == 'u') {
471
+ ar->nups = fn->c.nupvalues;
472
+ if (ext) {
473
+ if (isluafunc(fn)) {
474
+ GCproto *pt = funcproto(fn);
475
+ ar->nparams = pt->numparams;
476
+ ar->isvararg = !!(pt->flags & PROTO_VARARG);
477
+ } else {
478
+ ar->nparams = 0;
479
+ ar->isvararg = 1;
480
+ }
481
+ }
482
+ } else if (*what == 'n') {
483
+ ar->namewhat = frame ? lj_debug_funcname(L, frame, &ar->name) : NULL;
484
+ if (ar->namewhat == NULL) {
485
+ ar->namewhat = "";
486
+ ar->name = NULL;
487
+ }
488
+ } else if (*what == 'f') {
489
+ opt_f = 1;
490
+ } else if (*what == 'L') {
491
+ opt_L = 1;
492
+ } else {
493
+ return 0; /* Bad option. */
494
+ }
495
+ }
496
+ if (opt_f) {
497
+ setfuncV(L, L->top, fn);
498
+ incr_top(L);
499
+ }
500
+ if (opt_L) {
501
+ if (isluafunc(fn)) {
502
+ GCtab *t = lj_tab_new(L, 0, 0);
503
+ GCproto *pt = funcproto(fn);
504
+ const void *lineinfo = proto_lineinfo(pt);
505
+ if (lineinfo) {
506
+ BCLine first = pt->firstline;
507
+ int sz = pt->numline < 256 ? 1 : pt->numline < 65536 ? 2 : 4;
508
+ MSize i, szl = pt->sizebc-1;
509
+ for (i = 0; i < szl; i++) {
510
+ BCLine line = first +
511
+ (sz == 1 ? (BCLine)((const uint8_t *)lineinfo)[i] :
512
+ sz == 2 ? (BCLine)((const uint16_t *)lineinfo)[i] :
513
+ (BCLine)((const uint32_t *)lineinfo)[i]);
514
+ setboolV(lj_tab_setint(L, t, line), 1);
515
+ }
516
+ }
517
+ settabV(L, L->top, t);
518
+ } else {
519
+ setnilV(L->top);
520
+ }
521
+ incr_top(L);
522
+ }
523
+ return 1; /* Ok. */
524
+ }
525
+
526
+ LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar)
527
+ {
528
+ return lj_debug_getinfo(L, what, (lj_Debug *)ar, 0);
529
+ }
530
+
531
+ LUA_API int lua_getstack(lua_State *L, int level, lua_Debug *ar)
532
+ {
533
+ int size;
534
+ cTValue *frame = lj_debug_frame(L, level, &size);
535
+ if (frame) {
536
+ ar->i_ci = (size << 16) + (int)(frame - tvref(L->stack));
537
+ return 1;
538
+ } else {
539
+ ar->i_ci = level - size;
540
+ return 0;
541
+ }
542
+ }
543
+
544
+ #if LJ_HASPROFILE
545
+ /* Put the chunkname into a buffer. */
546
+ static int debug_putchunkname(SBuf *sb, GCproto *pt, int pathstrip)
547
+ {
548
+ GCstr *name = proto_chunkname(pt);
549
+ const char *p = strdata(name);
550
+ if (pt->firstline == ~(BCLine)0) {
551
+ lj_buf_putmem(sb, "[builtin:", 9);
552
+ lj_buf_putstr(sb, name);
553
+ lj_buf_putb(sb, ']');
554
+ return 0;
555
+ }
556
+ if (*p == '=' || *p == '@') {
557
+ MSize len = name->len-1;
558
+ p++;
559
+ if (pathstrip) {
560
+ int i;
561
+ for (i = len-1; i >= 0; i--)
562
+ if (p[i] == '/' || p[i] == '\\') {
563
+ len -= i+1;
564
+ p = p+i+1;
565
+ break;
566
+ }
567
+ }
568
+ lj_buf_putmem(sb, p, len);
569
+ } else {
570
+ lj_buf_putmem(sb, "[string]", 8);
571
+ }
572
+ return 1;
573
+ }
574
+
575
+ /* Put a compact stack dump into a buffer. */
576
+ void lj_debug_dumpstack(lua_State *L, SBuf *sb, const char *fmt, int depth)
577
+ {
578
+ int level = 0, dir = 1, pathstrip = 1;
579
+ MSize lastlen = 0;
580
+ if (depth < 0) { level = ~depth; depth = dir = -1; } /* Reverse frames. */
581
+ while (level != depth) { /* Loop through all frame. */
582
+ int size;
583
+ cTValue *frame = lj_debug_frame(L, level, &size);
584
+ if (frame) {
585
+ cTValue *nextframe = size ? frame+size : NULL;
586
+ GCfunc *fn = frame_func(frame);
587
+ const uint8_t *p = (const uint8_t *)fmt;
588
+ int c;
589
+ while ((c = *p++)) {
590
+ switch (c) {
591
+ case 'p': /* Preserve full path. */
592
+ pathstrip = 0;
593
+ break;
594
+ case 'F': case 'f': { /* Dump function name. */
595
+ const char *name;
596
+ const char *what = lj_debug_funcname(L, frame, &name);
597
+ if (what) {
598
+ if (c == 'F' && isluafunc(fn)) { /* Dump module:name for 'F'. */
599
+ GCproto *pt = funcproto(fn);
600
+ if (pt->firstline != ~(BCLine)0) { /* Not a bytecode builtin. */
601
+ debug_putchunkname(sb, pt, pathstrip);
602
+ lj_buf_putb(sb, ':');
603
+ }
604
+ }
605
+ lj_buf_putmem(sb, name, (MSize)strlen(name));
606
+ break;
607
+ } /* else: can't derive a name, dump module:line. */
608
+ }
609
+ /* fallthrough */
610
+ case 'l': /* Dump module:line. */
611
+ if (isluafunc(fn)) {
612
+ GCproto *pt = funcproto(fn);
613
+ if (debug_putchunkname(sb, pt, pathstrip)) {
614
+ /* Regular Lua function. */
615
+ BCLine line = c == 'l' ? debug_frameline(L, fn, nextframe) :
616
+ pt->firstline;
617
+ lj_buf_putb(sb, ':');
618
+ lj_strfmt_putint(sb, line >= 0 ? line : pt->firstline);
619
+ }
620
+ } else if (isffunc(fn)) { /* Dump numbered builtins. */
621
+ lj_buf_putmem(sb, "[builtin#", 9);
622
+ lj_strfmt_putint(sb, fn->c.ffid);
623
+ lj_buf_putb(sb, ']');
624
+ } else { /* Dump C function address. */
625
+ lj_buf_putb(sb, '@');
626
+ lj_strfmt_putptr(sb, fn->c.f);
627
+ }
628
+ break;
629
+ case 'Z': /* Zap trailing separator. */
630
+ lastlen = sbuflen(sb);
631
+ break;
632
+ default:
633
+ lj_buf_putb(sb, c);
634
+ break;
635
+ }
636
+ }
637
+ } else if (dir == 1) {
638
+ break;
639
+ } else {
640
+ level -= size; /* Reverse frame order: quickly skip missing level. */
641
+ }
642
+ level += dir;
643
+ }
644
+ if (lastlen)
645
+ setsbufP(sb, sbufB(sb) + lastlen); /* Zap trailing separator. */
646
+ }
647
+ #endif
648
+
649
+ /* Number of frames for the leading and trailing part of a traceback. */
650
+ #define TRACEBACK_LEVELS1 12
651
+ #define TRACEBACK_LEVELS2 10
652
+
653
+ LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
654
+ int level)
655
+ {
656
+ int top = (int)(L->top - L->base);
657
+ int lim = TRACEBACK_LEVELS1;
658
+ lua_Debug ar;
659
+ if (msg) lua_pushfstring(L, "%s\n", msg);
660
+ lua_pushliteral(L, "stack traceback:");
661
+ while (lua_getstack(L1, level++, &ar)) {
662
+ GCfunc *fn;
663
+ if (level > lim) {
664
+ if (!lua_getstack(L1, level + TRACEBACK_LEVELS2, &ar)) {
665
+ level--;
666
+ } else {
667
+ lua_pushliteral(L, "\n\t...");
668
+ lua_getstack(L1, -10, &ar);
669
+ level = ar.i_ci - TRACEBACK_LEVELS2;
670
+ }
671
+ lim = 2147483647;
672
+ continue;
673
+ }
674
+ lua_getinfo(L1, "Snlf", &ar);
675
+ fn = funcV(L1->top-1); L1->top--;
676
+ if (isffunc(fn) && !*ar.namewhat)
677
+ lua_pushfstring(L, "\n\t[builtin#%d]:", fn->c.ffid);
678
+ else
679
+ lua_pushfstring(L, "\n\t%s:", ar.short_src);
680
+ if (ar.currentline > 0)
681
+ lua_pushfstring(L, "%d:", ar.currentline);
682
+ if (*ar.namewhat) {
683
+ lua_pushfstring(L, " in function " LUA_QS, ar.name);
684
+ } else {
685
+ if (*ar.what == 'm') {
686
+ lua_pushliteral(L, " in main chunk");
687
+ } else if (*ar.what == 'C') {
688
+ lua_pushfstring(L, " at %p", fn->c.f);
689
+ } else {
690
+ lua_pushfstring(L, " in function <%s:%d>",
691
+ ar.short_src, ar.linedefined);
692
+ }
693
+ }
694
+ if ((int)(L->top - L->base) - top >= 15)
695
+ lua_concat(L, (int)(L->top - L->base) - top);
696
+ }
697
+ lua_concat(L, (int)(L->top - L->base) - top);
698
+ }
699
+