immunio 0.15.4 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
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,386 @@
1
+ /*
2
+ ** Machine code management.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #define lj_mcode_c
7
+ #define LUA_CORE
8
+
9
+ #include "lj_obj.h"
10
+ #if LJ_HASJIT
11
+ #include "lj_gc.h"
12
+ #include "lj_err.h"
13
+ #include "lj_jit.h"
14
+ #include "lj_mcode.h"
15
+ #include "lj_trace.h"
16
+ #include "lj_dispatch.h"
17
+ #endif
18
+ #if LJ_HASJIT || LJ_HASFFI
19
+ #include "lj_vm.h"
20
+ #endif
21
+
22
+ /* -- OS-specific functions ----------------------------------------------- */
23
+
24
+ #if LJ_HASJIT || LJ_HASFFI
25
+
26
+ /* Define this if you want to run LuaJIT with Valgrind. */
27
+ #ifdef LUAJIT_USE_VALGRIND
28
+ #include <valgrind/valgrind.h>
29
+ #endif
30
+
31
+ #if LJ_TARGET_IOS
32
+ void sys_icache_invalidate(void *start, size_t len);
33
+ #endif
34
+
35
+ /* Synchronize data/instruction cache. */
36
+ void lj_mcode_sync(void *start, void *end)
37
+ {
38
+ #ifdef LUAJIT_USE_VALGRIND
39
+ VALGRIND_DISCARD_TRANSLATIONS(start, (char *)end-(char *)start);
40
+ #endif
41
+ #if LJ_TARGET_X86ORX64
42
+ UNUSED(start); UNUSED(end);
43
+ #elif LJ_TARGET_IOS
44
+ sys_icache_invalidate(start, (char *)end-(char *)start);
45
+ #elif LJ_TARGET_PPC
46
+ lj_vm_cachesync(start, end);
47
+ #elif defined(__GNUC__)
48
+ __clear_cache(start, end);
49
+ #else
50
+ #error "Missing builtin to flush instruction cache"
51
+ #endif
52
+ }
53
+
54
+ #endif
55
+
56
+ #if LJ_HASJIT
57
+
58
+ #if LJ_TARGET_WINDOWS
59
+
60
+ #define WIN32_LEAN_AND_MEAN
61
+ #include <windows.h>
62
+
63
+ #define MCPROT_RW PAGE_READWRITE
64
+ #define MCPROT_RX PAGE_EXECUTE_READ
65
+ #define MCPROT_RWX PAGE_EXECUTE_READWRITE
66
+
67
+ static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, DWORD prot)
68
+ {
69
+ void *p = VirtualAlloc((void *)hint, sz,
70
+ MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, prot);
71
+ if (!p && !hint)
72
+ lj_trace_err(J, LJ_TRERR_MCODEAL);
73
+ return p;
74
+ }
75
+
76
+ static void mcode_free(jit_State *J, void *p, size_t sz)
77
+ {
78
+ UNUSED(J); UNUSED(sz);
79
+ VirtualFree(p, 0, MEM_RELEASE);
80
+ }
81
+
82
+ static int mcode_setprot(void *p, size_t sz, DWORD prot)
83
+ {
84
+ DWORD oprot;
85
+ return !VirtualProtect(p, sz, prot, &oprot);
86
+ }
87
+
88
+ #elif LJ_TARGET_POSIX
89
+
90
+ #include <sys/mman.h>
91
+
92
+ #ifndef MAP_ANONYMOUS
93
+ #define MAP_ANONYMOUS MAP_ANON
94
+ #endif
95
+
96
+ #define MCPROT_RW (PROT_READ|PROT_WRITE)
97
+ #define MCPROT_RX (PROT_READ|PROT_EXEC)
98
+ #define MCPROT_RWX (PROT_READ|PROT_WRITE|PROT_EXEC)
99
+
100
+ static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)
101
+ {
102
+ void *p = mmap((void *)hint, sz, prot, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
103
+ if (p == MAP_FAILED) {
104
+ if (!hint) lj_trace_err(J, LJ_TRERR_MCODEAL);
105
+ p = NULL;
106
+ }
107
+ return p;
108
+ }
109
+
110
+ static void mcode_free(jit_State *J, void *p, size_t sz)
111
+ {
112
+ UNUSED(J);
113
+ munmap(p, sz);
114
+ }
115
+
116
+ static int mcode_setprot(void *p, size_t sz, int prot)
117
+ {
118
+ return mprotect(p, sz, prot);
119
+ }
120
+
121
+ #elif LJ_64
122
+
123
+ #error "Missing OS support for explicit placement of executable memory"
124
+
125
+ #else
126
+
127
+ /* Fallback allocator. This will fail if memory is not executable by default. */
128
+ #define LUAJIT_UNPROTECT_MCODE
129
+ #define MCPROT_RW 0
130
+ #define MCPROT_RX 0
131
+ #define MCPROT_RWX 0
132
+
133
+ static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)
134
+ {
135
+ UNUSED(hint); UNUSED(prot);
136
+ return lj_mem_new(J->L, sz);
137
+ }
138
+
139
+ static void mcode_free(jit_State *J, void *p, size_t sz)
140
+ {
141
+ lj_mem_free(J2G(J), p, sz);
142
+ }
143
+
144
+ #endif
145
+
146
+ /* -- MCode area protection ----------------------------------------------- */
147
+
148
+ /* Define this ONLY if page protection twiddling becomes a bottleneck. */
149
+ #ifdef LUAJIT_UNPROTECT_MCODE
150
+
151
+ /* It's generally considered to be a potential security risk to have
152
+ ** pages with simultaneous write *and* execute access in a process.
153
+ **
154
+ ** Do not even think about using this mode for server processes or
155
+ ** apps handling untrusted external data (such as a browser).
156
+ **
157
+ ** The security risk is not in LuaJIT itself -- but if an adversary finds
158
+ ** any *other* flaw in your C application logic, then any RWX memory page
159
+ ** simplifies writing an exploit considerably.
160
+ */
161
+ #define MCPROT_GEN MCPROT_RWX
162
+ #define MCPROT_RUN MCPROT_RWX
163
+
164
+ static void mcode_protect(jit_State *J, int prot)
165
+ {
166
+ UNUSED(J); UNUSED(prot);
167
+ }
168
+
169
+ #else
170
+
171
+ /* This is the default behaviour and much safer:
172
+ **
173
+ ** Most of the time the memory pages holding machine code are executable,
174
+ ** but NONE of them is writable.
175
+ **
176
+ ** The current memory area is marked read-write (but NOT executable) only
177
+ ** during the short time window while the assembler generates machine code.
178
+ */
179
+ #define MCPROT_GEN MCPROT_RW
180
+ #define MCPROT_RUN MCPROT_RX
181
+
182
+ /* Protection twiddling failed. Probably due to kernel security. */
183
+ static LJ_NOINLINE void mcode_protfail(jit_State *J)
184
+ {
185
+ lua_CFunction panic = J2G(J)->panic;
186
+ if (panic) {
187
+ lua_State *L = J->L;
188
+ setstrV(L, L->top++, lj_err_str(L, LJ_ERR_JITPROT));
189
+ panic(L);
190
+ }
191
+ }
192
+
193
+ /* Change protection of MCode area. */
194
+ static void mcode_protect(jit_State *J, int prot)
195
+ {
196
+ if (J->mcprot != prot) {
197
+ if (LJ_UNLIKELY(mcode_setprot(J->mcarea, J->szmcarea, prot)))
198
+ mcode_protfail(J);
199
+ J->mcprot = prot;
200
+ }
201
+ }
202
+
203
+ #endif
204
+
205
+ /* -- MCode area allocation ----------------------------------------------- */
206
+
207
+ #if LJ_TARGET_X64
208
+ #define mcode_validptr(p) ((p) && (uintptr_t)(p) < (uintptr_t)1<<47)
209
+ #else
210
+ #define mcode_validptr(p) ((p) && (uintptr_t)(p) < 0xffff0000)
211
+ #endif
212
+
213
+ #ifdef LJ_TARGET_JUMPRANGE
214
+
215
+ /* Get memory within relative jump distance of our code in 64 bit mode. */
216
+ static void *mcode_alloc(jit_State *J, size_t sz)
217
+ {
218
+ /* Target an address in the static assembler code (64K aligned).
219
+ ** Try addresses within a distance of target-range/2+1MB..target+range/2-1MB.
220
+ ** Use half the jump range so every address in the range can reach any other.
221
+ */
222
+ #if LJ_TARGET_MIPS
223
+ /* Use the middle of the 256MB-aligned region. */
224
+ uintptr_t target = ((uintptr_t)(void *)lj_vm_exit_handler & 0xf0000000u) +
225
+ 0x08000000u;
226
+ #else
227
+ uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff;
228
+ #endif
229
+ const uintptr_t range = (1u << (LJ_TARGET_JUMPRANGE-1)) - (1u << 21);
230
+ /* First try a contiguous area below the last one. */
231
+ uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0;
232
+ int i;
233
+ for (i = 0; i < 32; i++) { /* 32 attempts ought to be enough ... */
234
+ if (mcode_validptr(hint)) {
235
+ void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN);
236
+
237
+ if (mcode_validptr(p) &&
238
+ ((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range))
239
+ return p;
240
+ if (p) mcode_free(J, p, sz); /* Free badly placed area. */
241
+ }
242
+ /* Next try probing pseudo-random addresses. */
243
+ do {
244
+ hint = (0x78fb ^ LJ_PRNG_BITS(J, 15)) << 16; /* 64K aligned. */
245
+ } while (!(hint + sz < range));
246
+ hint = target + hint - (range>>1);
247
+ }
248
+ lj_trace_err(J, LJ_TRERR_MCODEAL); /* Give up. OS probably ignores hints? */
249
+ return NULL;
250
+ }
251
+
252
+ #else
253
+
254
+ /* All memory addresses are reachable by relative jumps. */
255
+ static void *mcode_alloc(jit_State *J, size_t sz)
256
+ {
257
+ #ifdef __OpenBSD__
258
+ /* Allow better executable memory allocation for OpenBSD W^X mode. */
259
+ void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN);
260
+ if (p && mcode_setprot(p, sz, MCPROT_GEN)) {
261
+ mcode_free(J, p, sz);
262
+ return NULL;
263
+ }
264
+ return p;
265
+ #else
266
+ return mcode_alloc_at(J, 0, sz, MCPROT_GEN);
267
+ #endif
268
+ }
269
+
270
+ #endif
271
+
272
+ /* -- MCode area management ----------------------------------------------- */
273
+
274
+ /* Linked list of MCode areas. */
275
+ typedef struct MCLink {
276
+ MCode *next; /* Next area. */
277
+ size_t size; /* Size of current area. */
278
+ } MCLink;
279
+
280
+ /* Allocate a new MCode area. */
281
+ static void mcode_allocarea(jit_State *J)
282
+ {
283
+ MCode *oldarea = J->mcarea;
284
+ size_t sz = (size_t)J->param[JIT_P_sizemcode] << 10;
285
+ sz = (sz + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);
286
+ J->mcarea = (MCode *)mcode_alloc(J, sz);
287
+ J->szmcarea = sz;
288
+ J->mcprot = MCPROT_GEN;
289
+ J->mctop = (MCode *)((char *)J->mcarea + J->szmcarea);
290
+ J->mcbot = (MCode *)((char *)J->mcarea + sizeof(MCLink));
291
+ ((MCLink *)J->mcarea)->next = oldarea;
292
+ ((MCLink *)J->mcarea)->size = sz;
293
+ J->szallmcarea += sz;
294
+ }
295
+
296
+ /* Free all MCode areas. */
297
+ void lj_mcode_free(jit_State *J)
298
+ {
299
+ MCode *mc = J->mcarea;
300
+ J->mcarea = NULL;
301
+ J->szallmcarea = 0;
302
+ while (mc) {
303
+ MCode *next = ((MCLink *)mc)->next;
304
+ mcode_free(J, mc, ((MCLink *)mc)->size);
305
+ mc = next;
306
+ }
307
+ }
308
+
309
+ /* -- MCode transactions -------------------------------------------------- */
310
+
311
+ /* Reserve the remainder of the current MCode area. */
312
+ MCode *lj_mcode_reserve(jit_State *J, MCode **lim)
313
+ {
314
+ if (!J->mcarea)
315
+ mcode_allocarea(J);
316
+ else
317
+ mcode_protect(J, MCPROT_GEN);
318
+ *lim = J->mcbot;
319
+ return J->mctop;
320
+ }
321
+
322
+ /* Commit the top part of the current MCode area. */
323
+ void lj_mcode_commit(jit_State *J, MCode *top)
324
+ {
325
+ J->mctop = top;
326
+ mcode_protect(J, MCPROT_RUN);
327
+ }
328
+
329
+ /* Abort the reservation. */
330
+ void lj_mcode_abort(jit_State *J)
331
+ {
332
+ if (J->mcarea)
333
+ mcode_protect(J, MCPROT_RUN);
334
+ }
335
+
336
+ /* Set/reset protection to allow patching of MCode areas. */
337
+ MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish)
338
+ {
339
+ #ifdef LUAJIT_UNPROTECT_MCODE
340
+ UNUSED(J); UNUSED(ptr); UNUSED(finish);
341
+ return NULL;
342
+ #else
343
+ if (finish) {
344
+ if (J->mcarea == ptr)
345
+ mcode_protect(J, MCPROT_RUN);
346
+ else if (LJ_UNLIKELY(mcode_setprot(ptr, ((MCLink *)ptr)->size, MCPROT_RUN)))
347
+ mcode_protfail(J);
348
+ return NULL;
349
+ } else {
350
+ MCode *mc = J->mcarea;
351
+ /* Try current area first to use the protection cache. */
352
+ if (ptr >= mc && ptr < (MCode *)((char *)mc + J->szmcarea)) {
353
+ mcode_protect(J, MCPROT_GEN);
354
+ return mc;
355
+ }
356
+ /* Otherwise search through the list of MCode areas. */
357
+ for (;;) {
358
+ mc = ((MCLink *)mc)->next;
359
+ lua_assert(mc != NULL);
360
+ if (ptr >= mc && ptr < (MCode *)((char *)mc + ((MCLink *)mc)->size)) {
361
+ if (LJ_UNLIKELY(mcode_setprot(mc, ((MCLink *)mc)->size, MCPROT_GEN)))
362
+ mcode_protfail(J);
363
+ return mc;
364
+ }
365
+ }
366
+ }
367
+ #endif
368
+ }
369
+
370
+ /* Limit of MCode reservation reached. */
371
+ void lj_mcode_limiterr(jit_State *J, size_t need)
372
+ {
373
+ size_t sizemcode, maxmcode;
374
+ lj_mcode_abort(J);
375
+ sizemcode = (size_t)J->param[JIT_P_sizemcode] << 10;
376
+ sizemcode = (sizemcode + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);
377
+ maxmcode = (size_t)J->param[JIT_P_maxmcode] << 10;
378
+ if ((size_t)need > sizemcode)
379
+ lj_trace_err(J, LJ_TRERR_MCODEOV); /* Too long for any area. */
380
+ if (J->szallmcarea + sizemcode > maxmcode)
381
+ lj_trace_err(J, LJ_TRERR_MCODEAL);
382
+ mcode_allocarea(J);
383
+ lj_trace_err(J, LJ_TRERR_MCODELM); /* Retry with new area. */
384
+ }
385
+
386
+ #endif
@@ -0,0 +1,30 @@
1
+ /*
2
+ ** Machine code management.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #ifndef _LJ_MCODE_H
7
+ #define _LJ_MCODE_H
8
+
9
+ #include "lj_obj.h"
10
+
11
+ #if LJ_HASJIT || LJ_HASFFI
12
+ LJ_FUNC void lj_mcode_sync(void *start, void *end);
13
+ #endif
14
+
15
+ #if LJ_HASJIT
16
+
17
+ #include "lj_jit.h"
18
+
19
+ LJ_FUNC void lj_mcode_free(jit_State *J);
20
+ LJ_FUNC MCode *lj_mcode_reserve(jit_State *J, MCode **lim);
21
+ LJ_FUNC void lj_mcode_commit(jit_State *J, MCode *m);
22
+ LJ_FUNC void lj_mcode_abort(jit_State *J);
23
+ LJ_FUNC MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish);
24
+ LJ_FUNC_NORET void lj_mcode_limiterr(jit_State *J, size_t need);
25
+
26
+ #define lj_mcode_commitbot(J, m) (J->mcbot = (m))
27
+
28
+ #endif
29
+
30
+ #endif
@@ -0,0 +1,477 @@
1
+ /*
2
+ ** Metamethod handling.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ **
5
+ ** 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 lj_meta_c
10
+ #define LUA_CORE
11
+
12
+ #include "lj_obj.h"
13
+ #include "lj_gc.h"
14
+ #include "lj_err.h"
15
+ #include "lj_buf.h"
16
+ #include "lj_str.h"
17
+ #include "lj_tab.h"
18
+ #include "lj_meta.h"
19
+ #include "lj_frame.h"
20
+ #include "lj_bc.h"
21
+ #include "lj_vm.h"
22
+ #include "lj_strscan.h"
23
+ #include "lj_strfmt.h"
24
+ #include "lj_lib.h"
25
+
26
+ /* -- Metamethod handling ------------------------------------------------- */
27
+
28
+ /* String interning of metamethod names for fast indexing. */
29
+ void lj_meta_init(lua_State *L)
30
+ {
31
+ #define MMNAME(name) "__" #name
32
+ const char *metanames = MMDEF(MMNAME);
33
+ #undef MMNAME
34
+ global_State *g = G(L);
35
+ const char *p, *q;
36
+ uint32_t mm;
37
+ for (mm = 0, p = metanames; *p; mm++, p = q) {
38
+ GCstr *s;
39
+ for (q = p+2; *q && *q != '_'; q++) ;
40
+ s = lj_str_new(L, p, (size_t)(q-p));
41
+ /* NOBARRIER: g->gcroot[] is a GC root. */
42
+ setgcref(g->gcroot[GCROOT_MMNAME+mm], obj2gco(s));
43
+ }
44
+ }
45
+
46
+ /* Negative caching of a few fast metamethods. See the lj_meta_fast() macro. */
47
+ cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name)
48
+ {
49
+ cTValue *mo = lj_tab_getstr(mt, name);
50
+ lua_assert(mm <= MM_FAST);
51
+ if (!mo || tvisnil(mo)) { /* No metamethod? */
52
+ mt->nomm |= (uint8_t)(1u<<mm); /* Set negative cache flag. */
53
+ return NULL;
54
+ }
55
+ return mo;
56
+ }
57
+
58
+ /* Lookup metamethod for object. */
59
+ cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm)
60
+ {
61
+ GCtab *mt;
62
+ if (tvistab(o))
63
+ mt = tabref(tabV(o)->metatable);
64
+ else if (tvisudata(o))
65
+ mt = tabref(udataV(o)->metatable);
66
+ else
67
+ mt = tabref(basemt_obj(G(L), o));
68
+ if (mt) {
69
+ cTValue *mo = lj_tab_getstr(mt, mmname_str(G(L), mm));
70
+ if (mo)
71
+ return mo;
72
+ }
73
+ return niltv(L);
74
+ }
75
+
76
+ #if LJ_HASFFI
77
+ /* Tailcall from C function. */
78
+ int lj_meta_tailcall(lua_State *L, cTValue *tv)
79
+ {
80
+ TValue *base = L->base;
81
+ TValue *top = L->top;
82
+ const BCIns *pc = frame_pc(base-1); /* Preserve old PC from frame. */
83
+ copyTV(L, base-1-LJ_FR2, tv); /* Replace frame with new object. */
84
+ if (LJ_FR2)
85
+ (top++)->u64 = LJ_CONT_TAILCALL;
86
+ else
87
+ top->u32.lo = LJ_CONT_TAILCALL;
88
+ setframe_pc(top++, pc);
89
+ if (LJ_FR2) top++;
90
+ setframe_gc(top, obj2gco(L), LJ_TTHREAD); /* Dummy frame object. */
91
+ setframe_ftsz(top, ((char *)(top+1) - (char *)base) + FRAME_CONT);
92
+ L->base = L->top = top+1;
93
+ /*
94
+ ** before: [old_mo|PC] [... ...]
95
+ ** ^base ^top
96
+ ** after: [new_mo|itype] [... ...] [NULL|PC] [dummy|delta]
97
+ ** ^base/top
98
+ ** tailcall: [new_mo|PC] [... ...]
99
+ ** ^base ^top
100
+ */
101
+ return 0;
102
+ }
103
+ #endif
104
+
105
+ /* Setup call to metamethod to be run by Assembler VM. */
106
+ static TValue *mmcall(lua_State *L, ASMFunction cont, cTValue *mo,
107
+ cTValue *a, cTValue *b)
108
+ {
109
+ /*
110
+ ** |-- framesize -> top top+1 top+2 top+3
111
+ ** before: [func slots ...]
112
+ ** mm setup: [func slots ...] [cont|?] [mo|tmtype] [a] [b]
113
+ ** in asm: [func slots ...] [cont|PC] [mo|delta] [a] [b]
114
+ ** ^-- func base ^-- mm base
115
+ ** after mm: [func slots ...] [result]
116
+ ** ^-- copy to base[PC_RA] --/ for lj_cont_ra
117
+ ** istruecond + branch for lj_cont_cond*
118
+ ** ignore for lj_cont_nop
119
+ ** next PC: [func slots ...]
120
+ */
121
+ TValue *top = L->top;
122
+ if (curr_funcisL(L)) top = curr_topL(L);
123
+ setcont(top++, cont); /* Assembler VM stores PC in upper word or FR2. */
124
+ if (LJ_FR2) setnilV(top++);
125
+ copyTV(L, top++, mo); /* Store metamethod and two arguments. */
126
+ if (LJ_FR2) setnilV(top++);
127
+ copyTV(L, top, a);
128
+ copyTV(L, top+1, b);
129
+ return top; /* Return new base. */
130
+ }
131
+
132
+ /* -- C helpers for some instructions, called from assembler VM ----------- */
133
+
134
+ /* Helper for TGET*. __index chain and metamethod. */
135
+ cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k)
136
+ {
137
+ int loop;
138
+ for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
139
+ cTValue *mo;
140
+ if (LJ_LIKELY(tvistab(o))) {
141
+ GCtab *t = tabV(o);
142
+ cTValue *tv = lj_tab_get(L, t, k);
143
+ if (!tvisnil(tv) ||
144
+ !(mo = lj_meta_fast(L, tabref(t->metatable), MM_index)))
145
+ return tv;
146
+ } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_index))) {
147
+ lj_err_optype(L, o, LJ_ERR_OPINDEX);
148
+ return NULL; /* unreachable */
149
+ }
150
+ if (tvisfunc(mo)) {
151
+ L->top = mmcall(L, lj_cont_ra, mo, o, k);
152
+ return NULL; /* Trigger metamethod call. */
153
+ }
154
+ o = mo;
155
+ }
156
+ lj_err_msg(L, LJ_ERR_GETLOOP);
157
+ return NULL; /* unreachable */
158
+ }
159
+
160
+ /* Helper for TSET*. __newindex chain and metamethod. */
161
+ TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k)
162
+ {
163
+ TValue tmp;
164
+ int loop;
165
+ for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
166
+ cTValue *mo;
167
+ if (LJ_LIKELY(tvistab(o))) {
168
+ GCtab *t = tabV(o);
169
+ cTValue *tv = lj_tab_get(L, t, k);
170
+ if (LJ_LIKELY(!tvisnil(tv))) {
171
+ t->nomm = 0; /* Invalidate negative metamethod cache. */
172
+ lj_gc_anybarriert(L, t);
173
+ return (TValue *)tv;
174
+ } else if (!(mo = lj_meta_fast(L, tabref(t->metatable), MM_newindex))) {
175
+ t->nomm = 0; /* Invalidate negative metamethod cache. */
176
+ lj_gc_anybarriert(L, t);
177
+ if (tv != niltv(L))
178
+ return (TValue *)tv;
179
+ if (tvisnil(k)) lj_err_msg(L, LJ_ERR_NILIDX);
180
+ else if (tvisint(k)) { setnumV(&tmp, (lua_Number)intV(k)); k = &tmp; }
181
+ else if (tvisnum(k) && tvisnan(k)) lj_err_msg(L, LJ_ERR_NANIDX);
182
+ return lj_tab_newkey(L, t, k);
183
+ }
184
+ } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_newindex))) {
185
+ lj_err_optype(L, o, LJ_ERR_OPINDEX);
186
+ return NULL; /* unreachable */
187
+ }
188
+ if (tvisfunc(mo)) {
189
+ L->top = mmcall(L, lj_cont_nop, mo, o, k);
190
+ /* L->top+2 = v filled in by caller. */
191
+ return NULL; /* Trigger metamethod call. */
192
+ }
193
+ copyTV(L, &tmp, mo);
194
+ o = &tmp;
195
+ }
196
+ lj_err_msg(L, LJ_ERR_SETLOOP);
197
+ return NULL; /* unreachable */
198
+ }
199
+
200
+ static cTValue *str2num(cTValue *o, TValue *n)
201
+ {
202
+ if (tvisnum(o))
203
+ return o;
204
+ else if (tvisint(o))
205
+ return (setnumV(n, (lua_Number)intV(o)), n);
206
+ else if (tvisstr(o) && lj_strscan_num(strV(o), n))
207
+ return n;
208
+ else
209
+ return NULL;
210
+ }
211
+
212
+ /* Helper for arithmetic instructions. Coercion, metamethod. */
213
+ TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb, cTValue *rc,
214
+ BCReg op)
215
+ {
216
+ MMS mm = bcmode_mm(op);
217
+ TValue tempb, tempc;
218
+ cTValue *b, *c;
219
+ if ((b = str2num(rb, &tempb)) != NULL &&
220
+ (c = str2num(rc, &tempc)) != NULL) { /* Try coercion first. */
221
+ setnumV(ra, lj_vm_foldarith(numV(b), numV(c), (int)mm-MM_add));
222
+ return NULL;
223
+ } else {
224
+ cTValue *mo = lj_meta_lookup(L, rb, mm);
225
+ if (tvisnil(mo)) {
226
+ mo = lj_meta_lookup(L, rc, mm);
227
+ if (tvisnil(mo)) {
228
+ if (str2num(rb, &tempb) == NULL) rc = rb;
229
+ lj_err_optype(L, rc, LJ_ERR_OPARITH);
230
+ return NULL; /* unreachable */
231
+ }
232
+ }
233
+ return mmcall(L, lj_cont_ra, mo, rb, rc);
234
+ }
235
+ }
236
+
237
+ /* Helper for CAT. Coercion, iterative concat, __concat metamethod. */
238
+ TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
239
+ {
240
+ int fromc = 0;
241
+ if (left < 0) { left = -left; fromc = 1; }
242
+ do {
243
+ if (!(tvisstr(top) || tvisnumber(top)) ||
244
+ !(tvisstr(top-1) || tvisnumber(top-1))) {
245
+ cTValue *mo = lj_meta_lookup(L, top-1, MM_concat);
246
+ if (tvisnil(mo)) {
247
+ mo = lj_meta_lookup(L, top, MM_concat);
248
+ if (tvisnil(mo)) {
249
+ if (tvisstr(top-1) || tvisnumber(top-1)) top++;
250
+ lj_err_optype(L, top-1, LJ_ERR_OPCAT);
251
+ return NULL; /* unreachable */
252
+ }
253
+ }
254
+ /* One of the top two elements is not a string, call __cat metamethod:
255
+ **
256
+ ** before: [...][CAT stack .........................]
257
+ ** top-1 top top+1 top+2
258
+ ** pick two: [...][CAT stack ...] [o1] [o2]
259
+ ** setup mm: [...][CAT stack ...] [cont|?] [mo|tmtype] [o1] [o2]
260
+ ** in asm: [...][CAT stack ...] [cont|PC] [mo|delta] [o1] [o2]
261
+ ** ^-- func base ^-- mm base
262
+ ** after mm: [...][CAT stack ...] <--push-- [result]
263
+ ** next step: [...][CAT stack .............]
264
+ */
265
+ copyTV(L, top+2*LJ_FR2+2, top); /* Carefully ordered stack copies! */
266
+ copyTV(L, top+2*LJ_FR2+1, top-1);
267
+ copyTV(L, top+LJ_FR2, mo);
268
+ setcont(top-1, lj_cont_cat);
269
+ if (LJ_FR2) { setnilV(top); setnilV(top+2); top += 2; }
270
+ return top+1; /* Trigger metamethod call. */
271
+ } else {
272
+ /* Pick as many strings as possible from the top and concatenate them:
273
+ **
274
+ ** before: [...][CAT stack ...........................]
275
+ ** pick str: [...][CAT stack ...] [...... strings ......]
276
+ ** concat: [...][CAT stack ...] [result]
277
+ ** next step: [...][CAT stack ............]
278
+ */
279
+ TValue *e, *o = top;
280
+ uint64_t tlen = tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
281
+ char *p, *buf;
282
+ do {
283
+ o--; tlen += tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
284
+ } while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1)));
285
+ if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV);
286
+ p = buf = lj_buf_tmp(L, (MSize)tlen);
287
+ for (e = top, top = o; o <= e; o++) {
288
+ if (tvisstr(o)) {
289
+ GCstr *s = strV(o);
290
+ MSize len = s->len;
291
+ p = lj_buf_wmem(p, strdata(s), len);
292
+ } else if (tvisint(o)) {
293
+ p = lj_strfmt_wint(p, intV(o));
294
+ } else {
295
+ lua_assert(tvisnum(o));
296
+ p = lj_strfmt_wnum(p, o);
297
+ }
298
+ }
299
+ setstrV(L, top, lj_str_new(L, buf, (size_t)(p-buf)));
300
+ }
301
+ } while (left >= 1);
302
+ if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) {
303
+ if (!fromc) L->top = curr_topL(L);
304
+ lj_gc_step(L);
305
+ }
306
+ return NULL;
307
+ }
308
+
309
+ /* Helper for LEN. __len metamethod. */
310
+ TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o)
311
+ {
312
+ cTValue *mo = lj_meta_lookup(L, o, MM_len);
313
+ if (tvisnil(mo)) {
314
+ if (LJ_52 && tvistab(o))
315
+ tabref(tabV(o)->metatable)->nomm |= (uint8_t)(1u<<MM_len);
316
+ else
317
+ lj_err_optype(L, o, LJ_ERR_OPLEN);
318
+ return NULL;
319
+ }
320
+ return mmcall(L, lj_cont_ra, mo, o, LJ_52 ? o : niltv(L));
321
+ }
322
+
323
+ /* Helper for equality comparisons. __eq metamethod. */
324
+ TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne)
325
+ {
326
+ /* Field metatable must be at same offset for GCtab and GCudata! */
327
+ cTValue *mo = lj_meta_fast(L, tabref(o1->gch.metatable), MM_eq);
328
+ if (mo) {
329
+ TValue *top;
330
+ uint32_t it;
331
+ if (tabref(o1->gch.metatable) != tabref(o2->gch.metatable)) {
332
+ cTValue *mo2 = lj_meta_fast(L, tabref(o2->gch.metatable), MM_eq);
333
+ if (mo2 == NULL || !lj_obj_equal(mo, mo2))
334
+ return (TValue *)(intptr_t)ne;
335
+ }
336
+ top = curr_top(L);
337
+ setcont(top++, ne ? lj_cont_condf : lj_cont_condt);
338
+ if (LJ_FR2) setnilV(top++);
339
+ copyTV(L, top++, mo);
340
+ if (LJ_FR2) setnilV(top++);
341
+ it = ~(uint32_t)o1->gch.gct;
342
+ setgcV(L, top, o1, it);
343
+ setgcV(L, top+1, o2, it);
344
+ return top; /* Trigger metamethod call. */
345
+ }
346
+ return (TValue *)(intptr_t)ne;
347
+ }
348
+
349
+ #if LJ_HASFFI
350
+ TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins)
351
+ {
352
+ ASMFunction cont = (bc_op(ins) & 1) ? lj_cont_condf : lj_cont_condt;
353
+ int op = (int)bc_op(ins) & ~1;
354
+ TValue tv;
355
+ cTValue *mo, *o2, *o1 = &L->base[bc_a(ins)];
356
+ cTValue *o1mm = o1;
357
+ if (op == BC_ISEQV) {
358
+ o2 = &L->base[bc_d(ins)];
359
+ if (!tviscdata(o1mm)) o1mm = o2;
360
+ } else if (op == BC_ISEQS) {
361
+ setstrV(L, &tv, gco2str(proto_kgc(curr_proto(L), ~(ptrdiff_t)bc_d(ins))));
362
+ o2 = &tv;
363
+ } else if (op == BC_ISEQN) {
364
+ o2 = &mref(curr_proto(L)->k, cTValue)[bc_d(ins)];
365
+ } else {
366
+ lua_assert(op == BC_ISEQP);
367
+ setpriV(&tv, ~bc_d(ins));
368
+ o2 = &tv;
369
+ }
370
+ mo = lj_meta_lookup(L, o1mm, MM_eq);
371
+ if (LJ_LIKELY(!tvisnil(mo)))
372
+ return mmcall(L, cont, mo, o1, o2);
373
+ else
374
+ return (TValue *)(intptr_t)(bc_op(ins) & 1);
375
+ }
376
+ #endif
377
+
378
+ /* Helper for ordered comparisons. String compare, __lt/__le metamethods. */
379
+ TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op)
380
+ {
381
+ if (LJ_HASFFI && (tviscdata(o1) || tviscdata(o2))) {
382
+ ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;
383
+ MMS mm = (op & 2) ? MM_le : MM_lt;
384
+ cTValue *mo = lj_meta_lookup(L, tviscdata(o1) ? o1 : o2, mm);
385
+ if (LJ_UNLIKELY(tvisnil(mo))) goto err;
386
+ return mmcall(L, cont, mo, o1, o2);
387
+ } else if (LJ_52 || itype(o1) == itype(o2)) {
388
+ /* Never called with two numbers. */
389
+ if (tvisstr(o1) && tvisstr(o2)) {
390
+ int32_t res = lj_str_cmp(strV(o1), strV(o2));
391
+ return (TValue *)(intptr_t)(((op&2) ? res <= 0 : res < 0) ^ (op&1));
392
+ } else {
393
+ trymt:
394
+ while (1) {
395
+ ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;
396
+ MMS mm = (op & 2) ? MM_le : MM_lt;
397
+ cTValue *mo = lj_meta_lookup(L, o1, mm);
398
+ #if LJ_52
399
+ if (tvisnil(mo) && tvisnil((mo = lj_meta_lookup(L, o2, mm))))
400
+ #else
401
+ cTValue *mo2 = lj_meta_lookup(L, o2, mm);
402
+ if (tvisnil(mo) || !lj_obj_equal(mo, mo2))
403
+ #endif
404
+ {
405
+ if (op & 2) { /* MM_le not found: retry with MM_lt. */
406
+ cTValue *ot = o1; o1 = o2; o2 = ot; /* Swap operands. */
407
+ op ^= 3; /* Use LT and flip condition. */
408
+ continue;
409
+ }
410
+ goto err;
411
+ }
412
+ return mmcall(L, cont, mo, o1, o2);
413
+ }
414
+ }
415
+ } else if (tvisbool(o1) && tvisbool(o2)) {
416
+ goto trymt;
417
+ } else {
418
+ err:
419
+ lj_err_comp(L, o1, o2);
420
+ return NULL;
421
+ }
422
+ }
423
+
424
+ /* Helper for ISTYPE and ISNUM. Implicit coercion or error. */
425
+ void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp)
426
+ {
427
+ L->top = curr_topL(L);
428
+ ra++; tp--;
429
+ lua_assert(LJ_DUALNUM || tp != ~LJ_TNUMX); /* ISTYPE -> ISNUM broken. */
430
+ if (LJ_DUALNUM && tp == ~LJ_TNUMX) lj_lib_checkint(L, ra);
431
+ else if (tp == ~LJ_TNUMX+1) lj_lib_checknum(L, ra);
432
+ else if (tp == ~LJ_TSTR) lj_lib_checkstr(L, ra);
433
+ else lj_err_argtype(L, ra, lj_obj_itypename[tp]);
434
+ }
435
+
436
+ /* Helper for calls. __call metamethod. */
437
+ void lj_meta_call(lua_State *L, TValue *func, TValue *top)
438
+ {
439
+ cTValue *mo = lj_meta_lookup(L, func, MM_call);
440
+ TValue *p;
441
+ if (!tvisfunc(mo))
442
+ lj_err_optype_call(L, func);
443
+ for (p = top; p > func+2*LJ_FR2; p--) copyTV(L, p, p-1);
444
+ if (LJ_FR2) copyTV(L, func+2, func);
445
+ copyTV(L, func, mo);
446
+ }
447
+
448
+ /* Helper for FORI. Coercion. */
449
+ void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o)
450
+ {
451
+ if (!lj_strscan_numberobj(o)) lj_err_msg(L, LJ_ERR_FORINIT);
452
+ if (!lj_strscan_numberobj(o+1)) lj_err_msg(L, LJ_ERR_FORLIM);
453
+ if (!lj_strscan_numberobj(o+2)) lj_err_msg(L, LJ_ERR_FORSTEP);
454
+ if (LJ_DUALNUM) {
455
+ /* Ensure all slots are integers or all slots are numbers. */
456
+ int32_t k[3];
457
+ int nint = 0;
458
+ ptrdiff_t i;
459
+ for (i = 0; i <= 2; i++) {
460
+ if (tvisint(o+i)) {
461
+ k[i] = intV(o+i); nint++;
462
+ } else {
463
+ k[i] = lj_num2int(numV(o+i)); nint += ((lua_Number)k[i] == numV(o+i));
464
+ }
465
+ }
466
+ if (nint == 3) { /* Narrow to integers. */
467
+ setintV(o, k[0]);
468
+ setintV(o+1, k[1]);
469
+ setintV(o+2, k[2]);
470
+ } else if (nint != 0) { /* Widen to numbers. */
471
+ if (tvisint(o)) setnumV(o, (lua_Number)intV(o));
472
+ if (tvisint(o+1)) setnumV(o+1, (lua_Number)intV(o+1));
473
+ if (tvisint(o+2)) setnumV(o+2, (lua_Number)intV(o+2));
474
+ }
475
+ }
476
+ }
477
+