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
  ** String library.
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
  ** Major portions taken verbatim or adapted from the Lua interpreter.
6
6
  ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -737,10 +737,6 @@ LUALIB_API int luaopen_string(lua_State *L)
737
737
  GCtab *mt;
738
738
  global_State *g;
739
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
740
  mt = lj_tab_new(L, 0, 1);
745
741
  /* NOBARRIER: basemt is a GC root. */
746
742
  g = G(L);
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Table library.
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
  ** Major portions taken verbatim or adapted from the Lua interpreter.
6
6
  ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -129,6 +129,26 @@ LJLIB_LUA(table_remove) /*
129
129
  end
130
130
  */
131
131
 
132
+ LJLIB_LUA(table_move) /*
133
+ function(a1, f, e, t, a2)
134
+ CHECK_tab(a1)
135
+ CHECK_int(f)
136
+ CHECK_int(e)
137
+ CHECK_int(t)
138
+ if a2 == nil then a2 = a1 end
139
+ CHECK_tab(a2)
140
+ if e >= f then
141
+ local d = t - f
142
+ if t > e or t <= f or a2 ~= a1 then
143
+ for i=f,e do a2[i+d] = a1[i] end
144
+ else
145
+ for i=e,f,-1 do a2[i+d] = a1[i] end
146
+ end
147
+ end
148
+ return a2
149
+ end
150
+ */
151
+
132
152
  LJLIB_CF(table_concat) LJLIB_REC(.)
