immunio 1.2.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (291) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -5
  3. data/ext/immunio/Rakefile +14 -6
  4. data/lib/immunio/context.rb +2 -0
  5. data/lib/immunio/plugins/action_view.rb +7 -668
  6. data/lib/immunio/plugins/action_view/action_view.rb +22 -0
  7. data/lib/immunio/plugins/action_view/active_support_hash.rb +29 -0
  8. data/lib/immunio/plugins/action_view/cache_store.rb +24 -0
  9. data/lib/immunio/plugins/action_view/erubi.rb +38 -0
  10. data/lib/immunio/plugins/action_view/erubis.rb +39 -0
  11. data/lib/immunio/plugins/action_view/fragment_caching.rb +29 -0
  12. data/lib/immunio/plugins/action_view/haml.rb +46 -0
  13. data/lib/immunio/plugins/action_view/slim.rb +42 -0
  14. data/lib/immunio/plugins/action_view/template.rb +431 -0
  15. data/lib/immunio/plugins/action_view/template_rendering.rb +45 -0
  16. data/lib/immunio/plugins/http_tracker.rb +2 -0
  17. data/lib/immunio/plugins/io.rb +34 -0
  18. data/lib/immunio/version.rb +1 -1
  19. data/lua-hooks/Makefile +36 -9
  20. data/lua-hooks/ext/luajit/COPYRIGHT +1 -1
  21. data/lua-hooks/ext/luajit/Makefile +22 -15
  22. data/lua-hooks/ext/luajit/README +2 -2
  23. data/lua-hooks/ext/luajit/doc/bluequad-print.css +1 -1
  24. data/lua-hooks/ext/luajit/doc/bluequad.css +1 -1
  25. data/lua-hooks/ext/luajit/doc/changes.html +69 -3
  26. data/lua-hooks/ext/luajit/doc/contact.html +10 -3
  27. data/lua-hooks/ext/luajit/doc/ext_c_api.html +2 -2
  28. data/lua-hooks/ext/luajit/doc/ext_ffi.html +2 -2
  29. data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +2 -2
  30. data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +3 -4
  31. data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +2 -2
  32. data/lua-hooks/ext/luajit/doc/ext_jit.html +3 -3
  33. data/lua-hooks/ext/luajit/doc/ext_profiler.html +2 -2
  34. data/lua-hooks/ext/luajit/doc/extensions.html +47 -20
  35. data/lua-hooks/ext/luajit/doc/faq.html +2 -2
  36. data/lua-hooks/ext/luajit/doc/install.html +74 -45
  37. data/lua-hooks/ext/luajit/doc/luajit.html +5 -5
  38. data/lua-hooks/ext/luajit/doc/running.html +3 -3
  39. data/lua-hooks/ext/luajit/doc/status.html +13 -8
  40. data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +1 -1
  41. data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1 -1
  42. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +1 -1
  43. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1 -1
  44. data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +8 -5
  45. data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +66 -11
  46. data/lua-hooks/ext/luajit/dynasm/dasm_mips64.lua +12 -0
  47. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +1 -1
  48. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1 -1
  49. data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +1 -1
  50. data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +1 -1
  51. data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +1 -1
  52. data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +5 -1
  53. data/lua-hooks/ext/luajit/dynasm/dynasm.lua +2 -2
  54. data/lua-hooks/ext/luajit/etc/luajit.1 +1 -1
  55. data/lua-hooks/ext/luajit/etc/luajit.pc +1 -1
  56. data/lua-hooks/ext/luajit/src/Makefile +15 -11
  57. data/lua-hooks/ext/luajit/src/Makefile.dep +16 -16
  58. data/lua-hooks/ext/luajit/src/host/buildvm.c +2 -2
  59. data/lua-hooks/ext/luajit/src/host/buildvm.h +1 -1
  60. data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +9 -4
  61. data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +2 -2
  62. data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +1 -1
  63. data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +14 -3
  64. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +27 -3
  65. data/lua-hooks/ext/luajit/src/host/genlibbc.lua +1 -1
  66. data/lua-hooks/ext/luajit/src/host/genminilua.lua +6 -5
  67. data/lua-hooks/ext/luajit/src/host/minilua.c +1 -1
  68. data/lua-hooks/ext/luajit/src/jit/bc.lua +1 -1
  69. data/lua-hooks/ext/luajit/src/jit/bcsave.lua +8 -8
  70. data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +2 -2
  71. data/lua-hooks/ext/luajit/src/jit/dis_arm64.lua +1216 -0
  72. data/lua-hooks/ext/luajit/src/jit/dis_arm64be.lua +12 -0
  73. data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +35 -20
  74. data/lua-hooks/ext/luajit/src/jit/dis_mips64.lua +17 -0
  75. data/lua-hooks/ext/luajit/src/jit/dis_mips64el.lua +17 -0
  76. data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +1 -1
  77. data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +2 -2
  78. data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +1 -1
  79. data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +7 -4
  80. data/lua-hooks/ext/luajit/src/jit/dump.lua +17 -12
  81. data/lua-hooks/ext/luajit/src/jit/p.lua +3 -2
  82. data/lua-hooks/ext/luajit/src/jit/v.lua +2 -2
  83. data/lua-hooks/ext/luajit/src/jit/zone.lua +1 -1
  84. data/lua-hooks/ext/luajit/src/lauxlib.h +14 -20
  85. data/lua-hooks/ext/luajit/src/lib_aux.c +38 -27
  86. data/lua-hooks/ext/luajit/src/lib_base.c +12 -5
  87. data/lua-hooks/ext/luajit/src/lib_bit.c +1 -1
  88. data/lua-hooks/ext/luajit/src/lib_debug.c +5 -5
  89. data/lua-hooks/ext/luajit/src/lib_ffi.c +2 -2
  90. data/lua-hooks/ext/luajit/src/lib_init.c +16 -16
  91. data/lua-hooks/ext/luajit/src/lib_io.c +6 -7
  92. data/lua-hooks/ext/luajit/src/lib_jit.c +14 -4
  93. data/lua-hooks/ext/luajit/src/lib_math.c +1 -5
  94. data/lua-hooks/ext/luajit/src/lib_os.c +1 -1
  95. data/lua-hooks/ext/luajit/src/lib_package.c +14 -23
  96. data/lua-hooks/ext/luajit/src/lib_string.c +1 -5
  97. data/lua-hooks/ext/luajit/src/lib_table.c +21 -1
  98. data/lua-hooks/ext/luajit/src/lj.supp +3 -3
  99. data/lua-hooks/ext/luajit/src/lj_alloc.c +174 -83
  100. data/lua-hooks/ext/luajit/src/lj_api.c +97 -18
  101. data/lua-hooks/ext/luajit/src/lj_arch.h +54 -22
  102. data/lua-hooks/ext/luajit/src/lj_asm.c +172 -53
  103. data/lua-hooks/ext/luajit/src/lj_asm.h +1 -1
  104. data/lua-hooks/ext/luajit/src/lj_asm_arm.h +19 -16
  105. data/lua-hooks/ext/luajit/src/lj_asm_arm64.h +2022 -0
  106. data/lua-hooks/ext/luajit/src/lj_asm_mips.h +564 -158
  107. data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +19 -18
  108. data/lua-hooks/ext/luajit/src/lj_asm_x86.h +578 -92
  109. data/lua-hooks/ext/luajit/src/lj_bc.c +1 -1
  110. data/lua-hooks/ext/luajit/src/lj_bc.h +1 -1
  111. data/lua-hooks/ext/luajit/src/lj_bcdump.h +1 -1
  112. data/lua-hooks/ext/luajit/src/lj_bcread.c +1 -1
  113. data/lua-hooks/ext/luajit/src/lj_bcwrite.c +1 -1
  114. data/lua-hooks/ext/luajit/src/lj_buf.c +1 -1
  115. data/lua-hooks/ext/luajit/src/lj_buf.h +1 -1
  116. data/lua-hooks/ext/luajit/src/lj_carith.c +1 -1
  117. data/lua-hooks/ext/luajit/src/lj_carith.h +1 -1
  118. data/lua-hooks/ext/luajit/src/lj_ccall.c +172 -7
  119. data/lua-hooks/ext/luajit/src/lj_ccall.h +21 -5
  120. data/lua-hooks/ext/luajit/src/lj_ccallback.c +71 -17
  121. data/lua-hooks/ext/luajit/src/lj_ccallback.h +1 -1
  122. data/lua-hooks/ext/luajit/src/lj_cconv.c +4 -2
  123. data/lua-hooks/ext/luajit/src/lj_cconv.h +1 -1
  124. data/lua-hooks/ext/luajit/src/lj_cdata.c +7 -5
  125. data/lua-hooks/ext/luajit/src/lj_cdata.h +1 -1
  126. data/lua-hooks/ext/luajit/src/lj_clib.c +5 -5
  127. data/lua-hooks/ext/luajit/src/lj_clib.h +1 -1
  128. data/lua-hooks/ext/luajit/src/lj_cparse.c +11 -6
  129. data/lua-hooks/ext/luajit/src/lj_cparse.h +1 -1
  130. data/lua-hooks/ext/luajit/src/lj_crecord.c +70 -14
  131. data/lua-hooks/ext/luajit/src/lj_crecord.h +1 -1
  132. data/lua-hooks/ext/luajit/src/lj_ctype.c +1 -1
  133. data/lua-hooks/ext/luajit/src/lj_ctype.h +8 -8
  134. data/lua-hooks/ext/luajit/src/lj_debug.c +1 -1
  135. data/lua-hooks/ext/luajit/src/lj_debug.h +1 -1
  136. data/lua-hooks/ext/luajit/src/lj_def.h +6 -9
  137. data/lua-hooks/ext/luajit/src/lj_dispatch.c +3 -3
  138. data/lua-hooks/ext/luajit/src/lj_dispatch.h +2 -1
  139. data/lua-hooks/ext/luajit/src/lj_emit_arm.h +5 -4
  140. data/lua-hooks/ext/luajit/src/lj_emit_arm64.h +419 -0
  141. data/lua-hooks/ext/luajit/src/lj_emit_mips.h +100 -20
  142. data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +4 -4
  143. data/lua-hooks/ext/luajit/src/lj_emit_x86.h +116 -25
  144. data/lua-hooks/ext/luajit/src/lj_err.c +34 -13
  145. data/lua-hooks/ext/luajit/src/lj_err.h +1 -1
  146. data/lua-hooks/ext/luajit/src/lj_errmsg.h +1 -1
  147. data/lua-hooks/ext/luajit/src/lj_ff.h +1 -1
  148. data/lua-hooks/ext/luajit/src/lj_ffrecord.c +58 -49
  149. data/lua-hooks/ext/luajit/src/lj_ffrecord.h +1 -1
  150. data/lua-hooks/ext/luajit/src/lj_frame.h +33 -6
  151. data/lua-hooks/ext/luajit/src/lj_func.c +4 -2
  152. data/lua-hooks/ext/luajit/src/lj_func.h +1 -1
  153. data/lua-hooks/ext/luajit/src/lj_gc.c +16 -7
  154. data/lua-hooks/ext/luajit/src/lj_gc.h +1 -1
  155. data/lua-hooks/ext/luajit/src/lj_gdbjit.c +31 -1
  156. data/lua-hooks/ext/luajit/src/lj_gdbjit.h +1 -1
  157. data/lua-hooks/ext/luajit/src/lj_ir.c +69 -96
  158. data/lua-hooks/ext/luajit/src/lj_ir.h +29 -18
  159. data/lua-hooks/ext/luajit/src/lj_ircall.h +24 -30
  160. data/lua-hooks/ext/luajit/src/lj_iropt.h +9 -9
  161. data/lua-hooks/ext/luajit/src/lj_jit.h +67 -9
  162. data/lua-hooks/ext/luajit/src/lj_lex.c +1 -1
  163. data/lua-hooks/ext/luajit/src/lj_lex.h +1 -1
  164. data/lua-hooks/ext/luajit/src/lj_lib.c +1 -1
  165. data/lua-hooks/ext/luajit/src/lj_lib.h +1 -1
  166. data/lua-hooks/ext/luajit/src/lj_load.c +1 -1
  167. data/lua-hooks/ext/luajit/src/lj_mcode.c +11 -10
  168. data/lua-hooks/ext/luajit/src/lj_mcode.h +1 -1
  169. data/lua-hooks/ext/luajit/src/lj_meta.c +1 -1
  170. data/lua-hooks/ext/luajit/src/lj_meta.h +1 -1
  171. data/lua-hooks/ext/luajit/src/lj_obj.c +1 -1
  172. data/lua-hooks/ext/luajit/src/lj_obj.h +7 -3
  173. data/lua-hooks/ext/luajit/src/lj_opt_dce.c +1 -1
  174. data/lua-hooks/ext/luajit/src/lj_opt_fold.c +84 -17
  175. data/lua-hooks/ext/luajit/src/lj_opt_loop.c +1 -1
  176. data/lua-hooks/ext/luajit/src/lj_opt_mem.c +3 -3
  177. data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +24 -22
  178. data/lua-hooks/ext/luajit/src/lj_opt_sink.c +11 -6
  179. data/lua-hooks/ext/luajit/src/lj_opt_split.c +11 -2
  180. data/lua-hooks/ext/luajit/src/lj_parse.c +9 -7
  181. data/lua-hooks/ext/luajit/src/lj_parse.h +1 -1
  182. data/lua-hooks/ext/luajit/src/lj_profile.c +1 -1
  183. data/lua-hooks/ext/luajit/src/lj_profile.h +1 -1
  184. data/lua-hooks/ext/luajit/src/lj_record.c +201 -117
  185. data/lua-hooks/ext/luajit/src/lj_record.h +1 -1
  186. data/lua-hooks/ext/luajit/src/lj_snap.c +72 -26
  187. data/lua-hooks/ext/luajit/src/lj_snap.h +1 -1
  188. data/lua-hooks/ext/luajit/src/lj_state.c +6 -6
  189. data/lua-hooks/ext/luajit/src/lj_state.h +2 -2
  190. data/lua-hooks/ext/luajit/src/lj_str.c +1 -1
  191. data/lua-hooks/ext/luajit/src/lj_str.h +1 -1
  192. data/lua-hooks/ext/luajit/src/lj_strfmt.c +7 -3
  193. data/lua-hooks/ext/luajit/src/lj_strfmt.h +1 -1
  194. data/lua-hooks/ext/luajit/src/lj_strfmt_num.c +4 -3
  195. data/lua-hooks/ext/luajit/src/lj_strscan.c +1 -1
  196. data/lua-hooks/ext/luajit/src/lj_strscan.h +1 -1
  197. data/lua-hooks/ext/luajit/src/lj_tab.c +1 -2
  198. data/lua-hooks/ext/luajit/src/lj_tab.h +1 -1
  199. data/lua-hooks/ext/luajit/src/lj_target.h +3 -3
  200. data/lua-hooks/ext/luajit/src/lj_target_arm.h +1 -1
  201. data/lua-hooks/ext/luajit/src/lj_target_arm64.h +239 -7
  202. data/lua-hooks/ext/luajit/src/lj_target_mips.h +111 -22
  203. data/lua-hooks/ext/luajit/src/lj_target_ppc.h +1 -1
  204. data/lua-hooks/ext/luajit/src/lj_target_x86.h +21 -4
  205. data/lua-hooks/ext/luajit/src/lj_trace.c +63 -18
  206. data/lua-hooks/ext/luajit/src/lj_trace.h +2 -1
  207. data/lua-hooks/ext/luajit/src/lj_traceerr.h +1 -1
  208. data/lua-hooks/ext/luajit/src/lj_udata.c +1 -1
  209. data/lua-hooks/ext/luajit/src/lj_udata.h +1 -1
  210. data/lua-hooks/ext/luajit/src/lj_vm.h +5 -1
  211. data/lua-hooks/ext/luajit/src/lj_vmevent.c +1 -1
  212. data/lua-hooks/ext/luajit/src/lj_vmevent.h +1 -1
  213. data/lua-hooks/ext/luajit/src/lj_vmmath.c +1 -1
  214. data/lua-hooks/ext/luajit/src/ljamalg.c +1 -1
  215. data/lua-hooks/ext/luajit/src/lua.h +9 -1
  216. data/lua-hooks/ext/luajit/src/luaconf.h +3 -7
  217. data/lua-hooks/ext/luajit/src/luajit.c +69 -54
  218. data/lua-hooks/ext/luajit/src/luajit.h +4 -4
  219. data/lua-hooks/ext/luajit/src/lualib.h +1 -1
  220. data/lua-hooks/ext/luajit/src/msvcbuild.bat +12 -4
  221. data/lua-hooks/ext/luajit/src/vm_arm.dasc +1 -1
  222. data/lua-hooks/ext/luajit/src/vm_arm64.dasc +255 -32
  223. data/lua-hooks/ext/luajit/src/vm_mips.dasc +26 -23
  224. data/lua-hooks/ext/luajit/src/vm_mips64.dasc +5062 -0
  225. data/lua-hooks/ext/luajit/src/vm_ppc.dasc +1 -1
  226. data/lua-hooks/ext/luajit/src/vm_x64.dasc +24 -25
  227. data/lua-hooks/ext/luajit/src/vm_x86.dasc +77 -4
  228. data/lua-hooks/libluahooks.darwin.a +0 -0
  229. data/lua-hooks/libluahooks.linux.a +0 -0
  230. data/lua-hooks/options.mk +1 -1
  231. metadata +37 -77
  232. data/lua-hooks/ext/all.c +0 -69
  233. data/lua-hooks/ext/libinjection/COPYING +0 -37
  234. data/lua-hooks/ext/libinjection/libinjection.h +0 -65
  235. data/lua-hooks/ext/libinjection/libinjection_html5.c +0 -847
  236. data/lua-hooks/ext/libinjection/libinjection_html5.h +0 -54
  237. data/lua-hooks/ext/libinjection/libinjection_sqli.c +0 -2301
  238. data/lua-hooks/ext/libinjection/libinjection_sqli.h +0 -295
  239. data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +0 -9349
  240. data/lua-hooks/ext/libinjection/libinjection_xss.c +0 -531
  241. data/lua-hooks/ext/libinjection/libinjection_xss.h +0 -21
  242. data/lua-hooks/ext/libinjection/lualib.c +0 -145
  243. data/lua-hooks/ext/libinjection/module.mk +0 -5
  244. data/lua-hooks/ext/lpeg/HISTORY +0 -96
  245. data/lua-hooks/ext/lpeg/lpcap.c +0 -537
  246. data/lua-hooks/ext/lpeg/lpcap.h +0 -56
  247. data/lua-hooks/ext/lpeg/lpcode.c +0 -1014
  248. data/lua-hooks/ext/lpeg/lpcode.h +0 -40
  249. data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
  250. data/lua-hooks/ext/lpeg/lpeg.html +0 -1445
  251. data/lua-hooks/ext/lpeg/lpprint.c +0 -244
  252. data/lua-hooks/ext/lpeg/lpprint.h +0 -36
  253. data/lua-hooks/ext/lpeg/lptree.c +0 -1303
  254. data/lua-hooks/ext/lpeg/lptree.h +0 -82
  255. data/lua-hooks/ext/lpeg/lptypes.h +0 -149
  256. data/lua-hooks/ext/lpeg/lpvm.c +0 -364
  257. data/lua-hooks/ext/lpeg/lpvm.h +0 -58
  258. data/lua-hooks/ext/lpeg/makefile +0 -55
  259. data/lua-hooks/ext/lpeg/module.mk +0 -6
  260. data/lua-hooks/ext/lpeg/re.html +0 -498
  261. data/lua-hooks/ext/lua-cmsgpack/.gitignore +0 -13
  262. data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +0 -45
  263. data/lua-hooks/ext/lua-cmsgpack/README.md +0 -115
  264. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +0 -970
  265. data/lua-hooks/ext/lua-cmsgpack/module.mk +0 -2
  266. data/lua-hooks/ext/lua-cmsgpack/test.lua +0 -570
  267. data/lua-hooks/ext/lua-snapshot/LICENSE +0 -7
  268. data/lua-hooks/ext/lua-snapshot/Makefile +0 -12
  269. data/lua-hooks/ext/lua-snapshot/README.md +0 -18
  270. data/lua-hooks/ext/lua-snapshot/dump.lua +0 -15
  271. data/lua-hooks/ext/lua-snapshot/module.mk +0 -2
  272. data/lua-hooks/ext/lua-snapshot/snapshot.c +0 -462
  273. data/lua-hooks/ext/luautf8/README.md +0 -152
  274. data/lua-hooks/ext/luautf8/lutf8lib.c +0 -1274
  275. data/lua-hooks/ext/luautf8/module.mk +0 -2
  276. data/lua-hooks/ext/luautf8/unidata.h +0 -3064
  277. data/lua-hooks/ext/module.mk +0 -15
  278. data/lua-hooks/ext/modules.h +0 -17
  279. data/lua-hooks/ext/perf/luacpu.c +0 -114
  280. data/lua-hooks/ext/perf/lualoadavg.c +0 -40
  281. data/lua-hooks/ext/perf/luameminfo.c +0 -38
  282. data/lua-hooks/ext/perf/luaoslib.c +0 -203
  283. data/lua-hooks/ext/perf/module.mk +0 -5
  284. data/lua-hooks/ext/sha1/luasha1.c +0 -74
  285. data/lua-hooks/ext/sha1/module.mk +0 -5
  286. data/lua-hooks/ext/sha1/sha1.c +0 -145
  287. data/lua-hooks/ext/sha2/luasha256.c +0 -77
  288. data/lua-hooks/ext/sha2/module.mk +0 -5
  289. data/lua-hooks/ext/sha2/sha256.c +0 -196
  290. data/lua-hooks/ext/sysutils/lua_utils.c +0 -56
  291. data/lua-hooks/ext/sysutils/module.mk +0 -2
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Error handling.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #define lj_err_c
@@ -46,7 +46,8 @@
46
46
  ** the wrapper function feature. Lua errors thrown through C++ frames
