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,310 @@
1
+ ----------------------------------------------------------------------------
2
+ -- LuaJIT profiler.
3
+ --
4
+ -- Copyright (C) 2005-2015 Mike Pall. All rights reserved.
5
+ -- Released under the MIT license. See Copyright Notice in luajit.h
6
+ ----------------------------------------------------------------------------
7
+ --
8
+ -- This module is a simple command line interface to the built-in
9
+ -- low-overhead profiler of LuaJIT.
10
+ --
11
+ -- The lower-level API of the profiler is accessible via the "jit.profile"
12
+ -- module or the luaJIT_profile_* C API.
13
+ --
14
+ -- Example usage:
15
+ --
16
+ -- luajit -jp myapp.lua
17
+ -- luajit -jp=s myapp.lua
18
+ -- luajit -jp=-s myapp.lua
19
+ -- luajit -jp=vl myapp.lua
20
+ -- luajit -jp=G,profile.txt myapp.lua
21
+ --
22
+ -- The following dump features are available:
23
+ --
24
+ -- f Stack dump: function name, otherwise module:line. Default mode.
25
+ -- F Stack dump: ditto, but always prepend module.
26
+ -- l Stack dump: module:line.
27
+ -- <number> stack dump depth (callee < caller). Default: 1.
28
+ -- -<number> Inverse stack dump depth (caller > callee).
29
+ -- s Split stack dump after first stack level. Implies abs(depth) >= 2.
30
+ -- p Show full path for module names.
31
+ -- v Show VM states. Can be combined with stack dumps, e.g. vf or fv.
32
+ -- z Show zones. Can be combined with stack dumps, e.g. zf or fz.
33
+ -- r Show raw sample counts. Default: show percentages.
34
+ -- a Annotate excerpts from source code files.
35
+ -- A Annotate complete source code files.
36
+ -- G Produce raw output suitable for graphical tools (e.g. flame graphs).
37
+ -- m<number> Minimum sample percentage to be shown. Default: 3.
38
+ -- i<number> Sampling interval in milliseconds. Default: 10.
39
+ --
40
+ ----------------------------------------------------------------------------
41
+
42
+ -- Cache some library functions and objects.
43
+ local jit = require("jit")
44
+ assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
45
+ local profile = require("jit.profile")
46
+ local vmdef = require("jit.vmdef")
47
+ local math = math
48
+ local pairs, ipairs, tonumber, floor = pairs, ipairs, tonumber, math.floor
49
+ local sort, format = table.sort, string.format
50
+ local stdout = io.stdout
51
+ local zone -- Load jit.zone module on demand.
52
+
53
+ -- Output file handle.
54
+ local out
55
+
56
+ ------------------------------------------------------------------------------
57
+
58
+ local prof_ud
59
+ local prof_states, prof_split, prof_min, prof_raw, prof_fmt, prof_depth
60
+ local prof_ann, prof_count1, prof_count2, prof_samples
61
+
62
+ local map_vmmode = {
63
+ N = "Compiled",
64
+ I = "Interpreted",
65
+ C = "C code",
66
+ G = "Garbage Collector",
67
+ J = "JIT Compiler",
68
+ }
69
+
70
+ -- Profiler callback.
71
+ local function prof_cb(th, samples, vmmode)
72
+ prof_samples = prof_samples + samples
73
+ local key_stack, key_stack2, key_state
74
+ -- Collect keys for sample.
75
+ if prof_states then
76
+ if prof_states == "v" then
77
+ key_state = map_vmmode[vmmode] or vmmode
78
+ else
79
+ key_state = zone:get() or "(none)"
80
+ end
81
+ end
82
+ if prof_fmt then
83
+ key_stack = profile.dumpstack(th, prof_fmt, prof_depth)
84
+ key_stack = key_stack:gsub("%[builtin#(%d+)%]", function(x)
85
+ return vmdef.ffnames[tonumber(x)]
86
+ end)
87
+ if prof_split == 2 then
88
+ local k1, k2 = key_stack:match("(.-) [<>] (.*)")
89
+ if k2 then key_stack, key_stack2 = k1, k2 end
90
+ elseif prof_split == 3 then
91
+ key_stack2 = profile.dumpstack(th, "l", 1)
92
+ end
93
+ end
94
+ -- Order keys.
95
+ local k1, k2
96
+ if prof_split == 1 then
97
+ if key_state then
98
+ k1 = key_state
99
+ if key_stack then k2 = key_stack end
100
+ end
101
+ elseif key_stack then
102
+ k1 = key_stack
103
+ if key_stack2 then k2 = key_stack2 elseif key_state then k2 = key_state end
104
+ end
105
+ -- Coalesce samples in one or two levels.
106
+ if k1 then
107
+ local t1 = prof_count1
108
+ t1[k1] = (t1[k1] or 0) + samples
109
+ if k2 then
110
+ local t2 = prof_count2
111
+ local t3 = t2[k1]
112
+ if not t3 then t3 = {}; t2[k1] = t3 end
113
+ t3[k2] = (t3[k2] or 0) + samples
114
+ end
115
+ end
116
+ end
117
+
118
+ ------------------------------------------------------------------------------
119
+
120
+ -- Show top N list.
121
+ local function prof_top(count1, count2, samples, indent)
122
+ local t, n = {}, 0
123
+ for k, v in pairs(count1) do
124
+ n = n + 1
125
+ t[n] = k
126
+ end
127
+ sort(t, function(a, b) return count1[a] > count1[b] end)
128
+ for i=1,n do
129
+ local k = t[i]
130
+ local v = count1[k]
131
+ local pct = floor(v*100/samples + 0.5)
132
+ if pct < prof_min then break end
133
+ if not prof_raw then
134
+ out:write(format("%s%2d%% %s\n", indent, pct, k))
135
+ elseif prof_raw == "r" then
136
+ out:write(format("%s%5d %s\n", indent, v, k))
137
+ else
138
+ out:write(format("%s %d\n", k, v))
139
+ end
140
+ if count2 then
141
+ local r = count2[k]
142
+ if r then
143
+ prof_top(r, nil, v, (prof_split == 3 or prof_split == 1) and " -- " or
144
+ (prof_depth < 0 and " -> " or " <- "))
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ -- Annotate source code
151
+ local function prof_annotate(count1, samples)
152
+ local files = {}
153
+ local ms = 0
154
+ for k, v in pairs(count1) do
155
+ local pct = floor(v*100/samples + 0.5)
156
+ ms = math.max(ms, v)
157
+ if pct >= prof_min then
158
+ local file, line = k:match("^(.*):(%d+)$")
159
+ local fl = files[file]
160
+ if not fl then fl = {}; files[file] = fl; files[#files+1] = file end
161
+ line = tonumber(line)
162
+ fl[line] = prof_raw and v or pct
163
+ end
164
+ end
165
+ sort(files)
166
+ local fmtv, fmtn = " %3d%% | %s\n", " | %s\n"
167
+ if prof_raw then
168
+ local n = math.max(5, math.ceil(math.log10(ms)))
169
+ fmtv = "%"..n.."d | %s\n"
170
+ fmtn = (" "):rep(n).." | %s\n"
171
+ end
172
+ local ann = prof_ann
173
+ for _, file in ipairs(files) do
174
+ local f0 = file:byte()
175
+ if f0 == 40 or f0 == 91 then
176
+ out:write(format("\n====== %s ======\n[Cannot annotate non-file]\n", file))
177
+ break
178
+ end
179
+ local fp, err = io.open(file)
180
+ if not fp then
181
+ out:write(format("====== ERROR: %s: %s\n", file, err))
182
+ break
183
+ end
184
+ out:write(format("\n====== %s ======\n", file))
185
+ local fl = files[file]
186
+ local n, show = 1, false
187
+ if ann ~= 0 then
188
+ for i=1,ann do
189
+ if fl[i] then show = true; out:write("@@ 1 @@\n"); break end
190
+ end
191
+ end
192
+ for line in fp:lines() do
193
+ if line:byte() == 27 then
194
+ out:write("[Cannot annotate bytecode file]\n")
195
+ break
196
+ end
197
+ local v = fl[n]
198
+ if ann ~= 0 then
199
+ local v2 = fl[n+ann]
200
+ if show then
201
+ if v2 then show = n+ann elseif v then show = n
202
+ elseif show+ann < n then show = false end
203
+ elseif v2 then
204
+ show = n+ann
205
+ out:write(format("@@ %d @@\n", n))
206
+ end
207
+ if not show then goto next end
208
+ end
209
+ if v then
210
+ out:write(format(fmtv, v, line))
211
+ else
212
+ out:write(format(fmtn, line))
213
+ end
214
+ ::next::
215
+ n = n + 1
216
+ end
217
+ fp:close()
218
+ end
219
+ end
220
+
221
+ ------------------------------------------------------------------------------
222
+
223
+ -- Finish profiling and dump result.
224
+ local function prof_finish()
225
+ if prof_ud then
226
+ profile.stop()
227
+ local samples = prof_samples
228
+ if samples == 0 then
229
+ if prof_raw ~= true then out:write("[No samples collected]\n") end
230
+ return
231
+ end
232
+ if prof_ann then
233
+ prof_annotate(prof_count1, samples)
234
+ else
235
+ prof_top(prof_count1, prof_count2, samples, "")
236
+ end
237
+ prof_count1 = nil
238
+ prof_count2 = nil
239
+ prof_ud = nil
240
+ end
241
+ end
242
+
243
+ -- Start profiling.
244
+ local function prof_start(mode)
245
+ local interval = ""
246
+ mode = mode:gsub("i%d*", function(s) interval = s; return "" end)
247
+ prof_min = 3
248
+ mode = mode:gsub("m(%d+)", function(s) prof_min = tonumber(s); return "" end)
249
+ prof_depth = 1
250
+ mode = mode:gsub("%-?%d+", function(s) prof_depth = tonumber(s); return "" end)
251
+ local m = {}
252
+ for c in mode:gmatch(".") do m[c] = c end
253
+ prof_states = m.z or m.v
254
+ if prof_states == "z" then zone = require("jit.zone") end
255
+ local scope = m.l or m.f or m.F or (prof_states and "" or "f")
256
+ local flags = (m.p or "")
257
+ prof_raw = m.r
258
+ if m.s then
259
+ prof_split = 2
260
+ if prof_depth == -1 or m["-"] then prof_depth = -2
261
+ elseif prof_depth == 1 then prof_depth = 2 end
262
+ elseif mode:find("[fF].*l") then
263
+ scope = "l"
264
+ prof_split = 3
265
+ else
266
+ prof_split = (scope == "" or mode:find("[zv].*[lfF]")) and 1 or 0
267
+ end
268
+ prof_ann = m.A and 0 or (m.a and 3)
269
+ if prof_ann then
270
+ scope = "l"
271
+ prof_fmt = "pl"
272
+ prof_split = 0
273
+ prof_depth = 1
274
+ elseif m.G and scope ~= "" then
275
+ prof_fmt = flags..scope.."Z;"
276
+ prof_depth = -100
277
+ prof_raw = true
278
+ prof_min = 0
279
+ elseif scope == "" then
280
+ prof_fmt = false
281
+ else
282
+ local sc = prof_split == 3 and m.f or m.F or scope
283
+ prof_fmt = flags..sc..(prof_depth >= 0 and "Z < " or "Z > ")
284
+ end
285
+ prof_count1 = {}
286
+ prof_count2 = {}
287
+ prof_samples = 0
288
+ profile.start(scope:lower()..interval, prof_cb)
289
+ prof_ud = newproxy(true)
290
+ getmetatable(prof_ud).__gc = prof_finish
291
+ end
292
+
293
+ ------------------------------------------------------------------------------
294
+
295
+ local function start(mode, outfile)
296
+ if not outfile then outfile = os.getenv("LUAJIT_PROFILEFILE") end
297
+ if outfile then
298
+ out = outfile == "-" and stdout or assert(io.open(outfile, "w"))
299
+ else
300
+ out = stdout
301
+ end
302
+ prof_start(mode or "f")
303
+ end
304
+
305
+ -- Public module functions.
306
+ return {
307
+ start = start, -- For -j command line option.
308
+ stop = prof_finish
309
+ }
310
+
@@ -0,0 +1,170 @@
1
+ ----------------------------------------------------------------------------
2
+ -- Verbose mode of the LuaJIT compiler.
3
+ --
4
+ -- Copyright (C) 2005-2015 Mike Pall. All rights reserved.
5
+ -- Released under the MIT license. See Copyright Notice in luajit.h
6
+ ----------------------------------------------------------------------------
7
+ --
8
+ -- This module shows verbose information about the progress of the
9
+ -- JIT compiler. It prints one line for each generated trace. This module
10
+ -- is useful to see which code has been compiled or where the compiler
11
+ -- punts and falls back to the interpreter.
12
+ --
13
+ -- Example usage:
14
+ --
15
+ -- luajit -jv -e "for i=1,1000 do for j=1,1000 do end end"
16
+ -- luajit -jv=myapp.out myapp.lua
17
+ --
18
+ -- Default output is to stderr. To redirect the output to a file, pass a
19
+ -- filename as an argument (use '-' for stdout) or set the environment
20
+ -- variable LUAJIT_VERBOSEFILE. The file is overwritten every time the
21
+ -- module is started.
22
+ --
23
+ -- The output from the first example should look like this:
24
+ --
25
+ -- [TRACE 1 (command line):1 loop]
26
+ -- [TRACE 2 (1/3) (command line):1 -> 1]
27
+ --
28
+ -- The first number in each line is the internal trace number. Next are
29
+ -- the file name ('(command line)') and the line number (':1') where the
30
+ -- trace has started. Side traces also show the parent trace number and
31
+ -- the exit number where they are attached to in parentheses ('(1/3)').
32
+ -- An arrow at the end shows where the trace links to ('-> 1'), unless
33
+ -- it loops to itself.
34
+ --
35
+ -- In this case the inner loop gets hot and is traced first, generating
36
+ -- a root trace. Then the last exit from the 1st trace gets hot, too,
37
+ -- and triggers generation of the 2nd trace. The side trace follows the
38
+ -- path along the outer loop and *around* the inner loop, back to its
39
+ -- start, and then links to the 1st trace. Yes, this may seem unusual,
40
+ -- if you know how traditional compilers work. Trace compilers are full
41
+ -- of surprises like this -- have fun! :-)
42
+ --
43
+ -- Aborted traces are shown like this:
44
+ --
45
+ -- [TRACE --- foo.lua:44 -- leaving loop in root trace at foo:lua:50]
46
+ --
47
+ -- Don't worry -- trace aborts are quite common, even in programs which
48
+ -- can be fully compiled. The compiler may retry several times until it
49
+ -- finds a suitable trace.
50
+ --
51
+ -- Of course this doesn't work with features that are not-yet-implemented
52
+ -- (NYI error messages). The VM simply falls back to the interpreter. This
53
+ -- may not matter at all if the particular trace is not very high up in
54
+ -- the CPU usage profile. Oh, and the interpreter is quite fast, too.
55
+ --
56
+ -- Also check out the -jdump module, which prints all the gory details.
57
+ --
58
+ ------------------------------------------------------------------------------
59
+
60
+ -- Cache some library functions and objects.
61
+ local jit = require("jit")
62
+ assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
63
+ local jutil = require("jit.util")
64
+ local vmdef = require("jit.vmdef")
65
+ local funcinfo, traceinfo = jutil.funcinfo, jutil.traceinfo
66
+ local type, format = type, string.format
67
+ local stdout, stderr = io.stdout, io.stderr
68
+
69
+ -- Active flag and output file handle.
70
+ local active, out
71
+
72
+ ------------------------------------------------------------------------------
73
+
74
+ local startloc, startex
75
+
76
+ local function fmtfunc(func, pc)
77
+ local fi = funcinfo(func, pc)
78
+ if fi.loc then
79
+ return fi.loc
80
+ elseif fi.ffid then
81
+ return vmdef.ffnames[fi.ffid]
82
+ elseif fi.addr then
83
+ return format("C:%x", fi.addr)
84
+ else
85
+ return "(?)"
86
+ end
87
+ end
88
+
89
+ -- Format trace error message.
90
+ local function fmterr(err, info)
91
+ if type(err) == "number" then
92
+ if type(info) == "function" then info = fmtfunc(info) end
93
+ err = format(vmdef.traceerr[err], info)
94
+ end
95
+ return err
96
+ end
97
+
98
+ -- Dump trace states.
99
+ local function dump_trace(what, tr, func, pc, otr, oex)
100
+ if what == "start" then
101
+ startloc = fmtfunc(func, pc)
102
+ startex = otr and "("..otr.."/"..oex..") " or ""
103
+ else
104
+ if what == "abort" then
105
+ local loc = fmtfunc(func, pc)
106
+ if loc ~= startloc then
107
+ out:write(format("[TRACE --- %s%s -- %s at %s]\n",
108
+ startex, startloc, fmterr(otr, oex), loc))
109
+ else
110
+ out:write(format("[TRACE --- %s%s -- %s]\n",
111
+ startex, startloc, fmterr(otr, oex)))
112
+ end
113
+ elseif what == "stop" then
114
+ local info = traceinfo(tr)
115
+ local link, ltype = info.link, info.linktype
116
+ if ltype == "interpreter" then
117
+ out:write(format("[TRACE %3s %s%s -- fallback to interpreter]\n",
118
+ tr, startex, startloc))
119
+ elseif ltype == "stitch" then
120
+ out:write(format("[TRACE %3s %s%s %s %s]\n",
121
+ tr, startex, startloc, ltype, fmtfunc(func, pc)))
122
+ elseif link == tr or link == 0 then
123
+ out:write(format("[TRACE %3s %s%s %s]\n",
124
+ tr, startex, startloc, ltype))
125
+ elseif ltype == "root" then
126
+ out:write(format("[TRACE %3s %s%s -> %d]\n",
127
+ tr, startex, startloc, link))
128
+ else
129
+ out:write(format("[TRACE %3s %s%s -> %d %s]\n",
130
+ tr, startex, startloc, link, ltype))
131
+ end
132
+ else
133
+ out:write(format("[TRACE %s]\n", what))
134
+ end
135
+ out:flush()
136
+ end
137
+ end
138
+
139
+ ------------------------------------------------------------------------------
140
+
141
+ -- Detach dump handlers.
142
+ local function dumpoff()
143
+ if active then
144
+ active = false
145
+ jit.attach(dump_trace)
146
+ if out and out ~= stdout and out ~= stderr then out:close() end
147
+ out = nil
148
+ end
149
+ end
150
+
151
+ -- Open the output file and attach dump handlers.
152
+ local function dumpon(outfile)
153
+ if active then dumpoff() end
154
+ if not outfile then outfile = os.getenv("LUAJIT_VERBOSEFILE") end
155
+ if outfile then
156
+ out = outfile == "-" and stdout or assert(io.open(outfile, "w"))
157
+ else
158
+ out = stderr
159
+ end
160
+ jit.attach(dump_trace, "trace")
161
+ active = true
162
+ end
163
+
164
+ -- Public module functions.
165
+ return {
166
+ on = dumpon,
167
+ off = dumpoff,
168
+ start = dumpon -- For -j command line option.
169
+ }
170
+