133
153
  {
134
154
  GCtab *t = lj_lib_checktab(L, 1);
@@ -27,15 +27,15 @@
27
27
  {
28
28
  Optimized string compare
29
29
  Memcheck:Addr4
30
- fun:lj_str_fastcmp
30
+ fun:str_fastcmp
31
31
  }
32
32
  {
33
33
  Optimized string compare
34
34
  Memcheck:Addr1
35
- fun:lj_str_fastcmp
35
+ fun:str_fastcmp
36
36
  }
37
37
  {
38
38
  Optimized string compare
39
39
  Memcheck:Cond
40
- fun:lj_str_fastcmp
40
+ fun:str_fastcmp
41
41
  }
@@ -72,13 +72,56 @@
72
72
 
73
73
  #define IS_DIRECT_BIT (SIZE_T_ONE)
74
74
 
75
+
76
+ /* Determine system-specific block allocation method. */
75
77
  #if LJ_TARGET_WINDOWS
76
78
 
77
79
  #define WIN32_LEAN_AND_MEAN
78
80
  #include <windows.h>
79
81
 
82
+ #define LJ_ALLOC_VIRTUALALLOC 1
83
+
80
84
  #if LJ_64 && !LJ_GC64
85
+ #define LJ_ALLOC_NTAVM 1
86
+ #endif
87
+
88
+ #else
89
+
90
+ #include <errno.h>
91
+ /* If this include fails, then rebuild with: -DLUAJIT_USE_SYSMALLOC */
92
+ #include <sys/mman.h>
93
+
94
+ #define LJ_ALLOC_MMAP 1
95
+
96
+ #if LJ_64
97
+
98
+ #define LJ_ALLOC_MMAP_PROBE 1
99
+
100
+ #if LJ_GC64
101
+ #define LJ_ALLOC_MBITS 47 /* 128 TB in LJ_GC64 mode. */
102
+ #elif LJ_TARGET_X64 && LJ_HASJIT
103
+ /* Due to limitations in the x64 compiler backend. */
104
+ #define LJ_ALLOC_MBITS 31 /* 2 GB on x64 with !LJ_GC64. */
105
+ #else
106
+ #define LJ_ALLOC_MBITS 32 /* 4 GB on other archs with !LJ_GC64. */
107
+ #endif
108
+
109
+ #endif
110
+
111
+ #if LJ_64 && !LJ_GC64 && defined(MAP_32BIT)
112
+ #define LJ_ALLOC_MMAP32 1
113
+ #endif
114
+
115
+ #if LJ_TARGET_LINUX
116
+ #define LJ_ALLOC_MREMAP 1
117
+ #endif
118
+
119
+ #endif
81
120
 
121
+
122
+ #if LJ_ALLOC_VIRTUALALLOC
123
+
124
+ #if LJ_ALLOC_NTAVM
82
125
  /* Undocumented, but hey, that's what we all love so much about Windows. */
83
126
  typedef long (*PNTAVM)(HANDLE handle, void **addr, ULONG zbits,
84
127
  size_t *size, ULONG alloctype, ULONG prot);
@@ -89,14 +132,15 @@ static PNTAVM ntavm;
89
132
  */
90
133
  #define NTAVM_ZEROBITS 1
91
134
 
92
- static void INIT_MMAP(void)
135
+ static void init_mmap(void)
93
136
  {
94
137
  ntavm = (PNTAVM)GetProcAddress(GetModuleHandleA("ntdll.dll"),
95
138
  "NtAllocateVirtualMemory");
96
139
  }
140
+ #define INIT_MMAP() init_mmap()
97
141
 
98
142
  /* Win64 32 bit MMAP via NtAllocateVirtualMemory. */
99
- static LJ_AINLINE void *CALL_MMAP(size_t size)
143
+ static void *CALL_MMAP(size_t size)
100
144
  {
101
145
  DWORD olderr = GetLastError();
102
146
  void *ptr = NULL;
@@ -107,7 +151,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
107
151
  }
108
152
 
109
153
  /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
110
- static LJ_AINLINE void *DIRECT_MMAP(size_t size)
154
+ static void *DIRECT_MMAP(size_t size)
111
155
  {
112
156
  DWORD olderr = GetLastError();
113
157
  void *ptr = NULL;
@@ -119,10 +163,8 @@ static LJ_AINLINE void *DIRECT_MMAP(size_t size)
119
163
 
120
164
  #else
121
165
 
122
- #define INIT_MMAP() ((void)0)
123
-
124
166
  /* Win32 MMAP via VirtualAlloc */
125
- static LJ_AINLINE void *CALL_MMAP(size_t size)
167
+ static void *CALL_MMAP(size_t size)
126
168
  {
127
169
  DWORD olderr = GetLastError();
128
170
  void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
@@ -131,7 +173,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
131
173
  }
132
174
 
133
175
  /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
134
- static LJ_AINLINE void *DIRECT_MMAP(size_t size)
176
+ static void *DIRECT_MMAP(size_t size)
135
177
  {
136
178
  DWORD olderr = GetLastError();
137
179
  void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
@@ -143,7 +185,7 @@ static LJ_AINLINE void *DIRECT_MMAP(size_t size)
143
185
  #endif
144
186
 
145
187
  /* This function supports releasing coalesed segments */
146
- static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
188
+ static int CALL_MUNMAP(void *ptr, size_t size)
147
189
  {
148
190
  DWORD olderr = GetLastError();
149
191
  MEMORY_BASIC_INFORMATION minfo;
@@ -163,10 +205,7 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
163
205
  return 0;
164
206
  }
165
207
 
166
- #else
167
-
168
- #include <errno.h>
169
- #include <sys/mman.h>
208
+ #elif LJ_ALLOC_MMAP
170
209
 
171
210
  #define MMAP_PROT (PROT_READ|PROT_WRITE)
172
211
  #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
@@ -174,107 +213,151 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
174
213
  #endif
175
214
  #define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS)
176
215
 
177
- #if LJ_64 && !LJ_GC64
178
- /* 64 bit mode with 32 bit pointers needs special support for allocating
179
- ** memory in the lower 2GB.
180
- */
181
-
182
- #if defined(MAP_32BIT)
216
+ #if LJ_ALLOC_MMAP_PROBE
183
217
 
184
- #if defined(__sun__)
185
- #define MMAP_REGION_START ((uintptr_t)0x1000)
218
+ #ifdef MAP_TRYFIXED
219
+ #define MMAP_FLAGS_PROBE (MMAP_FLAGS|MAP_TRYFIXED)
186
220
  #else
187
- /* Actually this only gives us max. 1GB in current Linux kernels. */
188
- #define MMAP_REGION_START ((uintptr_t)0)
221
+ #define MMAP_FLAGS_PROBE MMAP_FLAGS
189
222
  #endif
190
223
 
191
- static LJ_AINLINE void *CALL_MMAP(size_t size)
192
- {
193
- int olderr = errno;
194
- void *ptr = mmap((void *)MMAP_REGION_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
195
- errno = olderr;
196
- return ptr;
197
- }
224
+ #define LJ_ALLOC_MMAP_PROBE_MAX 30
225
+ #define LJ_ALLOC_MMAP_PROBE_LINEAR 5
198
226
 
199
- #elif LJ_TARGET_OSX || LJ_TARGET_PS4 || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__sun__) || defined(__CYGWIN__)
227
+ #define LJ_ALLOC_MMAP_PROBE_LOWER ((uintptr_t)0x4000)
200
228
 
201
- /* OSX and FreeBSD mmap() use a naive first-fit linear search.
202
- ** That's perfect for us. Except that -pagezero_size must be set for OSX,
203
- ** otherwise the lower 4GB are blocked. And the 32GB RLIMIT_DATA needs
204
- ** to be reduced to 250MB on FreeBSD.
229
+ /* No point in a giant ifdef mess. Just try to open /dev/urandom.
230
+ ** It doesn't really matter if this fails, since we get some ASLR bits from
231
+ ** every unsuitable allocation, too. And we prefer linear allocation, anyway.
205
232
  */
206
- #if LJ_TARGET_OSX || defined(__DragonFly__)
207
- #define MMAP_REGION_START ((uintptr_t)0x10000)
208
- #elif LJ_TARGET_PS4
209
- #define MMAP_REGION_START ((uintptr_t)0x4000)
210
- #else
211
- #define MMAP_REGION_START ((uintptr_t)0x10000000)
212
- #endif
213
- #define MMAP_REGION_END ((uintptr_t)0x80000000)
233
+ #include <fcntl.h>
234
+ #include <unistd.h>
214
235
 
215
- #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
216
- #include <sys/resource.h>
217
- #endif
236
+ static uintptr_t mmap_probe_seed(void)
237
+ {
238
+ uintptr_t val;
239
+ int fd = open("/dev/urandom", O_RDONLY);
240
+ if (fd != -1) {
241
+ int ok = ((size_t)read(fd, &val, sizeof(val)) == sizeof(val));
242
+ (void)close(fd);
243
+ if (ok) return val;
244
+ }
245
+ return 1; /* Punt. */
246
+ }
218
247
 
219
- static LJ_AINLINE void *CALL_MMAP(size_t size)
248
+ static void *mmap_probe(size_t size)
220
249
  {
221
- int olderr = errno;
222
250
  /* Hint for next allocation. Doesn't need to be thread-safe. */
223
- static uintptr_t alloc_hint = MMAP_REGION_START;
224
- int retry = 0;
225
- #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
226
- static int rlimit_modified = 0;
227
- if (LJ_UNLIKELY(rlimit_modified == 0)) {
228
- struct rlimit rlim;
229
- rlim.rlim_cur = rlim.rlim_max = MMAP_REGION_START;
230
- setrlimit(RLIMIT_DATA, &rlim); /* Ignore result. May fail below. */
231
- rlimit_modified = 1;
232
- }
233
- #endif
234
- for (;;) {
235
- void *p = mmap((void *)alloc_hint, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
236
- if ((uintptr_t)p >= MMAP_REGION_START &&
237
- (uintptr_t)p + size < MMAP_REGION_END) {
238
- alloc_hint = (uintptr_t)p + size;
251
+ static uintptr_t hint_addr = 0;
252
+ static uintptr_t hint_prng = 0;
253
+ int olderr = errno;
254
+ int retry;
255
+ for (retry = 0; retry < LJ_ALLOC_MMAP_PROBE_MAX; retry++) {
256
+ void *p = mmap((void *)hint_addr, size, MMAP_PROT, MMAP_FLAGS_PROBE, -1, 0);
257
+ uintptr_t addr = (uintptr_t)p;
258
+ if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER) {
259
+ /* We got a suitable address. Bump the hint address. */
260
+ hint_addr = addr + size;
239
261
  errno = olderr;
240
262
  return p;
241
263
  }
242
- if (p != CMFAIL) munmap(p, size);
243
- #if defined(__sun__) || defined(__DragonFly__)
244
- alloc_hint += 0x1000000; /* Need near-exhaustive linear scan. */
245
- if (alloc_hint + size < MMAP_REGION_END) continue;
246
- #endif
247
- if (retry) break;
248
- retry = 1;
249
- alloc_hint = MMAP_REGION_START;
264
+ if (p != MFAIL) {
265
+ munmap(p, size);
266
+ } else if (errno == ENOMEM) {
267
+ return MFAIL;
268
+ }
269
+ if (hint_addr) {
270
+ /* First, try linear probing. */
271
+ if (retry < LJ_ALLOC_MMAP_PROBE_LINEAR) {
272
+ hint_addr += 0x1000000;
273
+ if (((hint_addr + size) >> LJ_ALLOC_MBITS) != 0)
274
+ hint_addr = 0;
275
+ continue;
276
+ } else if (retry == LJ_ALLOC_MMAP_PROBE_LINEAR) {
277
+ /* Next, try a no-hint probe to get back an ASLR address. */
278
+ hint_addr = 0;
279
+ continue;
280
+ }
281
+ }
282
+ /* Finally, try pseudo-random probing. */
283
+ if (LJ_UNLIKELY(hint_prng == 0)) {
284
+ hint_prng = mmap_probe_seed();
285
+ }
286
+ /* The unsuitable address we got has some ASLR PRNG bits. */
287
+ hint_addr ^= addr & ~((uintptr_t)(LJ_PAGESIZE-1));
288
+ do { /* The PRNG itself is very weak, but see above. */
289
+ hint_prng = hint_prng * 1103515245 + 12345;
290
+ hint_addr ^= hint_prng * (uintptr_t)LJ_PAGESIZE;
291
+ hint_addr &= (((uintptr_t)1 << LJ_ALLOC_MBITS)-1);
292
+ } while (hint_addr < LJ_ALLOC_MMAP_PROBE_LOWER);
250
293
  }
251
294
  errno = olderr;
252
- return CMFAIL;
295
+ return MFAIL;
253
296
  }
254
297
 
298
+ #endif
299
+
300
+ #if LJ_ALLOC_MMAP32
301
+
302
+ #if defined(__sun__)
303
+ #define LJ_ALLOC_MMAP32_START ((uintptr_t)0x1000)
255
304
  #else
305
+ #define LJ_ALLOC_MMAP32_START ((uintptr_t)0)
306
+ #endif
256
307
 
257
- #error "NYI: need an equivalent of MAP_32BIT for this 64 bit OS"
308
+ static void *mmap_map32(size_t size)
309
+ {
310
+ #if LJ_ALLOC_MMAP_PROBE
311
+ static int fallback = 0;
312
+ if (fallback)
313
+ return mmap_probe(size);
314
+ #endif
315
+ {
316
+ int olderr = errno;
317
+ void *ptr = mmap((void *)LJ_ALLOC_MMAP32_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
318
+ errno = olderr;
319
+ /* This only allows 1GB on Linux. So fallback to probing to get 2GB. */
320
+ #if LJ_ALLOC_MMAP_PROBE
321
+ if (ptr == MFAIL) {
322
+ fallback = 1;
323
+ return mmap_probe(size);
324
+ }
325
+ #endif
326
+ return ptr;
327
+ }
328
+ }
258
329
 
259
330
  #endif
260
331
 
332
+ #if LJ_ALLOC_MMAP32
333
+ #define CALL_MMAP(size) mmap_map32(size)
334
+ #elif LJ_ALLOC_MMAP_PROBE
335
+ #define CALL_MMAP(size) mmap_probe(size)
261
336
  #else
262
-
263
- /* 32 bit mode and GC64 mode is easy. */
264
- static LJ_AINLINE void *CALL_MMAP(size_t size)
337
+ static void *CALL_MMAP(size_t size)
265
338
  {
266
339
  int olderr = errno;
267
340
  void *ptr = mmap(NULL, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
268
341
  errno = olderr;
269
342
  return ptr;
270
343
  }
271
-
272
344
  #endif
273
345
 
274
- #define INIT_MMAP() ((void)0)
275
- #define DIRECT_MMAP(s) CALL_MMAP(s)
346
+ #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
347
+
348
+ #include <sys/resource.h>
349
+
350
+ static void init_mmap(void)
351
+ {
352
+ struct rlimit rlim;
353
+ rlim.rlim_cur = rlim.rlim_max = 0x10000;
354
+ setrlimit(RLIMIT_DATA, &rlim); /* Ignore result. May fail later. */
355
+ }
356
+ #define INIT_MMAP() init_mmap()
357
+
358
+ #endif
276
359
 
277
- static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
360
+ static int CALL_MUNMAP(void *ptr, size_t size)
278
361
  {
279
362
  int olderr = errno;
280
363
  int ret = munmap(ptr, size);
@@ -282,10 +365,9 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
282
365
  return ret;
283
366
  }
284
367
 
285
- #if LJ_TARGET_LINUX
368
+ #if LJ_ALLOC_MREMAP
286
369
  /* Need to define _GNU_SOURCE to get the mremap prototype. */
287
- static LJ_AINLINE void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz,
288
- int flags)
370
+ static void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz, int flags)
289
371
  {
290
372
  int olderr = errno;
291
373
  ptr = mremap(ptr, osz, nsz, flags);
@@ -305,6 +387,15 @@ static LJ_AINLINE void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz,
305
387
 
306
388
  #endif
307
389
 
390
+
391
+ #ifndef INIT_MMAP
392
+ #define INIT_MMAP() ((void)0)
393
+ #endif
394
+
395
+ #ifndef DIRECT_MMAP
396
+ #define DIRECT_MMAP(s) CALL_MMAP(s)
397
+ #endif
398
+
308
399
  #ifndef CALL_MREMAP
309
400
  #define CALL_MREMAP(addr, osz, nsz, mv) ((void)osz, MFAIL)
310
401
  #endif
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Public Lua/C API.
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
  ** Major portions taken verbatim or adapted from the Lua interpreter.
6
6
  ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -112,6 +112,13 @@ LUA_API void lua_xmove(lua_State *from, lua_State *to, int n)
112
112
  from->top = f;
113
113
  }
114
114
 
115
+ LUA_API const lua_Number *lua_version(lua_State *L)
116
+ {
117
+ static const lua_Number version = LUA_VERSION_NUM;
118
+ UNUSED(L);
119
+ return &version;
120
+ }
121
+
115
122
  /* -- Stack manipulation -------------------------------------------------- */
116
123
 
117
124
  LUA_API int lua_gettop(lua_State *L)
@@ -152,30 +159,40 @@ LUA_API void lua_insert(lua_State *L, int idx)
152
159
  copyTV(L, p, L->top);
153
160
  }
154
161
 
155
- LUA_API void lua_replace(lua_State *L, int idx)
162
+ static void copy_slot(lua_State *L, TValue *f, int idx)
156
163
  {
157
- api_checknelems(L, 1);
158
164
  if (idx == LUA_GLOBALSINDEX) {
159
- api_check(L, tvistab(L->top-1));
165
+ api_check(L, tvistab(f));
160
166
  /* NOBARRIER: A thread (i.e. L) is never black. */
161
- setgcref(L->env, obj2gco(tabV(L->top-1)));
167
+ setgcref(L->env, obj2gco(tabV(f)));
162
168
  } else if (idx == LUA_ENVIRONINDEX) {
163
169
  GCfunc *fn = curr_func(L);
164
170
  if (fn->c.gct != ~LJ_TFUNC)
165
171
  lj_err_msg(L, LJ_ERR_NOENV);
166
- api_check(L, tvistab(L->top-1));
167
- setgcref(fn->c.env, obj2gco(tabV(L->top-1)));
168
- lj_gc_barrier(L, fn, L->top-1);
172
+ api_check(L, tvistab(f));
173
+ setgcref(fn->c.env, obj2gco(tabV(f)));
174
+ lj_gc_barrier(L, fn, f);
169
175
  } else {
170
176
  TValue *o = index2adr(L, idx);
171
177
  api_checkvalidindex(L, o);
172
- copyTV(L, o, L->top-1);
178
+ copyTV(L, o, f);
173
179
  if (idx < LUA_GLOBALSINDEX) /* Need a barrier for upvalues. */
174
- lj_gc_barrier(L, curr_func(L), L->top-1);
180
+ lj_gc_barrier(L, curr_func(L), f);
175
181
  }
182
+ }
183
+
184
+ LUA_API void lua_replace(lua_State *L, int idx)
185
+ {
186
+ api_checknelems(L, 1);
187
+ copy_slot(L, L->top - 1, idx);
176
188
  L->top--;
177
189
  }
178
190
 
191
+ LUA_API void lua_copy(lua_State *L, int fromidx, int toidx)
192
+ {
193
+ copy_slot(L, index2adr(L, fromidx), toidx);
194
+ }
195
+
179
196
  LUA_API void lua_pushvalue(lua_State *L, int idx)
180
197
  {
181
198
  copyTV(L, L->top, index2adr(L, idx));
@@ -325,6 +342,22 @@ LUA_API lua_Number lua_tonumber(lua_State *L, int idx)
325
342
  return 0;
326
343
  }
327
344
 
345
+ LUA_API lua_Number lua_tonumberx(lua_State *L, int idx, int *ok)
346
+ {
347
+ cTValue *o = index2adr(L, idx);
348
+ TValue tmp;
349
+ if (LJ_LIKELY(tvisnumber(o))) {
350
+ if (ok) *ok = 1;
351
+ return numberVnum(o);
352
+ } else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp)) {
353
+ if (ok) *ok = 1;
354
+ return numV(&tmp);
355
+ } else {
356
+ if (ok) *ok = 0;
357
+ return 0;
358
+ }
359
+ }
360
+
328
361
  LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)
329
362
  {
330
363
  cTValue *o = index2adr(L, idx);
@@ -362,7 +395,7 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
362
395
  if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))
363
396
  return 0;
364
397
  if (tvisint(&tmp))
365
- return (lua_Integer)intV(&tmp);
398
+ return intV(&tmp);
366
399
  n = numV(&tmp);
367
400
  }