47
47
  ** cannot be caught by C++ code and C++ destructors are not run.
48
48
  **
49
- ** EXT is the default on x64 systems, INT is the default on all other systems.
49
+ ** EXT is the default on x64 systems and on Windows, INT is the default on all
50
+ ** other systems.
50
51
  **
51
52
  ** EXT can be manually enabled on POSIX systems using GCC and DWARF2 stack
52
53
  ** unwinding with -DLUAJIT_UNWIND_EXTERNAL. *All* C code must be compiled
@@ -55,7 +56,6 @@
55
56
  ** and all C libraries that have callbacks which may be used to call back
56
57
  ** into Lua. C++ code must *not* be compiled with -fno-exceptions.
57
58
  **
58
- ** EXT cannot be enabled on WIN32 since system exceptions use code-driven SEH.
59
59
  ** EXT is mandatory on WIN64 since the calling convention has an abundance
60
60
  ** of callee-saved registers (rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15).
61
61
  ** The POSIX/x64 interpreter only saves r12/r13 for INT (e.g. PS4).
@@ -63,7 +63,7 @@
63
63
 
64
64
  #if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND
65
65
  #define LJ_UNWIND_EXT 1
66
- #elif LJ_TARGET_X64 && LJ_TARGET_WINDOWS
66
+ #elif LJ_TARGET_WINDOWS
67
67
  #define LJ_UNWIND_EXT 1
