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,752 @@
1
+ /*
2
+ ** String library.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ **
5
+ ** Major portions taken verbatim or adapted from the Lua interpreter.
6
+ ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
7
+ */
8
+
9
+ #define lib_string_c
10
+ #define LUA_LIB
11
+
12
+ #include "lua.h"
13
+ #include "lauxlib.h"
14
+ #include "lualib.h"
15
+
16
+ #include "lj_obj.h"
17
+ #include "lj_gc.h"
18
+ #include "lj_err.h"
19
+ #include "lj_buf.h"
20
+ #include "lj_str.h"
21
+ #include "lj_tab.h"
22
+ #include "lj_meta.h"
23
+ #include "lj_state.h"
24
+ #include "lj_ff.h"
25
+ #include "lj_bcdump.h"
26
+ #include "lj_char.h"
27
+ #include "lj_strfmt.h"
28
+ #include "lj_lib.h"
29
+
30
+ /* ------------------------------------------------------------------------ */
31
+
32
+ #define LJLIB_MODULE_string
33
+
34
+ LJLIB_LUA(string_len) /*
35
+ function(s)
36
+ CHECK_str(s)
37
+ return #s
38
+ end
39
+ */
40
+
41
+ LJLIB_ASM(string_byte) LJLIB_REC(string_range 0)
42
+ {
43
+ GCstr *s = lj_lib_checkstr(L, 1);
44
+ int32_t len = (int32_t)s->len;
45
+ int32_t start = lj_lib_optint(L, 2, 1);
46
+ int32_t stop = lj_lib_optint(L, 3, start);
47
+ int32_t n, i;
48
+ const unsigned char *p;
49
+ if (stop < 0) stop += len+1;
50
+ if (start < 0) start += len+1;
51
+ if (start <= 0) start = 1;
52
+ if (stop > len) stop = len;
53
+ if (start > stop) return FFH_RES(0); /* Empty interval: return no results. */
54
+ start--;
55
+ n = stop - start;
56
+ if ((uint32_t)n > LUAI_MAXCSTACK)
57
+ lj_err_caller(L, LJ_ERR_STRSLC);
58
+ lj_state_checkstack(L, (MSize)n);
59
+ p = (const unsigned char *)strdata(s) + start;
60
+ for (i = 0; i < n; i++)
61
+ setintV(L->base + i-1-LJ_FR2, p[i]);
62
+ return FFH_RES(n);
63
+ }
64
+
65
+ LJLIB_ASM(string_char) LJLIB_REC(.)
66
+ {
67
+ int i, nargs = (int)(L->top - L->base);
68
+ char *buf = lj_buf_tmp(L, (MSize)nargs);
69
+ for (i = 1; i <= nargs; i++) {
70
+ int32_t k = lj_lib_checkint(L, i);
71
+ if (!checku8(k))
72
+ lj_err_arg(L, i, LJ_ERR_BADVAL);
73
+ buf[i-1] = (char)k;
74
+ }
75
+ setstrV(L, L->base-1-LJ_FR2, lj_str_new(L, buf, (size_t)nargs));
76
+ return FFH_RES(1);
77
+ }
78
+
79
+ LJLIB_ASM(string_sub) LJLIB_REC(string_range 1)
80
+ {
81
+ lj_lib_checkstr(L, 1);
82
+ lj_lib_checkint(L, 2);
83
+ setintV(L->base+2, lj_lib_optint(L, 3, -1));
84
+ return FFH_RETRY;
85
+ }
86
+
87
+ LJLIB_CF(string_rep) LJLIB_REC(.)
88
+ {
89
+ GCstr *s = lj_lib_checkstr(L, 1);
90
+ int32_t rep = lj_lib_checkint(L, 2);
91
+ GCstr *sep = lj_lib_optstr(L, 3);
92
+ SBuf *sb = lj_buf_tmp_(L);
93
+ if (sep && rep > 1) {
94
+ GCstr *s2 = lj_buf_cat2str(L, sep, s);
95
+ lj_buf_reset(sb);
96
+ lj_buf_putstr(sb, s);
97
+ s = s2;
98
+ rep--;
99
+ }
100
+ sb = lj_buf_putstr_rep(sb, s, rep);
101
+ setstrV(L, L->top-1, lj_buf_str(L, sb));
102
+ lj_gc_check(L);
103
+ return 1;
104
+ }
105
+
106
+ LJLIB_ASM(string_reverse) LJLIB_REC(string_op IRCALL_lj_buf_putstr_reverse)
107
+ {
108
+ lj_lib_checkstr(L, 1);
109
+ return FFH_RETRY;
110
+ }
111
+ LJLIB_ASM_(string_lower) LJLIB_REC(string_op IRCALL_lj_buf_putstr_lower)
112
+ LJLIB_ASM_(string_upper) LJLIB_REC(string_op IRCALL_lj_buf_putstr_upper)
113
+
114
+ /* ------------------------------------------------------------------------ */
115
+
116
+ static int writer_buf(lua_State *L, const void *p, size_t size, void *sb)
117
+ {
118
+ lj_buf_putmem((SBuf *)sb, p, (MSize)size);
119
+ UNUSED(L);
120
+ return 0;
121
+ }
122
+
123
+ LJLIB_CF(string_dump)
124
+ {
125
+ GCfunc *fn = lj_lib_checkfunc(L, 1);
126
+ int strip = L->base+1 < L->top && tvistruecond(L->base+1);
127
+ SBuf *sb = lj_buf_tmp_(L); /* Assumes lj_bcwrite() doesn't use tmpbuf. */
128
+ L->top = L->base+1;
129
+ if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip))
130
+ lj_err_caller(L, LJ_ERR_STRDUMP);
131
+ setstrV(L, L->top-1, lj_buf_str(L, sb));
132
+ lj_gc_check(L);
133
+ return 1;
134
+ }
135
+
136
+ /* ------------------------------------------------------------------------ */
137
+
138
+ /* macro to `unsign' a character */
139
+ #define uchar(c) ((unsigned char)(c))
140
+
141
+ #define CAP_UNFINISHED (-1)
142
+ #define CAP_POSITION (-2)
143
+
144
+ typedef struct MatchState {
145
+ const char *src_init; /* init of source string */
146
+ const char *src_end; /* end (`\0') of source string */
147
+ lua_State *L;
148
+ int level; /* total number of captures (finished or unfinished) */
149
+ int depth;
150
+ struct {
151
+ const char *init;
152
+ ptrdiff_t len;
153
+ } capture[LUA_MAXCAPTURES];
154
+ } MatchState;
155
+
156
+ #define L_ESC '%'
157
+
158
+ static int check_capture(MatchState *ms, int l)
159
+ {
160
+ l -= '1';
161
+ if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)
162
+ lj_err_caller(ms->L, LJ_ERR_STRCAPI);
163
+ return l;
164
+ }
165
+
166
+ static int capture_to_close(MatchState *ms)
167
+ {
168
+ int level = ms->level;
169
+ for (level--; level>=0; level--)
170
+ if (ms->capture[level].len == CAP_UNFINISHED) return level;
171
+ lj_err_caller(ms->L, LJ_ERR_STRPATC);
172
+ return 0; /* unreachable */
173
+ }
174
+
175
+ static const char *classend(MatchState *ms, const char *p)
176
+ {
177
+ switch (*p++) {
178
+ case L_ESC:
179
+ if (*p == '\0')
180
+ lj_err_caller(ms->L, LJ_ERR_STRPATE);
181
+ return p+1;
182
+ case '[':
183
+ if (*p == '^') p++;
184
+ do { /* look for a `]' */
185
+ if (*p == '\0')
186
+ lj_err_caller(ms->L, LJ_ERR_STRPATM);
187
+ if (*(p++) == L_ESC && *p != '\0')
188
+ p++; /* skip escapes (e.g. `%]') */
189
+ } while (*p != ']');
190
+ return p+1;
191
+ default:
192
+ return p;
193
+ }
194
+ }
195
+
196
+ static const unsigned char match_class_map[32] = {
197
+ 0,LJ_CHAR_ALPHA,0,LJ_CHAR_CNTRL,LJ_CHAR_DIGIT,0,0,LJ_CHAR_GRAPH,0,0,0,0,
198
+ LJ_CHAR_LOWER,0,0,0,LJ_CHAR_PUNCT,0,0,LJ_CHAR_SPACE,0,
199
+ LJ_CHAR_UPPER,0,LJ_CHAR_ALNUM,LJ_CHAR_XDIGIT,0,0,0,0,0,0,0
200
+ };
201
+
202
+ static int match_class(int c, int cl)
203
+ {
204
+ if ((cl & 0xc0) == 0x40) {
205
+ int t = match_class_map[(cl&0x1f)];
206
+ if (t) {
207
+ t = lj_char_isa(c, t);
208
+ return (cl & 0x20) ? t : !t;
209
+ }
210
+ if (cl == 'z') return c == 0;
211
+ if (cl == 'Z') return c != 0;
212
+ }
213
+ return (cl == c);
214
+ }
215
+
216
+ static int matchbracketclass(int c, const char *p, const char *ec)
217
+ {
218
+ int sig = 1;
219
+ if (*(p+1) == '^') {
220
+ sig = 0;
221
+ p++; /* skip the `^' */
222
+ }
223
+ while (++p < ec) {
224
+ if (*p == L_ESC) {
225
+ p++;
226
+ if (match_class(c, uchar(*p)))
227
+ return sig;
228
+ }
229
+ else if ((*(p+1) == '-') && (p+2 < ec)) {
230
+ p+=2;
231
+ if (uchar(*(p-2)) <= c && c <= uchar(*p))
232
+ return sig;
233
+ }
234
+ else if (uchar(*p) == c) return sig;
235
+ }
236
+ return !sig;
237
+ }
238
+
239
+ static int singlematch(int c, const char *p, const char *ep)
240
+ {
241
+ switch (*p) {
242
+ case '.': return 1; /* matches any char */
243
+ case L_ESC: return match_class(c, uchar(*(p+1)));
244
+ case '[': return matchbracketclass(c, p, ep-1);
245
+ default: return (uchar(*p) == c);
246
+ }
247
+ }
248
+
249
+ static const char *match(MatchState *ms, const char *s, const char *p);
250
+
251
+ static const char *matchbalance(MatchState *ms, const char *s, const char *p)
252
+ {
253
+ if (*p == 0 || *(p+1) == 0)
254
+ lj_err_caller(ms->L, LJ_ERR_STRPATU);
255
+ if (*s != *p) {
256
+ return NULL;
257
+ } else {
258
+ int b = *p;
259
+ int e = *(p+1);
260
+ int cont = 1;
261
+ while (++s < ms->src_end) {
262
+ if (*s == e) {
263
+ if (--cont == 0) return s+1;
264
+ } else if (*s == b) {
265
+ cont++;
266
+ }
267
+ }
268
+ }
269
+ return NULL; /* string ends out of balance */
270
+ }
271
+
272
+ static const char *max_expand(MatchState *ms, const char *s,
273
+ const char *p, const char *ep)
274
+ {
275
+ ptrdiff_t i = 0; /* counts maximum expand for item */
276
+ while ((s+i)<ms->src_end && singlematch(uchar(*(s+i)), p, ep))
277
+ i++;
278
+ /* keeps trying to match with the maximum repetitions */
279
+ while (i>=0) {
280
+ const char *res = match(ms, (s+i), ep+1);
281
+ if (res) return res;
282
+ i--; /* else didn't match; reduce 1 repetition to try again */
283
+ }
284
+ return NULL;
285
+ }
286
+
287
+ static const char *min_expand(MatchState *ms, const char *s,
288
+ const char *p, const char *ep)
289
+ {
290
+ for (;;) {
291
+ const char *res = match(ms, s, ep+1);
292
+ if (res != NULL)
293
+ return res;
294
+ else if (s<ms->src_end && singlematch(uchar(*s), p, ep))
295
+ s++; /* try with one more repetition */
296
+ else
297
+ return NULL;
298
+ }
299
+ }
300
+
301
+ static const char *start_capture(MatchState *ms, const char *s,
302
+ const char *p, int what)
303
+ {
304
+ const char *res;
305
+ int level = ms->level;
306
+ if (level >= LUA_MAXCAPTURES) lj_err_caller(ms->L, LJ_ERR_STRCAPN);
307
+ ms->capture[level].init = s;
308
+ ms->capture[level].len = what;
309
+ ms->level = level+1;
310
+ if ((res=match(ms, s, p)) == NULL) /* match failed? */
311
+ ms->level--; /* undo capture */
312
+ return res;
313
+ }
314
+
315
+ static const char *end_capture(MatchState *ms, const char *s,
316
+ const char *p)
317
+ {
318
+ int l = capture_to_close(ms);
319
+ const char *res;
320
+ ms->capture[l].len = s - ms->capture[l].init; /* close capture */
321
+ if ((res = match(ms, s, p)) == NULL) /* match failed? */
322
+ ms->capture[l].len = CAP_UNFINISHED; /* undo capture */
323
+ return res;
324
+ }
325
+
326
+ static const char *match_capture(MatchState *ms, const char *s, int l)
327
+ {
328
+ size_t len;
329
+ l = check_capture(ms, l);
330
+ len = (size_t)ms->capture[l].len;
331
+ if ((size_t)(ms->src_end-s) >= len &&
332
+ memcmp(ms->capture[l].init, s, len) == 0)
333
+ return s+len;
334
+ else
335
+ return NULL;
336
+ }
337
+
338
+ static const char *match(MatchState *ms, const char *s, const char *p)
339
+ {
340
+ if (++ms->depth > LJ_MAX_XLEVEL)
341
+ lj_err_caller(ms->L, LJ_ERR_STRPATX);
342
+ init: /* using goto's to optimize tail recursion */
343
+ switch (*p) {
344
+ case '(': /* start capture */
345
+ if (*(p+1) == ')') /* position capture? */
346
+ s = start_capture(ms, s, p+2, CAP_POSITION);
347
+ else
348
+ s = start_capture(ms, s, p+1, CAP_UNFINISHED);
349
+ break;
350
+ case ')': /* end capture */
351
+ s = end_capture(ms, s, p+1);
352
+ break;
353
+ case L_ESC:
354
+ switch (*(p+1)) {
355
+ case 'b': /* balanced string? */
356
+ s = matchbalance(ms, s, p+2);
357
+ if (s == NULL) break;
358
+ p+=4;
359
+ goto init; /* else s = match(ms, s, p+4); */
360
+ case 'f': { /* frontier? */
361
+ const char *ep; char previous;
362
+ p += 2;
363
+ if (*p != '[')
364
+ lj_err_caller(ms->L, LJ_ERR_STRPATB);
365
+ ep = classend(ms, p); /* points to what is next */
366
+ previous = (s == ms->src_init) ? '\0' : *(s-1);
367
+ if (matchbracketclass(uchar(previous), p, ep-1) ||
368
+ !matchbracketclass(uchar(*s), p, ep-1)) { s = NULL; break; }
369
+ p=ep;
370
+ goto init; /* else s = match(ms, s, ep); */
371
+ }
372
+ default:
373
+ if (lj_char_isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */
374
+ s = match_capture(ms, s, uchar(*(p+1)));
375
+ if (s == NULL) break;
376
+ p+=2;
377
+ goto init; /* else s = match(ms, s, p+2) */
378
+ }
379
+ goto dflt; /* case default */
380
+ }
381
+ break;
382
+ case '\0': /* end of pattern */
383
+ break; /* match succeeded */
384
+ case '$':
385
+ /* is the `$' the last char in pattern? */
386
+ if (*(p+1) != '\0') goto dflt;
387
+ if (s != ms->src_end) s = NULL; /* check end of string */
388
+ break;
389
+ default: dflt: { /* it is a pattern item */
390
+ const char *ep = classend(ms, p); /* points to what is next */
391
+ int m = s<ms->src_end && singlematch(uchar(*s), p, ep);
392
+ switch (*ep) {
393
+ case '?': { /* optional */
394
+ const char *res;
395
+ if (m && ((res=match(ms, s+1, ep+1)) != NULL)) {
396
+ s = res;
397
+ break;
398
+ }
399
+ p=ep+1;
400
+ goto init; /* else s = match(ms, s, ep+1); */
401
+ }
402
+ case '*': /* 0 or more repetitions */
403
+ s = max_expand(ms, s, p, ep);
404
+ break;
405
+ case '+': /* 1 or more repetitions */
406
+ s = (m ? max_expand(ms, s+1, p, ep) : NULL);
407
+ break;
408
+ case '-': /* 0 or more repetitions (minimum) */
409
+ s = min_expand(ms, s, p, ep);
410
+ break;
411
+ default:
412
+ if (m) { s++; p=ep; goto init; } /* else s = match(ms, s+1, ep); */
413
+ s = NULL;
414
+ break;
415
+ }
416
+ break;
417
+ }
418
+ }
419
+ ms->depth--;
420
+ return s;
421
+ }
422
+
423
+ static void push_onecapture(MatchState *ms, int i, const char *s, const char *e)
424
+ {
425
+ if (i >= ms->level) {
426
+ if (i == 0) /* ms->level == 0, too */
427
+ lua_pushlstring(ms->L, s, (size_t)(e - s)); /* add whole match */
428
+ else
429
+ lj_err_caller(ms->L, LJ_ERR_STRCAPI);
430
+ } else {
431
+ ptrdiff_t l = ms->capture[i].len;
432
+ if (l == CAP_UNFINISHED) lj_err_caller(ms->L, LJ_ERR_STRCAPU);
433
+ if (l == CAP_POSITION)
434
+ lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1);
435
+ else
436
+ lua_pushlstring(ms->L, ms->capture[i].init, (size_t)l);
437
+ }
438
+ }
439
+
440
+ static int push_captures(MatchState *ms, const char *s, const char *e)
441
+ {
442
+ int i;
443
+ int nlevels = (ms->level == 0 && s) ? 1 : ms->level;
444
+ luaL_checkstack(ms->L, nlevels, "too many captures");
445
+ for (i = 0; i < nlevels; i++)
446
+ push_onecapture(ms, i, s, e);
447
+ return nlevels; /* number of strings pushed */
448
+ }
449
+
450
+ static int str_find_aux(lua_State *L, int find)
451
+ {
452
+ GCstr *s = lj_lib_checkstr(L, 1);
453
+ GCstr *p = lj_lib_checkstr(L, 2);
454
+ int32_t start = lj_lib_optint(L, 3, 1);
455
+ MSize st;
456
+ if (start < 0) start += (int32_t)s->len; else start--;
457
+ if (start < 0) start = 0;
458
+ st = (MSize)start;
459
+ if (st > s->len) {
460
+ #if LJ_52
461
+ setnilV(L->top-1);
462
+ return 1;
463
+ #else
464
+ st = s->len;
465
+ #endif
466
+ }
467
+ if (find && ((L->base+3 < L->top && tvistruecond(L->base+3)) ||
468
+ !lj_str_haspattern(p))) { /* Search for fixed string. */
469
+ const char *q = lj_str_find(strdata(s)+st, strdata(p), s->len-st, p->len);
470
+ if (q) {
471
+ setintV(L->top-2, (int32_t)(q-strdata(s)) + 1);
472
+ setintV(L->top-1, (int32_t)(q-strdata(s)) + (int32_t)p->len);
473
+ return 2;
474
+ }
475
+ } else { /* Search for pattern. */
476
+ MatchState ms;
477
+ const char *pstr = strdata(p);
478
+ const char *sstr = strdata(s) + st;
479
+ int anchor = 0;
480
+ if (*pstr == '^') { pstr++; anchor = 1; }
481
+ ms.L = L;
482
+ ms.src_init = strdata(s);
483
+ ms.src_end = strdata(s) + s->len;
484
+ do { /* Loop through string and try to match the pattern. */
485
+ const char *q;
486
+ ms.level = ms.depth = 0;
487
+ q = match(&ms, sstr, pstr);
488
+ if (q) {
489
+ if (find) {
490
+ setintV(L->top++, (int32_t)(sstr-(strdata(s)-1)));
491
+ setintV(L->top++, (int32_t)(q-strdata(s)));
492
+ return push_captures(&ms, NULL, NULL) + 2;
493
+ } else {
494
+ return push_captures(&ms, sstr, q);
495
+ }
496
+ }
497
+ } while (sstr++ < ms.src_end && !anchor);
498
+ }
499
+ setnilV(L->top-1); /* Not found. */
500
+ return 1;
501
+ }
502
+
503
+ LJLIB_CF(string_find) LJLIB_REC(.)
504
+ {
505
+ return str_find_aux(L, 1);
506
+ }
507
+
508
+ LJLIB_CF(string_match)
509
+ {
510
+ return str_find_aux(L, 0);
511
+ }
512
+
513
+ LJLIB_NOREG LJLIB_CF(string_gmatch_aux)
514
+ {
515
+ const char *p = strVdata(lj_lib_upvalue(L, 2));
516
+ GCstr *str = strV(lj_lib_upvalue(L, 1));
517
+ const char *s = strdata(str);
518
+ TValue *tvpos = lj_lib_upvalue(L, 3);
519
+ const char *src = s + tvpos->u32.lo;
520
+ MatchState ms;
521
+ ms.L = L;
522
+ ms.src_init = s;
523
+ ms.src_end = s + str->len;
524
+ for (; src <= ms.src_end; src++) {
525
+ const char *e;
526
+ ms.level = ms.depth = 0;
527
+ if ((e = match(&ms, src, p)) != NULL) {
528
+ int32_t pos = (int32_t)(e - s);
529
+ if (e == src) pos++; /* Ensure progress for empty match. */
530
+ tvpos->u32.lo = (uint32_t)pos;
531
+ return push_captures(&ms, src, e);
532
+ }
533
+ }
534
+ return 0; /* not found */
535
+ }
536
+
537
+ LJLIB_CF(string_gmatch)
538
+ {
539
+ lj_lib_checkstr(L, 1);
540
+ lj_lib_checkstr(L, 2);
541
+ L->top = L->base+3;
542
+ (L->top-1)->u64 = 0;
543
+ lj_lib_pushcc(L, lj_cf_string_gmatch_aux, FF_string_gmatch_aux, 3);
544
+ return 1;
545
+ }
546
+
547
+ static void add_s(MatchState *ms, luaL_Buffer *b, const char *s, const char *e)
548
+ {
549
+ size_t l, i;
550
+ const char *news = lua_tolstring(ms->L, 3, &l);
551
+ for (i = 0; i < l; i++) {
552
+ if (news[i] != L_ESC) {
553
+ luaL_addchar(b, news[i]);
554
+ } else {
555
+ i++; /* skip ESC */
556
+ if (!lj_char_isdigit(uchar(news[i]))) {
557
+ luaL_addchar(b, news[i]);
558
+ } else if (news[i] == '0') {
559
+ luaL_addlstring(b, s, (size_t)(e - s));
560
+ } else {
561
+ push_onecapture(ms, news[i] - '1', s, e);
562
+ luaL_addvalue(b); /* add capture to accumulated result */
563
+ }
564
+ }
565
+ }
566
+ }
567
+
568
+ static void add_value(MatchState *ms, luaL_Buffer *b,
569
+ const char *s, const char *e)
570
+ {
571
+ lua_State *L = ms->L;
572
+ switch (lua_type(L, 3)) {
573
+ case LUA_TNUMBER:
574
+ case LUA_TSTRING: {
575
+ add_s(ms, b, s, e);
576
+ return;
577
+ }
578
+ case LUA_TFUNCTION: {
579
+ int n;
580
+ lua_pushvalue(L, 3);
581
+ n = push_captures(ms, s, e);
582
+ lua_call(L, n, 1);
583
+ break;
584
+ }
585
+ case LUA_TTABLE: {
586
+ push_onecapture(ms, 0, s, e);
587
+ lua_gettable(L, 3);
588
+ break;
589
+ }
590
+ }
591
+ if (!lua_toboolean(L, -1)) { /* nil or false? */
592
+ lua_pop(L, 1);
593
+ lua_pushlstring(L, s, (size_t)(e - s)); /* keep original text */
594
+ } else if (!lua_isstring(L, -1)) {
595
+ lj_err_callerv(L, LJ_ERR_STRGSRV, luaL_typename(L, -1));
596
+ }
597
+ luaL_addvalue(b); /* add result to accumulator */
598
+ }
599
+
600
+ LJLIB_CF(string_gsub)
601
+ {
602
+ size_t srcl;
603
+ const char *src = luaL_checklstring(L, 1, &srcl);
604
+ const char *p = luaL_checkstring(L, 2);
605
+ int tr = lua_type(L, 3);
606
+ int max_s = luaL_optint(L, 4, (int)(srcl+1));
607
+ int anchor = (*p == '^') ? (p++, 1) : 0;
608
+ int n = 0;
609
+ MatchState ms;
610
+ luaL_Buffer b;
611
+ if (!(tr == LUA_TNUMBER || tr == LUA_TSTRING ||
612
+ tr == LUA_TFUNCTION || tr == LUA_TTABLE))
613
+ lj_err_arg(L, 3, LJ_ERR_NOSFT);
614
+ luaL_buffinit(L, &b);
615
+ ms.L = L;
616
+ ms.src_init = src;
617
+ ms.src_end = src+srcl;
618
+ while (n < max_s) {
619
+ const char *e;
620
+ ms.level = ms.depth = 0;
621
+ e = match(&ms, src, p);
622
+ if (e) {
623
+ n++;
624
+ add_value(&ms, &b, src, e);
625
+ }
626
+ if (e && e>src) /* non empty match? */
627
+ src = e; /* skip it */
628
+ else if (src < ms.src_end)
629
+ luaL_addchar(&b, *src++);
630
+ else
631
+ break;
632
+ if (anchor)
633
+ break;
634
+ }
635
+ luaL_addlstring(&b, src, (size_t)(ms.src_end-src));
636
+ luaL_pushresult(&b);
637
+ lua_pushinteger(L, n); /* number of substitutions */
638
+ return 2;
639
+ }
640
+
641
+ /* ------------------------------------------------------------------------ */
642
+
643
+ /* Emulate tostring() inline. */
644
+ static GCstr *string_fmt_tostring(lua_State *L, int arg, int retry)
645
+ {
646
+ TValue *o = L->base+arg-1;
647
+ cTValue *mo;
648
+ lua_assert(o < L->top); /* Caller already checks for existence. */
649
+ if (LJ_LIKELY(tvisstr(o)))
650
+ return strV(o);
651
+ if (retry != 2 && !tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) {
652
+ copyTV(L, L->top++, mo);
653
+ copyTV(L, L->top++, o);
654
+ lua_call(L, 1, 1);
655
+ copyTV(L, L->base+arg-1, --L->top);
656
+ return NULL; /* Buffer may be overwritten, retry. */
657
+ }
658
+ return lj_strfmt_obj(L, o);
659
+ }
660
+
661
+ LJLIB_CF(string_format) LJLIB_REC(.)
662
+ {
663
+ int arg, top = (int)(L->top - L->base);
664
+ GCstr *fmt;
665
+ SBuf *sb;
666
+ FormatState fs;
667
+ SFormat sf;
668
+ int retry = 0;
669
+ again:
670
+ arg = 1;
671
+ sb = lj_buf_tmp_(L);
672
+ fmt = lj_lib_checkstr(L, arg);
673
+ lj_strfmt_init(&fs, strdata(fmt), fmt->len);
674
+ while ((sf = lj_strfmt_parse(&fs)) != STRFMT_EOF) {
675
+ if (sf == STRFMT_LIT) {
676
+ lj_buf_putmem(sb, fs.str, fs.len);
677
+ } else if (sf == STRFMT_ERR) {
678
+ lj_err_callerv(L, LJ_ERR_STRFMT, strdata(lj_str_new(L, fs.str, fs.len)));
679
+ } else {
680
+ if (++arg > top)
681
+ luaL_argerror(L, arg, lj_obj_typename[0]);
682
+ switch (STRFMT_TYPE(sf)) {
683
+ case STRFMT_INT:
684
+ if (tvisint(L->base+arg-1)) {
685
+ int32_t k = intV(L->base+arg-1);
686
+ if (sf == STRFMT_INT)
687
+ lj_strfmt_putint(sb, k); /* Shortcut for plain %d. */
688
+ else
689
+ lj_strfmt_putfxint(sb, sf, k);
690
+ } else {
691
+ lj_strfmt_putfnum_int(sb, sf, lj_lib_checknum(L, arg));
692
+ }
693
+ break;
694
+ case STRFMT_UINT:
695
+ if (tvisint(L->base+arg-1))
696
+ lj_strfmt_putfxint(sb, sf, intV(L->base+arg-1));
697
+ else
698
+ lj_strfmt_putfnum_uint(sb, sf, lj_lib_checknum(L, arg));
699
+ break;
700
+ case STRFMT_NUM:
701
+ lj_strfmt_putfnum(sb, sf, lj_lib_checknum(L, arg));
702
+ break;
703
+ case STRFMT_STR: {
704
+ GCstr *str = string_fmt_tostring(L, arg, retry);
705
+ if (str == NULL)
706
+ retry = 1;
707
+ else if ((sf & STRFMT_T_QUOTED))
708
+ lj_strfmt_putquoted(sb, str); /* No formatting. */
709
+ else
710
+ lj_strfmt_putfstr(sb, sf, str);
711
+ break;
712
+ }
713
+ case STRFMT_CHAR:
714
+ lj_strfmt_putfchar(sb, sf, lj_lib_checkint(L, arg));
715
+ break;
716
+ case STRFMT_PTR: /* No formatting. */
717
+ lj_strfmt_putptr(sb, lj_obj_ptr(L->base+arg-1));
718
+ break;
719
+ default:
720
+ lua_assert(0);
721
+ break;
722
+ }
723
+ }
724
+ }
725
+ if (retry++ == 1) goto again;
726
+ setstrV(L, L->top-1, lj_buf_str(L, sb));
727
+ lj_gc_check(L);
728
+ return 1;
729
+ }
730
+
731
+ /* ------------------------------------------------------------------------ */
732
+
733
+ #include "lj_libdef.h"
734
+
735
+ LUALIB_API int luaopen_string(lua_State *L)
736
+ {
737
+ GCtab *mt;
738
+ global_State *g;
739
+ LJ_LIB_REG(L, LUA_STRLIBNAME, string);
740
+ #if defined(LUA_COMPAT_GFIND) && !LJ_52
741
+ lua_getfield(L, -1, "gmatch");
742
+ lua_setfield(L, -2, "gfind");
743
+ #endif
744
+ mt = lj_tab_new(L, 0, 1);
745
+ /* NOBARRIER: basemt is a GC root. */
746
+ g = G(L);
747
+ setgcref(basemt_it(g, LJ_TSTR), obj2gco(mt));
748
+ settabV(L, lj_tab_setstr(L, mt, mmname_str(g, MM_index)), tabV(L->top-1));
749
+ mt->nomm = (uint8_t)(~(1u<<MM_index));
750
+ return 1;
751
+ }
752
+