368
401
  #if LJ_64
@@ -372,6 +405,35 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
372
405
  #endif
373
406
  }
374
407
 
408
+ LUA_API lua_Integer lua_tointegerx(lua_State *L, int idx, int *ok)
409
+ {
410
+ cTValue *o = index2adr(L, idx);
411
+ TValue tmp;
412
+ lua_Number n;
413
+ if (LJ_LIKELY(tvisint(o))) {
414
+ if (ok) *ok = 1;
415
+ return intV(o);
416
+ } else if (LJ_LIKELY(tvisnum(o))) {
417
+ n = numV(o);
418
+ } else {
419
+ if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) {
420
+ if (ok) *ok = 0;
421
+ return 0;
422
+ }
423
+ if (tvisint(&tmp)) {
424
+ if (ok) *ok = 1;
425
+ return intV(&tmp);
426
+ }
427
+ n = numV(&tmp);
428
+ }
429
+ if (ok) *ok = 1;
430
+ #if LJ_64
431
+ return (lua_Integer)n;
432
+ #else
433
+ return lj_num2int(n);
434
+ #endif
435
+ }
436
+
375
437
  LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)
376
438
  {
377
439
  cTValue *o = index2adr(L, idx);
@@ -858,7 +920,7 @@ LUA_API void lua_upvaluejoin(lua_State *L, int idx1, int n1, int idx2, int n2)
858
920
  lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1]));