68
68
  #endif
69
69
 
@@ -310,7 +310,6 @@ static void err_raise_ext(int errcode)
310
310
  #define _US_FORCE_UNWIND 8
311
311
 
312
312
  typedef struct _Unwind_Control_Block _Unwind_Control_Block;
313
- typedef struct _Unwind_Context _Unwind_Context;
314
313
 
315
314
  struct _Unwind_Control_Block {
316
315
  uint64_t exclass;
@@ -385,7 +384,7 @@ static void err_raise_ext(int errcode)
385
384
 
386
385
  #endif /* LJ_TARGET_ARM */
387
386
 
388
- #elif LJ_TARGET_X64 && LJ_ABI_WIN
387
+ #elif LJ_ABI_WIN
389
388
 
390
389
  /*
391
390
  ** Someone in Redmond owes me several days of my life. A lot of this is
@@ -403,6 +402,7 @@ static void err_raise_ext(int errcode)
403
402
  #define WIN32_LEAN_AND_MEAN
404
403
  #include <windows.h>
405
404
 
405
+ #if LJ_TARGET_X64
406
406
  /* Taken from: http://www.nynaeve.net/?p=99 */
407
407
  typedef struct UndocumentedDispatcherContext {
408
408
  ULONG64 ControlPc;
@@ -417,11 +417,14 @@ typedef struct UndocumentedDispatcherContext {
417
417
  ULONG ScopeIndex;
418
418
  ULONG Fill0;
419
419
  } UndocumentedDispatcherContext;
420
+ #else
421
+ typedef void *UndocumentedDispatcherContext;
422
+ #endif
420
423
 
421
424
  /* Another wild guess. */
422
425
  extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);
423
426
 
424
- #ifdef MINGW_SDK_INIT
427
+ #if LJ_TARGET_X64 && defined(MINGW_SDK_INIT)
425
428
  /* Workaround for broken MinGW64 declaration. */
426
429
  VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
427
430
  #define RtlUnwindEx RtlUnwindEx_FIXED
@@ -435,10 +438,15 @@ VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
435
438
  #define LJ_EXCODE_CHECK(cl) (((cl) ^ LJ_EXCODE) <= 0xff)
436
439
  #define LJ_EXCODE_ERRCODE(cl) ((int)((cl) & 0xff))
437
440
 
438
- /* Win64 exception handler for interpreter frame. */
439
- LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
440
- void *cf, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)
441
+ /* Windows exception handler for interpreter frame. */
442
+ LJ_FUNCA int lj_err_unwind_win(EXCEPTION_RECORD *rec,
443
+ void *f, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)
441
444
  {
445
+ #if LJ_TARGET_X64
446
+ void *cf = f;
447
+ #else
448
+ void *cf = (char *)f - CFRAME_OFS_SEH;
449
+ #endif
442
450
  lua_State *L = cframe_L(cf);
443
451
  int errcode = LJ_EXCODE_CHECK(rec->ExceptionCode) ?
444
452
  LJ_EXCODE_ERRCODE(rec->ExceptionCode) : LUA_ERRRUN;
@@ -456,8 +464,9 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
456
464
  setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));
457
465
  } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) {
458
466
  /* Don't catch access violations etc. */
459
- return ExceptionContinueSearch;
467
+ return 1; /* ExceptionContinueSearch */
460
468
  }
469
+ #if LJ_TARGET_X64
461
470
  /* Unwind the stack and call all handlers for all lower C frames
462
471
  ** (including ourselves) again with EH_UNWINDING set. Then set
463
472
  ** rsp = cf, rax = errcode and jump to the specified target.
@@ -467,9 +476,21 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
467
476
  lj_vm_unwind_c_eh),
468
477
  rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable);
469
478
  /* RtlUnwindEx should never return. */
479
+ #else
480
+ UNUSED(ctx);
481
+ UNUSED(dispatch);
482
+ /* Call all handlers for all lower C frames (including ourselves) again
483
+ ** with EH_UNWINDING set. Then call the specified function, passing cf
484
+ ** and errcode.
485
+ */
486
+ lj_vm_rtlunwind(cf, (void *)rec,
487
+ (cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ?
488
+ (void *)lj_vm_unwind_ff : (void *)lj_vm_unwind_c, errcode);
489
+ /* lj_vm_rtlunwind does not return. */
490
+ #endif
470
491
  }
471
492
  }
472
- return ExceptionContinueSearch;
493
+ return 1; /* ExceptionContinueSearch */
473
494
  }