859
921
  }
860
922
 
861
- LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
923
+ LUALIB_API void *luaL_testudata(lua_State *L, int idx, const char *tname)
862
924
  {
863
925
  cTValue *o = index2adr(L, idx);
864
926
  if (tvisudata(o)) {
@@ -867,8 +929,14 @@ LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
867
929
  if (tv && tvistab(tv) && tabV(tv) == tabref(ud->metatable))
868
930
  return uddata(ud);
869
931
  }
870
- lj_err_argtype(L, idx, tname);
871
- return NULL; /* unreachable */
932
+ return NULL; /* value is not a userdata with a metatable */
933
+ }
934
+
935
+ LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
936
+ {
937
+ void *p = luaL_testudata(L, idx, tname);
938
+ if (!p) lj_err_argtype(L, idx, tname);
939
+ return p;
872
940
  }
873
941
 
874
942
  /* -- Object setters ------------------------------------------------------ */
@@ -977,6 +1045,12 @@ LUA_API int lua_setmetatable(lua_State *L, int idx)
977
1045
  return 1;
978
1046
  }
979
1047
 
1048
+ LUALIB_API void luaL_setmetatable(lua_State *L, const char *tname)
1049
+ {
1050
+ lua_getfield(L, LUA_REGISTRYINDEX, tname);
1051
+ lua_setmetatable(L, -2);
1052
+ }
1053
+
980
1054
  LUA_API int lua_setfenv(lua_State *L, int idx)