474
495
 
475
496
  /* Raise Windows exception. */
@@ -488,7 +509,7 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode)
488
509
  global_State *g = G(L);
489
510
  lj_trace_abort(g);
490
511
  setmref(g->jit_base, NULL);
491
- L->status = 0;
512
+ L->status = LUA_OK;
492
513
  #if LJ_UNWIND_EXT
493
514
  err_raise_ext(errcode);
494
515
  /*
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Error handling.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #ifndef _LJ_ERR_H
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** VM error messages.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  /* This file may be included multiple times with different ERRDEF macros. */
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Fast function IDs.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #ifndef _LJ_FF_H
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Fast function call recorder.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #define lj_ffrecord_c
@@ -102,42 +102,41 @@ static void recff_stitch(jit_State *J)
102
102
  ASMFunction cont = lj_cont_stitch;
103
103
  lua_State *L = J->L;
104
104
  TValue *base = L->base;
105
+ BCReg nslot = J->maxslot + 1 + LJ_FR2;
106
+ TValue *nframe = base + 1 + LJ_FR2;
105
107
  const BCIns *pc = frame_pc(base-1);
106
108
  TValue *pframe = frame_prevl(base-1);
107
- TRef trcont;
108
109
 
109
- lua_assert(!LJ_FR2); /* TODO_FR2: handle frame shift. */
110
110
  /* Move func + args up in Lua stack and insert continuation. */
111
- memmove(&base[1], &base[-1], sizeof(TValue)*(J->maxslot+1));
112
- setframe_ftsz(base+1, ((char *)(base+1) - (char *)pframe) + FRAME_CONT);
113
- setcont(base, cont);
111
+ memmove(&base[1], &base[-1-LJ_FR2], sizeof(TValue)*nslot);
112
+ setframe_ftsz(nframe, ((char *)nframe - (char *)pframe) + FRAME_CONT);
113
+ setcont(base-LJ_FR2, cont);
114
114
  setframe_pc(base, pc);
115
- setnilV(base-1); /* Incorrect, but rec_check_slots() won't run anymore. */
116
- L->base += 2;
117
- L->top += 2;
115
+ setnilV(base-1-LJ_FR2); /* Incorrect, but rec_check_slots() won't run anymore. */
116
+ L->base += 2 + LJ_FR2;
117
+ L->top += 2 + LJ_FR2;
118
118
 
119
119
  /* Ditto for the IR. */
120
- memmove(&J->base[1], &J->base[-1], sizeof(TRef)*(J->maxslot+1));
121
- #if LJ_64
122
- trcont = lj_ir_kptr(J, (void *)((int64_t)cont-(int64_t)lj_vm_asm_begin));
120
+ memmove(&J->base[1], &J->base[-1-LJ_FR2], sizeof(TRef)*nslot);
121
+ #if LJ_FR2
122
+ J->base[2] = TREF_FRAME;
123
+ J->base[-1] = lj_ir_k64(J, IR_KNUM, u64ptr(contptr(cont)));
124
+ J->base[0] = lj_ir_k64(J, IR_KNUM, u64ptr(pc)) | TREF_CONT;
123
125
  #else
124
- trcont = lj_ir_kptr(J, (void *)cont);
126
+ J->base[0] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;
125
127
  #endif
126
- J->base[0] = trcont | TREF_CONT;
127
- J->ktracep = lj_ir_k64_reserve(J);
128
- lua_assert(irt_toitype_(IRT_P64) == LJ_TTRACE);
129
- J->base[-1] = emitir(IRT(IR_XLOAD, IRT_P64), lj_ir_kptr(J, &J->ktracep->gcr), 0);
130
- J->base += 2;
131
- J->baseslot += 2;
128
+ J->ktrace = tref_ref((J->base[-1-LJ_FR2] = lj_ir_ktrace(J)));
129
+ J->base += 2 + LJ_FR2;
130
+ J->baseslot += 2 + LJ_FR2;
132
131
  J->framedepth++;
133
132
 
134
133
  lj_record_stop(J, LJ_TRLINK_STITCH, 0);
135
134
 
136
135
  /* Undo Lua stack changes. */
137
- memmove(&base[-1], &base[1], sizeof(TValue)*(J->maxslot+1));
136
+ memmove(&base[-1-LJ_FR2], &base[1], sizeof(TValue)*nslot);
138
137
  setframe_pc(base-1, pc);
139
- L->base -= 2;
140
- L->top -= 2;
138
+ L->base -= 2 + LJ_FR2;
139
+ L->top -= 2 + LJ_FR2;
141
140
  }
142
141
 
143
142
  /* Fallback handler for fast functions that are not recorded (yet). */
@@ -179,7 +178,7 @@ static void LJ_FASTCALL recff_nyi(jit_State *J, RecordFFData *rd)
179
178
  /* Emit BUFHDR for the global temporary buffer. */
180
179
  static TRef recff_bufhdr(jit_State *J)
181
180
  {
182
- return emitir(IRT(IR_BUFHDR, IRT_P32),
181
+ return emitir(IRT(IR_BUFHDR, IRT_PGC),
183
182
  lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
184
183
  }
185
184
 
@@ -229,7 +228,7 @@ static void LJ_FASTCALL recff_setmetatable(jit_State *J, RecordFFData *rd)
229
228
  ix.tab = tr;
230
229
  copyTV(J->L, &ix.tabv, &rd->argv[0]);
231
230
  lj_record_mm_lookup(J, &ix, MM_metatable); /* Guard for no __metatable. */
232
- fref = emitir(IRT(IR_FREF, IRT_P32), tr, IRFL_TAB_META);
231
+ fref = emitir(IRT(IR_FREF, IRT_PGC), tr, IRFL_TAB_META);
233
232
  mtref = tref_isnil(mt) ? lj_ir_knull(J, IRT_TAB) : mt;
234
233
  emitir(IRT(IR_FSTORE, IRT_TAB), fref, mtref);
235
234
  if (!tref_isnil(mt))
@@ -295,7 +294,7 @@ int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv)
295
294
  if (strV(tv)->len == 1) {
296
295
  emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, strV(tv)));