981
1055
  {
982
1056
  cTValue *o = index2adr(L, idx);
@@ -1032,7 +1106,7 @@ static TValue *api_call_base(lua_State *L, int nargs)
1032
1106
 
1033
1107
  LUA_API void lua_call(lua_State *L, int nargs, int nresults)
1034
1108
  {
1035
- api_check(L, L->status == 0 || L->status == LUA_ERRERR);
1109
+ api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
1036
1110
  api_checknelems(L, nargs+1);
1037
1111
  lj_vm_call(L, api_call_base(L, nargs), nresults+1);
1038
1112
  }
@@ -1043,7 +1117,7 @@ LUA_API int lua_pcall(lua_State *L, int nargs, int nresults, int errfunc)
1043
1117
  uint8_t oldh = hook_save(g);
1044
1118
  ptrdiff_t ef;
1045
1119
  int status;
1046
- api_check(L, L->status == 0 || L->status == LUA_ERRERR);
1120
+ api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
1047
1121
  api_checknelems(L, nargs+1);
1048
1122
  if (errfunc == 0) {
1049
1123
  ef = 0;
@@ -1075,7 +1149,7 @@ LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud)
1075
1149
  global_State *g = G(L);
1076
1150
  uint8_t oldh = hook_save(g);
1077
1151
  int status;
1078
- api_check(L, L->status == 0 || L->status == LUA_ERRERR);
1152
+ api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
1079
1153
  status = lj_vm_cpcall(L, func, ud, cpcall);
1080
1154
  if (status) hook_restore(g, oldh);
1081
1155
  return status;
@@ -1096,6 +1170,11 @@ LUALIB_API int luaL_callmeta(lua_State *L, int idx, const char *field)
1096
1170
 
1097
1171
  /* -- Coroutine yield and resume ------------------------------------------ */
1098
1172
 
1173
+ LUA_API int lua_isyieldable(lua_State *L)
1174
+ {
1175
+ return cframe_canyield(L->cframe);
1176
+ }
1177
+
1099
1178
  LUA_API int lua_yield(lua_State *L, int nresults)
1100
1179
  {
1101
1180
  void *cf = L->cframe;
@@ -1140,7 +1219,7 @@ LUA_API int lua_resume(lua_State *L, int nargs)
1140
1219
  {
1141
1220
  if (L->cframe == NULL && L->status <= LUA_YIELD)
1142
1221
  return lj_vm_resume(L,
1143
- L->status == 0 ? api_call_base(L, nargs) : L->top - nargs,
1222
+ L->status == LUA_OK ? api_call_base(L, nargs) : L->top - nargs,
1144
1223
  0, 0);
1145
1224
  L->top = L->base;
1146
1225
  setstrV(L, L->top, lj_err_str(L, LJ_ERR_COSUSP));