297
296
  } else {
298
- TRef trptr = emitir(IRT(IR_STRREF, IRT_P32), tr, lj_ir_kint(J, 0));
297
+ TRef trptr = emitir(IRT(IR_STRREF, IRT_PGC), tr, lj_ir_kint(J, 0));
299
298
  TRef trchar = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY);
300
299
  emitir(IRTG(IR_EQ, IRT_INT), trchar, lj_ir_kint(J, '#'));
301
300
  }
@@ -380,10 +379,10 @@ static int recff_metacall(jit_State *J, RecordFFData *rd, MMS mm)
380
379
  int errcode;
381
380
  TValue argv0;
382
381
  /* Temporarily insert metamethod below object. */
383
- J->base[1] = J->base[0];
382
+ J->base[1+LJ_FR2] = J->base[0];
384
383
  J->base[0] = ix.mobj;
385
384
  copyTV(J->L, &argv0, &rd->argv[0]);
386
- copyTV(J->L, &rd->argv[1], &rd->argv[0]);
385
+ copyTV(J->L, &rd->argv[1+LJ_FR2], &rd->argv[0]);
387
386
  copyTV(J->L, &rd->argv[0], &ix.mobjv);
388
387
  /* Need to protect lj_record_tailcall because it may throw. */
389
388
  errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp);
@@ -450,6 +449,10 @@ static void LJ_FASTCALL recff_xpairs(jit_State *J, RecordFFData *rd)
450
449
  static void LJ_FASTCALL recff_pcall(jit_State *J, RecordFFData *rd)
451
450
  {
452
451
  if (J->maxslot >= 1) {
452
+ #if LJ_FR2
453
+ /* Shift function arguments up. */
454
+ memmove(J->base + 1, J->base, sizeof(TRef) * J->maxslot);
455
+ #endif
453
456
  lj_record_call(J, 0, J->maxslot - 1);
454
457
  rd->nres = -1; /* Pending call. */
455
458
  } /* else: Interpreter will throw. */
@@ -469,13 +472,16 @@ static void LJ_FASTCALL recff_xpcall(jit_State *J, RecordFFData *rd)
469
472
  TValue argv0, argv1;
470
473
  TRef tmp;
471
474
  int errcode;
472
- lua_assert(!LJ_FR2); /* TODO_FR2: handle different frame setup. */
473
475
  /* Swap function and traceback. */
474
476
  tmp = J->base[0]; J->base[0] = J->base[1]; J->base[1] = tmp;
475
477
  copyTV(J->L, &argv0, &rd->argv[0]);
476
478
  copyTV(J->L, &argv1, &rd->argv[1]);
477
479
  copyTV(J->L, &rd->argv[0], &argv1);
478
480
  copyTV(J->L, &rd->argv[1], &argv0);
481
+ #if LJ_FR2
482
+ /* Shift function arguments up. */
483
+ memmove(J->base + 2, J->base + 1, sizeof(TRef) * (J->maxslot-1));
484
+ #endif
479
485
  /* Need to protect lj_record_call because it may throw. */
480
486
  errcode = lj_vm_cpcall(J->L, NULL, J, recff_xpcall_cp);
481
487
  /* Always undo Lua stack swap to avoid confusing the interpreter. */
@@ -504,7 +510,7 @@ static void LJ_FASTCALL recff_getfenv(jit_State *J, RecordFFData *rd)
504
510
  static void LJ_FASTCALL recff_math_abs(jit_State *J, RecordFFData *rd)
505
511
  {
506
512
  TRef tr = lj_ir_tonum(J, J->base[0]);
507
- J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_knum_abs(J));
513
+ J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_ksimd(J, LJ_KSIMD_ABS));
508
514
  UNUSED(rd);
509
515
  }
510
516
 
@@ -613,10 +619,8 @@ static void LJ_FASTCALL recff_math_modf(jit_State *J, RecordFFData *rd)
613
619
 
614
620
  static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd)
615
621
  {
616
- TRef tr = lj_ir_tonum(J, J->base[0]);
617
- if (!tref_isnumber_str(J->base[1]))
618
- lj_trace_err(J, LJ_TRERR_BADTYPE);
619
- J->base[0] = lj_opt_narrow_pow(J, tr, J->base[1], &rd->argv[1]);
622
+ J->base[0] = lj_opt_narrow_pow(J, J->base[0], J->base[1],
623
+ &rd->argv[0], &rd->argv[1]);
620
624
  UNUSED(rd);
621
625
  }
622
626
 
@@ -822,7 +826,7 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
822
826
  /* Also handle empty range here, to avoid extra traces. */
823
827
  TRef trptr, trslen = emitir(IRTI(IR_SUB), trend, trstart);
824
828
  emitir(IRTGI(IR_GE), trslen, tr0);
825
- trptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);
829
+ trptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
826
830
  J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, trslen);
827
831
  } else { /* Range underflow: return empty string. */
828
832
  emitir(IRTGI(IR_LT), trend, trstart);
@@ -838,7 +842,7 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
838
842
  rd->nres = len;
839
843
  for (i = 0; i < len; i++) {
840
844
  TRef tmp = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, (int32_t)i));
841
- tmp = emitir(IRT(IR_STRREF, IRT_P32), trstr, tmp);
845
+ tmp = emitir(IRT(IR_STRREF, IRT_PGC), trstr, tmp);
842
846
  J->base[i] = emitir(IRT(IR_XLOAD, IRT_U8), tmp, IRXLOAD_READONLY);
843
847
  }
844
848
  } else { /* Empty range or range underflow: return no results. */
@@ -860,7 +864,7 @@ static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)
860
864
  if (i > 1) { /* Concatenate the strings, if there's more than one. */
861
865
  TRef hdr = recff_bufhdr(J), tr = hdr;
862
866
  for (i = 0; J->base[i] != 0; i++)
863
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]);
867
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, J->base[i]);
864
868
  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
865
869
  }
866
870
  UNUSED(rd);
@@ -877,14 +881,14 @@ static void LJ_FASTCALL recff_string_rep(jit_State *J, RecordFFData *rd)
877
881
  emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1));
878
882
  if (vrep > 1) {
879
883
  TRef hdr2 = recff_bufhdr(J);
880
- TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), hdr2, sep);
881
- tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), tr2, str);
884
+ TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), hdr2, sep);
885
+ tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), tr2, str);
882
886
  str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2);
883
887
  }
884
888
  }
885
889
  tr = hdr = recff_bufhdr(J);
886
890
  if (str2) {
887
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, str);
891
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, str);
888
892
  str = str2;
889
893
  rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1));
890
894
  }
@@ -935,8 +939,8 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
935
939
  if ((J->base[2] && tref_istruecond(J->base[3])) ||
936
940
  (emitir(IRTG(IR_EQ, IRT_STR), trpat, lj_ir_kstr(J, pat)),
937
941
  !lj_str_haspattern(pat))) { /* Search for fixed string. */
938
- TRef trsptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);
939
- TRef trpptr = emitir(IRT(IR_STRREF, IRT_P32), trpat, tr0);
942
+ TRef trsptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
943
+ TRef trpptr = emitir(IRT(IR_STRREF, IRT_PGC), trpat, tr0);
940
944
  TRef trslen = emitir(IRTI(IR_SUB), trlen, trstart);
941
945
  TRef trplen = emitir(IRTI(IR_FLOAD), trpat, IRFL_STR_LEN);
942
946
  TRef tr = lj_ir_call(J, IRCALL_lj_str_find, trsptr, trpptr, trslen, trplen);
@@ -944,13 +948,13 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
944
948
  if (lj_str_find(strdata(str)+(MSize)start, strdata(pat),
945
949
  str->len-(MSize)start, pat->len)) {
946
950
  TRef pos;
947
- emitir(IRTG(IR_NE, IRT_P32), tr, trp0);
948
- pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_P32), trstr, tr0));
951
+ emitir(IRTG(IR_NE, IRT_PGC), tr, trp0);
952
+ pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_PGC), trstr, tr0));
949
953
  J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));
950
954
  J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);
951
955
  rd->nres = 2;
952
956
  } else {
953
- emitir(IRTG(IR_EQ, IRT_P32), tr, trp0);
957
+ emitir(IRTG(IR_EQ, IRT_PGC), tr, trp0);
954
958
  J->base[0] = TREF_NIL;
955
959
  }
956
960
  } else { /* Search for pattern. */
@@ -977,7 +981,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
977
981
  IRCallID id;
978
982
  switch (STRFMT_TYPE(sf)) {
979
983
  case STRFMT_LIT:
980
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
984
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
981
985
  lj_ir_kstr(J, lj_str_new(J->L, fs.str, fs.len)));
982
986
  break;
983
987
  case STRFMT_INT:
@@ -986,7 +990,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
986
990
  if (!tref_isinteger(tra))
987
991
  goto handle_num;
988
992
  if (sf == STRFMT_INT) { /* Shortcut for plain %d. */
989
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
993
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
990
994
  emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_INT));
991
995
  } else {
992
996
  #if LJ_HASFFI
@@ -1016,7 +1020,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
1016
1020
  return;
1017
1021
  }
1018
1022
  if (sf == STRFMT_STR) /* Shortcut for plain %s. */
1019
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, tra);
1023
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, tra);
1020
1024
  else if ((sf & STRFMT_T_QUOTED))
1021
1025
  tr = lj_ir_call(J, IRCALL_lj_strfmt_putquoted, tr, tra);
1022
1026
  else
@@ -1025,7 +1029,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
1025
1029
  case STRFMT_CHAR:
1026
1030
  tra = lj_opt_narrow_toint(J, tra);
1027
1031
  if (sf == STRFMT_CHAR) /* Shortcut for plain %c. */
1028
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
1032
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
1029
1033
  emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_CHAR));
1030
1034
  else
1031
1035
  tr = lj_ir_call(J, IRCALL_lj_strfmt_putfchar, tr, trsf, tra);
@@ -1110,8 +1114,13 @@ static TRef recff_io_fp(jit_State *J, TRef *udp, int32_t id)
1110
1114
  {
1111
1115
  TRef tr, ud, fp;
1112
1116
  if (id) { /* io.func() */
1117
+ #if LJ_GC64
1118
+ /* TODO: fix ARM32 asm_fload(), so we can use this for all archs. */
1119
+ ud = lj_ir_ggfload(J, IRT_UDATA, GG_OFS(g.gcroot[id]));
1120
+ #else
1113
1121
  tr = lj_ir_kptr(J, &J2G(J)->gcroot[id]);
1114
1122
  ud = emitir(IRT(IR_XLOAD, IRT_UDATA), tr, 0);
1123
+ #endif
1115
1124
  } else { /* fp:method() */
1116
1125
  ud = J->base[0];
1117
1126
  if (!tref_isudata(ud))
@@ -1133,7 +1142,7 @@ static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)
1133
1142
  ptrdiff_t i = rd->data == 0 ? 1 : 0;
1134
1143
  for (; J->base[i]; i++) {
1135
1144
  TRef str = lj_ir_tostr(J, J->base[i]);
1136
- TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero);
1145
+ TRef buf = emitir(IRT(IR_STRREF, IRT_PGC), str, zero);
1137
1146
  TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);
1138
1147
  if (tref_isk(len) && IR(tref_ref(len))->i == 1) {
1139
1148
  IRIns *irs = IR(tref_ref(str));
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Fast function call recorder.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #ifndef _LJ_FFRECORD_H