texlive[46269] Build/source: Imported Luatex 1.06.3 (Lua 5.2.4)

commits+lscarso at tug.org commits+lscarso at tug.org
Wed Jan 10 00:43:22 CET 2018


Revision: 46269
          http://tug.org/svn/texlive?view=revision&revision=46269
Author:   lscarso
Date:     2018-01-10 00:43:20 +0100 (Wed, 10 Jan 2018)
Log Message:
-----------
Imported Luatex 1.06.3 (Lua 5.2.4)

Modified Paths:
--------------
    trunk/Build/source/libs/lua52/Makefile.in
    trunk/Build/source/libs/lua52/aclocal.m4
    trunk/Build/source/libs/lua52/configure
    trunk/Build/source/libs/lua52/include/Makefile.in
    trunk/Build/source/libs/luajit/ChangeLog
    trunk/Build/source/libs/luajit/LuaJIT-src/COPYRIGHT
    trunk/Build/source/libs/luajit/LuaJIT-src/Makefile
    trunk/Build/source/libs/luajit/LuaJIT-src/README
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/bluequad-print.css
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/bluequad.css
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/changes.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/contact.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_c_api.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_api.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_semantics.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_tutorial.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_jit.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_profiler.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/extensions.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/faq.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/install.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/luajit.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/running.html
    trunk/Build/source/libs/luajit/LuaJIT-src/doc/status.html
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm.h
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm64.h
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm64.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_mips.h
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_mips.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_ppc.h
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_ppc.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_proto.h
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x64.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x86.h
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x86.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dynasm.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/etc/luajit.1
    trunk/Build/source/libs/luajit/LuaJIT-src/etc/luajit.pc
    trunk/Build/source/libs/luajit/LuaJIT-src/src/Makefile
    trunk/Build/source/libs/luajit/LuaJIT-src/src/Makefile.dep
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_asm.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_fold.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_lib.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_libbc.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_peobj.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/genlibbc.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/genminilua.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/host/minilua.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/bc.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/bcsave.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_arm.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_mips.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_mipsel.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_ppc.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_x64.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_x86.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dump.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/p.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/v.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/zone.lua
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lauxlib.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_aux.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_base.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_bit.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_debug.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_ffi.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_init.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_io.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_jit.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_math.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_os.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_package.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_string.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_table.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj.supp
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_alloc.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_api.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_arch.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_arm.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_mips.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_ppc.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_x86.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bc.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bc.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcdump.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcread.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcwrite.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_buf.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_buf.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_carith.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_carith.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccall.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccall.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccallback.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccallback.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cconv.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cconv.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cdata.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cdata.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_clib.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_clib.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cparse.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cparse.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_crecord.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_crecord.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ctype.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ctype.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_debug.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_debug.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_def.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_dispatch.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_dispatch.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_arm.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_mips.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_ppc.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_x86.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_err.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_err.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_errmsg.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ff.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ffrecord.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ffrecord.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_frame.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_func.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_func.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gc.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gc.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gdbjit.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gdbjit.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ir.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ir.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ircall.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_iropt.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_jit.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lex.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lex.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lib.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lib.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_load.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_mcode.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_mcode.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_meta.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_meta.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_obj.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_obj.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_dce.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_fold.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_loop.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_mem.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_narrow.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_sink.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_split.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_parse.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_parse.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_profile.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_profile.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_record.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_record.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_snap.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_snap.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_state.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_state.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_str.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_str.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt_num.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strscan.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strscan.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_tab.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_tab.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_arm.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_arm64.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_mips.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_ppc.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_x86.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_trace.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_trace.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_traceerr.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_udata.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_udata.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vm.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmevent.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmevent.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmmath.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/ljamalg.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lua.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/luaconf.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/luajit.c
    trunk/Build/source/libs/luajit/LuaJIT-src/src/luajit.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/lualib.h
    trunk/Build/source/libs/luajit/LuaJIT-src/src/msvcbuild.bat
    trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_arm.dasc
    trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_arm64.dasc
    trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_mips.dasc
    trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_ppc.dasc
    trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_x64.dasc
    trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_x86.dasc
    trunk/Build/source/libs/luajit/Makefile.in
    trunk/Build/source/libs/luajit/TLpatches/ChangeLog
    trunk/Build/source/libs/luajit/aclocal.m4
    trunk/Build/source/libs/luajit/configure
    trunk/Build/source/libs/luajit/include/Makefile.in
    trunk/Build/source/libs/luajit/native/Makefile.in
    trunk/Build/source/libs/luajit/native/aclocal.m4
    trunk/Build/source/libs/luajit/native/configure
    trunk/Build/source/libs/luajit/version.ac
    trunk/Build/source/texk/web2c/luatexdir/ChangeLog
    trunk/Build/source/texk/web2c/luatexdir/am/luatex.am
    trunk/Build/source/texk/web2c/luatexdir/font/luafont.w
    trunk/Build/source/texk/web2c/luatexdir/font/texfont.h
    trunk/Build/source/texk/web2c/luatexdir/font/texfont.w
    trunk/Build/source/texk/web2c/luatexdir/font/vfpacket.w
    trunk/Build/source/texk/web2c/luatexdir/font/writefont.w
    trunk/Build/source/texk/web2c/luatexdir/font/writetype2.w
    trunk/Build/source/texk/web2c/luatexdir/image/image.h
    trunk/Build/source/texk/web2c/luatexdir/image/pdftoepdf.w
    trunk/Build/source/texk/web2c/luatexdir/image/writeimg.w
    trunk/Build/source/texk/web2c/luatexdir/image/writejbig2.w
    trunk/Build/source/texk/web2c/luatexdir/image/writejpg.w
    trunk/Build/source/texk/web2c/luatexdir/lang/hyphen.w
    trunk/Build/source/texk/web2c/luatexdir/lang/texlang.h
    trunk/Build/source/texk/web2c/luatexdir/lang/texlang.w
    trunk/Build/source/texk/web2c/luatexdir/lua/lauxlib_bridge.h
    trunk/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c
    trunk/Build/source/texk/web2c/luatexdir/lua/lepdflib.cc
    trunk/Build/source/texk/web2c/luatexdir/lua/lfontlib.c
    trunk/Build/source/texk/web2c/luatexdir/lua/liolibext.c
    trunk/Build/source/texk/web2c/luatexdir/lua/llualib.c
    trunk/Build/source/texk/web2c/luatexdir/lua/lnodelib.c
    trunk/Build/source/texk/web2c/luatexdir/lua/lpdflib.c
    trunk/Build/source/texk/web2c/luatexdir/lua/lpdfscannerlib.cc
    trunk/Build/source/texk/web2c/luatexdir/lua/lstatslib.c
    trunk/Build/source/texk/web2c/luatexdir/lua/lstrlibext.c
    trunk/Build/source/texk/web2c/luatexdir/lua/ltexlib.c
    trunk/Build/source/texk/web2c/luatexdir/lua/luainit.w
    trunk/Build/source/texk/web2c/luatexdir/lua/luanode.w
    trunk/Build/source/texk/web2c/luatexdir/lua/luastuff.w
    trunk/Build/source/texk/web2c/luatexdir/lua/luatex-api.h
    trunk/Build/source/texk/web2c/luatexdir/lua/luatex-core.c
    trunk/Build/source/texk/web2c/luatexdir/lua/luatex-core.lua
    trunk/Build/source/texk/web2c/luatexdir/lua/luatoken.w
    trunk/Build/source/texk/web2c/luatexdir/luaffi/ctype.c
    trunk/Build/source/texk/web2c/luatexdir/luaffi/ffi.c
    trunk/Build/source/texk/web2c/luatexdir/luaffi/ffi.h
    trunk/Build/source/texk/web2c/luatexdir/luapeg/lpeg.c
    trunk/Build/source/texk/web2c/luatexdir/luapeg/lpeg.h
    trunk/Build/source/texk/web2c/luatexdir/luatex.c
    trunk/Build/source/texk/web2c/luatexdir/luatex_svnversion.h
    trunk/Build/source/texk/web2c/luatexdir/luatexcallbackids.h
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdffont.w
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdfgen.h
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdftables.h
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdfxform.h
    trunk/Build/source/texk/web2c/luatexdir/pdf/pdfxform.w
    trunk/Build/source/texk/web2c/luatexdir/tex/commands.h
    trunk/Build/source/texk/web2c/luatexdir/tex/commands.w
    trunk/Build/source/texk/web2c/luatexdir/tex/conditional.w
    trunk/Build/source/texk/web2c/luatexdir/tex/dumpdata.w
    trunk/Build/source/texk/web2c/luatexdir/tex/equivalents.h
    trunk/Build/source/texk/web2c/luatexdir/tex/errors.h
    trunk/Build/source/texk/web2c/luatexdir/tex/errors.w
    trunk/Build/source/texk/web2c/luatexdir/tex/expand.w
    trunk/Build/source/texk/web2c/luatexdir/tex/linebreak.w
    trunk/Build/source/texk/web2c/luatexdir/tex/mainbody.h
    trunk/Build/source/texk/web2c/luatexdir/tex/mainbody.w
    trunk/Build/source/texk/web2c/luatexdir/tex/maincontrol.w
    trunk/Build/source/texk/web2c/luatexdir/tex/mlist.w
    trunk/Build/source/texk/web2c/luatexdir/tex/printing.w
    trunk/Build/source/texk/web2c/luatexdir/tex/texfileio.w
    trunk/Build/source/texk/web2c/luatexdir/tex/texmath.h
    trunk/Build/source/texk/web2c/luatexdir/tex/texmath.w
    trunk/Build/source/texk/web2c/luatexdir/tex/texnodes.h
    trunk/Build/source/texk/web2c/luatexdir/tex/texnodes.w
    trunk/Build/source/texk/web2c/luatexdir/tex/textoken.w
    trunk/Build/source/texk/web2c/luatexdir/utils/utils.w

Added Paths:
-----------
    trunk/Build/source/libs/luajit/TLpatches/patch-01
    trunk/Build/source/libs/luajit/TLpatches/patch-02
    trunk/Build/source/libs/luajit/TLpatches/patch-03
    trunk/Build/source/libs/luajit/TLpatches/patch-04
    trunk/Build/source/libs/luajit/TLpatches/patch-05
    trunk/Build/source/libs/luajit/TLpatches/patch-06
    trunk/Build/source/libs/luajit/TLpatches/patch-07
    trunk/Build/source/libs/luajit/TLpatches/patch-08
    trunk/Build/source/libs/luajit/TLpatches/patch-09
    trunk/Build/source/libs/luajit/TLpatches/patch-10
    trunk/Build/source/libs/luajit/TLpatches/patch-11
    trunk/Build/source/libs/luajit/TLpatches/patch-12

Removed Paths:
-------------
    trunk/Build/source/libs/luajit/TLpatches/patch-01-LuaJITTeX
    trunk/Build/source/libs/luajit/TLpatches/patch-05-LuaJITTeX
    trunk/Build/source/libs/luajit/TLpatches/patch-06-ppc-darwin
    trunk/Build/source/libs/luajit/TLpatches/patch-07-x86_64-cygwin

Modified: trunk/Build/source/libs/lua52/Makefile.in
===================================================================
--- trunk/Build/source/libs/lua52/Makefile.in	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/lua52/Makefile.in	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -612,6 +612,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -1351,7 +1352,7 @@
 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
 	$(am__post_remove_distdir)
 
 dist-bzip2: distdir
@@ -1377,7 +1378,7 @@
 	@echo WARNING: "Support for shar distribution archives is" \
 	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -1395,7 +1396,7 @@
 distcheck: dist
 	case '$(DIST_ARCHIVES)' in \
 	*.tar.gz*) \
-	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
 	*.tar.lz*) \
@@ -1405,7 +1406,7 @@
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
-	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
 	esac

Modified: trunk/Build/source/libs/lua52/aclocal.m4
===================================================================
--- trunk/Build/source/libs/lua52/aclocal.m4	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/lua52/aclocal.m4	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@
 [am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.15.1], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,7 +51,7 @@
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -58,7 +58,7 @@
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -332,7 +332,7 @@
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -408,7 +408,7 @@
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -605,7 +605,7 @@
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -626,7 +626,7 @@
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2017 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -648,7 +648,7 @@
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -683,7 +683,7 @@
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -733,7 +733,7 @@
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -772,7 +772,7 @@
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -801,7 +801,7 @@
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -848,7 +848,7 @@
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -867,7 +867,7 @@
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -948,7 +948,7 @@
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2017 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1008,7 +1008,7 @@
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1036,7 +1036,7 @@
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2017 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1055,7 +1055,7 @@
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2017 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,

Modified: trunk/Build/source/libs/lua52/configure
===================================================================
--- trunk/Build/source/libs/lua52/configure	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/lua52/configure	2018-01-09 23:43:20 UTC (rev 46269)
@@ -741,6 +741,7 @@
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -825,6 +826,7 @@
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1077,6 +1079,15 @@
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1214,7 +1225,7 @@
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1367,6 +1378,7 @@
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -13546,7 +13558,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -13592,7 +13604,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -13616,7 +13628,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -13661,7 +13673,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -13685,7 +13697,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];

Modified: trunk/Build/source/libs/lua52/include/Makefile.in
===================================================================
--- trunk/Build/source/libs/lua52/include/Makefile.in	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/lua52/include/Makefile.in	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -246,6 +246,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@

Modified: trunk/Build/source/libs/luajit/ChangeLog
===================================================================
--- trunk/Build/source/libs/luajit/ChangeLog	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/ChangeLog	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,3 +1,9 @@
+2017-20-06 Luigi Scarso <luigi.scarso at gmail.com>
+
+	Import LuaJIT-2.1.0-beta3.
+	* version.ac: Adjust.
+
+
 2016-03-09 Luigi Scarso <luigi.scarso at gmail.com>
 
 	Import LuaJIT-2.1.0-beta2.

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/COPYRIGHT
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/COPYRIGHT	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/COPYRIGHT	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ===============================================================================
 LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/
 
-Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/Makefile
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/Makefile	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/Makefile	2018-01-09 23:43:20 UTC (rev 46269)
@@ -10,13 +10,13 @@
 # For MSVC, please follow the instructions given in src/msvcbuild.bat.
 # For MinGW and Cygwin, cd to src and run make with the Makefile there.
 #
-# Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+# Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 ##############################################################################
 
 MAJVER=  2
 MINVER=  1
 RELVER=  0
-PREREL=  -beta2
+PREREL=  -beta3
 VERSION= $(MAJVER).$(MINVER).$(RELVER)$(PREREL)
 ABIVER=  5.1
 
@@ -47,17 +47,18 @@
 INSTALL_TNAME= luajit-$(VERSION)
 INSTALL_TSYMNAME= luajit
 INSTALL_ANAME= libluajit-$(ABIVER).a
-INSTALL_SONAME= libluajit-$(ABIVER).so.$(MAJVER).$(MINVER).$(RELVER)
-INSTALL_SOSHORT= libluajit-$(ABIVER).so
-INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).$(MINVER).$(RELVER).dylib
+INSTALL_SOSHORT1= libluajit-$(ABIVER).so
+INSTALL_SOSHORT2= libluajit-$(ABIVER).so.$(MAJVER)
+INSTALL_SONAME= $(INSTALL_SOSHORT2).$(MINVER).$(RELVER)
 INSTALL_DYLIBSHORT1= libluajit-$(ABIVER).dylib
 INSTALL_DYLIBSHORT2= libluajit-$(ABIVER).$(MAJVER).dylib
+INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).$(MINVER).$(RELVER).dylib
 INSTALL_PCNAME= luajit.pc
 
 INSTALL_STATIC= $(INSTALL_LIB)/$(INSTALL_ANAME)
 INSTALL_DYN= $(INSTALL_LIB)/$(INSTALL_SONAME)
-INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_SOSHORT)
-INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_SOSHORT)
+INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_SOSHORT1)
+INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_SOSHORT2)
 INSTALL_T= $(INSTALL_BIN)/$(INSTALL_TNAME)
 INSTALL_TSYM= $(INSTALL_BIN)/$(INSTALL_TSYMNAME)
 INSTALL_PC= $(INSTALL_PKGCONFIG)/$(INSTALL_PCNAME)
@@ -85,18 +86,24 @@
 FILE_PC= luajit.pc
 FILES_INC= lua.h lualib.h lauxlib.h luaconf.h lua.hpp luajit.h
 FILES_JITLIB= bc.lua bcsave.lua dump.lua p.lua v.lua zone.lua \
-	      dis_x86.lua dis_x64.lua dis_arm.lua dis_ppc.lua \
-	      dis_mips.lua dis_mipsel.lua vmdef.lua
+	      dis_x86.lua dis_x64.lua dis_arm.lua dis_arm64.lua \
+	      dis_arm64be.lua dis_ppc.lua dis_mips.lua dis_mipsel.lua \
+	      dis_mips64.lua dis_mips64el.lua vmdef.lua
 
 ifeq (,$(findstring Windows,$(OS)))
-  ifeq (Darwin,$(shell uname -s))
-    INSTALL_SONAME= $(INSTALL_DYLIBNAME)
-    INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_DYLIBSHORT1)
-    INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_DYLIBSHORT2)
-    LDCONFIG= :
-  endif
+  HOST_SYS:= $(shell uname -s)
+else
+  HOST_SYS= Windows
 endif
+TARGET_SYS?= $(HOST_SYS)
 
+ifeq (Darwin,$(TARGET_SYS))
+  INSTALL_SONAME= $(INSTALL_DYLIBNAME)
+  INSTALL_SOSHORT1= $(INSTALL_DYLIBSHORT1)
+  INSTALL_SOSHORT2= $(INSTALL_DYLIBSHORT2)
+  LDCONFIG= :
+endif
+
 ##############################################################################
 
 INSTALL_DEP= src/luajit

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/README
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/README	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/README	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,4 +1,4 @@
-README for LuaJIT 2.1.0-beta2
+README for LuaJIT 2.1.0-beta3
 -----------------------------
 
 LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming language.
@@ -5,7 +5,7 @@
 
 Project Homepage: http://luajit.org/
 
-LuaJIT is Copyright (C) 2005-2016 Mike Pall.
+LuaJIT is Copyright (C) 2005-2017 Mike Pall.
 LuaJIT is free software, released under the MIT license.
 See full Copyright Notice in the COPYRIGHT file or in luajit.h.
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/bluequad-print.css
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/bluequad-print.css	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/bluequad-print.css	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2004-2016 Mike Pall.
+/* Copyright (C) 2004-2017 Mike Pall.
  *
  * You are welcome to use the general ideas of this design for your own sites.
  * But please do not steal the stylesheet, the layout or the color scheme.

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/bluequad.css
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/bluequad.css	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/bluequad.css	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2004-2016 Mike Pall.
+/* Copyright (C) 2004-2017 Mike Pall.
  *
  * You are welcome to use the general ideas of this design for your own sites.
  * But please do not steal the stylesheet, the layout or the color scheme.

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/changes.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/changes.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/changes.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>LuaJIT Change History</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -65,7 +65,7 @@
 <div id="main">
 <p>
 This is a list of changes between the released versions of LuaJIT.<br>
-The current <span style="color: #0000c0;">stable version</span> is <strong>LuaJIT 2.0.4</strong>.<br>
+The current <span style="color: #0000c0;">stable version</span> is <strong>LuaJIT 2.0.5</strong>.<br>
 </p>
 <p>
 Please check the
@@ -74,6 +74,30 @@
 </p>
 
 <div class="major" style="background: #d0d0ff;">
+<h2 id="LuaJIT-2.1.0-beta3">LuaJIT 2.1.0-beta3 — 2017-05-01</h2>
+<ul>
+<li>Rewrite memory block allocator.</li>
+<li>Add various extension from Lua 5.2/5.3.</li>
+<li>Remove old Lua 5.0 compatibility defines.</li>
+<li>Set arg table before evaluating <tt>LUA_INIT</tt> and <tt>-e</tt> chunks.</li>
+<li>Fix FOLD rules for <tt>math.abs()</tt> and FP negation.</li>
+<li>Fix soft-float <tt>math.abs()</tt> and negation.</li>
+<li>Fix formatting of some small denormals at low precision.</li>
+<li>LJ_GC64: Add JIT compiler support.</li>
+<li>x64/LJ_GC64: Add JIT compiler backend.</li>
+<li>x86/x64: Generate BMI2 shifts and rotates, if available.</li>
+<li>Windows/x86: Add full exception interoperability.</li>
+<li>ARM64: Add big-endian support.</li>
+<li>ARM64: Add JIT compiler backend.</li>
+<li>MIPS: Fix <tt>TSETR</tt> barrier.</li>
+<li>MIPS: Support MIPS16 interlinking.</li>
+<li>MIPS soft-float: Fix code generation for <tt>HREF</tt>.</li>
+<li>MIPS64: Add MIPS64 hard-float JIT compiler backend.</li>
+<li>MIPS64: Add MIPS64 hard-float/soft-float support to interpreter.</li>
+<li>FFI: Compile bitfield loads/stores.</li>
+<li>Various fixes common with the 2.0 branch.</li>
+</ul>
+
 <h2 id="LuaJIT-2.1.0-beta2">LuaJIT 2.1.0-beta2 — 2016-03-03</h2>
 <ul>
 <li>Enable trace stitching.</li>
@@ -140,6 +164,48 @@
 </div>
 
 <div class="major" style="background: #ffffd0;">
+<h2 id="LuaJIT-2.0.5">LuaJIT 2.0.5 — 2017-05-01</h2>
+<ul>
+<li>Add workaround for MSVC 2015 stdio changes.</li>
+<li>Limit mcode alloc probing, depending on the available pool size.</li>
+<li>Fix overly restrictive range calculation in mcode allocation.</li>
+<li>Fix out-of-scope goto handling in parser.</li>
+<li>Remove internal <tt>__mode = "K"</tt> and replace with safe check.</li>
+<li>Add "proto" field to <tt>jit.util.funcinfo()</tt>.</li>
+<li>Fix GC step size calculation.</li>
+<li>Initialize <tt>uv->immutable</tt> for upvalues of loaded chunks.</li>
+<li>Fix for cdata vs. non-cdata arithmetics/comparisons.</li>
+<li>Drop leftover regs in 'for' iterator assignment, too.</li>
+<li>Fix PHI remarking in SINK pass.</li>
+<li>Don't try to record outermost <tt>pcall()</tt> return to lower frame.</li>
+<li>Add guard for obscure aliasing between open upvalues and SSA slots.</li>
+<li>Remove assumption that <tt>lj_math_random_step()</tt> doesn't clobber FPRs.</li>
+<li>Fix handling of non-numeric strings in arithmetic coercions.</li>
+<li>Fix recording of <tt>select(n, ...)</tt> with off-trace varargs</li>
+<li>Fix install for cross-builds.</li>
+<li>Don't allocate unused 2nd result register in JIT compiler backend.</li>
+<li>Drop marks from replayed instructions when sinking.</li>
+<li>Fix unsinking check.</li>
+<li>Properly handle OOM in <tt>trace_save()</tt>.</li>
+<li>Limit number of arguments given to <tt>io.lines()</tt> and <tt>fp:lines()</tt>.</li>
+<li>Fix narrowing of <tt>TOBIT</tt>.</li>
+<li>OSX: Fix build with recent XCode.</li>
+<li>x86/x64: Don't spill an explicit <tt>REF_BASE</tt> in the IR.</li>
+<li>x86/x64: Fix instruction length decoder.</li>
+<li>x86/x64: Search for exit jumps with instruction length decoder.</li>
+<li>ARM: Fix <tt>BLX</tt> encoding for Thumb interworking calls.</li>
+<li>MIPS: Don't use <tt>RID_GP</tt> as a scratch register.</li>
+<li>MIPS: Fix emitted code for U32 to float conversion.</li>
+<li>MIPS: Backport workaround for compact unwind tables.</li>
+<li>MIPS: Fix cross-endian jit.bcsave.</li>
+<li>MIPS: Fix <tt>BC_ISNEXT</tt> fallback path.</li>
+<li>MIPS: Fix use of ffgccheck delay slots in interpreter.</li>
+<li>FFI: Fix FOLD rules for <tt>int64_t</tt> comparisons.</li>
+<li>FFI: Fix SPLIT pass for <tt>CONV i64.u64</tt>.</li>
+<li>FFI: Fix <tt>ipairs()</tt> recording.</li>
+<li>FFI: Don't propagate qualifiers into subtypes of complex.</li>
+</ul>
+
 <h2 id="LuaJIT-2.0.4">LuaJIT 2.0.4 — 2015-05-14</h2>
 <ul>
 <li>Fix stack check in narrowing optimization.</li>
@@ -807,7 +873,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/contact.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/contact.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/contact.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>Contact</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -61,8 +61,15 @@
 </div>
 <div id="main">
 <p>
+If you want to report bugs, propose fixes or suggest enhancements,
+please use the
+<a href="https://github.com/LuaJIT/LuaJIT/issues">GitHub issue tracker</a>.
+</p>
+<p>
 Please send general questions to the
 <a href="http://luajit.org/list.html"><span class="ext">»</span> LuaJIT mailing list</a>.
+</p>
+<p>
 You can also send any questions you have directly to me:
 </p>
 
@@ -86,7 +93,7 @@
 <h2>Copyright</h2>
 <p>
 All documentation is
-Copyright © 2005-2016 Mike Pall.
+Copyright © 2005-2017 Mike Pall.
 </p>
 
 
@@ -94,7 +101,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_c_api.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_c_api.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_c_api.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>Lua/C API Extensions</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -179,7 +179,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>FFI Library</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -322,7 +322,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_api.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_api.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_api.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>ffi.* API Functions</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -560,7 +560,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_semantics.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_semantics.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_semantics.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>FFI Semantics</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -1221,13 +1221,12 @@
 suboptimal performance, especially when used in inner loops:
 </p>
 <ul>
-<li>Bitfield accesses and initializations.</li>
 <li>Vector operations.</li>
 <li>Table initializers.</li>
 <li>Initialization of nested <tt>struct</tt>/<tt>union</tt> types.</li>
 <li>Non-default initialization of VLA/VLS or large C types
 (> 128 bytes or > 16 array elements.</li>
-<li>Conversions from lightuserdata to <tt>void *</tt>.</li>
+<li>Bitfield initializations.</li>
 <li>Pointer differences for element sizes that are not a power of
 two.</li>
 <li>Calls to C functions with aggregates passed or returned by
@@ -1253,7 +1252,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_tutorial.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_tutorial.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_ffi_tutorial.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>FFI Tutorial</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -593,7 +593,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_jit.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_jit.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_jit.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>jit.* Library</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -153,7 +153,7 @@
 <h3 id="jit_arch"><tt>jit.arch</tt></h3>
 <p>
 Contains the target architecture name:
-"x86", "x64", "arm", "ppc", or "mips".
+"x86", "x64", "arm", "arm64", "ppc", "mips" or "mips64".
 </p>
 
 <h2 id="jit_opt"><tt>jit.opt.*</tt> — JIT compiler optimization control</h2>
@@ -191,7 +191,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_profiler.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_profiler.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/ext_profiler.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>Profiler</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -355,7 +355,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/extensions.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/extensions.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/extensions.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>Extensions</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -210,7 +210,8 @@
 <p>
 Note: <tt>LJ_GC64</tt> mode requires a different frame layout, which implies
 a different, incompatible bytecode format for ports that use this mode (e.g.
-ARM64). This may be rectified in the future.
+ARM64 or MIPS64) or when explicitly enabled for x64. This may be rectified
+in the future.
 </p>
 
 <h3 id="table_new"><tt>table.new(narray, nhash)</tt> allocates a pre-sized table</h3>
@@ -291,8 +292,8 @@
 <li><tt>load(string|reader [, chunkname [,mode [,env]]])</tt>.</li>
 <li><tt>loadstring()</tt> is an alias for <tt>load()</tt>.</li>
 <li><tt>loadfile(filename [,mode [,env]])</tt>.</li>
-<li><tt>math.log(x [,base])</tt>.
-<li><tt>string.rep(s, n [,sep])</tt>.
+<li><tt>math.log(x [,base])</tt>.</li>
+<li><tt>string.rep(s, n [,sep])</tt>.</li>
 <li><tt>string.format()</tt>: <tt>%q</tt> reversible.
 <tt>%s</tt> checks <tt>__tostring</tt>.
 <tt>%a</tt> and <tt>"%A</tt> added.</li>
@@ -311,6 +312,26 @@
 <li><tt>debug.getupvalue()</tt> and <tt>debug.setupvalue()</tt> handle
 C functions.</li>
 <li><tt>debug.upvalueid()</tt> and <tt>debug.upvaluejoin()</tt>.</li>
+<li>Lua/C API extensions:
+<tt>lua_version()</tt>
+<tt>lua_upvalueid()</tt>
+<tt>lua_upvaluejoin()</tt>
+<tt>lua_loadx()</tt>
+<tt>lua_copy()</tt>
+<tt>lua_tonumberx()</tt>
+<tt>lua_tointegerx()</tt>
+<tt>luaL_fileresult()</tt>
+<tt>luaL_execresult()</tt>
+<tt>luaL_loadfilex()</tt>
+<tt>luaL_loadbufferx()</tt>
+<tt>luaL_traceback()</tt>
+<tt>luaL_setfuncs()</tt>
+<tt>luaL_pushmodule()</tt>
+<tt>luaL_newlibtable()</tt>
+<tt>luaL_newlib()</tt>
+<tt>luaL_testudata()</tt>
+<tt>luaL_setmetatable()</tt>
+</li>
 <li>Command line option <tt>-E</tt>.</li>
 <li>Command line checks <tt>__tostring</tt> for errors.</li>
 </ul>
@@ -335,7 +356,9 @@
 exit status.</li>
 <li><tt>debug.setmetatable()</tt> returns object.</li>
 <li><tt>debug.getuservalue()</tt> and <tt>debug.setuservalue()</tt>.</li>
-<li>Remove <tt>math.mod()</tt>, <tt>string.gfind()</tt>.
+<li>Remove <tt>math.mod()</tt>, <tt>string.gfind()</tt>.</li>
+<li><tt>package.searchers</tt>.</li>
+<li><tt>module()</tt> returns the module table.</li>
 </ul>
 <p>
 Note: this provides only partial compatibility with Lua 5.2 at the
@@ -349,6 +372,13 @@
 LuaJIT supports some extensions from Lua 5.3:
 <ul>
 <li>Unicode escape <tt>'\u{XX...}'</tt> embeds the UTF-8 encoding in string literals.</li>
+<li>The argument table <tt>arg</tt> can be read (and modified) by <tt>LUA_INIT</tt> and <tt>-e</tt> chunks.</li>
+<li><tt>io.read()</tt> and <tt>file:read()</tt> accept formats with or without a leading <tt>*</tt>.</li>
+<li><tt>table.move(a1, f, e, t [,a2])</tt>.</li>
+<li><tt>coroutine.isyieldable()</tt>.</li>
+<li>Lua/C API extensions:
+<tt>lua_isyieldable()</tt>
+</li>
 </ul>
 
 <h2 id="exceptions">C++ Exception Interoperability</h2>
@@ -365,25 +395,30 @@
 </tr>
 <tr class="odd separate">
 <td class="excplatform">POSIX/x64, DWARF2 unwinding</td>
-<td class="exccompiler">GCC 4.3+</td>
+<td class="exccompiler">GCC 4.3+, Clang</td>
 <td class="excinterop"><b style="color: #00a000;">Full</b></td>
 </tr>
 <tr class="even">
+<td class="excplatform">ARM <tt>-DLUAJIT_UNWIND_EXTERNAL</tt></td>
+<td class="exccompiler">GCC, Clang</td>
+<td class="excinterop"><b style="color: #00a000;">Full</b></td>
+</tr>
+<tr class="odd">
 <td class="excplatform">Other platforms, DWARF2 unwinding</td>
-<td class="exccompiler">GCC</td>
+<td class="exccompiler">GCC, Clang</td>
 <td class="excinterop"><b style="color: #c06000;">Limited</b></td>
 </tr>
-<tr class="odd">
+<tr class="even">
 <td class="excplatform">Windows/x64</td>
 <td class="exccompiler">MSVC or WinSDK</td>
 <td class="excinterop"><b style="color: #00a000;">Full</b></td>
 </tr>
-<tr class="even">
+<tr class="odd">
 <td class="excplatform">Windows/x86</td>
 <td class="exccompiler">Any</td>
-<td class="excinterop"><b style="color: #a00000;">No</b></td>
+<td class="excinterop"><b style="color: #00a000;">Full</b></td>
 </tr>
-<tr class="odd">
+<tr class="even">
 <td class="excplatform">Other platforms</td>
 <td class="exccompiler">Other compilers</td>
 <td class="excinterop"><b style="color: #a00000;">No</b></td>
@@ -432,20 +467,12 @@
 <li>Lua errors <b>cannot</b> be caught on the C++ side.</li>
 <li>Throwing Lua errors across C++ frames will <b>not</b> call
 C++ destructors.</li>
-<li>Additionally, on Windows/x86 with SEH-based C++ exceptions:
-it's <b>not</b> safe to throw a Lua error across any frames containing
-a C++ function with any try/catch construct or using variables with
-(implicit) destructors. This also applies to any functions which may be
-inlined in such a function. It doesn't matter whether <tt>lua_error()</tt>
-is called inside or outside of a try/catch or whether any object actually
-needs to be destroyed: the SEH chain is corrupted and this will eventually
-lead to the termination of the process.</li>
 </ul>
 <br class="flush">
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/faq.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/faq.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/faq.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>Frequently Asked Questions (FAQ)</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -176,7 +176,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/install.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/install.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/install.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>Installation</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -122,7 +122,7 @@
 <tr class="even">
 <td class="compatcpu">x64 (64 bit)</td>
 <td class="compatos">GCC 4.2+</td>
-<td class="compatos">ORBIS (<a href="#ps4">PS4</a>)</td>
+<td class="compatos">GCC 4.2+<br>ORBIS (<a href="#ps4">PS4</a>)</td>
 <td class="compatos">XCode 5.0+<br>Clang</td>
 <td class="compatos">MSVC + SDK v7.0<br>WinSDK v7.0<br>Durango (<a href="#xboxone">Xbox One</a>)</td>
 </tr>
@@ -148,7 +148,7 @@
 <td class="compatos">XEDK (<a href="#xbox360">Xbox 360</a>)</td>
 </tr>
 <tr class="even">
-<td class="compatcpu"><a href="#cross2">MIPS</a></td>
+<td class="compatcpu"><a href="#cross2">MIPS32<br>MIPS64</a></td>
 <td class="compatos">GCC 4.3+</td>
 <td class="compatos">GCC 4.3+</td>
 <td class="compatos compatno"> </td>
@@ -175,6 +175,14 @@
 Please read the instructions given in these files, before changing
 any settings.
 </p>
+<p>
+LuaJIT on x64 currently uses 32 bit GC objects by default.
+<tt>LJ_GC64</tt> mode may be explicitly enabled:
+add <tt>XCFLAGS=-DLUAJIT_ENABLE_GC64</tt> to the make command or run
+<tt>msvcbuild gc64</tt> for MSVC/WinSDK. Please check the note
+about the <a href="extensions.html#string_dump">bytecode format</a>
+differences, too.
+</p>
 
 <h2 id="posix">POSIX Systems (Linux, OSX, *BSD etc.)</h2>
 <h3>Prerequisites</h3>
@@ -190,8 +198,8 @@
 and change to the newly created directory:
 </p>
 <pre class="code">
-tar zxf LuaJIT-2.0.4.tar.gz
-cd LuaJIT-2.0.4</pre>
+tar zxf LuaJIT-2.0.5.tar.gz
+cd LuaJIT-2.0.5</pre>
 <h3>Building LuaJIT</h3>
 <p>
 The supplied Makefiles try to auto-detect the settings needed for your
@@ -202,7 +210,7 @@
 make
 </pre>
 <p>
-This always builds a native x86, x64 or PPC binary, depending on the host OS
+This always builds a native binary, depending on the host OS
 you're running this command on. Check the section on
 <a href="#cross">cross-compilation</a> for more options.
 </p>
@@ -333,23 +341,37 @@
 
 <h2 id="cross">Cross-compiling LuaJIT</h2>
 <p>
+First, let's clear up some terminology:
+</p>
+<ul>
+<li>Host: This is your development system, usually based on a x64 or x86 CPU.</li>
+<li>Target: This is the target system you want LuaJIT to run on, e.g. Android/ARM.</li>
+<li>Toolchain: This comprises a C compiler, linker, assembler and a matching C library.</li>
+<li>Host (or system) toolchain: This is the toolchain used to build native binaries for your host system.</li>
+<li>Cross-compile toolchain: This is the toolchain used to build binaries for the target system. They can only be run on the target system.</li>
+</ul>
+<p>
 The GNU Makefile-based build system allows cross-compiling on any host
-for any supported target, as long as both architectures have the same
-pointer size. If you want to cross-compile to any 32 bit target on an
-x64 OS, you need to install the multilib development package (e.g.
-<tt>libc6-dev-i386</tt> on Debian/Ubuntu) and build a 32 bit host part
-(<tt>HOST_CC="gcc -m32"</tt>).
+for any supported target:
 </p>
+<ul>
+<li>Yes, you need a toolchain for both your host <em>and</em> your target!</li>
+<li>Both host and target architectures must have the same pointer size.</li>
+<li>E.g. if you want to cross-compile to a 32 bit target on a 64 bit host, you need to install the multilib development package (e.g. <tt>libc6-dev-i386</tt> on Debian/Ubuntu) and build a 32 bit host part (<tt>HOST_CC="gcc -m32"</tt>).</li>
+<li>64 bit targets always require compilation on a 64 bit host.</li>
+</ul>
 <p>
 You need to specify <tt>TARGET_SYS</tt> whenever the host OS and the
-target OS differ, or you'll get assembler or linker errors. E.g. if
-you're compiling on a Windows or OSX host for embedded Linux or Android,
-you need to add <tt>TARGET_SYS=Linux</tt> to the examples below. For a
-minimal target OS, you may need to disable the built-in allocator in
-<tt>src/Makefile</tt> and use <tt>TARGET_SYS=Other</tt>. The examples
-below only show some popular targets — please check the comments
-in <tt>src/Makefile</tt> for more details.
+target OS differ, or you'll get assembler or linker errors:
 </p>
+<ul>
+<li>E.g. if you're compiling on a Windows or OSX host for embedded Linux or Android, you need to add <tt>TARGET_SYS=Linux</tt> to the examples below.</li>
+<li>For a minimal target OS, you may need to disable the built-in allocator in <tt>src/Makefile</tt> and use <tt>TARGET_SYS=Other</tt>.</li>
+<li>Don't forget to specify the same <tt>TARGET_SYS</tt> for the install step, too.</li>
+</ul>
+<p>
+Here are some examples where host and target have the same CPU:
+</p>
 <pre class="code">
 # Cross-compile to a 32 bit binary on a multilib x64 OS
 make CC="gcc -m32"
@@ -366,12 +388,16 @@
 </p>
 <p>
 Since there's often no easy way to detect CPU features at runtime, it's
-important to compile with the proper CPU or architecture settings. You
-can specify these when building the toolchain yourself. Or add
-<tt>-mcpu=...</tt> or <tt>-march=...</tt> to <tt>TARGET_CFLAGS</tt>. For
-ARM it's important to have the correct <tt>-mfloat-abi=...</tt> setting,
-too. Otherwise LuaJIT may not run at the full performance of your target
-CPU.
+important to compile with the proper CPU or architecture settings:
+</o>
+<ul>
+<li>The best way to get consistent results is to specify the correct settings when building the toolchain yourself.</li>
+<li>For a pre-built, generic toolchain add <tt>-mcpu=...</tt> or <tt>-march=...</tt> and other necessary flags to <tt>TARGET_CFLAGS</tt>.</li>
+<li>For ARM it's important to have the correct <tt>-mfloat-abi=...</tt> setting, too. Otherwise LuaJIT may not run at the full performance of your target CPU.</li>
+<li>For MIPS it's important to select a supported ABI (o32 on MIPS32, n64 on MIPS64) and consistently compile your project either with hard-float or soft-float compiler settings.</li>
+</ul>
+<p>
+Here are some examples for targets with a different CPU than the host:
 </p>
 <pre class="code">
 # ARM soft-float
@@ -378,26 +404,31 @@
 make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
      TARGET_CFLAGS="-mfloat-abi=soft"
 
-# ARM soft-float ABI with VFP (example for Cortex-A8)
+# ARM soft-float ABI with VFP (example for Cortex-A9)
 make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
-     TARGET_CFLAGS="-mcpu=cortex-a8 -mfloat-abi=softfp"
+     TARGET_CFLAGS="-mcpu=cortex-a9 -mfloat-abi=softfp"
 
-# ARM hard-float ABI with VFP (armhf, requires recent toolchain)
+# ARM hard-float ABI with VFP (armhf, most modern toolchains)
 make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-
 
-# ARM64 (requires x64 host)
+# ARM64
 make CROSS=aarch64-linux-
 
 # PPC
 make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-
 
-# MIPS big-endian
+# MIPS32 big-endian
 make HOST_CC="gcc -m32" CROSS=mips-linux-
-# MIPS little-endian
+# MIPS32 little-endian
 make HOST_CC="gcc -m32" CROSS=mipsel-linux-
+
+# MIPS64 big-endian
+make CROSS=mips-linux- TARGET_CFLAGS="-mips64r2 -mabi=64"
+# MIPS64 little-endian
+make CROSS=mipsel-linux- TARGET_CFLAGS="-mips64r2 -mabi=64"
 </pre>
 <p>
-You can cross-compile for <b id="android">Android</b> using the <a href="http://developer.android.com/sdk/ndk/index.html"><span class="ext">»</span> Android NDK</a>.
+You can cross-compile for <b id="android">Android</b> using the <a href="https://developer.android.com/ndk/index.html">Android NDK</a>.
 The environment variables need to match the install locations and the
 desired target platform. E.g. Android 4.0 corresponds to ABI level 14.
 For details check the folder <tt>docs</tt> in the NDK directory.
@@ -411,7 +442,7 @@
 # Android/ARM, armeabi (ARMv5TE soft-float), Android 2.2+ (Froyo)
 NDK=/opt/android/ndk
 NDKABI=8
-NDKVER=$NDK/toolchains/arm-linux-androideabi-4.6
+NDKVER=$NDK/toolchains/arm-linux-androideabi-4.9
 NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-
 NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
 make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
@@ -419,16 +450,16 @@
 # Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.0+ (ICS)
 NDK=/opt/android/ndk
 NDKABI=14
-NDKVER=$NDK/toolchains/arm-linux-androideabi-4.6
+NDKVER=$NDK/toolchains/arm-linux-androideabi-4.9
 NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-
 NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
 NDKARCH="-march=armv7-a -mfloat-abi=softfp -Wl,--fix-cortex-a8"
 make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF $NDKARCH"
 
-# Android/MIPS, mips (MIPS32R1 hard-float), Android 4.0+ (ICS)
+# Android/MIPS, mipsel (MIPS32R1 hard-float), Android 4.0+ (ICS)
 NDK=/opt/android/ndk
 NDKABI=14
-NDKVER=$NDK/toolchains/mipsel-linux-android-4.6
+NDKVER=$NDK/toolchains/mipsel-linux-android-4.9
 NDKP=$NDKVER/prebuilt/linux-x86/bin/mipsel-linux-android-
 NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-mips"
 make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
@@ -436,7 +467,7 @@
 # Android/x86, x86 (i686 SSE3), Android 4.0+ (ICS)
 NDK=/opt/android/ndk
 NDKABI=14
-NDKVER=$NDK/toolchains/x86-4.6
+NDKVER=$NDK/toolchains/x86-4.9
 NDKP=$NDKVER/prebuilt/linux-x86/bin/i686-linux-android-
 NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-x86"
 make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
@@ -456,14 +487,15 @@
 ISDKP=$(xcrun --sdk iphoneos --show-sdk-path)
 ICC=$(xcrun --sdk iphoneos --find clang)
 ISDKF="-arch armv7 -isysroot $ISDKP"
-make HOST_CC="clang -m32 -arch i386" CROSS="$(dirname $ICC)/" \
-     TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS
+make DEFAULT_CC=clang HOST_CC="clang -m32 -arch i386" \
+     CROSS="$(dirname $ICC)/" TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS
 
 # iOS/ARM64
 ISDKP=$(xcrun --sdk iphoneos --show-sdk-path)
 ICC=$(xcrun --sdk iphoneos --find clang)
 ISDKF="-arch arm64 -isysroot $ISDKP"
-make CROSS="$(dirname $ICC)/" TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS
+make DEFAULT_CC=clang CROSS="$(dirname $ICC)/" \
+     TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS
 </pre>
 
 <h3 id="consoles">Cross-compiling for consoles</h3>
@@ -560,14 +592,11 @@
 </li>
 <li>
 If you're building a 64 bit application on OSX which links directly or
-indirectly against LuaJIT, you need to link your main executable
-with these flags:
+indirectly against LuaJIT which is not built for <tt>LJ_GC64</tt> mode,
+you need to link your main executable with these flags:
 <pre class="code">
 -pagezero_size 10000 -image_base 100000000
 </pre>
-Also, it's recommended to <tt>rebase</tt> all (self-compiled) shared libraries
-which are loaded at runtime on OSX/x64 (e.g. C extension modules for Lua).
-See: <tt>man rebase</tt>
 </li>
 </ul>
 <p>Additional hints for initializing LuaJIT using the C API functions:</p>
@@ -653,7 +682,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/luajit.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/luajit.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/luajit.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>LuaJIT</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -152,7 +152,7 @@
 It may be embedded or used as a general-purpose, stand-alone language.
 </p>
 <p>
-LuaJIT is Copyright © 2005-2016 Mike Pall, released under the
+LuaJIT is Copyright © 2005-2017 Mike Pall, released under the
 <a href="http://www.opensource.org/licenses/mit-license.php"><span class="ext">»</span> MIT open source license</a>.
 </p>
 <p>
@@ -169,10 +169,10 @@
 <tr><td>PS3</td><td>PS4</td><td>PS Vita</td><td>Xbox 360</td><td>Xbox One</td></tr>
 </table>
 <table class="feature compiler">
-<tr><td>GCC</td><td>CLANG<br>LLVM</td><td>MSVC</td></tr>
+<tr><td>GCC</td><td>Clang<br>LLVM</td><td>MSVC</td></tr>
 </table>
 <table class="feature cpu">
-<tr><td>x86</td><td>x64</td><td>ARM</td><td>ARM64</td><td>PPC</td><td>MIPS</td></tr>
+<tr><td>x86<br>x64</td><td>ARM<br>ARM64</td><td>PPC</td><td>MIPS32<br>MIPS64</td></tr>
 </table>
 <table class="feature fcompat">
 <tr><td>Lua 5.1<br>API+ABI</td><td>+ JIT</td><td>+ BitOp</td><td>+ FFI</td><td>Drop-in<br>DLL/.so</td></tr>
@@ -226,7 +226,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/running.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/running.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/running.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>Running LuaJIT</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -189,7 +189,7 @@
 read the comment block at the start of their source.
 They can be found in the <tt>lib</tt> directory of the source
 distribution or installed under the <tt>jit</tt> directory. By default
-this is <tt>/usr/local/share/luajit-2.0.4/jit</tt> on POSIX
+this is <tt>/usr/local/share/luajit-2.0.5/jit</tt> on POSIX
 systems.
 </p>
 
@@ -299,7 +299,7 @@
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/doc/status.html
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/doc/status.html	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/doc/status.html	2018-01-09 23:43:20 UTC (rev 46269)
@@ -4,7 +4,7 @@
 <title>Status</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Author" content="Mike Pall">
-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">
+<meta name="Copyright" content="Copyright (C) 2005-2017, Mike Pall">
 <meta name="Language" content="en">
 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
@@ -91,12 +91,6 @@
 in LuaJIT (no per-coroutine hooks, no tail call counting).
 </li>
 <li>
-Some checks are missing in the JIT-compiled code for obscure situations
-with <b>open upvalues aliasing</b> one of the SSA slots later on (or
-vice versa). Bonus points, if you can find a real world test case for
-this.
-</li>
-<li>
 Currently some <b>out-of-memory</b> errors from <b>on-trace code</b> are not
 handled correctly. The error may fall through an on-trace
 <tt>pcall</tt> or it may be passed on to the function set with
@@ -103,12 +97,23 @@
 <tt>lua_atpanic</tt> on x64. This issue will be fixed with the new
 garbage collector.
 </li>
+<li>
+LuaJIT on 64 bit systems provides a <b>limited range</b> of 47 bits for the
+<b>legacy <tt>lightuserdata</tt></b> data type.
+This is only relevant on x64 systems which use the negative part of the
+virtual address space in user mode, e.g. Solaris/x64, and on ARM64 systems
+configured with a 48 bit or 52 bit VA.
+Avoid using <tt>lightuserdata</tt> to hold pointers that may point outside
+of that range, e.g. variables on the stack. In general, avoid this data
+type for new code and replace it with (much more performant) FFI bindings.
+FFI cdata pointers can address the full 64 bit range.
+</li>
 </ul>
 <br class="flush">
 </div>
 <div id="foot">
 <hr class="hide">
-Copyright © 2005-2016 Mike Pall
+Copyright © 2005-2017 Mike Pall
 <span class="noprint">
 ·
 <a href="contact.html">Contact</a>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** DynASM ARM encoding engine.
-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+** Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 ** Released under the MIT license. See dynasm.lua for full copyright notice.
 */
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------------
 -- DynASM ARM module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- See dynasm.lua for full copyright notice.
 ------------------------------------------------------------------------------
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm64.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm64.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm64.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** DynASM ARM64 encoding engine.
-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+** Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 ** Released under the MIT license. See dynasm.lua for full copyright notice.
 */
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm64.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm64.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_arm64.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------------
 -- DynASM ARM64 module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- See dynasm.lua for full copyright notice.
 ------------------------------------------------------------------------------
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_mips.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_mips.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_mips.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** DynASM MIPS encoding engine.
-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+** Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 ** Released under the MIT license. See dynasm.lua for full copyright notice.
 */
 
@@ -21,7 +21,7 @@
   /* The following actions need a buffer position. */
   DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,
   /* The following actions also have an argument. */
-  DASM_REL_PC, DASM_LABEL_PC, DASM_IMM,
+  DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM_IMMS,
   DASM__MAX
 };
 
@@ -231,7 +231,7 @@
 	*pl = -pos;  /* Label exists now. */
 	b[pos++] = ofs;  /* Store pass1 offset estimate. */
 	break;
-      case DASM_IMM:
+      case DASM_IMM: case DASM_IMMS:
 #ifdef DASM_CHECKS
 	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);
 #endif
@@ -299,7 +299,7 @@
 	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;
 	case DASM_REL_LG: case DASM_REL_PC: pos++; break;
 	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;
-	case DASM_IMM: pos++; break;
+	case DASM_IMM: case DASM_IMMS: pos++; break;
 	}
       }
       stop: (void)0;
@@ -356,7 +356,7 @@
 	  if (ins & 2048)
 	    n = n - (int)((char *)cp - base);
 	  else
-	    n = (n + (int)base) & 0x0fffffff;
+	    n = (n + (int)(size_t)base) & 0x0fffffff;
 	patchrel:
 	  CK((n & 3) == 0 &&
 	     ((n + ((ins & 2048) ? 0x00020000 : 0)) >>
@@ -367,6 +367,9 @@
 	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);
 	  break;
 	case DASM_LABEL_PC: break;
+	case DASM_IMMS:
+	  cp[-1] |= ((n>>3) & 4); n &= 0x1f;
+	  /* fallthrough */
 	case DASM_IMM:
 	  cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31);
 	  break;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_mips.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_mips.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_mips.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,17 +1,19 @@
 ------------------------------------------------------------------------------
--- DynASM MIPS module.
+-- DynASM MIPS32/MIPS64 module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- See dynasm.lua for full copyright notice.
 ------------------------------------------------------------------------------
 
+local mips64 = mips64
+
 -- Module information:
 local _info = {
-  arch =	"mips",
-  description =	"DynASM MIPS module",
+  arch =	mips64 and "mips64" or "mips",
+  description =	"DynASM MIPS32/MIPS64 module",
   version =	"1.4.0",
   vernum =	 10400,
-  release =	"2015-10-18",
+  release =	"2016-05-24",
   author =	"Mike Pall",
   license =	"MIT",
 }
@@ -27,7 +29,8 @@
 local match, gmatch = _s.match, _s.gmatch
 local concat, sort = table.concat, table.sort
 local bit = bit or require("bit")
-local band, shl, sar, tohex = bit.band, bit.lshift, bit.arshift, bit.tohex
+local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift
+local tohex = bit.tohex
 
 -- Inherited tables and callbacks.
 local g_opt, g_arch
@@ -38,7 +41,7 @@
 local action_names = {
   "STOP", "SECTION", "ESC", "REL_EXT",
   "ALIGN", "REL_LG", "LABEL_LG",
-  "REL_PC", "LABEL_PC", "IMM",
+  "REL_PC", "LABEL_PC", "IMM", "IMMS",
 }
 
 -- Maximum number of section buffer positions for dasm_put().
@@ -251,6 +254,10 @@
   bnel_3 =	"54000000STB",
   blezl_2 =	"58000000SB",
   bgtzl_2 =	"5c000000SB",
+  daddi_3 =	mips64 and "60000000TSI",
+  daddiu_3 =	mips64 and "64000000TSI",
+  ldl_2 =	mips64 and "68000000TO",
+  ldr_2 =	mips64 and "6c000000TO",
   lb_2 =	"80000000TO",
   lh_2 =	"84000000TO",
   lwl_2 =	"88000000TO",
@@ -258,10 +265,13 @@
   lbu_2 =	"90000000TO",
   lhu_2 =	"94000000TO",
   lwr_2 =	"98000000TO",
+  lwu_2 =	mips64 and "9c000000TO",
   sb_2 =	"a0000000TO",
   sh_2 =	"a4000000TO",
   swl_2 =	"a8000000TO",
   sw_2 =	"ac000000TO",
+  sdl_2 =	mips64 and "b0000000TO",
+  sdr_2 =	mips64 and "b1000000TO",
   swr_2 =	"b8000000TO",
   cache_2 =	"bc000000NO",
   ll_2 =	"c0000000TO",
@@ -268,13 +278,17 @@
   lwc1_2 =	"c4000000HO",
   pref_2 =	"cc000000NO",
   ldc1_2 =	"d4000000HO",
+  ld_2 =	mips64 and "dc000000TO",
   sc_2 =	"e0000000TO",
   swc1_2 =	"e4000000HO",
+  scd_2 =	mips64 and "f0000000TO",
   sdc1_2 =	"f4000000HO",
+  sd_2 =	mips64 and "fc000000TO",
 
   -- Opcode SPECIAL.
   nop_0 =	"00000000",
   sll_3 =	"00000000DTA",
+  sextw_2 =	"00000000DT",
   movf_2 =	"00000001DS",
   movf_3 =	"00000001DSC",
   movt_2 =	"00010001DS",
@@ -285,6 +299,7 @@
   sllv_3 =	"00000004DTS",
   srlv_3 =	"00000006DTS",
   rotrv_3 =	"00000046DTS",
+  drotrv_3 =	mips64 and "00000056DTS",
   srav_3 =	"00000007DTS",
   jr_1 =	"00000008S",
   jalr_1 =	"0000f809S",
@@ -300,15 +315,22 @@
   mthi_1 =	"00000011S",
   mflo_1 =	"00000012D",
   mtlo_1 =	"00000013S",
+  dsllv_3 =	mips64 and "00000014DTS",
+  dsrlv_3 =	mips64 and "00000016DTS",
+  dsrav_3 =	mips64 and "00000017DTS",
   mult_2 =	"00000018ST",
   multu_2 =	"00000019ST",
   div_2 =	"0000001aST",
   divu_2 =	"0000001bST",
+  dmult_2 =	mips64 and "0000001cST",
+  dmultu_2 =	mips64 and "0000001dST",
+  ddiv_2 =	mips64 and "0000001eST",
+  ddivu_2 =	mips64 and "0000001fST",
   add_3 =	"00000020DST",
-  move_2 =	"00000021DS",
+  move_2 =	mips64 and "00000025DS" or "00000021DS",
   addu_3 =	"00000021DST",
   sub_3 =	"00000022DST",
-  negu_2 =	"00000023DT",
+  negu_2 =	mips64 and "0000002fDT" or "00000023DT",
   subu_3 =	"00000023DST",
   and_3 =	"00000024DST",
   or_3 =	"00000025DST",
@@ -317,6 +339,10 @@
   nor_3 =	"00000027DST",
   slt_3 =	"0000002aDST",
   sltu_3 =	"0000002bDST",
+  dadd_3 =	mips64 and "0000002cDST",
+  daddu_3 =	mips64 and "0000002dDST",
+  dsub_3 =	mips64 and "0000002eDST",
+  dsubu_3 =	mips64 and "0000002fDST",
   tge_2 =	"00000030ST",
   tge_3 =	"00000030STZ",
   tgeu_2 =	"00000031ST",
@@ -329,6 +355,14 @@
   teq_3 =	"00000034STZ",
   tne_2 =	"00000036ST",
   tne_3 =	"00000036STZ",
+  dsll_3 =	mips64 and "00000038DTa",
+  dsrl_3 =	mips64 and "0000003aDTa",
+  drotr_3 =	mips64 and "0020003aDTa",
+  dsra_3 =	mips64 and "0000003bDTa",
+  dsll32_3 =	mips64 and "0000003cDTA",
+  dsrl32_3 =	mips64 and "0000003eDTA",
+  drotr32_3 =	mips64 and "0020003eDTA",
+  dsra32_3 =	mips64 and "0000003fDTA",
 
   -- Opcode REGIMM.
   bltz_2 =	"04000000SB",
@@ -356,13 +390,24 @@
   msubu_2 =	"70000005ST",
   clz_2 =	"70000020DS=",
   clo_2 =	"70000021DS=",
+  dclz_2 =	mips64 and "70000024DS=",
+  dclo_2 =	mips64 and "70000025DS=",
   sdbbp_0 =	"7000003f",
   sdbbp_1 =	"7000003fY",
 
   -- Opcode SPECIAL3.
   ext_4 =	"7c000000TSAM", -- Note: last arg is msbd = size-1
+  dextm_4 =	mips64 and "7c000001TSAM", -- Args: pos    | size-1-32
+  dextu_4 =	mips64 and "7c000002TSAM", -- Args: pos-32 | size-1
+  dext_4 =	mips64 and "7c000003TSAM", -- Args: pos    | size-1
+  zextw_2 =	mips64 and "7c00f803TS",
   ins_4 =	"7c000004TSAM", -- Note: last arg is msb = pos+size-1
+  dinsm_4 =	mips64 and "7c000005TSAM", -- Args: pos    | pos+size-33
+  dinsu_4 =	mips64 and "7c000006TSAM", -- Args: pos-32 | pos+size-33
+  dins_4 =	mips64 and "7c000007TSAM", -- Args: pos    | pos+size-1
   wsbh_2 =	"7c0000a0DT",
+  dsbh_2 =	mips64 and "7c0000a4DT",
+  dshd_2 =	mips64 and "7c000164DT",
   seb_2 =	"7c000420DT",
   seh_2 =	"7c000620DT",
   rdhwr_2 =	"7c00003bTD",
@@ -370,8 +415,12 @@
   -- Opcode COP0.
   mfc0_2 =	"40000000TD",
   mfc0_3 =	"40000000TDW",
+  dmfc0_2 =	mips64 and "40200000TD",
+  dmfc0_3 =	mips64 and "40200000TDW",
   mtc0_2 =	"40800000TD",
   mtc0_3 =	"40800000TDW",
+  dmtc0_2 =	mips64 and "40a00000TD",
+  dmtc0_3 =	mips64 and "40a00000TDW",
   rdpgpr_2 =	"41400000DT",
   di_0 =	"41606000",
   di_1 =	"41606000T",
@@ -388,9 +437,11 @@
 
   -- Opcode COP1.
   mfc1_2 =	"44000000TG",
+  dmfc1_2 =	mips64 and "44200000TG",
   cfc1_2 =	"44400000TG",
   mfhc1_2 =	"44600000TG",
   mtc1_2 =	"44800000TG",
+  dmtc1_2 =	mips64 and "44a00000TG",
   ctc1_2 =	"44c00000TG",
   mthc1_2 =	"44e00000TG",
 
@@ -633,7 +684,7 @@
   werror("bad register name `"..expr.."'")
 end
 
-local function parse_imm(imm, bits, shift, scale, signed)
+local function parse_imm(imm, bits, shift, scale, signed, action)
   local n = tonumber(imm)
   if n then
     local m = sar(n, scale)
@@ -651,7 +702,8 @@
 	 match(imm, "^([%w_]+):([rf][1-3]?[0-9])$") then
     werror("expected immediate operand, got register")
   else
-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)
+    waction(action or "IMM",
+	    (signed and 32768 or 0)+shl(scale, 10)+shl(bits, 5)+shift, imm)
     return 0
   end
 end
@@ -763,6 +815,9 @@
       n = n + 1
     elseif p == "A" then
       op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1
+    elseif p == "a" then
+      local m = parse_imm(params[n], 6, 6, 0, false, "IMMS"); n = n + 1
+      op = op + band(m, 0x7c0) + band(shr(m, 9), 4)
     elseif p == "M" then
       op = op + parse_imm(params[n], 5, 11, 0, false); n = n + 1
     elseif p == "N" then

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_ppc.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_ppc.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_ppc.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** DynASM PPC/PPC64 encoding engine.
-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+** Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 ** Released under the MIT license. See dynasm.lua for full copyright notice.
 */
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_ppc.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_ppc.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_ppc.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------------
 -- DynASM PPC/PPC64 module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- See dynasm.lua for full copyright notice.
 --
 -- Support for various extensions contributed by Caio Souza Oliveira.

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_proto.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_proto.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_proto.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** DynASM encoding engine prototypes.
-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+** Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 ** Released under the MIT license. See dynasm.lua for full copyright notice.
 */
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x64.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x64.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x64.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------------
 -- DynASM x64 module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- See dynasm.lua for full copyright notice.
 ------------------------------------------------------------------------------
 -- This module just sets 64 bit mode for the combined x86/x64 module.

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x86.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x86.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x86.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** DynASM x86 encoding engine.
-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+** Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 ** Released under the MIT license. See dynasm.lua for full copyright notice.
 */
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x86.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x86.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dasm_x86.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------------
 -- DynASM x86/x64 module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- See dynasm.lua for full copyright notice.
 ------------------------------------------------------------------------------
 
@@ -1673,6 +1673,10 @@
   vpsravd_3 =	"rrmoy:660F38V46rM",
   vpsrlvd_3 =	"rrmoy:660F38V45rM",
   vpsrlvq_3 =	"rrmoy:660F38VX45rM",
+
+  -- Intel ADX
+  adcx_2 =	"rmqd:660F38F6rM",
+  adox_2 =	"rmqd:F30F38F6rM",
 }
 
 ------------------------------------------------------------------------------

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dynasm.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dynasm.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/dynasm/dynasm.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -2,7 +2,7 @@
 -- DynASM. A dynamic assembler for code generation engines.
 -- Originally designed and implemented for LuaJIT.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- See below for full copyright notice.
 ------------------------------------------------------------------------------
 
@@ -17,7 +17,7 @@
   url =		"http://luajit.org/dynasm.html",
   license =	"MIT",
   copyright =	[[
-Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/etc/luajit.1
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/etc/luajit.1	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/etc/luajit.1	2018-01-09 23:43:20 UTC (rev 46269)
@@ -74,7 +74,7 @@
 Runs some nested loops and shows the resulting traces.
 .SH COPYRIGHT
 .PP
-\fBLuaJIT\fR is Copyright \(co 2005-2016 Mike Pall.
+\fBLuaJIT\fR is Copyright \(co 2005-2017 Mike Pall.
 .br
 \fBLuaJIT\fR is open source software, released under the MIT license.
 .SH SEE ALSO

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/etc/luajit.pc
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/etc/luajit.pc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/etc/luajit.pc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -2,7 +2,7 @@
 majver=2
 minver=1
 relver=0
-version=${majver}.${minver}.${relver}-beta2
+version=${majver}.${minver}.${relver}-beta3
 abiver=5.1
 
 prefix=/usr/local

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/Makefile
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/Makefile	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/Makefile	2018-01-09 23:43:20 UTC (rev 46269)
@@ -7,7 +7,7 @@
 # Also works with MinGW and Cygwin on Windows.
 # Please check msvcbuild.bat for building with MSVC on Windows.
 #
-# Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+# Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 ##############################################################################
 
 MAJVER=  2
@@ -110,6 +110,9 @@
 #XCFLAGS+= -DLUAJIT_NUMMODE=1
 #XCFLAGS+= -DLUAJIT_NUMMODE=2
 #
+# Enable GC64 mode for x64.
+#XCFLAGS+= -DLUAJIT_ENABLE_GC64
+#
 ##############################################################################
 
 ##############################################################################
@@ -121,8 +124,8 @@
 #
 # Use the system provided memory allocator (realloc) instead of the
 # bundled memory allocator. This is slower, but sometimes helpful for
-# debugging. This option cannot be enabled on x64, since realloc usually
-# doesn't return addresses in the right address range.
+# debugging. This option cannot be enabled on x64 without GC64, since
+# realloc usually doesn't return addresses in the right address range.
 # OTOH this option is mandatory for Valgrind's memcheck tool on x64 and
 # the only way to get useful results from it for all other architectures.
 #XCFLAGS+= -DLUAJIT_USE_SYSMALLOC
@@ -166,10 +169,6 @@
     HOST_SYS= Windows
     HOST_MSYS= cygwin
   endif
-  # Use Clang for OSX host.
-  ifeq (Darwin,$(HOST_SYS))
-    DEFAULT_CC= clang
-  endif
 endif
 
 ##############################################################################
@@ -210,7 +209,7 @@
 TARGET_STCC= $(STATIC_CC)
 TARGET_DYNCC= $(DYNAMIC_CC)
 TARGET_LD= $(CROSS)$(CC)
-TARGET_AR= $(CROSS)ar rcus
+TARGET_AR= $(CROSS)ar rcus 2>/dev/null
 TARGET_STRIP= $(CROSS)strip
 
 TARGET_LIBPATH= $(or $(PREFIX),/usr/local)/$(or $(MULTILIB),lib)
@@ -243,6 +242,9 @@
   TARGET_LJARCH= arm
 else
 ifneq (,$(findstring LJ_TARGET_ARM64 ,$(TARGET_TESTARCH)))
+  ifneq (,$(findstring __AARCH64EB__ ,$(TARGET_TESTARCH)))
+    TARGET_ARCH= -D__AARCH64EB__=1
+  endif
   TARGET_LJARCH= arm64
 else
 ifneq (,$(findstring LJ_TARGET_PPC ,$(TARGET_TESTARCH)))
@@ -257,7 +259,11 @@
   ifneq (,$(findstring MIPSEL ,$(TARGET_TESTARCH)))
     TARGET_ARCH= -D__MIPSEL__=1
   endif
-  TARGET_LJARCH= mips
+  ifneq (,$(findstring LJ_TARGET_MIPS64 ,$(TARGET_TESTARCH)))
+    TARGET_LJARCH= mips64
+  else
+    TARGET_LJARCH= mips
+  endif
 else
   $(error Unsupported target architecture)
 endif
@@ -310,7 +316,6 @@
     export MACOSX_DEPLOYMENT_TARGET=10.4
   endif
   TARGET_STRIP+= -x
-  TARGET_AR+= 2>/dev/null
   TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC
   TARGET_DYNXLDOPTS=
   TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER)
@@ -321,7 +326,6 @@
 else
 ifeq (iOS,$(TARGET_SYS))
   TARGET_STRIP+= -x
-  TARGET_AR+= 2>/dev/null
   TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC
   TARGET_DYNXLDOPTS=
   TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER)

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/Makefile.dep
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/Makefile.dep	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/Makefile.dep	2018-01-09 23:43:20 UTC (rev 46269)
@@ -3,8 +3,8 @@
  lj_dispatch.h lj_bc.h lj_traceerr.h lj_lib.h lj_alloc.h
 lib_base.o: lib_base.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \
  lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h \
- lj_tab.h lj_meta.h lj_state.h lj_ctype.h lj_cconv.h lj_bc.h lj_ff.h \
- lj_ffdef.h lj_dispatch.h lj_jit.h lj_ir.h lj_char.h lj_strscan.h \
+ lj_tab.h lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_cconv.h \
+ lj_ff.h lj_ffdef.h lj_dispatch.h lj_jit.h lj_ir.h lj_char.h lj_strscan.h \
  lj_strfmt.h lj_lib.h lj_libdef.h
 lbitlib.o: lbitlib.c lua.h luaconf.h lauxlib.h lualib.h
 lib_bit.o: lib_bit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \
@@ -164,7 +164,7 @@
  lj_ir.h lj_jit.h lj_iropt.h lj_target.h lj_target_*.h
 lj_opt_split.o: lj_opt_split.c lj_obj.h lua.h luaconf.h lj_def.h \
  lj_arch.h lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_ir.h \
- lj_jit.h lj_ircall.h lj_iropt.h lj_vm.h
+ lj_jit.h lj_ircall.h lj_iropt.h lj_dispatch.h lj_bc.h lj_vm.h
 lj_parse.o: lj_parse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
  lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_buf.h lj_str.h lj_tab.h \
  lj_func.h lj_state.h lj_bc.h lj_ctype.h lj_strfmt.h lj_lex.h lj_parse.h \
@@ -216,19 +216,19 @@
  lj_func.c lj_udata.c lj_meta.c lj_strscan.h lj_lib.h lj_debug.c \
  lj_state.c lj_lex.h lj_alloc.h luajit.h lj_dispatch.c lj_ccallback.h \
  lj_profile.h lj_vmevent.c lj_vmevent.h lj_vmmath.c lj_strscan.c \
- lj_strfmt.c lj_api.c lj_profile.c lj_lex.c lualib.h lj_parse.h \
- lj_parse.c lj_bcread.c lj_bcdump.h lj_bcwrite.c lj_load.c lj_ctype.c \
- lj_cdata.c lj_cconv.h lj_cconv.c lj_ccall.c lj_ccall.h lj_ccallback.c \
- lj_target.h lj_target_*.h lj_mcode.h lj_carith.c lj_carith.h lj_clib.c \
- lj_clib.h lj_cparse.c lj_cparse.h lj_lib.c lj_ir.c lj_ircall.h \
- lj_iropt.h lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c \
- lj_opt_dce.c lj_opt_loop.c lj_snap.h lj_opt_split.c lj_opt_sink.c \
- lj_mcode.c lj_snap.c lj_record.c lj_record.h lj_ffrecord.h lj_crecord.c \
- lj_crecord.h lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h \
- lj_asm_*.h lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c \
- lib_base.c lj_libdef.h lib_math.c lib_string.c lib_table.c lib_io.c \
- lib_os.c lib_package.c lib_debug.c lib_bit.c lib_jit.c lib_ffi.c \
- lib_init.c
+ lj_strfmt.c lj_strfmt_num.c lj_api.c lj_profile.c lj_lex.c lualib.h \
+ lj_parse.h lj_parse.c lj_bcread.c lj_bcdump.h lj_bcwrite.c lj_load.c \
+ lj_ctype.c lj_cdata.c lj_cconv.h lj_cconv.c lj_ccall.c lj_ccall.h \
+ lj_ccallback.c lj_target.h lj_target_*.h lj_mcode.h lj_carith.c \
+ lj_carith.h lj_clib.c lj_clib.h lj_cparse.c lj_cparse.h lj_lib.c lj_ir.c \
+ lj_ircall.h lj_iropt.h lj_opt_mem.c lj_opt_fold.c lj_folddef.h \
+ lj_opt_narrow.c lj_opt_dce.c lj_opt_loop.c lj_snap.h lj_opt_split.c \
+ lj_opt_sink.c lj_mcode.c lj_snap.c lj_record.c lj_record.h lj_ffrecord.h \
+ lj_crecord.c lj_crecord.h lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h \
+ lj_emit_*.h lj_asm_*.h lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c \
+ lib_aux.c lib_base.c lj_libdef.h lib_math.c lib_string.c lib_table.c \
+ lib_io.c lib_os.c lib_package.c lib_debug.c lib_bit.c lib_jit.c \
+ lib_ffi.c lib_init.c
 luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h
 host/buildvm.o: host/buildvm.c host/buildvm.h lj_def.h lua.h luaconf.h \
  lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_gc.h lj_obj.h lj_bc.h lj_ir.h \

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT VM builder.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** This is a tool to build the hand-tuned assembler code required for
 ** LuaJIT's bytecode interpreter. It supports a variety of output formats
@@ -110,7 +110,7 @@
   if (p) {
 #if LJ_TARGET_X86ORX64
     if (!LJ_64 && (ctx->mode == BUILD_coffasm || ctx->mode == BUILD_peobj))
-      name[0] = '@';
+      name[0] = name[1] == 'R' ? '_' : '@';  /* Just for _RtlUnwind at 16. */
     else
       *p = '\0';
 #elif LJ_TARGET_PPC && !LJ_TARGET_OSX && !LJ_TARGET_CONSOLE

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT VM builder.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _BUILDVM_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_asm.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_asm.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_asm.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT VM builder: Assembler source code emitter.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "buildvm.h"
@@ -93,10 +93,14 @@
 {
   int i;
   for (i = 0; i < n; i += 4) {
+    uint32_t ins = *(uint32_t *)(p+i);
+#if LJ_TARGET_ARM64 && LJ_BE
+    ins = lj_bswap(ins);  /* ARM64 instructions are always little-endian. */
+#endif
     if ((i & 15) == 0)
-      fprintf(ctx->fp, "\t.long 0x%08x", *(uint32_t *)(p+i));
+      fprintf(ctx->fp, "\t.long 0x%08x", ins);
     else
-      fprintf(ctx->fp, ",0x%08x", *(uint32_t *)(p+i));
+      fprintf(ctx->fp, ",0x%08x", ins);
     if ((i & 15) == 12) putc('\n', ctx->fp);
   }
   if ((n & 15) != 0) putc('\n', ctx->fp);
@@ -214,7 +218,8 @@
   case BUILD_machasm:
     fprintf(ctx->fp,
       "\n\t.private_extern %s\n"
-      "%s:\n", name, name);
+      "\t.no_dead_strip %s\n"
+      "%s:\n", name, name, name);
     break;
   default:
     break;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_fold.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_fold.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_fold.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT VM builder: IR folding hash table generator.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "buildvm.h"
@@ -9,7 +9,7 @@
 
 /* Context for the folding hash table generator. */
 static int lineno;
-static int funcidx;
+static uint32_t funcidx;
 static uint32_t foldkeys[BUILD_MAX_FOLD];
 static uint32_t nkeys;
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_lib.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_lib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_lib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT VM builder: library definition compiler.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "buildvm.h"

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_libbc.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_libbc.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_libbc.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -15,7 +15,12 @@
 8,2,0,0,88,3,23,128,59,3,2,0,43,4,0,0,64,4,2,0,76,3,2,0,88,3,18,128,16,1,14,
 0,41,3,1,0,3,3,1,0,88,3,14,128,3,1,2,0,88,3,12,128,59,3,1,0,22,4,1,1,18,5,2,
 0,41,6,1,0,77,4,4,128,23,8,1,7,59,9,7,0,64,9,8,0,79,4,252,127,43,4,0,0,64,4,
-2,0,76,3,2,0,75,0,1,0,0,2,0
+2,0,76,3,2,0,75,0,1,0,0,2,0,5,12,0,0,0,35,16,0,12,0,16,1,14,0,16,2,14,0,16,
+3,14,0,11,4,0,0,88,5,1,128,18,4,0,0,16,4,12,0,3,1,2,0,88,5,24,128,33,5,1,3,
+0,2,3,0,88,6,4,128,2,3,1,0,88,6,2,128,4,4,0,0,88,6,9,128,18,6,1,0,18,7,2,0,
+41,8,1,0,77,6,4,128,32,10,5,9,59,11,9,0,64,11,10,4,79,6,252,127,88,6,8,128,
+18,6,2,0,18,7,1,0,41,8,255,255,77,6,4,128,32,10,5,9,59,11,9,0,64,11,10,4,79,
+6,252,127,76,4,2,0,0
 #else
 0,1,2,0,0,1,2,24,1,0,0,76,1,2,0,241,135,158,166,3,220,203,178,130,4,0,1,2,0,
 0,1,2,24,1,0,0,76,1,2,0,243,244,148,165,20,198,190,199,252,3,0,1,2,0,0,0,3,
@@ -28,7 +33,12 @@
 8,2,0,0,88,3,23,128,59,3,2,0,43,4,0,0,64,4,2,0,76,3,2,0,88,3,18,128,16,1,14,
 0,41,3,1,0,3,3,1,0,88,3,14,128,3,1,2,0,88,3,12,128,59,3,1,0,22,4,1,1,18,5,2,
 0,41,6,1,0,77,4,4,128,23,8,1,7,59,9,7,0,64,9,8,0,79,4,252,127,43,4,0,0,64,4,
-2,0,76,3,2,0,75,0,1,0,0,2,0
+2,0,76,3,2,0,75,0,1,0,0,2,0,5,12,0,0,0,35,16,0,12,0,16,1,14,0,16,2,14,0,16,
+3,14,0,11,4,0,0,88,5,1,128,18,4,0,0,16,4,12,0,3,1,2,0,88,5,24,128,33,5,1,3,
+0,2,3,0,88,6,4,128,2,3,1,0,88,6,2,128,4,4,0,0,88,6,9,128,18,6,1,0,18,7,2,0,
+41,8,1,0,77,6,4,128,32,10,5,9,59,11,9,0,64,11,10,4,79,6,252,127,88,6,8,128,
+18,6,2,0,18,7,1,0,41,8,255,255,77,6,4,128,32,10,5,9,59,11,9,0,64,11,10,4,79,
+6,252,127,76,4,2,0,0
 #endif
 };
 
@@ -40,6 +50,7 @@
 {"table_foreach",136},
 {"table_getn",207},
 {"table_remove",226},
-{NULL,355}
+{"table_move",355},
+{NULL,502}
 };
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_peobj.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_peobj.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/buildvm_peobj.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT VM builder: PE object emitter.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Only used for building on Windows, since we cannot assume the presence
 ** of a suitable assembler. The host and target byte order must match.
@@ -109,6 +109,8 @@
 #if LJ_TARGET_X64
   PEOBJ_SECT_PDATA,
   PEOBJ_SECT_XDATA,
+#elif LJ_TARGET_X86
+  PEOBJ_SECT_SXDATA,
 #endif
   PEOBJ_SECT_RDATA_Z,
   PEOBJ_NSECTIONS
@@ -208,6 +210,13 @@
   sofs += (pesect[PEOBJ_SECT_XDATA].nreloc = 1) * PEOBJ_RELOC_SIZE;
   /* Flags: 40 = read, 30 = align4, 40 = initialized data. */
   pesect[PEOBJ_SECT_XDATA].flags = 0x40300040;
+#elif LJ_TARGET_X86
+  memcpy(pesect[PEOBJ_SECT_SXDATA].name, ".sxdata", sizeof(".sxdata")-1);
+  pesect[PEOBJ_SECT_SXDATA].ofs = sofs;
+  sofs += (pesect[PEOBJ_SECT_SXDATA].size = 4);
+  pesect[PEOBJ_SECT_SXDATA].relocofs = sofs;
+  /* Flags: 40 = read, 30 = align4, 02 = lnk_info, 40 = initialized data. */
+  pesect[PEOBJ_SECT_SXDATA].flags = 0x40300240;
 #endif
 
   memcpy(pesect[PEOBJ_SECT_RDATA_Z].name, ".rdata$Z", sizeof(".rdata$Z")-1);
@@ -232,7 +241,7 @@
   nrsym = ctx->nrelocsym;
   pehdr.nsyms = 1+PEOBJ_NSECTIONS*2 + 1+ctx->nsym + nrsym;
 #if LJ_TARGET_X64
-  pehdr.nsyms += 1;  /* Symbol for lj_err_unwind_win64. */
+  pehdr.nsyms += 1;  /* Symbol for lj_err_unwind_win. */
 #endif
 
   /* Write PE object header and all sections. */
@@ -312,6 +321,19 @@
     reloc.type = PEOBJ_RELOC_ADDR32NB;
     owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
   }
+#elif LJ_TARGET_X86
+  /* Write .sxdata section. */
+  for (i = 0; i < nrsym; i++) {
+    if (!strcmp(ctx->relocsym[i], "_lj_err_unwind_win")) {
+      uint32_t symidx = 1+2+i;
+      owrite(ctx, &symidx, 4);
+      break;
+    }
+  }
+  if (i == nrsym) {
+    fprintf(stderr, "Error: extern lj_err_unwind_win not used\n");
+    exit(1);
+  }
 #endif
 
   /* Write .rdata$Z section. */
@@ -333,8 +355,10 @@
 #if LJ_TARGET_X64
     emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_PDATA);
     emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_XDATA);
-    emit_peobj_sym(ctx, "lj_err_unwind_win64", 0,
+    emit_peobj_sym(ctx, "lj_err_unwind_win", 0,
 		   PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN);
+#elif LJ_TARGET_X86
+    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_SXDATA);
 #endif
 
     emit_peobj_sym(ctx, ctx->beginsym, 0,

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/genlibbc.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/genlibbc.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/genlibbc.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -2,7 +2,7 @@
 -- Lua script to dump the bytecode of the library functions written in Lua.
 -- The resulting 'buildvm_libbc.h' is used for the build process of LuaJIT.
 ----------------------------------------------------------------------------
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/genminilua.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/genminilua.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/genminilua.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -2,7 +2,7 @@
 -- Lua script to generate a customized, minified version of Lua.
 -- The resulting 'minilua' is used for the build process of LuaJIT.
 ----------------------------------------------------------------------------
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 
@@ -157,11 +157,11 @@
     if includes[name] then return "" end
     includes[name] = true
     local fp = assert(io.open(LUA_SOURCE..name, "r"))
-    local src = fp:read("*a")
+    local inc = fp:read("*a")
     assert(fp:close())
-    src = gsub(src, "#ifndef%s+%w+_h\n#define%s+%w+_h\n", "")
-    src = gsub(src, "#endif%s*$", "")
-    return merge_includes(src)
+    inc = gsub(inc, "#ifndef%s+%w+_h\n#define%s+%w+_h\n", "")
+    inc = gsub(inc, "#endif%s*$", "")
+    return merge_includes(inc)
   end)
 end
 
@@ -300,6 +300,7 @@
   src = gsub(src, "if%([^\n]*hookmask[^\n]*&&\n[^\n]*%b{}\n", "")
   src = gsub(src, "(twoto%b()%()", "%1(size_t)")
   src = gsub(src, "i<sizenode", "i<(int)sizenode")
+  src = gsub(src, "cast%(unsigned int,key%-1%)", "cast(unsigned int,key)-1")
   return gsub(src, "\n\n+", "\n")
 end
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/host/minilua.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/host/minilua.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/host/minilua.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1606,7 +1606,7 @@
 return gval(mp);
 }
 static const TValue*luaH_getnum(Table*t,int key){
-if(cast(unsigned int,key-1)<cast(unsigned int,t->sizearray))
+if(cast(unsigned int,key)-1<cast(unsigned int,t->sizearray))
 return&t->array[key-1];
 else{
 lua_Number nk=cast_num(key);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/bc.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/bc.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/bc.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT bytecode listing module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 --

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/bcsave.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/bcsave.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/bcsave.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT module to save/list bytecode.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 --
@@ -63,8 +63,8 @@
 }
 
 local map_arch = {
-  x86 = true, x64 = true, arm = true, arm64 = true, ppc = true,
-  mips = true, mipsel = true,
+  x86 = true, x64 = true, arm = true, arm64 = true, arm64be = true,
+  ppc = true, mips = true, mipsel = true,
 }
 
 local map_os = {
@@ -125,12 +125,12 @@
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
-const char %s%s[] = {
+const unsigned char %s%s[] = {
 ]], LJBC_PREFIX, ctx.modname))
   else
     fp:write(string.format([[
 #define %s%s_SIZE %d
-static const char %s%s[] = {
+static const unsigned char %s%s[] = {
 ]], LJBC_PREFIX, ctx.modname, #s, LJBC_PREFIX, ctx.modname))
   end
   local t, n, m = {}, 0, 0
@@ -200,7 +200,7 @@
 ]]
   local symname = LJBC_PREFIX..ctx.modname
   local is64, isbe = false, false
-  if ctx.arch == "x64" or ctx.arch == "arm64" then
+  if ctx.arch == "x64" or ctx.arch == "arm64" or ctx.arch == "arm64be" then
     is64 = true
   elseif ctx.arch == "ppc" or ctx.arch == "mips" then
     isbe = true
@@ -237,9 +237,9 @@
   hdr.eendian = isbe and 2 or 1
   hdr.eversion = 1
   hdr.type = f16(1)
-  hdr.machine = f16(({ x86=3, x64=62, arm=40, arm64=183, ppc=20, mips=8, mipsel=8 })[ctx.arch])
+  hdr.machine = f16(({ x86=3, x64=62, arm=40, arm64=183, arm64be=183, ppc=20, mips=8, mipsel=8 })[ctx.arch])
   if ctx.arch == "mips" or ctx.arch == "mipsel" then
-    hdr.flags = 0x50001006
+    hdr.flags = f32(0x50001006)
   end
   hdr.version = f32(1)
   hdr.shofs = fofs(ffi.offsetof(o, "sect"))

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_arm.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_arm.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_arm.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT ARM disassembler module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 -- This is a helper module used by the LuaJIT machine code dumper module.
@@ -12,7 +12,7 @@
 
 local type = type
 local sub, byte, format = string.sub, string.byte, string.format
-local match, gmatch, gsub = string.match, string.gmatch, string.gsub
+local match, gmatch = string.match, string.gmatch
 local concat = table.concat
 local bit = require("bit")
 local band, bor, ror, tohex = bit.band, bit.bor, bit.ror, bit.tohex

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_mips.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_mips.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_mips.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT MIPS disassembler module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT/X license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 -- This is a helper module used by the LuaJIT machine code dumper module.
@@ -11,8 +11,8 @@
 ------------------------------------------------------------------------------
 
 local type = type
-local sub, byte, format = string.sub, string.byte, string.format
-local match, gmatch, gsub = string.match, string.gmatch, string.gsub
+local byte, format = string.byte, string.format
+local match, gmatch = string.match, string.gmatch
 local concat = table.concat
 local bit = require("bit")
 local band, bor, tohex = bit.band, bit.bor, bit.tohex
@@ -34,15 +34,17 @@
   "jrS",	"jalrD1S",	"movzDST",	"movnDST",
   "syscallY",	"breakY",	false,		"sync",
   "mfhiD",	"mthiS",	"mfloD",	"mtloS",
-  false,	false,		false,		false,
+  "dsllvDST",	false,		"dsrlvDST",	"dsravDST",
   "multST",	"multuST",	"divST",	"divuST",
-  false,	false,		false,		false,
+  "dmultST",	"dmultuST",	"ddivST",	"ddivuST",
   "addDST",	"addu|moveDST0", "subDST",	"subu|neguDS0T",
-  "andDST",	"orDST",	"xorDST",	"nor|notDST0",
+  "andDST",	"or|moveDST0",	"xorDST",	"nor|notDST0",
   false,	false,		"sltDST",	"sltuDST",
-  false,	false,		false,		false,
+  "daddDST",	"dadduDST",	"dsubDST",	"dsubuDST",
   "tgeSTZ",	"tgeuSTZ",	"tltSTZ",	"tltuSTZ",
-  "teqSTZ",	false,		"tneSTZ",
+  "teqSTZ",	false,		"tneSTZ",	false,
+  "dsllDTA",	false,		"dsrlDTA",	"dsraDTA",
+  "dsll32DTA",	false,		"dsrl32DTA",	"dsra32DTA",
 }
 
 local map_special2 = {
@@ -60,11 +62,17 @@
   [24] = "sehDT",
 }
 
+local map_dbshfl = {
+  shift = 6, mask = 31,
+  [2] = "dsbhDT",
+  [5] = "dshdDT",
+}
+
 local map_special3 = {
   shift = 0, mask = 63,
-  [0] = "extTSAK", [4] = "insTSAL",
-  [32] = map_bshfl,
-  [59] = "rdhwrTD",
+  [0]  = "extTSAK", [1]  = "dextmTSAP", [3]  = "dextTSAK",
+  [4]  = "insTSAL", [6]  = "dinsuTSEQ", [7]  = "dinsTSAL",
+  [32] = map_bshfl, [36] = map_dbshfl,  [59] = "rdhwrTD",
 }
 
 local map_regimm = {
@@ -178,8 +186,8 @@
 
 local map_cop1 = {
   shift = 21, mask = 31,
-  [0] = "mfc1TG", false,	"cfc1TG",	"mfhc1TG",
-  "mtc1TG",	false,		"ctc1TG",	"mthc1TG",
+  [0] = "mfc1TG", "dmfc1TG",	"cfc1TG",	"mfhc1TG",
+  "mtc1TG",	"dmtc1TG",	"ctc1TG",	"mthc1TG",
   map_cop1bc,	false,		false,		false,
   false,	false,		false,		false,
   map_cop1s,	map_cop1d,	false,		false,
@@ -213,16 +221,16 @@
   "andiTSU",	"ori|liTS0U",	"xoriTSU",	"luiTU",
   map_cop0,	map_cop1,	false,		map_cop1x,
   "beql|beqzlST0B",	"bnel|bnezlST0B",	"blezlSB",	"bgtzlSB",
-  false,	false,		false,		false,
-  map_special2,	false,		false,		map_special3,
+  "daddiTSI",	"daddiuTSI",	false,		false,
+  map_special2,	"jalxJ",	false,		map_special3,
   "lbTSO",	"lhTSO",	"lwlTSO",	"lwTSO",
   "lbuTSO",	"lhuTSO",	"lwrTSO",	false,
   "sbTSO",	"shTSO",	"swlTSO",	"swTSO",
   false,	false,		"swrTSO",	"cacheNSO",
   "llTSO",	"lwc1HSO",	"lwc2TSO",	"prefNSO",
-  false,	"ldc1HSO",	"ldc2TSO",	false,
+  false,	"ldc1HSO",	"ldc2TSO",	"ldTSO",
   "scTSO",	"swc1HSO",	"swc2TSO",	false,
-  false,	"sdc1HSO",	"sdc2TSO",	false,
+  false,	"sdc1HSO",	"sdc2TSO",	"sdTSO",
 }
 
 ------------------------------------------------------------------------------
@@ -306,6 +314,8 @@
       x = "f"..band(rshift(op, 21), 31)
     elseif p == "A" then
       x = band(rshift(op, 6), 31)
+    elseif p == "E" then
+      x = band(rshift(op, 6), 31) + 32
     elseif p == "M" then
       x = band(rshift(op, 11), 31)
     elseif p == "N" then
@@ -315,8 +325,12 @@
       if x == 0 then x = nil end
     elseif p == "K" then
       x = band(rshift(op, 11), 31) + 1
+    elseif p == "P" then
+      x = band(rshift(op, 11), 31) + 33
     elseif p == "L" then
       x = band(rshift(op, 11), 31) - last + 1
+    elseif p == "Q" then
+      x = band(rshift(op, 11), 31) - last + 33
     elseif p == "I" then
       x = arshift(lshift(op, 16), 16)
     elseif p == "U" then
@@ -330,11 +344,12 @@
     elseif p == "B" then
       x = ctx.addr + ctx.pos + arshift(lshift(op, 16), 16)*4 + 4
       ctx.rel = x
-      x = "0x"..tohex(x)
+      x = format("0x%08x", x)
     elseif p == "J" then
-      x = band(ctx.addr + ctx.pos, 0xf0000000) + band(op, 0x03ffffff)*4
+      local a = ctx.addr + ctx.pos
+      x = a - band(a, 0x0fffffff) + band(op, 0x03ffffff)*4
       ctx.rel = x
-      x = "0x"..tohex(x)
+      x = format("0x%08x", x)
     elseif p == "V" then
       x = band(rshift(op, 8), 7)
       if x == 0 then x = nil end

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_mipsel.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_mipsel.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_mipsel.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT MIPSEL disassembler wrapper module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 -- This module just exports the little-endian functions from the

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_ppc.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_ppc.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_ppc.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT PPC disassembler module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT/X license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 -- This is a helper module used by the LuaJIT machine code dumper module.
@@ -13,7 +13,7 @@
 ------------------------------------------------------------------------------
 
 local type = type
-local sub, byte, format = string.sub, string.byte, string.format
+local byte, format = string.byte, string.format
 local match, gmatch, gsub = string.match, string.gmatch, string.gsub
 local concat = table.concat
 local bit = require("bit")

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_x64.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_x64.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_x64.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT x64 disassembler wrapper module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 -- This module just exports the 64 bit functions from the combined

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_x86.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_x86.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dis_x86.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT x86/x64 disassembler module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 -- This is a helper module used by the LuaJIT machine code dumper module.
@@ -244,6 +244,7 @@
 [0xde] = "||aesdecXrvm", [0xdf] = "||aesdeclastXrvm",
 --Fx
 [0xf0] = "|||crc32TrBmt",[0xf1] = "|||crc32TrVmt",
+[0xf7] = "| sarxVrmv| shlxVrmv| shrxVrmv",
 },
 
 ["3a"] = { -- [66] 0f 3a xx
@@ -273,6 +274,8 @@
 [0x60] = "||pcmpestrmXrmu",[0x61] = "||pcmpestriXrmu",
 [0x62] = "||pcmpistrmXrmu",[0x63] = "||pcmpistriXrmu",
 [0xdf] = "||aeskeygenassistXrmu",
+--Fx
+[0xf0] = "||| rorxVrmu",
 },
 }
 
@@ -414,8 +417,8 @@
 	      (ctx.rexx and "x" or "")..(ctx.rexb and "b" or "")..
 	      (ctx.vexl and "l" or "")
     if ctx.vexv and ctx.vexv ~= 0 then t = t.."v"..ctx.vexv end
-    if t ~= "" then text = ctx.rex.."."..t.." "..text
-    elseif ctx.rex == "vex" then text = "v"..text end
+    if t ~= "" then text = ctx.rex.."."..t.." "..gsub(text, "^ ", "")
+    elseif ctx.rex == "vex" then text = gsub("v"..text, "^v ", "") end
     ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false
     ctx.rex = false; ctx.vexl = false; ctx.vexv = false
   end
@@ -815,7 +818,7 @@
       m = b%32; b = (b-m)/32
       local nb = b%2; b = (b-nb)/2
       if nb == 0 then ctx.rexb = true end
-      local nx = b%2; b = (b-nx)/2
+      local nx = b%2
       if nx == 0 then ctx.rexx = true end
       b = byte(ctx.code, pos, pos)
       if not b then return incomplete(ctx) end

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dump.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dump.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/dump.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT compiler dump module.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 --
@@ -63,9 +63,9 @@
 local tracemc, tracesnap = jutil.tracemc, jutil.tracesnap
 local traceexitstub, ircalladdr = jutil.traceexitstub, jutil.ircalladdr
 local bit = require("bit")
-local band, shl, shr, tohex = bit.band, bit.lshift, bit.rshift, bit.tohex
+local band, shr, tohex = bit.band, bit.rshift, bit.tohex
 local sub, gsub, format = string.sub, string.gsub, string.format
-local byte, char, rep = string.byte, string.char, string.rep
+local byte, rep = string.byte, string.rep
 local type, tostring = type, tostring
 local stdout, stderr = io.stdout, io.stderr
 
@@ -85,7 +85,7 @@
 local function fillsymtab_tr(tr, nexit)
   local t = {}
   symtabmt.__index = t
-  if jit.arch == "mips" or jit.arch == "mipsel" then
+  if jit.arch:sub(1, 4) == "mips" then
     t[traceexitstub(tr, 0)] = "exit"
     return
   end
@@ -213,7 +213,7 @@
   "\027[35m%s\027[m",
 }
 
-local function colorize_text(s, t)
+local function colorize_text(s)
   return s
 end
 
@@ -310,15 +310,17 @@
   end
 end
 
-local function formatk(tr, idx)
+local function formatk(tr, idx, sn)
   local k, t, slot = tracek(tr, idx)
   local tn = type(k)
   local s
   if tn == "number" then
-    if k == 2^52+2^51 then
+    if band(sn or 0, 0x30000) ~= 0 then
+      s = band(sn, 0x20000) ~= 0 and "contpc" or "ftsz"
+    elseif k == 2^52+2^51 then
       s = "bias"
     else
-      s = format("%+.14g", k)
+      s = format(0 < k and k < 0x1p-1026 and "%+a" or "%+.14g", k)
     end
   elseif tn == "string" then
     s = format(#k > 20 and '"%.20s"~' or '"%s"', gsub(k, "%c", ctlsub))
@@ -331,11 +333,13 @@
       s = format("userdata:%p", k)
     else
       s = format("[%p]", k)
-      if s == "[0x00000000]" then s = "NULL" end
+      if s == "[NULL]" then s = "NULL" end
     end
   elseif t == 21 then -- int64_t
     s = sub(tostring(k), 1, -3)
     if sub(s, 1, 1) ~= "-" then s = "+"..s end
+  elseif sn == 0x1057fff then -- SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL)
+    return "----" -- Special case for LJ_FR2 slot 1.
   else
     s = tostring(k) -- For primitives.
   end
@@ -354,7 +358,7 @@
       n = n + 1
       local ref = band(sn, 0xffff) - 0x8000 -- REF_BIAS
       if ref < 0 then
-	out:write(formatk(tr, ref))
+	out:write(formatk(tr, ref, sn))
       elseif band(sn, 0x80000) ~= 0 then -- SNAP_SOFTFPNUM
 	out:write(colorize(format("%04d/%04d", ref, ref+1), 14))
       else
@@ -552,7 +556,7 @@
   if what == "start" then
     if dumpmode.H then out:write('<pre class="ljdump">\n') end
     out:write("---- TRACE ", tr, " ", what)
-    if otr then out:write(" ", otr, "/", oex) end
+    if otr then out:write(" ", otr, "/", oex == -1 and "stitch" or oex) end
     out:write(" ", fmtfunc(func, pc), "\n")
   elseif what == "stop" or what == "abort" then
     out:write("---- TRACE ", tr, " ", what)
@@ -651,7 +655,8 @@
 local function dumpon(opt, outfile)
   if active then dumpoff() end
 
-  local colormode = os.getenv("COLORTERM") and "A" or "T"
+  local term = os.getenv("TERM")
+  local colormode = (term and term:match("color") or os.getenv("COLORTERM")) and "A" or "T"
   if opt then
     opt = gsub(opt, "[TAH]", function(mode) colormode = mode; return ""; end)
   end

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/p.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/p.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/p.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT profiler.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 --
@@ -120,7 +120,7 @@
 -- Show top N list.
 local function prof_top(count1, count2, samples, indent)
   local t, n = {}, 0
-  for k, v in pairs(count1) do
+  for k in pairs(count1) do
     n = n + 1
     t[n] = k
   end
@@ -156,6 +156,7 @@
     ms = math.max(ms, v)
     if pct >= prof_min then
       local file, line = k:match("^(.*):(%d+)$")
+      if not file then file = k; line = 0 end
       local fl = files[file]
       if not fl then fl = {}; files[file] = fl; files[#files+1] = file end
       line = tonumber(line)

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/v.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/v.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/v.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- Verbose mode of the LuaJIT compiler.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 --
@@ -99,7 +99,7 @@
 local function dump_trace(what, tr, func, pc, otr, oex)
   if what == "start" then
     startloc = fmtfunc(func, pc)
-    startex = otr and "("..otr.."/"..oex..") " or ""
+    startex = otr and "("..otr.."/"..(oex == -1 and "stitch" or oex)..") " or ""
   else
     if what == "abort" then
       local loc = fmtfunc(func, pc)

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/zone.lua
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/zone.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/jit/zone.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 ----------------------------------------------------------------------------
 -- LuaJIT profiler zones.
 --
--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+-- Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 -- Released under the MIT license. See Copyright Notice in luajit.h
 ----------------------------------------------------------------------------
 --

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lauxlib.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lauxlib.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lauxlib.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -15,9 +15,6 @@
 #include "lua.h"
 
 
-#define luaL_getn(L,i)          ((int)lua_objlen(L, i))
-#define luaL_setn(L,i,j)        ((void)0)  /* no op! */
-
 /* extra error code for `luaL_load' */
 #define LUA_ERRFILE     (LUA_ERRERR+1)
 
@@ -58,6 +55,10 @@
 LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
                                    const char *const lst[]);
 
+/* pre-defined references */
+#define LUA_NOREF       (-2)
+#define LUA_REFNIL      (-1)
+
 LUALIB_API int (luaL_ref) (lua_State *L, int t);
 LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
 
@@ -84,6 +85,11 @@
 				   const char *name, const char *mode);
 LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
 				int level);
+LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
+LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname,
+				   int sizehint);
+LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);
+LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname);
 
 
 
@@ -111,7 +117,6 @@
 
 
 
-
 /*
 ** ===============================================================
 ** some useful macros
@@ -139,6 +144,11 @@
 
 #define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
 
+/* From Lua 5.2. */
+#define luaL_newlibtable(L, l) \
+	lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
+#define luaL_newlib(L, l)	(luaL_newlibtable(L, l), luaL_setfuncs(L, l, 0))
+
 /*
 ** {======================================================
 ** Generic Buffer manipulation
@@ -175,21 +185,4 @@
 
 /* }====================================================== */
 
-
-/* compatibility with ref system */
-
-/* pre-defined references */
-#define LUA_NOREF       (-2)
-#define LUA_REFNIL      (-1)
-
-#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \
-      (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))
-
-#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))
-
-#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))
-
-
-#define luaL_reg	luaL_Reg
-
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_aux.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_aux.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_aux.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Auxiliary library for the Lua/C API.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major parts taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -107,38 +107,36 @@
 static int libsize(const luaL_Reg *l)
 {
   int size = 0;
-  for (; l->name; l++) size++;
+  for (; l && l->name; l++) size++;
   return size;
 }
 
+LUALIB_API void luaL_pushmodule(lua_State *L, const char *modname, int sizehint)
+{
+  luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);
+  lua_getfield(L, -1, modname);
+  if (!lua_istable(L, -1)) {
+    lua_pop(L, 1);
+    if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, sizehint) != NULL)
+      lj_err_callerv(L, LJ_ERR_BADMODN, modname);
+    lua_pushvalue(L, -1);
+    lua_setfield(L, -3, modname);  /* _LOADED[modname] = new table. */
+  }
+  lua_remove(L, -2);  /* Remove _LOADED table. */
+}
+
 LUALIB_API void luaL_openlib(lua_State *L, const char *libname,
 			     const luaL_Reg *l, int nup)
 {
   lj_lib_checkfpu(L);
   if (libname) {
-    int size = libsize(l);
-    /* check whether lib already exists */
-    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);
-    lua_getfield(L, -1, libname);  /* get _LOADED[libname] */
-    if (!lua_istable(L, -1)) {  /* not found? */
-      lua_pop(L, 1);  /* remove previous result */
-      /* try global variable (and create one if it does not exist) */
-      if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL)
-	lj_err_callerv(L, LJ_ERR_BADMODN, libname);
-      lua_pushvalue(L, -1);
-      lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */
-    }
-    lua_remove(L, -2);  /* remove _LOADED table */
-    lua_insert(L, -(nup+1));  /* move library table to below upvalues */
+    luaL_pushmodule(L, libname, libsize(l));
+    lua_insert(L, -(nup + 1));  /* Move module table below upvalues. */
   }
-  for (; l->name; l++) {
-    int i;
-    for (i = 0; i < nup; i++)  /* copy upvalues to the top */
-      lua_pushvalue(L, -nup);
-    lua_pushcclosure(L, l->func, nup);
-    lua_setfield(L, -(nup+2), l->name);
-  }
-  lua_pop(L, nup);  /* remove upvalues */
+  if (l)
+    luaL_setfuncs(L, l, nup);
+  else
+    lua_pop(L, nup);  /* Remove upvalues. */
 }
 
 LUALIB_API void luaL_register(lua_State *L, const char *libname,
@@ -147,6 +145,19 @@
   luaL_openlib(L, libname, l, 0);
 }
 
+LUALIB_API void luaL_setfuncs(lua_State *L, const luaL_Reg *l, int nup)
+{
+  luaL_checkstack(L, nup, "too many upvalues");
+  for (; l->name; l++) {
+    int i;
+    for (i = 0; i < nup; i++)  /* Copy upvalues to the top. */
+      lua_pushvalue(L, -nup);
+    lua_pushcclosure(L, l->func, nup);
+    lua_setfield(L, -(nup + 2), l->name);
+  }
+  lua_pop(L, nup);  /* Remove upvalues. */
+}
+
 LUALIB_API const char *luaL_gsub(lua_State *L, const char *s,
 				 const char *p, const char *r)
 {
@@ -302,7 +313,7 @@
 
 #ifdef LUAJIT_USE_SYSMALLOC
 
-#if LJ_64 && !defined(LUAJIT_USE_VALGRIND)
+#if LJ_64 && !LJ_GC64 && !defined(LUAJIT_USE_VALGRIND)
 #error "Must use builtin allocator for 64 bit target"
 #endif
 
@@ -334,7 +345,7 @@
   lua_State *L;
   void *ud = lj_alloc_create();
   if (ud == NULL) return NULL;
-#if LJ_64
+#if LJ_64 && !LJ_GC64
   L = lj_state_newstate(lj_alloc_f, ud);
 #else
   L = lua_newstate(lj_alloc_f, ud);
@@ -343,7 +354,7 @@
   return L;
 }
 
-#if LJ_64
+#if LJ_64 && !LJ_GC64
 LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)
 {
   UNUSED(f); UNUSED(ud);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_base.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_base.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_base.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Base and coroutine library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -23,6 +23,7 @@
 #include "lj_tab.h"
 #include "lj_meta.h"
 #include "lj_state.h"
+#include "lj_frame.h"
 #if LJ_HASFFI
 #include "lj_ctype.h"
 #include "lj_cconv.h"
@@ -345,7 +346,7 @@
 
 static int load_aux(lua_State *L, int status, int envarg)
 {
-  if (status == 0) {
+  if (status == LUA_OK) {
     if (tvistab(L->base+envarg-1)) {
       GCfunc *fn = funcV(L->top-1);
       GCtab *t = tabV(L->base+envarg-1);
@@ -418,7 +419,7 @@
   GCstr *fname = lj_lib_optstr(L, 1);
   setnilV(L->top);
   L->top = L->base+1;
-  if (luaL_loadfile(L, fname ? strdata(fname) : NULL) != 0)
+  if (luaL_loadfile(L, fname ? strdata(fname) : NULL) != LUA_OK)
     lua_error(L);
   lua_call(L, 0, LUA_MULTRET);
   return (int)(L->top - L->base) - 1;
@@ -536,7 +537,7 @@
   co = threadV(L->base);
   if (co == L) s = "running";
   else if (co->status == LUA_YIELD) s = "suspended";
-  else if (co->status != 0) s = "dead";
+  else if (co->status != LUA_OK) s = "dead";
   else if (co->base > tvref(co->stack)+1+LJ_FR2) s = "normal";
   else if (co->top == co->base) s = "dead";
   else s = "suspended";
@@ -557,6 +558,12 @@
 #endif
 }
 
+LJLIB_CF(coroutine_isyieldable)
+{
+  setboolV(L->top++, cframe_canyield(L->cframe));
+  return 1;
+}
+
 LJLIB_CF(coroutine_create)
 {
   lua_State *L1;
@@ -576,7 +583,7 @@
 static int ffh_resume(lua_State *L, lua_State *co, int wrap)
 {
   if (co->cframe != NULL || co->status > LUA_YIELD ||
-      (co->status == 0 && co->top == co->base)) {
+      (co->status == LUA_OK && co->top == co->base)) {
     ErrMsg em = co->cframe ? LJ_ERR_CORUN : LJ_ERR_CODEAD;
     if (wrap) lj_err_caller(L, em);
     setboolV(L->base-1-LJ_FR2, 0);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_bit.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_bit.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_bit.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Bit manipulation library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lib_bit_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_debug.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_debug.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_debug.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Debug library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -283,13 +283,13 @@
 
 /* ------------------------------------------------------------------------ */
 
-static const char KEY_HOOK = 'h';
+#define KEY_HOOK	((void *)0x3004)
 
 static void hookf(lua_State *L, lua_Debug *ar)
 {
   static const char *const hooknames[] =
     {"call", "return", "line", "count", "tail return"};
-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);
+  lua_pushlightuserdata(L, KEY_HOOK);
   lua_rawget(L, LUA_REGISTRYINDEX);
   if (lua_isfunction(L, -1)) {
     lua_pushstring(L, hooknames[(int)ar->event]);
@@ -334,7 +334,7 @@
     count = luaL_optint(L, arg+3, 0);
     func = hookf; mask = makemask(smask, count);
   }
-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);
+  lua_pushlightuserdata(L, KEY_HOOK);
   lua_pushvalue(L, arg+1);
   lua_rawset(L, LUA_REGISTRYINDEX);
   lua_sethook(L, func, mask, count);
@@ -349,7 +349,7 @@
   if (hook != NULL && hook != hookf) {  /* external hook? */
     lua_pushliteral(L, "external hook");
   } else {
-    lua_pushlightuserdata(L, (void *)&KEY_HOOK);
+    lua_pushlightuserdata(L, KEY_HOOK);
     lua_rawget(L, LUA_REGISTRYINDEX);   /* get hook */
   }
   lua_pushstring(L, unmakemask(mask, buff));

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_ffi.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_ffi.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_ffi.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** FFI library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lib_ffi_c
@@ -829,7 +829,7 @@
   settabV(L, L->top++, t);
   setgcref(t->metatable, obj2gco(t));
   setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")),
-	  lj_str_newlit(L, "K"));
+	  lj_str_newlit(L, "k"));
   t->nomm = (uint8_t)(~(1u<<MM_mode));
   return t;
 }

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_init.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_init.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_init.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Library initialization.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major parts taken verbatim from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_io.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_io.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_io.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** I/O library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -203,13 +203,12 @@
     for (n = start; nargs-- && ok; n++) {
       if (tvisstr(L->base+n)) {
 	const char *p = strVdata(L->base+n);
-	if (p[0] != '*')
-	  lj_err_arg(L, n+1, LJ_ERR_INVOPT);
-	if (p[1] == 'n')
+	if (p[0] == '*') p++;
+	if (p[0] == 'n')
 	  ok = io_file_readnum(L, fp);
-	else if ((p[1] & ~0x20) == 'L')
-	  ok = io_file_readline(L, fp, (p[1] == 'l'));
-	else if (p[1] == 'a')
+	else if ((p[0] & ~0x20) == 'L')
+	  ok = io_file_readline(L, fp, (p[0] == 'l'));
+	else if (p[0] == 'a')
 	  io_file_readall(L, fp);
 	else
 	  lj_err_arg(L, n+1, LJ_ERR_INVFMT);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_jit.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_jit.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_jit.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** JIT library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lib_jit_c
@@ -204,6 +204,7 @@
     lua_setfield(L, -2, "source");
     lj_debug_pushloc(L, pt, pc);
     lua_setfield(L, -2, "loc");
+    setprotoV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "proto")), pt);
   } else {
     GCfunc *fn = funcV(L->base);
     GCtab *t;
@@ -668,6 +669,11 @@
       if (fam >= 0x00000f00)  /* K8, K10. */
 	flags |= JIT_F_PREFER_IMUL;
     }
+    if (vendor[0] >= 7) {
+      uint32_t xfeatures[4];
+      lj_vm_cpuid(7, xfeatures);
+      flags |= ((xfeatures[1] >> 8)&1) * JIT_F_BMI2;
+    }
 #endif
   }
   /* Check for required instruction set support on x86 (unnecessary on x64). */
@@ -710,15 +716,19 @@
 #if LJ_HASJIT
   /* Compile-time MIPS CPU detection. */
 #if LJ_ARCH_VERSION >= 20
-  flags |= JIT_F_MIPS32R2;
+  flags |= JIT_F_MIPSXXR2;
 #endif
   /* Runtime MIPS CPU detection. */
 #if defined(__GNUC__)
-  if (!(flags & JIT_F_MIPS32R2)) {
+  if (!(flags & JIT_F_MIPSXXR2)) {
     int x;
+#ifdef __mips16
+    x = 0;  /* Runtime detection is difficult. Ensure optimal -march flags. */
+#else
     /* On MIPS32R1 rotr is treated as srl. rotr r2,r2,1 -> srl r2,r2,1. */
     __asm__("li $2, 1\n\t.long 0x00221042\n\tmove %0, $2" : "=r"(x) : : "$2");
-    if (x) flags |= JIT_F_MIPS32R2;  /* Either 0x80000000 (R2) or 0 (R1). */
+#endif
+    if (x) flags |= JIT_F_MIPSXXR2;  /* Either 0x80000000 (R2) or 0 (R1). */
   }
 #endif
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_math.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_math.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_math.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Math library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include <math.h>
@@ -221,10 +221,6 @@
   rs = (RandomState *)lua_newuserdata(L, sizeof(RandomState));
   rs->valid = 0;  /* Use lazy initialization to save some time on startup. */
   LJ_LIB_REG(L, LUA_MATHLIBNAME, math);
-#if defined(LUA_COMPAT_MOD) && !LJ_52
-  lua_getfield(L, -1, "fmod");
-  lua_setfield(L, -2, "mod");
-#endif
   return 1;
 }
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_os.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_os.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_os.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** OS library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_package.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_package.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_package.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Package library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2012 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -193,8 +193,7 @@
     lua_pop(L, 1);
     plib = (void **)lua_newuserdata(L, sizeof(void *));
     *plib = NULL;
-    luaL_getmetatable(L, "_LOADLIB");
-    lua_setmetatable(L, -2);
+    luaL_setmetatable(L, "_LOADLIB");
     lua_pushfstring(L, "LOADLIB: %s", path);
     lua_pushvalue(L, -2);
     lua_settable(L, LUA_REGISTRYINDEX);
@@ -362,9 +361,9 @@
   return 1;  /* library loaded successfully */
 }
 
-#define LUA_POF		"luaopen_"
-#define LUA_OFSEP	"_"
-#define POF		LUA_POF
+#define LUA_POF         "luaopen_"
+#define LUA_OFSEP       "_"
+#define POF             LUA_POF
 
 static const char *mkfuncname (lua_State *L, const char *modname) {
   const char *funcname;
@@ -376,7 +375,6 @@
   return funcname;
 }
 
-
 int loader_C_luatex (lua_State *L, const char *name, const char *filename) {
   const char *funcname;
   funcname = mkfuncname(L, name);
@@ -418,7 +416,6 @@
   return 1;  /* library loaded successfully */
 }
 
-
 static int lj_cf_package_loader_preload(lua_State *L)
 {
   const char *name = luaL_checkstring(L, 1);
@@ -437,8 +434,7 @@
 
 /* ------------------------------------------------------------------------ */
 
-static const int sentinel_ = 0;
-#define sentinel	((void *)&sentinel_)
+#define sentinel	((void *)0x4004)
 
 static int lj_cf_package_require(lua_State *L)
 {
@@ -528,29 +524,19 @@
 static int lj_cf_package_module(lua_State *L)
 {
   const char *modname = luaL_checkstring(L, 1);
-  int loaded = lua_gettop(L) + 1;  /* index of _LOADED table */
-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
-  lua_getfield(L, loaded, modname);  /* get _LOADED[modname] */
-  if (!lua_istable(L, -1)) {  /* not found? */
-    lua_pop(L, 1);  /* remove previous result */
-    /* try global variable (and create one if it does not exist) */
-    if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL)
-      lj_err_callerv(L, LJ_ERR_BADMODN, modname);
-    lua_pushvalue(L, -1);
-    lua_setfield(L, loaded, modname);  /* _LOADED[modname] = new table */
-  }
-  /* check whether table already has a _NAME field */
+  int lastarg = (int)(L->top - L->base);
+  luaL_pushmodule(L, modname, 1);
   lua_getfield(L, -1, "_NAME");
-  if (!lua_isnil(L, -1)) {  /* is table an initialized module? */
+  if (!lua_isnil(L, -1)) {  /* Module already initialized? */
     lua_pop(L, 1);
-  } else {  /* no; initialize it */
+  } else {
     lua_pop(L, 1);
     modinit(L, modname);
   }
   lua_pushvalue(L, -1);
   setfenv(L);
-  dooptions(L, loaded - 1);
-  return 0;
+  dooptions(L, lastarg);
+  return LJ_52;
 }
 
 static int lj_cf_package_seeall(lua_State *L)
@@ -621,13 +607,16 @@
   lj_lib_pushcf(L, lj_cf_package_unloadlib, 1);
   lua_setfield(L, -2, "__gc");
   luaL_register(L, LUA_LOADLIBNAME, package_lib);
-  lua_pushvalue(L, -1);
-  lua_replace(L, LUA_ENVIRONINDEX);
+  lua_copy(L, -1, LUA_ENVIRONINDEX);
   lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0);
   for (i = 0; package_loaders[i] != NULL; i++) {
     lj_lib_pushcf(L, package_loaders[i], 1);
     lua_rawseti(L, -2, i+1);
   }
+#if LJ_52
+  lua_pushvalue(L, -1);
+  lua_setfield(L, -3, "searchers");
+#endif
   lua_setfield(L, -2, "loaders");
   lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
   noenv = lua_toboolean(L, -1);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_string.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_string.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_string.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** String library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -737,10 +737,6 @@
   GCtab *mt;
   global_State *g;
   LJ_LIB_REG(L, LUA_STRLIBNAME, string);
-#if defined(LUA_COMPAT_GFIND) && !LJ_52
-  lua_getfield(L, -1, "gmatch");
-  lua_setfield(L, -2, "gfind");
-#endif
   mt = lj_tab_new(L, 0, 1);
   /* NOBARRIER: basemt is a GC root. */
   g = G(L);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_table.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_table.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lib_table.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Table library.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -129,6 +129,26 @@
   end
 */
 
+LJLIB_LUA(table_move) /*
+  function(a1, f, e, t, a2)
+    CHECK_tab(a1)
+    CHECK_int(f)
+    CHECK_int(e)
+    CHECK_int(t)
+    if a2 == nil then a2 = a1 end
+    CHECK_tab(a2)
+    if e >= f then
+      local d = t - f
+      if t > e or t <= f or a2 ~= a1 then
+	for i=f,e do a2[i+d] = a1[i] end
+      else
+	for i=e,f,-1 do a2[i+d] = a1[i] end
+      end
+    end
+    return a2
+  end
+*/
+
 LJLIB_CF(table_concat)		LJLIB_REC(.)
 {
   GCtab *t = lj_lib_checktab(L, 1);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj.supp
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj.supp	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj.supp	2018-01-09 23:43:20 UTC (rev 46269)
@@ -27,15 +27,15 @@
 {
    Optimized string compare
    Memcheck:Addr4
-   fun:lj_str_fastcmp
+   fun:str_fastcmp
 }
 {
    Optimized string compare
    Memcheck:Addr1
-   fun:lj_str_fastcmp
+   fun:str_fastcmp
 }
 {
    Optimized string compare
    Memcheck:Cond
-   fun:lj_str_fastcmp
+   fun:str_fastcmp
 }

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_alloc.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_alloc.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_alloc.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -72,13 +72,56 @@
 
 #define IS_DIRECT_BIT		(SIZE_T_ONE)
 
+
+/* Determine system-specific block allocation method. */
 #if LJ_TARGET_WINDOWS
 
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
+#define LJ_ALLOC_VIRTUALALLOC	1
+
 #if LJ_64 && !LJ_GC64
+#define LJ_ALLOC_NTAVM		1
+#endif
 
+#else
+
+#include <errno.h>
+/* If this include fails, then rebuild with: -DLUAJIT_USE_SYSMALLOC */
+#include <sys/mman.h>
+
+#define LJ_ALLOC_MMAP		1
+
+#if LJ_64
+
+#define LJ_ALLOC_MMAP_PROBE	1
+
+#if LJ_GC64
+#define LJ_ALLOC_MBITS		47	/* 128 TB in LJ_GC64 mode. */
+#elif LJ_TARGET_X64 && LJ_HASJIT
+/* Due to limitations in the x64 compiler backend. */
+#define LJ_ALLOC_MBITS		31	/* 2 GB on x64 with !LJ_GC64. */
+#else
+#define LJ_ALLOC_MBITS		32	/* 4 GB on other archs with !LJ_GC64. */
+#endif
+
+#endif
+
+#if LJ_64 && !LJ_GC64 && defined(MAP_32BIT)
+#define LJ_ALLOC_MMAP32		1
+#endif
+
+#if LJ_TARGET_LINUX
+#define LJ_ALLOC_MREMAP		1
+#endif
+
+#endif
+
+
+#if LJ_ALLOC_VIRTUALALLOC
+
+#if LJ_ALLOC_NTAVM
 /* Undocumented, but hey, that's what we all love so much about Windows. */
 typedef long (*PNTAVM)(HANDLE handle, void **addr, ULONG zbits,
 		       size_t *size, ULONG alloctype, ULONG prot);
@@ -89,14 +132,15 @@
 */
 #define NTAVM_ZEROBITS		1
 
-static void INIT_MMAP(void)
+static void init_mmap(void)
 {
   ntavm = (PNTAVM)GetProcAddress(GetModuleHandleA("ntdll.dll"),
 				 "NtAllocateVirtualMemory");
 }
+#define INIT_MMAP()	init_mmap()
 
 /* Win64 32 bit MMAP via NtAllocateVirtualMemory. */
-static LJ_AINLINE void *CALL_MMAP(size_t size)
+static void *CALL_MMAP(size_t size)
 {
   DWORD olderr = GetLastError();
   void *ptr = NULL;
@@ -107,7 +151,7 @@
 }
 
 /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
-static LJ_AINLINE void *DIRECT_MMAP(size_t size)
+static void *DIRECT_MMAP(size_t size)
 {
   DWORD olderr = GetLastError();
   void *ptr = NULL;
@@ -119,10 +163,8 @@
 
 #else
 
-#define INIT_MMAP()		((void)0)
-
 /* Win32 MMAP via VirtualAlloc */
-static LJ_AINLINE void *CALL_MMAP(size_t size)
+static void *CALL_MMAP(size_t size)
 {
   DWORD olderr = GetLastError();
   void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
@@ -131,7 +173,7 @@
 }
 
 /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
-static LJ_AINLINE void *DIRECT_MMAP(size_t size)
+static void *DIRECT_MMAP(size_t size)
 {
   DWORD olderr = GetLastError();
   void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
@@ -143,7 +185,7 @@
 #endif
 
 /* This function supports releasing coalesed segments */
-static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
+static int CALL_MUNMAP(void *ptr, size_t size)
 {
   DWORD olderr = GetLastError();
   MEMORY_BASIC_INFORMATION minfo;
@@ -163,11 +205,8 @@
   return 0;
 }
 
-#else
+#elif LJ_ALLOC_MMAP
 
-#include <errno.h>
-#include <sys/mman.h>
-
 #define MMAP_PROT		(PROT_READ|PROT_WRITE)
 #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
 #define MAP_ANONYMOUS		MAP_ANON
@@ -174,94 +213,128 @@
 #endif
 #define MMAP_FLAGS		(MAP_PRIVATE|MAP_ANONYMOUS)
 
-#if LJ_64 && !LJ_GC64
-/* 64 bit mode with 32 bit pointers needs special support for allocating
-** memory in the lower 2GB.
-*/
+#if LJ_ALLOC_MMAP_PROBE
 
-#if defined(MAP_32BIT)
-
-#if defined(__sun__)
-#define MMAP_REGION_START	((uintptr_t)0x1000)
+#ifdef MAP_TRYFIXED
+#define MMAP_FLAGS_PROBE	(MMAP_FLAGS|MAP_TRYFIXED)
 #else
-/* Actually this only gives us max. 1GB in current Linux kernels. */
-#define MMAP_REGION_START	((uintptr_t)0)
+#define MMAP_FLAGS_PROBE	MMAP_FLAGS
 #endif
 
-static LJ_AINLINE void *CALL_MMAP(size_t size)
-{
-  int olderr = errno;
-  void *ptr = mmap((void *)MMAP_REGION_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
-  errno = olderr;
-  return ptr;
-}
+#define LJ_ALLOC_MMAP_PROBE_MAX		30
+#define LJ_ALLOC_MMAP_PROBE_LINEAR	5
 
-#elif LJ_TARGET_OSX || LJ_TARGET_PS4 || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__sun__) || defined(__CYGWIN__)
+#define LJ_ALLOC_MMAP_PROBE_LOWER	((uintptr_t)0x4000)
 
-/* OSX and FreeBSD mmap() use a naive first-fit linear search.
-** That's perfect for us. Except that -pagezero_size must be set for OSX,
-** otherwise the lower 4GB are blocked. And the 32GB RLIMIT_DATA needs
-** to be reduced to 250MB on FreeBSD.
+/* No point in a giant ifdef mess. Just try to open /dev/urandom.
+** It doesn't really matter if this fails, since we get some ASLR bits from
+** every unsuitable allocation, too. And we prefer linear allocation, anyway.
 */
-#if LJ_TARGET_OSX || defined(__DragonFly__)
-#define MMAP_REGION_START	((uintptr_t)0x10000)
-#elif LJ_TARGET_PS4
-#define MMAP_REGION_START	((uintptr_t)0x4000)
-#else
-#define MMAP_REGION_START	((uintptr_t)0x10000000)
-#endif
-#define MMAP_REGION_END		((uintptr_t)0x80000000)
+#include <fcntl.h>
+#include <unistd.h>
 
-#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
-#include <sys/resource.h>
-#endif
+static uintptr_t mmap_probe_seed(void)
+{
+  uintptr_t val;
+  int fd = open("/dev/urandom", O_RDONLY);
+  if (fd != -1) {
+    int ok = ((size_t)read(fd, &val, sizeof(val)) == sizeof(val));
+    (void)close(fd);
+    if (ok) return val;
+  }
+  return 1;  /* Punt. */
+}
 
-static LJ_AINLINE void *CALL_MMAP(size_t size)
+static void *mmap_probe(size_t size)
 {
+  /* Hint for next allocation. Doesn't need to be thread-safe. */
+  static uintptr_t hint_addr = 0;
+  static uintptr_t hint_prng = 0;
   int olderr = errno;
-  /* Hint for next allocation. Doesn't need to be thread-safe. */
-  static uintptr_t alloc_hint = MMAP_REGION_START;
-  int retry = 0;
-#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
-  static int rlimit_modified = 0;
-  if (LJ_UNLIKELY(rlimit_modified == 0)) {
-    struct rlimit rlim;
-    rlim.rlim_cur = rlim.rlim_max = MMAP_REGION_START;
-    setrlimit(RLIMIT_DATA, &rlim);  /* Ignore result. May fail below. */
-    rlimit_modified = 1;
-  }
-#endif
-  for (;;) {
-    void *p = mmap((void *)alloc_hint, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
-    if ((uintptr_t)p >= MMAP_REGION_START &&
-	(uintptr_t)p + size < MMAP_REGION_END) {
-      alloc_hint = (uintptr_t)p + size;
+  int retry;
+  for (retry = 0; retry < LJ_ALLOC_MMAP_PROBE_MAX; retry++) {
+    void *p = mmap((void *)hint_addr, size, MMAP_PROT, MMAP_FLAGS_PROBE, -1, 0);
+    uintptr_t addr = (uintptr_t)p;
+    if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER) {
+      /* We got a suitable address. Bump the hint address. */
+      hint_addr = addr + size;
       errno = olderr;
       return p;
     }
-    if (p != CMFAIL) munmap(p, size);
-#if defined(__sun__) || defined(__DragonFly__)
-    alloc_hint += 0x1000000;  /* Need near-exhaustive linear scan. */
-    if (alloc_hint + size < MMAP_REGION_END) continue;
-#endif
-    if (retry) break;
-    retry = 1;
-    alloc_hint = MMAP_REGION_START;
+    if (p != MFAIL) {
+      munmap(p, size);
+    } else if (errno == ENOMEM) {
+      return MFAIL;
+    }
+    if (hint_addr) {
+      /* First, try linear probing. */
+      if (retry < LJ_ALLOC_MMAP_PROBE_LINEAR) {
+	hint_addr += 0x1000000;
+	if (((hint_addr + size) >> LJ_ALLOC_MBITS) != 0)
+	  hint_addr = 0;
+	continue;
+      } else if (retry == LJ_ALLOC_MMAP_PROBE_LINEAR) {
+	/* Next, try a no-hint probe to get back an ASLR address. */
+	hint_addr = 0;
+	continue;
+      }
+    }
+    /* Finally, try pseudo-random probing. */
+    if (LJ_UNLIKELY(hint_prng == 0)) {
+      hint_prng = mmap_probe_seed();
+    }
+    /* The unsuitable address we got has some ASLR PRNG bits. */
+    hint_addr ^= addr & ~((uintptr_t)(LJ_PAGESIZE-1));
+    do {  /* The PRNG itself is very weak, but see above. */
+      hint_prng = hint_prng * 1103515245 + 12345;
+      hint_addr ^= hint_prng * (uintptr_t)LJ_PAGESIZE;
+      hint_addr &= (((uintptr_t)1 << LJ_ALLOC_MBITS)-1);
+    } while (hint_addr < LJ_ALLOC_MMAP_PROBE_LOWER);
   }
   errno = olderr;
-  return CMFAIL;
+  return MFAIL;
 }
 
+#endif
+
+#if LJ_ALLOC_MMAP32
+
+#if defined(__sun__)
+#define LJ_ALLOC_MMAP32_START	((uintptr_t)0x1000)
 #else
+#define LJ_ALLOC_MMAP32_START	((uintptr_t)0)
+#endif
 
-#error "NYI: need an equivalent of MAP_32BIT for this 64 bit OS"
+static void *mmap_map32(size_t size)
+{
+#if LJ_ALLOC_MMAP_PROBE
+  static int fallback = 0;
+  if (fallback)
+    return mmap_probe(size);
+#endif
+  {
+    int olderr = errno;
+    void *ptr = mmap((void *)LJ_ALLOC_MMAP32_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
+    errno = olderr;
+    /* This only allows 1GB on Linux. So fallback to probing to get 2GB. */
+#if LJ_ALLOC_MMAP_PROBE
+    if (ptr == MFAIL) {
+      fallback = 1;
+      return mmap_probe(size);
+    }
+#endif
+    return ptr;
+  }
+}
 
 #endif
 
+#if LJ_ALLOC_MMAP32
+#define CALL_MMAP(size)		mmap_map32(size)
+#elif LJ_ALLOC_MMAP_PROBE
+#define CALL_MMAP(size)		mmap_probe(size)
 #else
-
-/* 32 bit mode and GC64 mode is easy. */
-static LJ_AINLINE void *CALL_MMAP(size_t size)
+static void *CALL_MMAP(size_t size)
 {
   int olderr = errno;
   void *ptr = mmap(NULL, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
@@ -268,14 +341,24 @@
   errno = olderr;
   return ptr;
 }
-
 #endif
 
-#define INIT_MMAP()		((void)0)
-#define DIRECT_MMAP(s)		CALL_MMAP(s)
+#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
 
-static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
+#include <sys/resource.h>
+
+static void init_mmap(void)
 {
+  struct rlimit rlim;
+  rlim.rlim_cur = rlim.rlim_max = 0x10000;
+  setrlimit(RLIMIT_DATA, &rlim);  /* Ignore result. May fail later. */
+}
+#define INIT_MMAP()	init_mmap()
+
+#endif
+
+static int CALL_MUNMAP(void *ptr, size_t size)
+{
   int olderr = errno;
   int ret = munmap(ptr, size);
   errno = olderr;
@@ -282,10 +365,9 @@
   return ret;
 }
 
-#if LJ_TARGET_LINUX
+#if LJ_ALLOC_MREMAP
 /* Need to define _GNU_SOURCE to get the mremap prototype. */
-static LJ_AINLINE void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz,
-				     int flags)
+static void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz, int flags)
 {
   int olderr = errno;
   ptr = mremap(ptr, osz, nsz, flags);
@@ -305,6 +387,15 @@
 
 #endif
 
+
+#ifndef INIT_MMAP
+#define INIT_MMAP()		((void)0)
+#endif
+
+#ifndef DIRECT_MMAP
+#define DIRECT_MMAP(s)		CALL_MMAP(s)
+#endif
+
 #ifndef CALL_MREMAP
 #define CALL_MREMAP(addr, osz, nsz, mv) ((void)osz, MFAIL)
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_api.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_api.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_api.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Public Lua/C API.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -112,6 +112,13 @@
   from->top = f;
 }
 
+LUA_API const lua_Number *lua_version(lua_State *L)
+{
+  static const lua_Number version = LUA_VERSION_NUM;
+  UNUSED(L);
+  return &version;
+}
+
 /* -- Stack manipulation -------------------------------------------------- */
 
 LUA_API int lua_gettop(lua_State *L)
@@ -152,30 +159,40 @@
   copyTV(L, p, L->top);
 }
 
-LUA_API void lua_replace(lua_State *L, int idx)
+static void copy_slot(lua_State *L, TValue *f, int idx)
 {
-  api_checknelems(L, 1);
   if (idx == LUA_GLOBALSINDEX) {
-    api_check(L, tvistab(L->top-1));
+    api_check(L, tvistab(f));
     /* NOBARRIER: A thread (i.e. L) is never black. */
-    setgcref(L->env, obj2gco(tabV(L->top-1)));
+    setgcref(L->env, obj2gco(tabV(f)));
   } else if (idx == LUA_ENVIRONINDEX) {
     GCfunc *fn = curr_func(L);
     if (fn->c.gct != ~LJ_TFUNC)
       lj_err_msg(L, LJ_ERR_NOENV);
-    api_check(L, tvistab(L->top-1));
-    setgcref(fn->c.env, obj2gco(tabV(L->top-1)));
-    lj_gc_barrier(L, fn, L->top-1);
+    api_check(L, tvistab(f));
+    setgcref(fn->c.env, obj2gco(tabV(f)));
+    lj_gc_barrier(L, fn, f);
   } else {
     TValue *o = index2adr(L, idx);
     api_checkvalidindex(L, o);
-    copyTV(L, o, L->top-1);
+    copyTV(L, o, f);
     if (idx < LUA_GLOBALSINDEX)  /* Need a barrier for upvalues. */
-      lj_gc_barrier(L, curr_func(L), L->top-1);
+      lj_gc_barrier(L, curr_func(L), f);
   }
+}
+
+LUA_API void lua_replace(lua_State *L, int idx)
+{
+  api_checknelems(L, 1);
+  copy_slot(L, L->top - 1, idx);
   L->top--;
 }
 
+LUA_API void lua_copy(lua_State *L, int fromidx, int toidx)
+{
+  copy_slot(L, index2adr(L, fromidx), toidx);
+}
+
 LUA_API void lua_pushvalue(lua_State *L, int idx)
 {
   copyTV(L, L->top, index2adr(L, idx));
@@ -325,6 +342,22 @@
     return 0;
 }
 
+LUA_API lua_Number lua_tonumberx(lua_State *L, int idx, int *ok)
+{
+  cTValue *o = index2adr(L, idx);
+  TValue tmp;
+  if (LJ_LIKELY(tvisnumber(o))) {
+    if (ok) *ok = 1;
+    return numberVnum(o);
+  } else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp)) {
+    if (ok) *ok = 1;
+    return numV(&tmp);
+  } else {
+    if (ok) *ok = 0;
+    return 0;
+  }
+}
+
 LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)
 {
   cTValue *o = index2adr(L, idx);
@@ -362,7 +395,7 @@
     if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))
       return 0;
     if (tvisint(&tmp))
-      return (lua_Integer)intV(&tmp);
+      return intV(&tmp);
     n = numV(&tmp);
   }
 #if LJ_64
@@ -372,6 +405,35 @@
 #endif
 }
 
+LUA_API lua_Integer lua_tointegerx(lua_State *L, int idx, int *ok)
+{
+  cTValue *o = index2adr(L, idx);
+  TValue tmp;
+  lua_Number n;
+  if (LJ_LIKELY(tvisint(o))) {
+    if (ok) *ok = 1;
+    return intV(o);
+  } else if (LJ_LIKELY(tvisnum(o))) {
+    n = numV(o);
+  } else {
+    if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) {
+      if (ok) *ok = 0;
+      return 0;
+    }
+    if (tvisint(&tmp)) {
+      if (ok) *ok = 1;
+      return intV(&tmp);
+    }
+    n = numV(&tmp);
+  }
+  if (ok) *ok = 1;
+#if LJ_64
+  return (lua_Integer)n;
+#else
+  return lj_num2int(n);
+#endif
+}
+
 LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)
 {
   cTValue *o = index2adr(L, idx);
@@ -858,7 +920,7 @@
   lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1]));
 }
 
-LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
+LUALIB_API void *luaL_testudata(lua_State *L, int idx, const char *tname)
 {
   cTValue *o = index2adr(L, idx);
   if (tvisudata(o)) {
@@ -867,10 +929,16 @@
     if (tv && tvistab(tv) && tabV(tv) == tabref(ud->metatable))
       return uddata(ud);
   }
-  lj_err_argtype(L, idx, tname);
-  return NULL;  /* unreachable */
+  return NULL;  /* value is not a userdata with a metatable */
 }
 
+LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
+{
+  void *p = luaL_testudata(L, idx, tname);
+  if (!p) lj_err_argtype(L, idx, tname);
+  return p;
+}
+
 /* -- Object setters ------------------------------------------------------ */
 
 LUA_API void lua_settable(lua_State *L, int idx)
@@ -977,6 +1045,12 @@
   return 1;
 }
 
+LUALIB_API void luaL_setmetatable(lua_State *L, const char *tname)
+{
+  lua_getfield(L, LUA_REGISTRYINDEX, tname);
+  lua_setmetatable(L, -2);
+}
+
 LUA_API int lua_setfenv(lua_State *L, int idx)
 {
   cTValue *o = index2adr(L, idx);
@@ -1032,7 +1106,7 @@
 
 LUA_API void lua_call(lua_State *L, int nargs, int nresults)
 {
-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);
+  api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
   api_checknelems(L, nargs+1);
   lj_vm_call(L, api_call_base(L, nargs), nresults+1);
 }
@@ -1043,7 +1117,7 @@
   uint8_t oldh = hook_save(g);
   ptrdiff_t ef;
   int status;
-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);
+  api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
   api_checknelems(L, nargs+1);
   if (errfunc == 0) {
     ef = 0;
@@ -1075,7 +1149,7 @@
   global_State *g = G(L);
   uint8_t oldh = hook_save(g);
   int status;
-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);
+  api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
   status = lj_vm_cpcall(L, func, ud, cpcall);
   if (status) hook_restore(g, oldh);
   return status;
@@ -1096,6 +1170,11 @@
 
 /* -- Coroutine yield and resume ------------------------------------------ */
 
+LUA_API int lua_isyieldable(lua_State *L)
+{
+  return cframe_canyield(L->cframe);
+}
+
 LUA_API int lua_yield(lua_State *L, int nresults)
 {
   void *cf = L->cframe;
@@ -1140,7 +1219,7 @@
 {
   if (L->cframe == NULL && L->status <= LUA_YIELD)
     return lj_vm_resume(L,
-      L->status == 0 ? api_call_base(L, nargs) : L->top - nargs,
+      L->status == LUA_OK ? api_call_base(L, nargs) : L->top - nargs,
       0, 0);
   L->top = L->base;
   setstrV(L, L->top, lj_err_str(L, LJ_ERR_COSUSP));

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_arch.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_arch.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_arch.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Target architecture selection.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_ARCH_H
@@ -25,6 +25,10 @@
 #define LUAJIT_ARCH_ppc		5
 #define LUAJIT_ARCH_MIPS	6
 #define LUAJIT_ARCH_mips	6
+#define LUAJIT_ARCH_MIPS32	6
+#define LUAJIT_ARCH_mips32	6
+#define LUAJIT_ARCH_MIPS64	7
+#define LUAJIT_ARCH_mips64	7
 
 /* Target OS. */
 #define LUAJIT_OS_OTHER		0
@@ -47,8 +51,10 @@
 #define LUAJIT_TARGET	LUAJIT_ARCH_ARM64
 #elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC)
 #define LUAJIT_TARGET	LUAJIT_ARCH_PPC
+#elif defined(__mips64__) || defined(__mips64) || defined(__MIPS64__) || defined(__MIPS64)
+#define LUAJIT_TARGET	LUAJIT_ARCH_MIPS64
 #elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS)
-#define LUAJIT_TARGET	LUAJIT_ARCH_MIPS
+#define LUAJIT_TARGET	LUAJIT_ARCH_MIPS32
 #else
 #error "No support for this architecture (yet)"
 #endif
@@ -68,8 +74,11 @@
        defined(__NetBSD__) || defined(__OpenBSD__) || \
        defined(__DragonFly__)) && !defined(__ORBIS__)
 #define LUAJIT_OS	LUAJIT_OS_BSD
-#elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__)
+#elif (defined(__sun__) && defined(__svr4__)) || defined(__HAIKU__)
 #define LUAJIT_OS	LUAJIT_OS_POSIX
+#elif defined(__CYGWIN__)
+#define LJ_TARGET_CYGWIN	1
+#define LUAJIT_OS	LUAJIT_OS_POSIX
 #else
 #define LUAJIT_OS	LUAJIT_OS_OTHER
 #endif
@@ -137,7 +146,7 @@
 #define LJ_ARCH_NAME		"x86"
 #define LJ_ARCH_BITS		32
 #define LJ_ARCH_ENDIAN		LUAJIT_LE
-#if LJ_TARGET_WINDOWS || __CYGWIN__
+#if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN
 #define LJ_ABI_WIN		1
 #else
 #define LJ_ABI_WIN		0
@@ -155,7 +164,7 @@
 #define LJ_ARCH_NAME		"x64"
 #define LJ_ARCH_BITS		64
 #define LJ_ARCH_ENDIAN		LUAJIT_LE
-#if LJ_TARGET_WINDOWS || __CYGWIN__
+#if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN
 #define LJ_ABI_WIN		1
 #else
 #define LJ_ABI_WIN		0
@@ -206,9 +215,14 @@
 
 #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM64
 
+#define LJ_ARCH_BITS		64
+#if defined(__AARCH64EB__)
+#define LJ_ARCH_NAME		"arm64be"
+#define LJ_ARCH_ENDIAN		LUAJIT_BE
+#else
 #define LJ_ARCH_NAME		"arm64"
-#define LJ_ARCH_BITS		64
 #define LJ_ARCH_ENDIAN		LUAJIT_LE
+#endif
 #define LJ_TARGET_ARM64		1
 #define LJ_TARGET_EHRETREG	0
 #define LJ_TARGET_JUMPRANGE	27	/* +-2^27 = +-128MB */
@@ -217,7 +231,6 @@
 #define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */
 #define LJ_TARGET_GC64		1
 #define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL
-#define LJ_ARCH_NOJIT		1	/* NYI */
 
 #define LJ_ARCH_VERSION		80
 
@@ -286,13 +299,21 @@
 #define LJ_ARCH_XENON		1
 #endif
 
-#elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS
+#elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 || LUAJIT_TARGET == LUAJIT_ARCH_MIPS64
 
 #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL)
+#if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
 #define LJ_ARCH_NAME		"mipsel"
+#else
+#define LJ_ARCH_NAME		"mips64el"
+#endif
 #define LJ_ARCH_ENDIAN		LUAJIT_LE
 #else
+#if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
 #define LJ_ARCH_NAME		"mips"
+#else
+#define LJ_ARCH_NAME		"mips64"
+#endif
 #define LJ_ARCH_ENDIAN		LUAJIT_BE
 #endif
 
@@ -304,11 +325,6 @@
 #endif
 #endif
 
-/* Temporarily disable features until the code has been merged. */
-#if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__
-#define LUAJIT_NO_UNWIND	1
-#endif
-
 #if !defined(LJ_ABI_SOFTFP)
 #ifdef __mips_soft_float
 #define LJ_ABI_SOFTFP		1
@@ -317,7 +333,17 @@
 #endif
 #endif
 
+#if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
 #define LJ_ARCH_BITS		32
+#define LJ_TARGET_MIPS32	1
+#else
+#if LJ_ABI_SOFTFP || !LJ_ARCH_HASFPU
+#define LJ_ARCH_NOJIT		1	/* NYI */
+#endif
+#define LJ_ARCH_BITS		64
+#define LJ_TARGET_MIPS64	1
+#define LJ_TARGET_GC64		1
+#endif
 #define LJ_TARGET_MIPS		1
 #define LJ_TARGET_EHRETREG	4
 #define LJ_TARGET_JUMPRANGE	27	/* 2*2^27 = 256MB-aligned region */
@@ -326,7 +352,7 @@
 #define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */
 #define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL
 
-#if _MIPS_ARCH_MIPS32R2
+#if _MIPS_ARCH_MIPS32R2 || _MIPS_ARCH_MIPS64R2
 #define LJ_ARCH_VERSION		20
 #else
 #define LJ_ARCH_VERSION		10
@@ -350,13 +376,13 @@
 #if __GNUC__ < 4
 #error "Need at least GCC 4.0 or newer"
 #endif
-#elif LJ_TARGET_ARM || LJ_TARGET_PPC
+#elif LJ_TARGET_ARM  || LJ_TARGET_PPC
 #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)
 #error "Need at least GCC 4.2 or newer"
 #endif
 #elif LJ_TARGET_ARM64
 #if __clang__
-#if (__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)
+#if ((__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)) && !defined(__NX_TOOLCHAIN_MAJOR__)
 #error "Need at least Clang 3.5 or newer"
 #endif
 #else
@@ -388,9 +414,6 @@
 #error "Only ARM EABI or iOS 3.0+ ABI is supported"
 #endif
 #elif LJ_TARGET_ARM64
-#if defined(__AARCH64EB__)
-#error "No support for big-endian ARM64"
-#endif
 #if defined(_ILP32)
 #error "No support for ILP32 model on ARM64"
 #endif
@@ -407,12 +430,16 @@
 #ifdef __NO_FPRS__
 #error "No support for PPC/e500 anymore (use LuaJIT 2.0)"
 #endif
-#elif LJ_TARGET_MIPS
-#if defined(_LP64)
-#error "No support for MIPS64"
+#elif LJ_TARGET_MIPS32
+#if !((defined(_MIPS_SIM_ABI32) && _MIPS_SIM == _MIPS_SIM_ABI32) || (defined(_ABIO32) && _MIPS_SIM == _ABIO32))
+#error "Only o32 ABI supported for MIPS32"
 #endif
+#elif LJ_TARGET_MIPS64
+#if !((defined(_MIPS_SIM_ABI64) && _MIPS_SIM == _MIPS_SIM_ABI64) || (defined(_ABI64) && _MIPS_SIM == _ABI64))
+#error "Only n64 ABI supported for MIPS64"
 #endif
 #endif
+#endif
 
 /* Enable or disable the dual-number mode for the VM. */
 #if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \
@@ -450,7 +477,7 @@
 #endif
 
 /* Disable or enable the JIT compiler. */
-#if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) || LJ_FR2 || LJ_GC64
+#if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT)
 #define LJ_HASJIT		0
 #else
 #define LJ_HASJIT		1
@@ -521,6 +548,11 @@
 #define LJ_NO_SYSTEM		1
 #endif
 
+#if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__
+/* NYI: no support for compact unwind specification, yet. */
+#define LUAJIT_NO_UNWIND	1
+#endif
+
 #if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4
 #define LJ_NO_UNWIND		1
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** IR assembler (SSA IR -> machine code).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_asm_c
@@ -91,7 +91,7 @@
   MCode *realign;	/* Realign loop if not NULL. */
 
 #ifdef RID_NUM_KREF
-  int32_t krefk[RID_NUM_KREF];
+  intptr_t krefk[RID_NUM_KREF];
 #endif
   IRRef1 phireg[RID_MAX];  /* PHI register references. */
   uint16_t parentmap[LJ_MAX_JSLOTS];  /* Parent instruction to RegSP map. */
@@ -144,7 +144,7 @@
 #define ra_krefreg(ref)		((Reg)(RID_MIN_KREF + (Reg)(ref)))
 #define ra_krefk(as, ref)	(as->krefk[(ref)])
 
-static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, int32_t k)
+static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, intptr_t k)
 {
   IRRef ref = (IRRef)(r - RID_MIN_KREF);
   as->krefk[ref] = k;
@@ -171,6 +171,8 @@
 #include "lj_emit_x86.h"
 #elif LJ_TARGET_ARM
 #include "lj_emit_arm.h"
+#elif LJ_TARGET_ARM64
+#include "lj_emit_arm64.h"
 #elif LJ_TARGET_PPC
 #include "lj_emit_ppc.h"
 #elif LJ_TARGET_MIPS
@@ -322,7 +324,11 @@
     lua_assert(!rset_test(as->freeset, r));
     ra_free(as, r);
     ra_modified(as, r);
+#if LJ_64
+    emit_loadu64(as, r, ra_krefk(as, ref));
+#else
     emit_loadi(as, r, ra_krefk(as, ref));
+#endif
     return r;
   }
   ir = IR(ref);
@@ -334,7 +340,7 @@
   RA_DBGX((as, "remat     $i $r", ir, r));
 #if !LJ_SOFTFP
   if (ir->o == IR_KNUM) {
-    emit_loadn(as, r, ir_knum(ir));
+    emit_loadk64(as, r, ir);
   } else
 #endif
   if (emit_canremat(REF_BASE) && ir->o == IR_BASE) {
@@ -346,7 +352,13 @@
 #if LJ_64
   } else if (ir->o == IR_KINT64) {
     emit_loadu64(as, r, ir_kint64(ir)->u64);
+#if LJ_GC64
+  } else if (ir->o == IR_KGC) {
+    emit_loadu64(as, r, (uintptr_t)ir_kgc(ir));
+  } else if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {
+    emit_loadu64(as, r, (uintptr_t)ir_kptr(ir));
 #endif
+#endif
   } else {
     lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||
 	       ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL);
@@ -518,7 +530,7 @@
 
 #ifdef RID_NUM_KREF
 /* Allocate a register for a constant. */
-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow)
+static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow)
 {
   /* First try to find a register which already holds the same constant. */
   RegSet pick, work = ~as->freeset & RSET_GPR;
@@ -527,9 +539,31 @@
     IRRef ref;
     r = rset_pickbot(work);
     ref = regcost_ref(as->cost[r]);
+#if LJ_64
+    if (ref < ASMREF_L) {
+      if (ra_iskref(ref)) {
+	if (k == ra_krefk(as, ref))
+	  return r;
+      } else {
+	IRIns *ir = IR(ref);
+	if ((ir->o == IR_KINT64 && k == (int64_t)ir_kint64(ir)->u64) ||
+#if LJ_GC64
+	    (ir->o == IR_KINT && k == ir->i) ||
+	    (ir->o == IR_KGC && k == (intptr_t)ir_kgc(ir)) ||
+	    ((ir->o == IR_KPTR || ir->o == IR_KKPTR) &&
+	     k == (intptr_t)ir_kptr(ir))
+#else
+	    (ir->o != IR_KINT64 && k == ir->i)
+#endif
+	   )
+	  return r;
+      }
+    }
+#else
     if (ref < ASMREF_L &&
 	k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i))
       return r;
+#endif
     rset_clear(work, r);
   }
   pick = as->freeset & allow;
@@ -549,7 +583,7 @@
 }
 
 /* Allocate a specific register for a constant. */
-static void ra_allockreg(ASMState *as, int32_t k, Reg r)
+static void ra_allockreg(ASMState *as, intptr_t k, Reg r)
 {
   Reg kr = ra_allock(as, k, RID2RSET(r));
   if (kr != r) {
@@ -619,10 +653,20 @@
   return r;
 }
 
+/* Add a register rename to the IR. */
+static void ra_addrename(ASMState *as, Reg down, IRRef ref, SnapNo snapno)
+{
+  IRRef ren;
+  lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), ref, snapno);
+  ren = tref_ref(lj_ir_emit(as->J));
+  as->J->cur.ir[ren].r = (uint8_t)down;
+  as->J->cur.ir[ren].s = SPS_NONE;
+}
+
 /* Rename register allocation and emit move. */
 static void ra_rename(ASMState *as, Reg down, Reg up)
 {
-  IRRef ren, ref = regcost_ref(as->cost[up] = as->cost[down]);
+  IRRef ref = regcost_ref(as->cost[up] = as->cost[down]);
   IRIns *ir = IR(ref);
   ir->r = (uint8_t)up;
   as->cost[down] = 0;
@@ -635,11 +679,7 @@
   RA_DBGX((as, "rename    $f $r $r", regcost_ref(as->cost[up]), down, up));
   emit_movrr(as, ir, down, up);  /* Backwards codegen needs inverse move. */
   if (!ra_hasspill(IR(ref)->s)) {  /* Add the rename to the IR. */
-    lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), ref, as->snapno);
-    ren = tref_ref(lj_ir_emit(as->J));
-    as->ir = as->T->ir;  /* The IR may have been reallocated. */
-    IR(ren)->r = (uint8_t)down;
-    IR(ren)->s = SPS_NONE;
+    ra_addrename(as, down, ref, as->snapno);
   }
 }
 
@@ -689,17 +729,21 @@
   if (ra_noreg(left)) {
     if (irref_isk(lref)) {
       if (ir->o == IR_KNUM) {
-	cTValue *tv = ir_knum(ir);
 	/* FP remat needs a load except for +0. Still better than eviction. */
-	if (tvispzero(tv) || !(as->freeset & RSET_FPR)) {
-	  emit_loadn(as, dest, tv);
+	if (tvispzero(ir_knum(ir)) || !(as->freeset & RSET_FPR)) {
+	  emit_loadk64(as, dest, ir);
 	  return;
 	}
 #if LJ_64
       } else if (ir->o == IR_KINT64) {
-	emit_loadu64(as, dest, ir_kint64(ir)->u64);
+	emit_loadk64(as, dest, ir);
 	return;
+#if LJ_GC64
+      } else if (ir->o == IR_KGC || ir->o == IR_KPTR || ir->o == IR_KKPTR) {
+	emit_loadk64(as, dest, ir);
+	return;
 #endif
+#endif
       } else if (ir->o != IR_KPRI) {
 	lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||
 		   ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL);
@@ -941,7 +985,7 @@
   } else {
     /* Process any renames above the highwater mark. */
     for (; as->snaprename < as->T->nins; as->snaprename++) {
-      IRIns *ir = IR(as->snaprename);
+      IRIns *ir = &as->T->ir[as->snaprename];
       if (asm_snap_checkrename(as, ir->op1))
 	ir->op2 = REF_BIAS-1;  /* Kill rename. */
     }
@@ -1055,7 +1099,7 @@
     }
   } else {
     Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, sb));
-    /* Passing ir isn't strictly correct, but it's an IRT_P32, too. */
+    /* Passing ir isn't strictly correct, but it's an IRT_PGC, too. */
     emit_storeofs(as, ir, tmp, sb, offsetof(SBuf, p));
     emit_loadofs(as, ir, tmp, sb, offsetof(SBuf, b));
   }
@@ -1472,12 +1516,7 @@
       irt_clearmark(ir->t);
       /* Left PHI gained a spill slot before the loop? */
       if (ra_hasspill(ir->s)) {
-	IRRef ren;
-	lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno);
-	ren = tref_ref(lj_ir_emit(as->J));
-	as->ir = as->T->ir;  /* The IR may have been reallocated. */
-	IR(ren)->r = (uint8_t)r;
-	IR(ren)->s = SPS_NONE;
+	ra_addrename(as, r, lref, as->loopsnapno);
       }
     }
     rset_clear(work, r);
@@ -1552,6 +1591,8 @@
 #include "lj_asm_x86.h"
 #elif LJ_TARGET_ARM
 #include "lj_asm_arm.h"
+#elif LJ_TARGET_ARM64
+#include "lj_asm_arm64.h"
 #elif LJ_TARGET_PPC
 #include "lj_asm_ppc.h"
 #elif LJ_TARGET_MIPS
@@ -1888,7 +1929,7 @@
     SnapEntry sn = map[n-1];
     if ((sn & SNAP_FRAME)) {
       *gotframe = 1;
-      return snap_slot(sn);
+      return snap_slot(sn) - LJ_FR2;
     }
   }
   return 0;
@@ -1908,7 +1949,7 @@
 
   if (as->T->link == 0) {
     /* Setup fixed registers for exit to interpreter. */
-    const BCIns *pc = snap_pc(as->T->snapmap[snap->mapofs + snap->nent]);
+    const BCIns *pc = snap_pc(&as->T->snapmap[snap->mapofs + snap->nent]);
     int32_t mres;
     if (bc_op(*pc) == BC_JLOOP) {  /* NYI: find a better way to do this. */
       BCIns *retpc = &traceref(as->J, bc_d(*pc))->startins;
@@ -1915,9 +1956,13 @@
       if (bc_isret(bc_op(*retpc)))
 	pc = retpc;
     }
+#if LJ_GC64
+    emit_loadu64(as, RID_LPC, u64ptr(pc));
+#else
     ra_allockreg(as, i32ptr(J2GG(as->J)->dispatch), RID_DISPATCH);
     ra_allockreg(as, i32ptr(pc), RID_LPC);
-    mres = (int32_t)(snap->nslots - baseslot);
+#endif
+    mres = (int32_t)(snap->nslots - baseslot - LJ_FR2);
     switch (bc_op(*pc)) {
     case BC_CALLM: case BC_CALLMT:
       mres -= (int32_t)(1 + LJ_FR2 + bc_a(*pc) + bc_c(*pc)); break;
@@ -1932,6 +1977,11 @@
   }
   emit_addptr(as, RID_BASE, 8*(int32_t)baseslot);
 
+  if (as->J->ktrace) {  /* Patch ktrace slot with the final GCtrace pointer. */
+    setgcref(IR(as->J->ktrace)[LJ_GC64].gcr, obj2gco(as->J->curfinal));
+    IR(as->J->ktrace)->o = IR_KGC;
+  }
+
   /* Sync the interpreter state with the on-trace state. */
   asm_stack_restore(as, snap);
 
@@ -1957,17 +2007,22 @@
   ra_setup(as);
 
   /* Clear reg/sp for constants. */
-  for (ir = IR(T->nk), lastir = IR(REF_BASE); ir < lastir; ir++)
+  for (ir = IR(T->nk), lastir = IR(REF_BASE); ir < lastir; ir++) {
     ir->prev = REGSP_INIT;
+    if (irt_is64(ir->t) && ir->o != IR_KNULL) {
+#if LJ_GC64
+      ir->i = 0;  /* Will become non-zero only for RIP-relative addresses. */
+#else
+      /* Make life easier for backends by putting address of constant in i. */
+      ir->i = (int32_t)(intptr_t)(ir+1);
+#endif
+      ir++;
+    }
+  }
 
   /* REF_BASE is used for implicit references to the BASE register. */
   lastir->prev = REGSP_HINT(RID_BASE);
 
-  ir = IR(nins-1);
-  if (ir->o == IR_RENAME) {
-    do { ir--; nins--; } while (ir->o == IR_RENAME);
-    T->nins = nins;  /* Remove any renames left over from ASM restart. */
-  }
   as->snaprename = nins;
   as->snapref = nins;
   as->snapno = T->nsnap;
@@ -2150,7 +2205,10 @@
 #endif
 #if LJ_TARGET_X86ORX64
     /* Non-constant shift counts need to be in RID_ECX on x86/x64. */
-    case IR_BSHL: case IR_BSHR: case IR_BSAR: case IR_BROL: case IR_BROR:
+    case IR_BSHL: case IR_BSHR: case IR_BSAR:
+      if ((as->flags & JIT_F_BMI2))  /* Except if BMI2 is available. */
+	break;
+    case IR_BROL: case IR_BROR:
       if (!irref_isk(ir->op2) && !ra_hashint(IR(ir->op2)->r)) {
 	IR(ir->op2)->r = REGSP_HINT(RID_ECX);
 	if (inloop)
@@ -2196,14 +2254,25 @@
   ASMState *as = &as_;
   MCode *origtop;
 
+  /* Remove nops/renames left over from ASM restart due to LJ_TRERR_MCODELM. */
+  {
+    IRRef nins = T->nins;
+    IRIns *ir = &T->ir[nins-1];
+    if (ir->o == IR_NOP || ir->o == IR_RENAME) {
+      do { ir--; nins--; } while (ir->o == IR_NOP || ir->o == IR_RENAME);
+      T->nins = nins;
+    }
+  }
+
   /* Ensure an initialized instruction beyond the last one for HIOP checks. */
-  J->cur.nins = lj_ir_nextins(J);
-  J->cur.ir[J->cur.nins].o = IR_NOP;
+  /* This also allows one RENAME to be added without reallocating curfinal. */
+  as->orignins = lj_ir_nextins(J);
+  J->cur.ir[as->orignins].o = IR_NOP;
 
   /* Setup initial state. Copy some fields to reduce indirections. */
   as->J = J;
   as->T = T;
-  as->ir = T->ir;
+  J->curfinal = lj_trace_alloc(J->L, T);  /* This copies the IR, too. */
   as->flags = J->flags;
   as->loopref = J->loopref;
   as->realign = NULL;
@@ -2216,12 +2285,41 @@
   as->mclim = as->mcbot + MCLIM_REDZONE;
   asm_setup_target(as);
 
-  do {
+  /*
+  ** This is a loop, because the MCode may have to be (re-)assembled
+  ** multiple times:
+  **
+  ** 1. as->realign is set (and the assembly aborted), if the arch-specific
+  **    backend wants the MCode to be aligned differently.
+  **
+  **    This is currently only the case on x86/x64, where small loops get
+  **    an aligned loop body plus a short branch. Not much effort is wasted,
+  **    because the abort happens very quickly and only once.
+  **
+  ** 2. The IR is immovable, since the MCode embeds pointers to various
+  **    constants inside the IR. But RENAMEs may need to be added to the IR
+  **    during assembly, which might grow and reallocate the IR. We check
+  **    at the end if the IR (in J->cur.ir) has actually grown, resize the
+  **    copy (in J->curfinal.ir) and try again.
+  **
+  **    95% of all traces have zero RENAMEs, 3% have one RENAME, 1.5% have
+  **    2 RENAMEs and only 0.5% have more than that. That's why we opt to
+  **    always have one spare slot in the IR (see above), which means we
+  **    have to redo the assembly for only ~2% of all traces.
+  **
+  **    Very, very rarely, this needs to be done repeatedly, since the
+  **    location of constants inside the IR (actually, reachability from
+  **    a global pointer) may affect register allocation and thus the
+  **    number of RENAMEs.
+  */
+  for (;;) {
     as->mcp = as->mctop;
 #ifdef LUA_USE_ASSERT
     as->mcp_prev = as->mcp;
 #endif
-    as->curins = T->nins;
+    as->ir = J->curfinal->ir;  /* Use the copied IR. */
+    as->curins = J->cur.nins = as->orignins;
+
     RA_DBG_START();
     RA_DBGX((as, "===== STOP ====="));
 
@@ -2249,22 +2347,40 @@
       checkmclim(as);
       asm_ir(as, ir);
     }
-  } while (as->realign);  /* Retry in case the MCode needs to be realigned. */
 
-  /* Emit head of trace. */
-  RA_DBG_REF();
-  checkmclim(as);
-  if (as->gcsteps > 0) {
-    as->curins = as->T->snap[0].ref;
-    asm_snap_prep(as);  /* The GC check is a guard. */
-    asm_gc_check(as);
+    if (as->realign && J->curfinal->nins >= T->nins)
+      continue;  /* Retry in case only the MCode needs to be realigned. */
+
+    /* Emit head of trace. */
+    RA_DBG_REF();
+    checkmclim(as);
+    if (as->gcsteps > 0) {
+      as->curins = as->T->snap[0].ref;
+      asm_snap_prep(as);  /* The GC check is a guard. */
+      asm_gc_check(as);
+      as->curins = as->stopins;
+    }
+    ra_evictk(as);
+    if (as->parent)
+      asm_head_side(as);
+    else
+      asm_head_root(as);
+    asm_phi_fixup(as);
+
+    if (J->curfinal->nins >= T->nins) {  /* IR didn't grow? */
+      lua_assert(J->curfinal->nk == T->nk);
+      memcpy(J->curfinal->ir + as->orignins, T->ir + as->orignins,
+	     (T->nins - as->orignins) * sizeof(IRIns));  /* Copy RENAMEs. */
+      T->nins = J->curfinal->nins;
+      break;  /* Done. */
+    }
+
+    /* Otherwise try again with a bigger IR. */
+    lj_trace_free(J2G(J), J->curfinal);
+    J->curfinal = NULL;  /* In case lj_trace_alloc() OOMs. */
+    J->curfinal = lj_trace_alloc(J->L, T);
+    as->realign = NULL;
   }
-  ra_evictk(as);
-  if (as->parent)
-    asm_head_side(as);
-  else
-    asm_head_root(as);
-  asm_phi_fixup(as);
 
   RA_DBGX((as, "===== START ===="));
   RA_DBG_FLUSH();
@@ -2277,6 +2393,9 @@
   if (!as->loopref)
     asm_tail_fixup(as, T->link);  /* Note: this may change as->mctop! */
   T->szmcode = (MSize)((char *)as->mctop - (char *)as->mcp);
+#if LJ_TARGET_MCODE_FIXUP
+  asm_mcode_fixup(T->mcode, T->szmcode);
+#endif
   lj_mcode_sync(T->mcode, origtop);
 }
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** IR assembler (SSA IR -> machine code).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_ASM_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_arm.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_arm.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_arm.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** ARM IR assembler (SSA IR -> machine code).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* -- Register allocator extensions --------------------------------------- */
@@ -909,7 +909,6 @@
 
 static void asm_uref(ASMState *as, IRIns *ir)
 {
-  /* NYI: Check that UREFO is still open and not aliasing a slot. */
   Reg dest = ra_dest(as, ir, RSET_GPR);
   if (irref_isk(ir->op1)) {
     GCfunc *fn = ir_kfunc(IR(ir->op1));
@@ -998,22 +997,26 @@
 
 static void asm_fload(ASMState *as, IRIns *ir)
 {
-  Reg dest = ra_dest(as, ir, RSET_GPR);
-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);
-  ARMIns ai = asm_fxloadins(ir);
-  int32_t ofs;
-  if (ir->op2 == IRFL_TAB_ARRAY) {
-    ofs = asm_fuseabase(as, ir->op1);
-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */
-      emit_dn(as, ARMI_ADD|ARMI_K12|ofs, dest, idx);
-      return;
+  if (ir->op1 == REF_NIL) {
+    lua_assert(!ra_used(ir));  /* We can end up here if DCE is turned off. */
+  } else {
+    Reg dest = ra_dest(as, ir, RSET_GPR);
+    Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);
+    ARMIns ai = asm_fxloadins(ir);
+    int32_t ofs;
+    if (ir->op2 == IRFL_TAB_ARRAY) {
+      ofs = asm_fuseabase(as, ir->op1);
+      if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */
+	emit_dn(as, ARMI_ADD|ARMI_K12|ofs, dest, idx);
+	return;
+      }
     }
+    ofs = field_ofs[ir->op2];
+    if ((ai & 0x04000000))
+      emit_lso(as, ai, dest, idx, ofs);
+    else
+      emit_lsox(as, ai, dest, idx, ofs);
   }
-  ofs = field_ofs[ir->op2];
-  if ((ai & 0x04000000))
-    emit_lso(as, ai, dest, idx, ofs);
-  else
-    emit_lsox(as, ai, dest, idx, ofs);
 }
 
 static void asm_fstore(ASMState *as, IRIns *ir)

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_mips.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_mips.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_mips.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** MIPS IR assembler (SSA IR -> machine code).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* -- Register allocator extensions --------------------------------------- */
@@ -23,7 +23,7 @@
 {
   Reg r = IR(ref)->r;
   if (ra_noreg(r)) {
-    if (!(allow & RSET_FPR) && irref_isk(ref) && IR(ref)->i == 0)
+    if (!(allow & RSET_FPR) && irref_isk(ref) && get_kval(IR(ref)) == 0)
       return RID_ZERO;
     r = ra_allocref(as, ref, allow);
   } else {
@@ -166,9 +166,9 @@
     } else if (ir->o == IR_UREFC) {
       if (irref_isk(ir->op1)) {
 	GCfunc *fn = ir_kfunc(IR(ir->op1));
-	int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv);
-	int32_t jgl = (intptr_t)J2G(as->J);
-	if ((uint32_t)(ofs-jgl) < 65536) {
+	intptr_t ofs = (intptr_t)&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv;
+	intptr_t jgl = (intptr_t)J2G(as->J);
+	if ((uintptr_t)(ofs-jgl) < 65536) {
 	  *ofsp = ofs-jgl-32768;
 	  return RID_JGL;
 	} else {
@@ -190,20 +190,21 @@
   Reg base;
   if (ra_noreg(ir->r) && canfuse(as, ir)) {
     if (ir->o == IR_ADD) {
-      int32_t ofs2;
-      if (irref_isk(ir->op2) && (ofs2 = ofs + IR(ir->op2)->i, checki16(ofs2))) {
+      intptr_t ofs2;
+      if (irref_isk(ir->op2) && (ofs2 = ofs + get_kval(IR(ir->op2)),
+				 checki16(ofs2))) {
 	ref = ir->op1;
-	ofs = ofs2;
+	ofs = (int32_t)ofs2;
       }
     } else if (ir->o == IR_STRREF) {
-      int32_t ofs2 = 65536;
+      intptr_t ofs2 = 65536;
       lua_assert(ofs == 0);
       ofs = (int32_t)sizeof(GCstr);
       if (irref_isk(ir->op2)) {
-	ofs2 = ofs + IR(ir->op2)->i;
+	ofs2 = ofs + get_kval(IR(ir->op2));
 	ref = ir->op1;
       } else if (irref_isk(ir->op1)) {
-	ofs2 = ofs + IR(ir->op1)->i;
+	ofs2 = ofs + get_kval(IR(ir->op1));
 	ref = ir->op2;
       }
       if (!checki16(ofs2)) {
@@ -211,7 +212,7 @@
 	Reg right, left = ra_alloc2(as, ir, allow);
 	right = (left >> 8); left &= 255;
 	emit_hsi(as, mi, rt, RID_TMP, ofs);
-	emit_dst(as, MIPSI_ADDU, RID_TMP, left, right);
+	emit_dst(as, MIPSI_AADDU, RID_TMP, left, right);
 	return;
       }
       ofs = ofs2;
@@ -227,7 +228,7 @@
 static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)
 {
   uint32_t n, nargs = CCI_XNARGS(ci);
-  int32_t ofs = 16;
+  int32_t ofs = LJ_32 ? 16 : 0;
 #if LJ_SOFTFP
   Reg gpr = REGARG_FIRSTGPR;
 #else
@@ -249,15 +250,15 @@
 	  !(ci->flags & CCI_VARARG)) {
 	lua_assert(rset_test(as->freeset, fpr));  /* Already evicted. */
 	ra_leftov(as, fpr, ref);
-	fpr += 2;
-	gpr += irt_isnum(ir->t) ? 2 : 1;
+	fpr += LJ_32 ? 2 : 1;
+	gpr += (LJ_32 && irt_isnum(ir->t)) ? 2 : 1;
       } else
 #endif
       {
-#if !LJ_SOFTFP
+#if LJ_32 && !LJ_SOFTFP
 	fpr = REGARG_LASTFPR+1;
 #endif
-	if (irt_isnum(ir->t)) gpr = (gpr+1) & ~1;
+	if (LJ_32 && irt_isnum(ir->t)) gpr = (gpr+1) & ~1;
 	if (gpr <= REGARG_LASTGPR) {
 	  lua_assert(rset_test(as->freeset, gpr));  /* Already evicted. */
 #if !LJ_SOFTFP
@@ -269,13 +270,21 @@
 	    r = ra_alloc1(as, ref, RSET_FPR);
 	    as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1));
 	    if (irt_isnum(ir->t)) {
+#if LJ_32
 	      emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?0:1), r+1);
 	      emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?1:0), r);
 	      lua_assert(rset_test(as->freeset, gpr+1));  /* Already evicted. */
 	      gpr += 2;
+#else
+	      emit_tg(as, MIPSI_DMFC1, gpr, r);
+	      gpr++; fpr++;
+#endif
 	    } else if (irt_isfloat(ir->t)) {
 	      emit_tg(as, MIPSI_MFC1, gpr, r);
 	      gpr++;
+#if LJ_64
+	      fpr++;
+#endif
 	    }
 	  } else
 #endif
@@ -282,12 +291,20 @@
 	  {
 	    ra_leftov(as, gpr, ref);
 	    gpr++;
+#if LJ_64
+	    fpr++;
+#endif
 	  }
 	} else {
 	  Reg r = ra_alloc1z(as, ref, !LJ_SOFTFP && irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);
+#if LJ_32
 	  if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4;
 	  emit_spstore(as, ir, r, ofs);
 	  ofs += irt_isnum(ir->t) ? 8 : 4;
+#else
+	  emit_spstore(as, ir, r, ofs + ((LJ_BE && (LJ_SOFTFP || r < RID_MAX_GPR) && !irt_is64(ir->t)) ? 4 : 0));
+	  ofs += 8;
+#endif
 	}
       }
     } else {
@@ -294,10 +311,14 @@
 #if !LJ_SOFTFP
       fpr = REGARG_LASTFPR+1;
 #endif
-      if (gpr <= REGARG_LASTGPR)
+      if (gpr <= REGARG_LASTGPR) {
 	gpr++;
-      else
-	ofs += 4;
+#if LJ_64
+	fpr++;
+#endif
+      } else {
+	ofs += LJ_32 ? 4 : 8;
+      }
     }
     checkmclim(as);
   }
@@ -307,7 +328,9 @@
 static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)
 {
   RegSet drop = RSET_SCRATCH;
+#if LJ_32
   int hiop = ((ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));
+#endif
 #if !LJ_SOFTFP
   if ((ci->flags & CCI_NOFPRCLOBBER))
     drop &= ~RSET_FPR;
@@ -314,8 +337,10 @@
 #endif
   if (ra_hasreg(ir->r))
     rset_clear(drop, ir->r);  /* Dest reg handled below. */
+#if LJ_32
   if (hiop && ra_hasreg((ir+1)->r))
     rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */
+#endif
   ra_evictset(as, drop);  /* Evictions must be performed first. */
   if (ra_used(ir)) {
     lua_assert(!irt_ispri(ir->t));
@@ -326,18 +351,28 @@
 	if (ra_hasreg(dest)) {
 	  ra_free(as, dest);
 	  ra_modified(as, dest);
+#if LJ_32
 	  emit_tg(as, MIPSI_MTC1, RID_RETHI, dest+1);
 	  emit_tg(as, MIPSI_MTC1, RID_RETLO, dest);
+#else
+	  emit_tg(as, MIPSI_DMTC1, RID_RET, dest);
+#endif
 	}
 	if (ofs) {
+#if LJ_32
 	  emit_tsi(as, MIPSI_SW, RID_RETLO, RID_SP, ofs+(LJ_BE?4:0));
 	  emit_tsi(as, MIPSI_SW, RID_RETHI, RID_SP, ofs+(LJ_BE?0:4));
+#else
+	  emit_tsi(as, MIPSI_SD, RID_RET, RID_SP, ofs);
+#endif
 	}
       } else {
 	ra_destreg(as, ir, RID_FPRET);
       }
+#if LJ_32
     } else if (hiop) {
       ra_destpair(as, ir);
+#endif
     } else {
       ra_destreg(as, ir, RID_RET);
     }
@@ -356,7 +391,7 @@
   func = ir->op2; irf = IR(func);
   if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }
   if (irref_isk(func)) {  /* Call to constant address. */
-    ci.func = (ASMFunction)(void *)(irf->i);
+    ci.func = (ASMFunction)(void *)get_kval(irf);
   } else {  /* Need specific register for indirect calls. */
     Reg r = ra_alloc1(as, func, RID2RSET(RID_CFUNCADDR));
     MCode *p = as->mcp;
@@ -399,8 +434,8 @@
   emit_setgl(as, base, jit_base);
   emit_addptr(as, base, -8*delta);
   asm_guard(as, MIPSI_BNE, RID_TMP,
-	    ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base)));
-  emit_tsi(as, MIPSI_LW, RID_TMP, base, -8);
+	    ra_allock(as, igcptr(pc), rset_exclude(RSET_GPR, base)));
+  emit_tsi(as, MIPSI_AL, RID_TMP, base, -8);
 }
 
 /* -- Type conversions ---------------------------------------------------- */
@@ -435,10 +470,15 @@
 #if !LJ_SOFTFP
   int stfp = (st == IRT_NUM || st == IRT_FLOAT);
 #endif
+#if LJ_64
+  int st64 = (st == IRT_I64 || st == IRT_U64 || st == IRT_P64);
+#endif
   IRRef lref = ir->op1;
+#if LJ_32
   lua_assert(!(irt_isint64(ir->t) ||
 	       (st == IRT_I64 || st == IRT_U64))); /* Handled by SPLIT. */
-#if LJ_SOFTFP
+#endif
+#if LJ_32 && LJ_SOFTFP
   /* FP conversions are handled by SPLIT. */
   lua_assert(!irt_isfp(ir->t) && !(st == IRT_NUM || st == IRT_FLOAT));
   /* Can't check for same types: SPLIT uses CONV int.int + BXOR for sfp NEG. */
@@ -453,26 +493,50 @@
       /* y = (x ^ 0x8000000) + 2147483648.0 */
       Reg left = ra_alloc1(as, lref, RSET_GPR);
       Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, dest));
-      emit_fgh(as, irt_isfloat(ir->t) ? MIPSI_ADD_S : MIPSI_ADD_D,
-	       dest, dest, tmp);
-      emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W,
-	      dest, dest);
       if (irt_isfloat(ir->t))
-	emit_lsptr(as, MIPSI_LWC1, (tmp & 31),
-		   (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)),
-		   RSET_GPR);
-      else
-	emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
-		   (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)),
-		   RSET_GPR);
+	emit_fg(as, MIPSI_CVT_S_D, dest, dest);
+      /* Must perform arithmetic with doubles to keep the precision. */
+      emit_fgh(as, MIPSI_ADD_D, dest, dest, tmp);
+      emit_fg(as, MIPSI_CVT_D_W, dest, dest);
+      emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
+		 (void *)&as->J->k64[LJ_K64_2P31], RSET_GPR);
       emit_tg(as, MIPSI_MTC1, RID_TMP, dest);
       emit_dst(as, MIPSI_XOR, RID_TMP, RID_TMP, left);
       emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000);
+#if LJ_64
+    } else if(st == IRT_U64) {  /* U64 to FP conversion. */
+      /* if (x >= 1u<<63) y = (double)(int64_t)(x&(1u<<63)-1) + pow(2.0, 63) */
+      Reg left = ra_alloc1(as, lref, RSET_GPR);
+      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, dest));
+      MCLabel l_end = emit_label(as);
+      if (irt_isfloat(ir->t)) {
+	emit_fgh(as, MIPSI_ADD_S, dest, dest, tmp);
+	emit_lsptr(as, MIPSI_LWC1, (tmp & 31), (void *)&as->J->k32[LJ_K32_2P63],
+		   rset_exclude(RSET_GPR, left));
+	emit_fg(as, MIPSI_CVT_S_L, dest, dest);
+      } else {
+	emit_fgh(as, MIPSI_ADD_D, dest, dest, tmp);
+	emit_lsptr(as, MIPSI_LDC1, (tmp & 31), (void *)&as->J->k64[LJ_K64_2P63],
+		   rset_exclude(RSET_GPR, left));
+	emit_fg(as, MIPSI_CVT_D_L, dest, dest);
+      }
+      emit_branch(as, MIPSI_BGEZ, left, RID_ZERO, l_end);
+      emit_tg(as, MIPSI_DMTC1, RID_TMP, dest);
+      emit_tsml(as, MIPSI_DEXTM, RID_TMP, left, 30, 0);
+#endif
     } else {  /* Integer to FP conversion. */
       Reg left = ra_alloc1(as, lref, RSET_GPR);
+#if LJ_32
       emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W,
 	      dest, dest);
       emit_tg(as, MIPSI_MTC1, left, dest);
+#else
+      MIPSIns mi = irt_isfloat(ir->t) ?
+	(st64 ? MIPSI_CVT_S_L : MIPSI_CVT_S_W) :
+	(st64 ? MIPSI_CVT_D_L : MIPSI_CVT_D_W);
+      emit_fg(as, mi, dest, dest);
+      emit_tg(as, st64 ? MIPSI_DMTC1 : MIPSI_MTC1, left, dest);
+#endif
     }
   } else if (stfp) {  /* FP to integer conversion. */
     if (irt_isguard(ir->t)) {
@@ -483,7 +547,7 @@
       Reg dest = ra_dest(as, ir, RSET_GPR);
       Reg left = ra_alloc1(as, lref, RSET_FPR);
       Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));
-      if (irt_isu32(ir->t)) {
+      if (irt_isu32(ir->t)) {  /* FP to U32 conversion. */
 	/* y = (int)floor(x - 2147483648.0) ^ 0x80000000 */
 	emit_dst(as, MIPSI_XOR, dest, dest, RID_TMP);
 	emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000);
@@ -494,16 +558,54 @@
 		 tmp, left, tmp);
 	if (st == IRT_FLOAT)
 	  emit_lsptr(as, MIPSI_LWC1, (tmp & 31),
-		     (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)),
-		     RSET_GPR);
+		     (void *)&as->J->k32[LJ_K32_2P31], RSET_GPR);
 	else
 	  emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
-		     (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)),
-		     RSET_GPR);
+		     (void *)&as->J->k64[LJ_K64_2P31], RSET_GPR);
+#if LJ_64
+      } else if (irt_isu64(ir->t)) {  /* FP to U64 conversion. */
+	MCLabel l_end;
+	emit_tg(as, MIPSI_DMFC1, dest, tmp);
+	l_end = emit_label(as);
+	/* For inputs >= 2^63 add -2^64 and convert again. */
+	if (st == IRT_NUM) {
+	  emit_fg(as, MIPSI_TRUNC_L_D, tmp, tmp);
+	  emit_fgh(as, MIPSI_ADD_D, tmp, left, tmp);
+	  emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
+		     (void *)&as->J->k64[LJ_K64_M2P64],
+		     rset_exclude(RSET_GPR, dest));
+	  emit_fg(as, MIPSI_TRUNC_L_D, tmp, left);  /* Delay slot. */
+	  emit_branch(as, MIPSI_BC1T, 0, 0, l_end);
+	  emit_fgh(as, MIPSI_C_OLT_D, 0, left, tmp);
+	  emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
+		     (void *)&as->J->k64[LJ_K64_2P63],
+		     rset_exclude(RSET_GPR, dest));
+	} else {
+	  emit_fg(as, MIPSI_TRUNC_L_S, tmp, tmp);
+	  emit_fgh(as, MIPSI_ADD_S, tmp, left, tmp);
+	  emit_lsptr(as, MIPSI_LWC1, (tmp & 31),
+		     (void *)&as->J->k32[LJ_K32_M2P64],
+		     rset_exclude(RSET_GPR, dest));
+	  emit_fg(as, MIPSI_TRUNC_L_S, tmp, left);  /* Delay slot. */
+	  emit_branch(as, MIPSI_BC1T, 0, 0, l_end);
+	  emit_fgh(as, MIPSI_C_OLT_S, 0, left, tmp);
+	  emit_lsptr(as, MIPSI_LWC1, (tmp & 31),
+		     (void *)&as->J->k32[LJ_K32_2P63],
+		     rset_exclude(RSET_GPR, dest));
+	}
+#endif
       } else {
+#if LJ_32
 	emit_tg(as, MIPSI_MFC1, dest, tmp);
 	emit_fg(as, st == IRT_FLOAT ? MIPSI_TRUNC_W_S : MIPSI_TRUNC_W_D,
 		tmp, left);
+#else
+	MIPSIns mi = irt_is64(ir->t) ?
+	  (st == IRT_NUM ? MIPSI_TRUNC_L_D : MIPSI_TRUNC_L_S) :
+	  (st == IRT_NUM ? MIPSI_TRUNC_W_D : MIPSI_TRUNC_W_S);
+	emit_tg(as, irt_is64(ir->t) ? MIPSI_DMFC1 : MIPSI_MFC1, dest, left);
+	emit_fg(as, mi, left, left);
+#endif
       }
     }
   } else
@@ -514,7 +616,7 @@
       Reg left = ra_alloc1(as, ir->op1, RSET_GPR);
       lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));
       if ((ir->op2 & IRCONV_SEXT)) {
-	if ((as->flags & JIT_F_MIPS32R2)) {
+	if (LJ_64 || (as->flags & JIT_F_MIPSXXR2)) {
 	  emit_dst(as, st == IRT_I8 ? MIPSI_SEB : MIPSI_SEH, dest, 0, left);
 	} else {
 	  uint32_t shift = st == IRT_I8 ? 24 : 16;
@@ -526,8 +628,35 @@
 		 (int32_t)(st == IRT_U8 ? 0xff : 0xffff));
       }
     } else {  /* 32/64 bit integer conversions. */
+#if LJ_32
       /* Only need to handle 32/32 bit no-op (cast) on 32 bit archs. */
       ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */
+#else
+      if (irt_is64(ir->t)) {
+	if (st64) {
+	  /* 64/64 bit no-op (cast)*/
+	  ra_leftov(as, dest, lref);
+	} else {
+	  Reg left = ra_alloc1(as, lref, RSET_GPR);
+	  if ((ir->op2 & IRCONV_SEXT)) {  /* 32 to 64 bit sign extension. */
+	    emit_dta(as, MIPSI_SLL, dest, left, 0);
+	  } else {  /* 32 to 64 bit zero extension. */
+	    emit_tsml(as, MIPSI_DEXT, dest, left, 31, 0);
+	  }
+	}
+      } else {
+	if (st64) {
+	  /* This is either a 32 bit reg/reg mov which zeroes the hiword
+	  ** or a load of the loword from a 64 bit address.
+	  */
+	  Reg left = ra_alloc1(as, lref, RSET_GPR);
+	  emit_tsml(as, MIPSI_DEXT, dest, left, 31, 0);
+	} else {  /* 32/32 bit no-op (cast). */
+	  /* Do nothing, but may need to move regs. */
+	  ra_leftov(as, dest, lref);
+	}
+      }
+#endif
     }
   }
 }
@@ -570,12 +699,38 @@
   args[1] = ASMREF_TMP1;  /* TValue *n  */
   asm_gencall(as, ci, args);
   /* Store the result to the spill slot or temp slots. */
-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1),
+  emit_tsi(as, MIPSI_AADDIU, ra_releasetmp(as, ASMREF_TMP1),
 	   RID_SP, ofs);
 }
 
 /* -- Memory references --------------------------------------------------- */
 
+#if LJ_64
+/* Store tagged value for ref at base+ofs. */
+static void asm_tvstore64(ASMState *as, Reg base, int32_t ofs, IRRef ref)
+{
+  RegSet allow = rset_exclude(RSET_GPR, base);
+  IRIns *ir = IR(ref);
+  lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));
+  if (irref_isk(ref)) {
+    TValue k;
+    lj_ir_kvalue(as->J->L, &k, ir);
+    emit_tsi(as, MIPSI_SD, ra_allock(as, (int64_t)k.u64, allow), base, ofs);
+  } else {
+    Reg src = ra_alloc1(as, ref, allow);
+    Reg type = ra_allock(as, (int64_t)irt_toitype(ir->t) << 47,
+			 rset_exclude(allow, src));
+    emit_tsi(as, MIPSI_SD, RID_TMP, base, ofs);
+    if (irt_isinteger(ir->t)) {
+      emit_dst(as, MIPSI_DADDU, RID_TMP, RID_TMP, type);
+      emit_tsml(as, MIPSI_DEXT, RID_TMP, src, 31, 0);
+    } else {
+      emit_dst(as, MIPSI_DADDU, RID_TMP, src, type);
+    }
+  }
+}
+#endif
+
 /* Get pointer to TValue. */
 static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)
 {
@@ -582,11 +737,12 @@
   IRIns *ir = IR(ref);
   if (irt_isnum(ir->t)) {
     if (irref_isk(ref))  /* Use the number constant itself as a TValue. */
-      ra_allockreg(as, i32ptr(ir_knum(ir)), dest);
+      ra_allockreg(as, igcptr(ir_knum(ir)), dest);
     else  /* Otherwise force a spill and use the spill slot. */
-      emit_tsi(as, MIPSI_ADDIU, dest, RID_SP, ra_spill(as, ir));
+      emit_tsi(as, MIPSI_AADDIU, dest, RID_SP, ra_spill(as, ir));
   } else {
     /* Otherwise use g->tmptv to hold the TValue. */
+#if LJ_32
     RegSet allow = rset_exclude(RSET_GPR, dest);
     Reg type;
     emit_tsi(as, MIPSI_ADDIU, dest, RID_JGL, (int32_t)(offsetof(global_State, tmptv)-32768));
@@ -599,6 +755,11 @@
     else
       type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);
     emit_setgl(as, type, tmptv.it);
+#else
+    asm_tvstore64(as, dest, 0, ref);
+    emit_tsi(as, MIPSI_DADDIU, dest, RID_JGL,
+	     (int32_t)(offsetof(global_State, tmptv)-32768));
+#endif
   }
 }
 
@@ -613,13 +774,13 @@
     ofs += 8*IR(ir->op2)->i;
     if (checki16(ofs)) {
       base = ra_alloc1(as, refa, RSET_GPR);
-      emit_tsi(as, MIPSI_ADDIU, dest, base, ofs);
+      emit_tsi(as, MIPSI_AADDIU, dest, base, ofs);
       return;
     }
   }
   base = ra_alloc1(as, ir->op1, RSET_GPR);
   idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));
-  emit_dst(as, MIPSI_ADDU, dest, RID_TMP, base);
+  emit_dst(as, MIPSI_AADDU, dest, RID_TMP, base);
   emit_dta(as, MIPSI_SLL, RID_TMP, idx, 3);
 }
 
@@ -640,19 +801,19 @@
   Reg key = RID_NONE, type = RID_NONE, tmpnum = RID_NONE, tmp1 = RID_TMP, tmp2;
   IRRef refkey = ir->op2;
   IRIns *irkey = IR(refkey);
+  int isk = irref_isk(refkey);
   IRType1 kt = irkey->t;
   uint32_t khash;
   MCLabel l_end, l_loop, l_next;
 
   rset_clear(allow, tab);
-#if LJ_SOFTFP
-  if (!irref_isk(refkey)) {
+#if LJ_32 && LJ_SOFTFP
+  if (!isk) {
     key = ra_alloc1(as, refkey, allow);
     rset_clear(allow, key);
     if (irkey[1].o == IR_HIOP) {
       if (ra_hasreg((irkey+1)->r)) {
-	tmpnum = (irkey+1)->r;
-	type = RID_TMP;
+	type = tmpnum = (irkey+1)->r;
 	tmp1 = ra_scratch(as, allow);
 	rset_clear(allow, tmp1);
 	ra_noweak(as, tmpnum);
@@ -672,8 +833,10 @@
   } else if (!irt_ispri(kt)) {
     key = ra_alloc1(as, refkey, allow);
     rset_clear(allow, key);
+#if LJ_32
     type = ra_allock(as, (int32_t)irt_toitype(irkey->t), allow);
     rset_clear(allow, type);
+#endif
   }
 #endif
   tmp2 = ra_scratch(as, allow);
@@ -687,9 +850,9 @@
   else if (destused)
     emit_loada(as, dest, niltvg(J2G(as->J)));
   /* Follow hash chain until the end. */
-  emit_move(as, dest, tmp2);
+  emit_move(as, dest, tmp1);
   l_loop = --as->mcp;
-  emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, next));
+  emit_tsi(as, MIPSI_AL, tmp1, dest, (int32_t)offsetof(Node, next));
   l_next = emit_label(as);
 
   /* Type and value comparison. */
@@ -701,38 +864,66 @@
     emit_branch(as, MIPSI_BC1T, 0, 0, l_end);
     emit_fgh(as, MIPSI_C_EQ_D, 0, tmpnum, key);
     *--as->mcp = MIPSI_NOP;  /* Avoid NaN comparison overhead. */
-    emit_branch(as, MIPSI_BEQ, tmp2, RID_ZERO, l_next);
-    emit_tsi(as, MIPSI_SLTIU, tmp2, tmp2, (int32_t)LJ_TISNUM);
+    emit_branch(as, MIPSI_BEQ, tmp1, RID_ZERO, l_next);
+    emit_tsi(as, MIPSI_SLTIU, tmp1, tmp1, (int32_t)LJ_TISNUM);
+#if LJ_32
     emit_hsi(as, MIPSI_LDC1, tmpnum, dest, (int32_t)offsetof(Node, key.n));
   } else {
     if (irt_ispri(kt)) {
-      emit_branch(as, MIPSI_BEQ, tmp2, type, l_end);
+      emit_branch(as, MIPSI_BEQ, tmp1, type, l_end);
     } else {
-      emit_branch(as, MIPSI_BEQ, tmp1, key, l_end);
-      emit_tsi(as, MIPSI_LW, tmp1, dest, (int32_t)offsetof(Node, key.gcr));
-      emit_branch(as, MIPSI_BNE, tmp2, type, l_next);
+      emit_branch(as, MIPSI_BEQ, tmp2, key, l_end);
+      emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, key.gcr));
+      emit_branch(as, MIPSI_BNE, tmp1, type, l_next);
     }
   }
-  emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, key.it));
-  *l_loop = MIPSI_BNE | MIPSF_S(tmp2) | ((as->mcp-l_loop-1) & 0xffffu);
+  emit_tsi(as, MIPSI_LW, tmp1, dest, (int32_t)offsetof(Node, key.it));
+  *l_loop = MIPSI_BNE | MIPSF_S(tmp1) | ((as->mcp-l_loop-1) & 0xffffu);
+#else
+    emit_dta(as, MIPSI_DSRA32, tmp1, tmp1, 15);
+    emit_tg(as, MIPSI_DMTC1, tmp1, tmpnum);
+    emit_tsi(as, MIPSI_LD, tmp1, dest, (int32_t)offsetof(Node, key.u64));
+  } else if (irt_isaddr(kt)) {
+    Reg refk = tmp2;
+    if (isk) {
+      int64_t k = ((int64_t)irt_toitype(irkey->t) << 47) | irkey[1].tv.u64;
+      refk = ra_allock(as, k, allow);
+      rset_clear(allow, refk);
+    }
+    emit_branch(as, MIPSI_BEQ, tmp1, refk, l_end);
+    emit_tsi(as, MIPSI_LD, tmp1, dest, offsetof(Node, key));
+  } else {
+    Reg pri = ra_allock(as, ~((int64_t)~irt_toitype(ir->t) << 47), allow);
+    rset_clear(allow, pri);
+    lua_assert(irt_ispri(kt) && !irt_isnil(kt));
+    emit_branch(as, MIPSI_BEQ, tmp1, pri, l_end);
+    emit_tsi(as, MIPSI_LD, tmp1, dest, offsetof(Node, key));
+  }
+  *l_loop = MIPSI_BNE | MIPSF_S(tmp1) | ((as->mcp-l_loop-1) & 0xffffu);
+  if (!isk && irt_isaddr(kt)) {
+    type = ra_allock(as, (int64_t)irt_toitype(kt) << 47, allow);
+    emit_dst(as, MIPSI_DADDU, tmp2, key, type);
+    rset_clear(allow, type);
+  }
+#endif
 
   /* Load main position relative to tab->node into dest. */
-  khash = irref_isk(refkey) ? ir_khash(irkey) : 1;
+  khash = isk ? ir_khash(irkey) : 1;
   if (khash == 0) {
-    emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node));
+    emit_tsi(as, MIPSI_AL, dest, tab, (int32_t)offsetof(GCtab, node));
   } else {
     Reg tmphash = tmp1;
-    if (irref_isk(refkey))
+    if (isk)
       tmphash = ra_allock(as, khash, allow);
-    emit_dst(as, MIPSI_ADDU, dest, dest, tmp1);
+    emit_dst(as, MIPSI_AADDU, dest, dest, tmp1);
     lua_assert(sizeof(Node) == 24);
     emit_dst(as, MIPSI_SUBU, tmp1, tmp2, tmp1);
     emit_dta(as, MIPSI_SLL, tmp1, tmp1, 3);
     emit_dta(as, MIPSI_SLL, tmp2, tmp1, 5);
     emit_dst(as, MIPSI_AND, tmp1, tmp2, tmphash);
-    emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node));
+    emit_tsi(as, MIPSI_AL, dest, tab, (int32_t)offsetof(GCtab, node));
     emit_tsi(as, MIPSI_LW, tmp2, tab, (int32_t)offsetof(GCtab, hmask));
-    if (irref_isk(refkey)) {
+    if (isk) {
       /* Nothing to do. */
     } else if (irt_isstr(kt)) {
       emit_tsi(as, MIPSI_LW, tmp1, key, (int32_t)offsetof(GCstr, hash));
@@ -742,9 +933,10 @@
       emit_dst(as, MIPSI_XOR, tmp1, tmp1, tmp2);
       emit_rotr(as, tmp1, tmp1, dest, (-HASH_ROT2-HASH_ROT1)&31);
       emit_dst(as, MIPSI_SUBU, tmp2, tmp2, dest);
+#if LJ_32
       if (LJ_SOFTFP ? (irkey[1].o == IR_HIOP) : irt_isnum(kt)) {
 	emit_dst(as, MIPSI_XOR, tmp2, tmp2, tmp1);
-	if ((as->flags & JIT_F_MIPS32R2)) {
+	if ((as->flags & JIT_F_MIPSXXR2)) {
 	  emit_dta(as, MIPSI_ROTR, dest, tmp1, (-HASH_ROT1)&31);
 	} else {
 	  emit_dst(as, MIPSI_OR, dest, dest, tmp1);
@@ -764,6 +956,23 @@
 	emit_rotr(as, dest, tmp1, tmp2, (-HASH_ROT1)&31);
 	emit_dst(as, MIPSI_ADDU, tmp1, key, ra_allock(as, HASH_BIAS, allow));
       }
+#else
+      emit_dst(as, MIPSI_XOR, tmp2, tmp2, tmp1);
+      emit_dta(as, MIPSI_ROTR, dest, tmp1, (-HASH_ROT1)&31);
+      if (irt_isnum(kt)) {
+	emit_dst(as, MIPSI_ADDU, tmp1, tmp1, tmp1);
+	emit_dta(as, MIPSI_DSRA32, tmp1, tmp1, 0);
+	emit_dta(as, MIPSI_SLL, tmp2, LJ_SOFTFP ? key : tmp1, 0);
+#if !LJ_SOFTFP
+	emit_tg(as, MIPSI_DMFC1, tmp1, key);
+#endif
+      } else {
+	checkmclim(as);
+	emit_dta(as, MIPSI_DSRA32, tmp1, tmp1, 0);
+	emit_dta(as, MIPSI_SLL, tmp2, key, 0);
+	emit_dst(as, MIPSI_DADDU, tmp1, key, type);
+      }
+#endif
     }
   }
 }
@@ -776,9 +985,15 @@
   int32_t kofs = ofs + (int32_t)offsetof(Node, key);
   Reg dest = (ra_used(ir)||ofs > 32736) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;
   Reg node = ra_alloc1(as, ir->op1, RSET_GPR);
-  Reg key = RID_NONE, type = RID_TMP, idx = node;
   RegSet allow = rset_exclude(RSET_GPR, node);
+  Reg idx = node;
+#if LJ_32
+  Reg key = RID_NONE, type = RID_TMP;
   int32_t lo, hi;
+#else
+  Reg key = ra_scratch(as, allow);
+  int64_t k;
+#endif
   lua_assert(ofs % sizeof(Node) == 0);
   if (ofs > 32736) {
     idx = dest;
@@ -785,8 +1000,9 @@
     rset_clear(allow, dest);
     kofs = (int32_t)offsetof(Node, key);
   } else if (ra_hasreg(dest)) {
-    emit_tsi(as, MIPSI_ADDIU, dest, node, ofs);
+    emit_tsi(as, MIPSI_AADDIU, dest, node, ofs);
   }
+#if LJ_32
   if (!irt_ispri(irkey->t)) {
     key = ra_scratch(as, allow);
     rset_clear(allow, key);
@@ -805,30 +1021,41 @@
   asm_guard(as, MIPSI_BNE, type, hi ? ra_allock(as, hi, allow) : RID_ZERO);
   if (ra_hasreg(key)) emit_tsi(as, MIPSI_LW, key, idx, kofs+(LJ_BE?4:0));
   emit_tsi(as, MIPSI_LW, type, idx, kofs+(LJ_BE?0:4));
+#else
+  if (irt_ispri(irkey->t)) {
+    lua_assert(!irt_isnil(irkey->t));
+    k = ~((int64_t)~irt_toitype(irkey->t) << 47);
+  } else if (irt_isnum(irkey->t)) {
+    k = (int64_t)ir_knum(irkey)->u64;
+  } else {
+    k = ((int64_t)irt_toitype(irkey->t) << 47) | (int64_t)ir_kgc(irkey);
+  }
+  asm_guard(as, MIPSI_BNE, key, ra_allock(as, k, allow));
+  emit_tsi(as, MIPSI_LD, key, idx, kofs);
+#endif
   if (ofs > 32736)
-    emit_tsi(as, MIPSI_ADDU, dest, node, ra_allock(as, ofs, allow));
+    emit_tsi(as, MIPSI_AADDU, dest, node, ra_allock(as, ofs, allow));
 }
 
 static void asm_uref(ASMState *as, IRIns *ir)
 {
-  /* NYI: Check that UREFO is still open and not aliasing a slot. */
   Reg dest = ra_dest(as, ir, RSET_GPR);
   if (irref_isk(ir->op1)) {
     GCfunc *fn = ir_kfunc(IR(ir->op1));
     MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;
-    emit_lsptr(as, MIPSI_LW, dest, v, RSET_GPR);
+    emit_lsptr(as, MIPSI_AL, dest, v, RSET_GPR);
   } else {
     Reg uv = ra_scratch(as, RSET_GPR);
     Reg func = ra_alloc1(as, ir->op1, RSET_GPR);
     if (ir->o == IR_UREFC) {
       asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
-      emit_tsi(as, MIPSI_ADDIU, dest, uv, (int32_t)offsetof(GCupval, tv));
+      emit_tsi(as, MIPSI_AADDIU, dest, uv, (int32_t)offsetof(GCupval, tv));
       emit_tsi(as, MIPSI_LBU, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));
     } else {
-      emit_tsi(as, MIPSI_LW, dest, uv, (int32_t)offsetof(GCupval, v));
+      emit_tsi(as, MIPSI_AL, dest, uv, (int32_t)offsetof(GCupval, v));
     }
-    emit_tsi(as, MIPSI_LW, uv, func,
-	     (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));
+    emit_tsi(as, MIPSI_AL, uv, func, (int32_t)offsetof(GCfuncL, uvptr) +
+	     (int32_t)sizeof(MRef) * (int32_t)(ir->op2 >> 8));
   }
 }
 
@@ -840,6 +1067,7 @@
 
 static void asm_strref(ASMState *as, IRIns *ir)
 {
+#if LJ_32
   Reg dest = ra_dest(as, ir, RSET_GPR);
   IRRef ref = ir->op2, refk = ir->op1;
   int32_t ofs = (int32_t)sizeof(GCstr);
@@ -871,6 +1099,20 @@
   else
     emit_dst(as, MIPSI_ADDU, dest, r,
 	     ra_allock(as, ofs, rset_exclude(RSET_GPR, r)));
+#else
+  RegSet allow = RSET_GPR;
+  Reg dest = ra_dest(as, ir, allow);
+  Reg base = ra_alloc1(as, ir->op1, allow);
+  IRIns *irr = IR(ir->op2);
+  int32_t ofs = sizeof(GCstr);
+  rset_clear(allow, base);
+  if (irref_isk(ir->op2) && checki16(ofs + irr->i)) {
+    emit_tsi(as, MIPSI_DADDIU, dest, base, ofs + irr->i);
+  } else {
+    emit_tsi(as, MIPSI_DADDIU, dest, dest, ofs);
+    emit_dst(as, MIPSI_DADDU, dest, base, ra_alloc1(as, ir->op2, allow));
+  }
+#endif
 }
 
 /* -- Loads and stores ---------------------------------------------------- */
@@ -884,7 +1126,7 @@
   case IRT_U16: return MIPSI_LHU;
   case IRT_NUM: lua_assert(!LJ_SOFTFP); return MIPSI_LDC1;
   case IRT_FLOAT: if (!LJ_SOFTFP) return MIPSI_LWC1;
-  default: return MIPSI_LW;
+  default: return (LJ_64 && irt_is64(ir->t)) ? MIPSI_LD : MIPSI_LW;
   }
 }
 
@@ -895,7 +1137,7 @@
   case IRT_I16: case IRT_U16: return MIPSI_SH;
   case IRT_NUM: lua_assert(!LJ_SOFTFP); return MIPSI_SDC1;
   case IRT_FLOAT: if (!LJ_SOFTFP) return MIPSI_SWC1;
-  default: return MIPSI_SW;
+  default: return (LJ_64 && irt_is64(ir->t)) ? MIPSI_SD : MIPSI_SW;
   }
 }
 
@@ -902,17 +1144,23 @@
 static void asm_fload(ASMState *as, IRIns *ir)
 {
   Reg dest = ra_dest(as, ir, RSET_GPR);
-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);
   MIPSIns mi = asm_fxloadins(ir);
+  Reg idx;
   int32_t ofs;
-  if (ir->op2 == IRFL_TAB_ARRAY) {
-    ofs = asm_fuseabase(as, ir->op1);
-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */
-      emit_tsi(as, MIPSI_ADDIU, dest, idx, ofs);
-      return;
+  if (ir->op1 == REF_NIL) {
+    idx = RID_JGL;
+    ofs = (ir->op2 << 2) - 32768 - GG_OFS(g);
+  } else {
+    idx = ra_alloc1(as, ir->op1, RSET_GPR);
+    if (ir->op2 == IRFL_TAB_ARRAY) {
+      ofs = asm_fuseabase(as, ir->op1);
+      if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */
+	emit_tsi(as, MIPSI_AADDIU, dest, idx, ofs);
+	return;
+      }
     }
+    ofs = field_ofs[ir->op2];
   }
-  ofs = field_ofs[ir->op2];
   lua_assert(!irt_isfp(ir->t));
   emit_tsi(as, mi, dest, idx, ofs);
 }
@@ -952,36 +1200,59 @@
 
 static void asm_ahuvload(ASMState *as, IRIns *ir)
 {
-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);
-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);
+  int hiop = (LJ_32 && LJ_SOFTFP && (ir+1)->o == IR_HIOP);
   Reg dest = RID_NONE, type = RID_TMP, idx;
   RegSet allow = RSET_GPR;
   int32_t ofs = 0;
-  if (hiop && ra_used(ir+1)) {
-    type = ra_dest(as, ir+1, allow);
-    rset_clear(allow, type);
+  IRType1 t = ir->t;
+  if (hiop) {
+    t.irt = IRT_NUM;
+    if (ra_used(ir+1)) {
+      type = ra_dest(as, ir+1, allow);
+      rset_clear(allow, type);
+    }
   }
   if (ra_used(ir)) {
     lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||
 	       irt_isint(ir->t) || irt_isaddr(ir->t));
-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);
+    dest = ra_dest(as, ir, (!LJ_SOFTFP && irt_isnum(t)) ? RSET_FPR : allow);
     rset_clear(allow, dest);
+#if LJ_64
+    if (irt_isaddr(t))
+      emit_tsml(as, MIPSI_DEXTM, dest, dest, 14, 0);
+    else if (irt_isint(t))
+      emit_dta(as, MIPSI_SLL, dest, dest, 0);
+#endif
   }
   idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
   rset_clear(allow, idx);
-  if (t == IRT_NUM) {
+  if (irt_isnum(t)) {
     asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
     emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);
   } else {
-    asm_guard(as, MIPSI_BNE, type, ra_allock(as, irt_toitype_(t), allow));
+    asm_guard(as, MIPSI_BNE, type,
+	      ra_allock(as, (int32_t)irt_toitype(t), allow));
   }
+#if LJ_32
   if (ra_hasreg(dest)) {
-    if (!LJ_SOFTFP && t == IRT_NUM)
+    if (!LJ_SOFTFP && irt_isnum(t))
       emit_hsi(as, MIPSI_LDC1, dest, idx, ofs);
     else
       emit_tsi(as, MIPSI_LW, dest, idx, ofs+(LJ_BE?4:0));
   }
   emit_tsi(as, MIPSI_LW, type, idx, ofs+(LJ_BE?0:4));
+#else
+  if (ra_hasreg(dest)) {
+    if (!LJ_SOFTFP && irt_isnum(t)) {
+      emit_hsi(as, MIPSI_LDC1, dest, idx, ofs);
+      dest = type;
+    }
+  } else {
+    dest = type;
+  }
+  emit_dta(as, MIPSI_DSRA32, type, dest, 15);
+  emit_tsi(as, MIPSI_LD, dest, idx, ofs);
+#endif
 }
 
 static void asm_ahustore(ASMState *as, IRIns *ir)
@@ -993,38 +1264,64 @@
     return;
   if (!LJ_SOFTFP && irt_isnum(ir->t)) {
     src = ra_alloc1(as, ir->op2, RSET_FPR);
+    idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
+    emit_hsi(as, MIPSI_SDC1, src, idx, ofs);
   } else {
-    int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);
+#if LJ_32
     if (!irt_ispri(ir->t)) {
       src = ra_alloc1(as, ir->op2, allow);
       rset_clear(allow, src);
     }
-    if (hiop)
+    if (LJ_SOFTFP && (ir+1)->o == IR_HIOP)
       type = ra_alloc1(as, (ir+1)->op2, allow);
     else
       type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);
     rset_clear(allow, type);
-  }
-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {
-    emit_hsi(as, MIPSI_SDC1, src, idx, ofs);
-  } else {
+    idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
     if (ra_hasreg(src))
       emit_tsi(as, MIPSI_SW, src, idx, ofs+(LJ_BE?4:0));
     emit_tsi(as, MIPSI_SW, type, idx, ofs+(LJ_BE?0:4));
+#else
+    Reg tmp = RID_TMP;
+    if (irt_ispri(ir->t)) {
+      tmp = ra_allock(as, ~((int64_t)~irt_toitype(ir->t) << 47), allow);
+      rset_clear(allow, tmp);
+    } else {
+      src = ra_alloc1(as, ir->op2, allow);
+      rset_clear(allow, src);
+      type = ra_allock(as, (int64_t)irt_toitype(ir->t) << 47, allow);
+      rset_clear(allow, type);
+    }
+    idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
+    emit_tsi(as, MIPSI_SD, tmp, idx, ofs);
+    if (ra_hasreg(src)) {
+      if (irt_isinteger(ir->t)) {
+	emit_dst(as, MIPSI_DADDU, tmp, tmp, type);
+	emit_tsml(as, MIPSI_DEXT, tmp, src, 31, 0);
+      } else {
+	emit_dst(as, MIPSI_DADDU, tmp, src, type);
+      }
+    }
+#endif
   }
 }
 
 static void asm_sload(ASMState *as, IRIns *ir)
 {
-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);
-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);
-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);
   Reg dest = RID_NONE, type = RID_NONE, base;
   RegSet allow = RSET_GPR;
+  IRType1 t = ir->t;
+#if LJ_32
+  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);
+  int hiop = (LJ_32 && LJ_SOFTFP && (ir+1)->o == IR_HIOP);
+  if (hiop)
+    t.irt = IRT_NUM;
+#else
+  int32_t ofs = 8*((int32_t)ir->op1-2);
+#endif
   lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */
   lua_assert(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK));
-#if LJ_SOFTFP
+#if LJ_32 && LJ_SOFTFP
   lua_assert(!(ir->op2 & IRSLOAD_CONVERT));  /* Handled by LJ_SOFTFP SPLIT. */
   if (hiop && ra_used(ir+1)) {
     type = ra_dest(as, ir+1, allow);
@@ -1031,59 +1328,62 @@
     rset_clear(allow, type);
   }
 #else
-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(ir->t) && t == IRT_INT) {
+  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) {
     dest = ra_scratch(as, RSET_FPR);
     asm_tointg(as, ir, dest);
-    t = IRT_NUM;  /* Continue with a regular number type check. */
+    t.irt = IRT_NUM;  /* Continue with a regular number type check. */
   } else
 #endif
   if (ra_used(ir)) {
     lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||
 	       irt_isint(ir->t) || irt_isaddr(ir->t));
-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);
+    dest = ra_dest(as, ir, (!LJ_SOFTFP && irt_isnum(t)) ? RSET_FPR : allow);
     rset_clear(allow, dest);
     base = ra_alloc1(as, REF_BASE, allow);
     rset_clear(allow, base);
     if (!LJ_SOFTFP && (ir->op2 & IRSLOAD_CONVERT)) {
-      if (t == IRT_INT) {
+      if (irt_isint(t)) {
 	Reg tmp = ra_scratch(as, RSET_FPR);
 	emit_tg(as, MIPSI_MFC1, dest, tmp);
 	emit_fg(as, MIPSI_TRUNC_W_D, tmp, tmp);
 	dest = tmp;
-	t = IRT_NUM;  /* Check for original type. */
+	t.irt = IRT_NUM;  /* Check for original type. */
       } else {
 	Reg tmp = ra_scratch(as, RSET_GPR);
 	emit_fg(as, MIPSI_CVT_D_W, dest, dest);
 	emit_tg(as, MIPSI_MTC1, tmp, dest);
 	dest = tmp;
-	t = IRT_INT;  /* Check for original type. */
+	t.irt = IRT_INT;  /* Check for original type. */
       }
     }
+#if LJ_64
+    else if (irt_isaddr(t)) {
+      /* Clear type from pointers. */
+      emit_tsml(as, MIPSI_DEXTM, dest, dest, 14, 0);
+    } else if (irt_isint(t) && (ir->op2 & IRSLOAD_TYPECHECK)) {
+      /* Sign-extend integers. */
+      emit_dta(as, MIPSI_SLL, dest, dest, 0);
+    }
+#endif
     goto dotypecheck;
   }
   base = ra_alloc1(as, REF_BASE, allow);
   rset_clear(allow, base);
 dotypecheck:
+#if LJ_32
   if ((ir->op2 & IRSLOAD_TYPECHECK)) {
-    if (ra_noreg(type)) {
-      if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 &&
-	  rset_test((as->freeset & allow), dest+1)) {
-	type = dest+1;
-	ra_modified(as, type);
-      } else {
-	type = RID_TMP;
-      }
-    }
-    if (t == IRT_NUM) {
+    if (ra_noreg(type))
+      type = RID_TMP;
+    if (irt_isnum(t)) {
       asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
       emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);
     } else {
-      Reg ktype = ra_allock(as, irt_toitype_(t), allow);
+      Reg ktype = ra_allock(as, irt_toitype(t), allow);
       asm_guard(as, MIPSI_BNE, type, ktype);
     }
   }
   if (ra_hasreg(dest)) {
-    if (!LJ_SOFTFP && t == IRT_NUM)
+    if (!LJ_SOFTFP && irt_isnum(t))
       emit_hsi(as, MIPSI_LDC1, dest, base, ofs);
     else
       emit_tsi(as, MIPSI_LW, dest, base, ofs ^ (LJ_BE?4:0));
@@ -1090,6 +1390,33 @@
   }
   if (ra_hasreg(type))
     emit_tsi(as, MIPSI_LW, type, base, ofs ^ (LJ_BE?0:4));
+#else
+  if ((ir->op2 & IRSLOAD_TYPECHECK)) {
+    type = dest < RID_MAX_GPR ? dest : RID_TMP;
+    if (irt_ispri(t)) {
+      asm_guard(as, MIPSI_BNE, type,
+		ra_allock(as, ~((int64_t)~irt_toitype(t) << 47) , allow));
+    } else {
+      if (irt_isnum(t)) {
+	asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
+	emit_tsi(as, MIPSI_SLTIU, RID_TMP, RID_TMP, (int32_t)LJ_TISNUM);
+	if (ra_hasreg(dest))
+	  emit_hsi(as, MIPSI_LDC1, dest, base, ofs);
+      } else {
+	asm_guard(as, MIPSI_BNE, RID_TMP,
+		  ra_allock(as, (int32_t)irt_toitype(t), allow));
+      }
+      emit_dta(as, MIPSI_DSRA32, RID_TMP, type, 15);
+    }
+    emit_tsi(as, MIPSI_LD, type, base, ofs);
+  } else if (ra_hasreg(dest)) {
+    if (irt_isnum(t))
+      emit_hsi(as, MIPSI_LDC1, dest, base, ofs);
+    else
+      emit_tsi(as, irt_isint(t) ? MIPSI_LW : MIPSI_LD, dest, base,
+	       ofs ^ ((LJ_BE && irt_isint(t)) ? 4 : 0));
+  }
+#endif
 }
 
 /* -- Allocations --------------------------------------------------------- */
@@ -1116,8 +1443,8 @@
   /* Initialize immutable cdata object. */
   if (ir->o == IR_CNEWI) {
     RegSet allow = (RSET_GPR & ~RSET_SCRATCH);
+#if LJ_32
     int32_t ofs = sizeof(GCcdata);
-    lua_assert(sz == 4 || sz == 8);
     if (sz == 8) {
       ofs += 4;
       lua_assert((ir+1)->o == IR_HIOP);
@@ -1130,6 +1457,11 @@
       if (ofs == sizeof(GCcdata)) break;
       ofs -= 4; if (LJ_BE) ir++; else ir--;
     }
+#else
+    emit_tsi(as, MIPSI_SD, ra_alloc1(as, ir->op2, allow),
+	     RID_RET, sizeof(GCcdata));
+#endif
+    lua_assert(sz == 4 || sz == 8);
   } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */
     ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];
     args[0] = ASMREF_L;     /* lua_State *L */
@@ -1164,7 +1496,7 @@
   Reg mark = ra_scratch(as, rset_exclude(RSET_GPR, tab));
   Reg link = RID_TMP;
   MCLabel l_end = emit_label(as);
-  emit_tsi(as, MIPSI_SW, link, tab, (int32_t)offsetof(GCtab, gclist));
+  emit_tsi(as, MIPSI_AS, link, tab, (int32_t)offsetof(GCtab, gclist));
   emit_tsi(as, MIPSI_SB, mark, tab, (int32_t)offsetof(GCtab, marked));
   emit_setgl(as, tab, gc.grayagain);
   emit_getgl(as, link, gc.grayagain);
@@ -1187,7 +1519,7 @@
   args[0] = ASMREF_TMP1;  /* global_State *g */
   args[1] = ir->op1;      /* TValue *tv      */
   asm_gencall(as, ci, args);
-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);
+  emit_tsi(as, MIPSI_AADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);
   obj = IR(ir->op1)->r;
   tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));
   emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);
@@ -1233,8 +1565,9 @@
 
 static void asm_add(ASMState *as, IRIns *ir)
 {
+  IRType1 t = ir->t;
 #if !LJ_SOFTFP
-  if (irt_isnum(ir->t)) {
+  if (irt_isnum(t)) {
     asm_fparith(as, ir, MIPSI_ADD_D);
   } else
 #endif
@@ -1242,14 +1575,16 @@
     Reg dest = ra_dest(as, ir, RSET_GPR);
     Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);
     if (irref_isk(ir->op2)) {
-      int32_t k = IR(ir->op2)->i;
+      intptr_t k = get_kval(IR(ir->op2));
       if (checki16(k)) {
-	emit_tsi(as, MIPSI_ADDIU, dest, left, k);
+	emit_tsi(as, (LJ_64 && irt_is64(t)) ? MIPSI_DADDIU : MIPSI_ADDIU, dest,
+		 left, k);
 	return;
       }
     }
     right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));
-    emit_dst(as, MIPSI_ADDU, dest, left, right);
+    emit_dst(as, (LJ_64 && irt_is64(t)) ? MIPSI_DADDU : MIPSI_ADDU, dest,
+	     left, right);
   }
 }
 
@@ -1264,7 +1599,8 @@
     Reg dest = ra_dest(as, ir, RSET_GPR);
     Reg right, left = ra_alloc2(as, ir, RSET_GPR);
     right = (left >> 8); left &= 255;
-    emit_dst(as, MIPSI_SUBU, dest, left, right);
+    emit_dst(as, (LJ_64 && irt_is64(ir->t)) ? MIPSI_DSUBU : MIPSI_SUBU, dest,
+	     left, right);
   }
 }
 
@@ -1279,14 +1615,50 @@
     Reg dest = ra_dest(as, ir, RSET_GPR);
     Reg right, left = ra_alloc2(as, ir, RSET_GPR);
     right = (left >> 8); left &= 255;
-    emit_dst(as, MIPSI_MUL, dest, left, right);
+    if (LJ_64 && irt_is64(ir->t)) {
+      emit_dst(as, MIPSI_MFLO, dest, 0, 0);
+      emit_dst(as, MIPSI_DMULT, 0, left, right);
+    } else {
+      emit_dst(as, MIPSI_MUL, dest, left, right);
+    }
   }
 }
 
-#define asm_div(as, ir)		asm_fparith(as, ir, MIPSI_DIV_D)
-#define asm_mod(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_modi)
-#define asm_pow(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_powi)
+static void asm_mod(ASMState *as, IRIns *ir)
+{
+#if LJ_64 && LJ_HASFFI
+  if (!irt_isint(ir->t))
+    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 :
+					  IRCALL_lj_carith_modu64);
+  else
+#endif
+    asm_callid(as, ir, IRCALL_lj_vm_modi);
+}
 
+#if !LJ_SOFTFP
+static void asm_pow(ASMState *as, IRIns *ir)
+{
+#if LJ_64 && LJ_HASFFI
+  if (!irt_isnum(ir->t))
+    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 :
+					  IRCALL_lj_carith_powu64);
+  else
+#endif
+    asm_callid(as, ir, IRCALL_lj_vm_powi);
+}
+
+static void asm_div(ASMState *as, IRIns *ir)
+{
+#if LJ_64 && LJ_HASFFI
+  if (!irt_isnum(ir->t))
+    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 :
+					  IRCALL_lj_carith_divu64);
+  else
+#endif
+    asm_fparith(as, ir, MIPSI_DIV_D);
+}
+#endif
+
 static void asm_neg(ASMState *as, IRIns *ir)
 {
 #if !LJ_SOFTFP
@@ -1297,7 +1669,8 @@
   {
     Reg dest = ra_dest(as, ir, RSET_GPR);
     Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);
-    emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left);
+    emit_dst(as, (LJ_64 && irt_is64(ir->t)) ? MIPSI_DSUBU : MIPSI_SUBU, dest,
+	     RID_ZERO, left);
   }
 }
 
@@ -1308,6 +1681,7 @@
 static void asm_arithov(ASMState *as, IRIns *ir)
 {
   Reg right, left, tmp, dest = ra_dest(as, ir, RSET_GPR);
+  lua_assert(!irt_is64(ir->t));
   if (irref_isk(ir->op2)) {
     int k = IR(ir->op2)->i;
     if (ir->o == IR_SUBOV) k = -k;
@@ -1355,7 +1729,7 @@
   emit_dst(as, MIPSI_MULT, 0, left, right);
 }
 
-#if LJ_HASFFI
+#if LJ_32 && LJ_HASFFI
 static void asm_add64(ASMState *as, IRIns *ir)
 {
   Reg dest = ra_dest(as, ir, RSET_GPR);
@@ -1457,7 +1831,8 @@
 {
   Reg dest = ra_dest(as, ir, RSET_GPR);
   Reg left = ra_alloc1(as, ir->op1, RSET_GPR);
-  if ((as->flags & JIT_F_MIPS32R2)) {
+#if LJ_32
+  if ((as->flags & JIT_F_MIPSXXR2)) {
     emit_dta(as, MIPSI_ROTR, dest, RID_TMP, 16);
     emit_dst(as, MIPSI_WSBH, RID_TMP, 0, left);
   } else {
@@ -1472,6 +1847,15 @@
     emit_dta(as, MIPSI_SRL, tmp, left, 24);
     emit_dta(as, MIPSI_SLL, RID_TMP, left, 24);
   }
+#else
+  if (irt_is64(ir->t)) {
+    emit_dst(as, MIPSI_DSHD, dest, 0, RID_TMP);
+    emit_dst(as, MIPSI_DSBH, RID_TMP, 0, left);
+  } else {
+    emit_dta(as, MIPSI_ROTR, dest, RID_TMP, 16);
+    emit_dst(as, MIPSI_WSBH, RID_TMP, 0, left);
+  }
+#endif
 }
 
 static void asm_bitop(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)
@@ -1479,7 +1863,7 @@
   Reg dest = ra_dest(as, ir, RSET_GPR);
   Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);
   if (irref_isk(ir->op2)) {
-    int32_t k = IR(ir->op2)->i;
+    intptr_t k = get_kval(IR(ir->op2));
     if (checku16(k)) {
       emit_tsi(as, mik, dest, left, k);
       return;
@@ -1497,11 +1881,14 @@
 {
   Reg dest = ra_dest(as, ir, RSET_GPR);
   if (irref_isk(ir->op2)) {  /* Constant shifts. */
-    uint32_t shift = (uint32_t)(IR(ir->op2)->i & 31);
-    emit_dta(as, mik, dest, ra_hintalloc(as, ir->op1, dest, RSET_GPR), shift);
+    uint32_t shift = (uint32_t)IR(ir->op2)->i;
+    if (LJ_64 && irt_is64(ir->t)) mik |= (shift & 32) ? MIPSI_D32 : MIPSI_D;
+    emit_dta(as, mik, dest, ra_hintalloc(as, ir->op1, dest, RSET_GPR),
+	     (shift & 31));
   } else {
     Reg right, left = ra_alloc2(as, ir, RSET_GPR);
     right = (left >> 8); left &= 255;
+    if (LJ_64 && irt_is64(ir->t)) mi |= MIPSI_DV;
     emit_dst(as, mi, dest, right, left);  /* Shift amount is in rs. */
   }
 }
@@ -1513,7 +1900,7 @@
 
 static void asm_bror(ASMState *as, IRIns *ir)
 {
-  if ((as->flags & JIT_F_MIPS32R2)) {
+  if (LJ_64 || (as->flags & JIT_F_MIPSXXR2)) {
     asm_bitshift(as, ir, MIPSI_ROTRV, MIPSI_ROTR);
   } else {
     Reg dest = ra_dest(as, ir, RSET_GPR);
@@ -1532,7 +1919,7 @@
   }
 }
 
-#if LJ_SOFTFP
+#if LJ_32 && LJ_SOFTFP
 static void asm_sfpmin_max(ASMState *as, IRIns *ir)
 {
   CCallInfo ci = lj_ir_callinfo[(IROp)ir->o == IR_MIN ? IRCALL_lj_vm_sfmin : IRCALL_lj_vm_sfmax];
@@ -1581,7 +1968,7 @@
 
 /* -- Comparisons --------------------------------------------------------- */
 
-#if LJ_SOFTFP
+#if LJ_32 && LJ_SOFTFP
 /* SFP comparisons. */
 static void asm_sfpcomp(ASMState *as, IRIns *ir)
 {
@@ -1654,13 +2041,13 @@
   } else {
     Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);
     if (op == IR_ABC) op = IR_UGT;
-    if ((op&4) == 0 && irref_isk(ir->op2) && IR(ir->op2)->i == 0) {
+    if ((op&4) == 0 && irref_isk(ir->op2) && get_kval(IR(ir->op2)) == 0) {
       MIPSIns mi = (op&2) ? ((op&1) ? MIPSI_BLEZ : MIPSI_BGTZ) :
 			    ((op&1) ? MIPSI_BLTZ : MIPSI_BGEZ);
       asm_guard(as, mi, left, 0);
     } else {
       if (irref_isk(ir->op2)) {
-	int32_t k = IR(ir->op2)->i;
+	intptr_t k = get_kval(IR(ir->op2));
 	if ((op&2)) k++;
 	if (checki16(k)) {
 	  asm_guard(as, (op&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);
@@ -1679,7 +2066,8 @@
 
 static void asm_equal(ASMState *as, IRIns *ir)
 {
-  Reg right, left = ra_alloc2(as, ir, (!LJ_SOFTFP && irt_isnum(ir->t)) ? RSET_FPR : RSET_GPR);
+  Reg right, left = ra_alloc2(as, ir, (!LJ_SOFTFP && irt_isnum(ir->t)) ?
+				       RSET_FPR : RSET_GPR);
   right = (left >> 8); left &= 255;
   if (!LJ_SOFTFP && irt_isnum(ir->t)) {
     asm_guard(as, (ir->o & 1) ? MIPSI_BC1T : MIPSI_BC1F, 0, 0);
@@ -1689,7 +2077,7 @@
   }
 }
 
-#if LJ_HASFFI
+#if LJ_32 && LJ_HASFFI
 /* 64 bit integer comparisons. */
 static void asm_comp64(ASMState *as, IRIns *ir)
 {
@@ -1731,7 +2119,7 @@
 /* Hiword op of a split 64 bit op. Previous op must be the loword op. */
 static void asm_hiop(ASMState *as, IRIns *ir)
 {
-#if LJ_HASFFI || LJ_SOFTFP
+#if LJ_32 && (LJ_HASFFI || LJ_SOFTFP)
   /* HIOP is marked as a store because it needs its own DCE logic. */
   int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */
   if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;
@@ -1835,23 +2223,27 @@
   Reg tmp, pbase = irp ? (ra_hasreg(irp->r) ? irp->r : RID_TMP) : RID_BASE;
   ExitNo oldsnap = as->snapno;
   rset_clear(allow, pbase);
+#if LJ_32
   tmp = allow ? rset_pickbot(allow) :
 		(pbase == RID_RETHI ? RID_RETLO : RID_RETHI);
+#else
+  tmp = allow ? rset_pickbot(allow) : RID_RET;
+#endif
   as->snapno = exitno;
   asm_guard(as, MIPSI_BNE, RID_TMP, RID_ZERO);
   as->snapno = oldsnap;
   if (allow == RSET_EMPTY)  /* Restore temp. register. */
-    emit_tsi(as, MIPSI_LW, tmp, RID_SP, 0);
+    emit_tsi(as, MIPSI_AL, tmp, RID_SP, 0);
   else
     ra_modified(as, tmp);
   emit_tsi(as, MIPSI_SLTIU, RID_TMP, RID_TMP, (int32_t)(8*topslot));
-  emit_dst(as, MIPSI_SUBU, RID_TMP, tmp, pbase);
-  emit_tsi(as, MIPSI_LW, tmp, tmp, offsetof(lua_State, maxstack));
+  emit_dst(as, MIPSI_ASUBU, RID_TMP, tmp, pbase);
+  emit_tsi(as, MIPSI_AL, tmp, tmp, offsetof(lua_State, maxstack));
   if (pbase == RID_TMP)
     emit_getgl(as, RID_TMP, jit_base);
   emit_getgl(as, tmp, cur_L);
   if (allow == RSET_EMPTY)  /* Spill temp. register. */
-    emit_tsi(as, MIPSI_SW, tmp, RID_SP, 0);
+    emit_tsi(as, MIPSI_AS, tmp, RID_SP, 0);
 }
 
 /* Restore Lua stack from on-trace state. */
@@ -1858,13 +2250,15 @@
 static void asm_stack_restore(ASMState *as, SnapShot *snap)
 {
   SnapEntry *map = &as->T->snapmap[snap->mapofs];
-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];
+#if LJ_32 || defined(LUA_USE_ASSERT)
+  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1-LJ_FR2];
+#endif
   MSize n, nent = snap->nent;
   /* Store the value of all modified slots to the Lua stack. */
   for (n = 0; n < nent; n++) {
     SnapEntry sn = map[n];
     BCReg s = snap_slot(sn);
-    int32_t ofs = 8*((int32_t)s-1);
+    int32_t ofs = 8*((int32_t)s-1-LJ_FR2);
     IRRef ref = snap_ref(sn);
     IRIns *ir = IR(ref);
     if ((sn & SNAP_NORESTORE))
@@ -1884,8 +2278,9 @@
       emit_hsi(as, MIPSI_SDC1, src, RID_BASE, ofs);
 #endif
     } else {
+#if LJ_32
+      RegSet allow = rset_exclude(RSET_GPR, RID_BASE);
       Reg type;
-      RegSet allow = rset_exclude(RSET_GPR, RID_BASE);
       lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));
       if (!irt_ispri(ir->t)) {
 	Reg src = ra_alloc1(as, ref, allow);
@@ -1903,6 +2298,9 @@
 	type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);
       }
       emit_tsi(as, MIPSI_SW, type, RID_BASE, ofs+(LJ_BE?0:4));
+#else
+      asm_tvstore64(as, RID_BASE, ofs, ref);
+#endif
     }
     checkmclim(as);
   }
@@ -1926,7 +2324,7 @@
   args[0] = ASMREF_TMP1;  /* global_State *g */
   args[1] = ASMREF_TMP2;  /* MSize steps     */
   asm_gencall(as, ci, args);
-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);
+  emit_tsi(as, MIPSI_AADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);
   tmp = ra_releasetmp(as, ASMREF_TMP2);
   emit_loadi(as, tmp, as->gcsteps);
   /* Jump around GC step if GC total < GC threshold. */
@@ -2001,7 +2399,7 @@
   MCode *target = lnk ? traceref(as->J,lnk)->mcode : (MCode *)lj_vm_exit_interp;
   int32_t spadj = as->T->spadjust;
   MCode *p = as->mctop-1;
-  *p = spadj ? (MIPSI_ADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP;
+  *p = spadj ? (MIPSI_AADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP;
   p[-1] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);
 }
 
@@ -2019,9 +2417,14 @@
 {
   IRRef args[CCI_NARGS_MAX*2];
   uint32_t i, nargs = CCI_XNARGS(ci);
+#if LJ_32
   int nslots = 4, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;
+#else
+  int nslots = 0, ngpr = REGARG_NUMGPR;
+#endif
   asm_collectargs(as, ir, ci, args);
   for (i = 0; i < nargs; i++) {
+#if LJ_32
     if (!LJ_SOFTFP && args[i] && irt_isfp(IR(args[i])->t) &&
 	nfpr > 0 && !(ci->flags & CCI_VARARG)) {
       nfpr--;
@@ -2034,6 +2437,9 @@
       nfpr = 0;
       if (ngpr > 0) ngpr--; else nslots++;
     }
+#else
+    if (ngpr > 0) ngpr--; else nslots += 2;
+#endif
   }
   if (nslots > as->evenspill)  /* Leave room for args in stack slots. */
     as->evenspill = nslots;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_ppc.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_ppc.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_ppc.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** PPC IR assembler (SSA IR -> machine code).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* -- Register allocator extensions --------------------------------------- */
@@ -393,8 +393,7 @@
   emit_asi(as, PPCI_XORIS, RID_TMP, dest, 0x8000);
   emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);
   emit_lsptr(as, PPCI_LFS, (fbias & 31),
-	     (void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)),
-	     RSET_GPR);
+	     (void *)&as->J->k32[LJ_K32_2P52_2P31], RSET_GPR);
   emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);
   emit_fb(as, PPCI_FCTIWZ, tmp, left);
 }
@@ -433,13 +432,11 @@
       Reg left = ra_alloc1(as, lref, allow);
       Reg hibias = ra_allock(as, 0x43300000, rset_clear(allow, left));
       Reg fbias = ra_scratch(as, rset_exclude(RSET_FPR, dest));
-      const float *kbias;
       if (irt_isfloat(ir->t)) emit_fb(as, PPCI_FRSP, dest, dest);
       emit_fab(as, PPCI_FSUB, dest, dest, fbias);
       emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP);
-      kbias = (const float *)lj_ir_k64_find(as->J, U64x(59800004,59800000));
-      if (st == IRT_U32) kbias++;
-      emit_lsptr(as, PPCI_LFS, (fbias & 31), (void *)kbias,
+      emit_lsptr(as, PPCI_LFS, (fbias & 31),
+		 &as->J->k32[st == IRT_U32 ? LJ_K32_2P52 : LJ_K32_2P52_2P31],
 		 rset_clear(allow, hibias));
       emit_tai(as, PPCI_STW, st == IRT_U32 ? left : RID_TMP,
 	       RID_SP, SPOFS_TMPLO);
@@ -472,8 +469,7 @@
 	emit_fb(as, PPCI_FCTIWZ, tmp, tmp);
 	emit_fab(as, PPCI_FSUB, tmp, left, tmp);
 	emit_lsptr(as, PPCI_LFS, (tmp & 31),
-		   (void *)lj_ir_k64_find(as->J, U64x(4f000000,00000000)),
-		   RSET_GPR);
+		   (void *)&as->J->k32[LJ_K32_2P31], RSET_GPR);
       } else {
 	emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);
 	emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);
@@ -717,7 +713,6 @@
 
 static void asm_uref(ASMState *as, IRIns *ir)
 {
-  /* NYI: Check that UREFO is still open and not aliasing a slot. */
   Reg dest = ra_dest(as, ir, RSET_GPR);
   if (irref_isk(ir->op1)) {
     GCfunc *fn = ir_kfunc(IR(ir->op1));
@@ -809,17 +804,23 @@
 static void asm_fload(ASMState *as, IRIns *ir)
 {
   Reg dest = ra_dest(as, ir, RSET_GPR);
-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);
   PPCIns pi = asm_fxloadins(ir);
+  Reg idx;
   int32_t ofs;
-  if (ir->op2 == IRFL_TAB_ARRAY) {
-    ofs = asm_fuseabase(as, ir->op1);
-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */
-      emit_tai(as, PPCI_ADDI, dest, idx, ofs);
-      return;
+  if (ir->op1 == REF_NIL) {
+    idx = RID_JGL;
+    ofs = (ir->op2 << 2) - 32768;
+  } else {
+    idx = ra_alloc1(as, ir->op1, RSET_GPR);
+    if (ir->op2 == IRFL_TAB_ARRAY) {
+      ofs = asm_fuseabase(as, ir->op1);
+      if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */
+	emit_tai(as, PPCI_ADDI, dest, idx, ofs);
+	return;
+      }
     }
+    ofs = field_ofs[ir->op2];
   }
-  ofs = field_ofs[ir->op2];
   lua_assert(!irt_isi8(ir->t));
   emit_tai(as, pi, dest, idx, ofs);
 }
@@ -975,7 +976,7 @@
 	emit_fab(as, PPCI_FSUB, dest, dest, fbias);
 	emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP);
 	emit_lsptr(as, PPCI_LFS, (fbias & 31),
-		   (void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)),
+		   (void *)&as->J->k32[LJ_K32_2P52_2P31],
 		   rset_clear(allow, hibias));
 	emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPLO);
 	emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_x86.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_x86.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_asm_x86.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** x86/x64 IR assembler (SSA IR -> machine code).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* -- Guard handling ------------------------------------------------------ */
@@ -21,6 +21,7 @@
   }
   /* Push the high byte of the exitno for each exit stub group. */
   *mxp++ = XI_PUSHi8; *mxp++ = (MCode)((group*EXITSTUBS_PER_GROUP)>>8);
+#if !LJ_GC64
   /* Store DISPATCH at original stack slot 0. Account for the two push ops. */
   *mxp++ = XI_MOVmi;
   *mxp++ = MODRM(XM_OFS8, 0, RID_ESP);
@@ -27,6 +28,7 @@
   *mxp++ = MODRM(XM_SCALE1, RID_ESP, RID_ESP);
   *mxp++ = 2*sizeof(void *);
   *(int32_t *)mxp = ptr2addr(J2GG(as->J)->dispatch); mxp += 4;
+#endif
   /* Jump to exit handler which fills in the ExitState. */
   *mxp++ = XI_JMP; mxp += 4;
   *((int32_t *)(mxp-4)) = jmprel(mxp, (MCode *)(void *)lj_vm_exit_handler);
@@ -62,10 +64,14 @@
     target = p;
     cc ^= 1;
     if (as->realign) {
+      if (LJ_GC64 && LJ_UNLIKELY(as->mrm.base == RID_RIP))
+	as->mrm.ofs += 2;  /* Fixup RIP offset for pending fused load. */
       emit_sjcc(as, cc, target);
       return;
     }
   }
+  if (LJ_GC64 && LJ_UNLIKELY(as->mrm.base == RID_RIP))
+    as->mrm.ofs += 6;  /* Fixup RIP offset for pending fused load. */
   emit_jcc(as, cc, target);
 }
 
@@ -79,6 +85,15 @@
 {
   if (irref_isk(ref)) {
     IRIns *ir = IR(ref);
+#if LJ_GC64
+    if (ir->o == IR_KNULL || !irt_is64(ir->t)) {
+      *k = ir->i;
+      return 1;
+    } else if (checki32((int64_t)ir_k64(ir)->u64)) {
+      *k = (int32_t)ir_k64(ir)->u64;
+      return 1;
+    }
+#else
     if (ir->o != IR_KINT64) {
       *k = ir->i;
       return 1;
@@ -86,6 +101,7 @@
       *k = (int32_t)ir_kint64(ir)->u64;
       return 1;
     }
+#endif
   }
   return 0;
 }
@@ -185,9 +201,19 @@
       if (irref_isk(ir->op1)) {
 	GCfunc *fn = ir_kfunc(IR(ir->op1));
 	GCupval *uv = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv;
+#if LJ_GC64
+	int64_t ofs = dispofs(as, &uv->tv);
+	if (checki32(ofs) && checki32(ofs+4)) {
+	  as->mrm.ofs = (int32_t)ofs;
+	  as->mrm.base = RID_DISPATCH;
+	  as->mrm.idx = RID_NONE;
+	  return;
+	}
+#else
 	as->mrm.ofs = ptr2addr(&uv->tv);
 	as->mrm.base = as->mrm.idx = RID_NONE;
 	return;
+#endif
       }
       break;
     default:
@@ -205,14 +231,40 @@
 static void asm_fusefref(ASMState *as, IRIns *ir, RegSet allow)
 {
   lua_assert(ir->o == IR_FLOAD || ir->o == IR_FREF);
+  as->mrm.idx = RID_NONE;
+  if (ir->op1 == REF_NIL) {
+#if LJ_GC64
+    as->mrm.ofs = (int32_t)(ir->op2 << 2) - GG_OFS(dispatch);
+    as->mrm.base = RID_DISPATCH;
+#else
+    as->mrm.ofs = (int32_t)(ir->op2 << 2) + ptr2addr(J2GG(as->J));
+    as->mrm.base = RID_NONE;
+#endif
+    return;
+  }
   as->mrm.ofs = field_ofs[ir->op2];
-  as->mrm.idx = RID_NONE;
   if (irref_isk(ir->op1)) {
-    as->mrm.ofs += IR(ir->op1)->i;
+    IRIns *op1 = IR(ir->op1);
+#if LJ_GC64
+    if (ir->op1 == REF_NIL) {
+      as->mrm.ofs -= GG_OFS(dispatch);
+      as->mrm.base = RID_DISPATCH;
+      return;
+    } else if (op1->o == IR_KPTR || op1->o == IR_KKPTR) {
+      intptr_t ofs = dispofs(as, ir_kptr(op1));
+      if (checki32(as->mrm.ofs + ofs)) {
+	as->mrm.ofs += (int32_t)ofs;
+	as->mrm.base = RID_DISPATCH;
+	return;
+      }
+    }
+#else
+    as->mrm.ofs += op1->i;
     as->mrm.base = RID_NONE;
-  } else {
-    as->mrm.base = (uint8_t)ra_alloc1(as, ir->op1, allow);
+    return;
+#endif
   }
+  as->mrm.base = (uint8_t)ra_alloc1(as, ir->op1, allow);
 }
 
 /* Fuse string reference into memory operand. */
@@ -223,7 +275,7 @@
   as->mrm.base = as->mrm.idx = RID_NONE;
   as->mrm.scale = XM_SCALE1;
   as->mrm.ofs = sizeof(GCstr);
-  if (irref_isk(ir->op1)) {
+  if (!LJ_GC64 && irref_isk(ir->op1)) {
     as->mrm.ofs += IR(ir->op1)->i;
   } else {
     Reg r = ra_alloc1(as, ir->op1, allow);
@@ -255,10 +307,20 @@
   IRIns *ir = IR(ref);
   as->mrm.idx = RID_NONE;
   if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {
+#if LJ_GC64
+    intptr_t ofs = dispofs(as, ir_kptr(ir));
+    if (checki32(ofs)) {
+      as->mrm.ofs = (int32_t)ofs;
+      as->mrm.base = RID_DISPATCH;
+      return;
+    }
+  } if (0) {
+#else
     as->mrm.ofs = ir->i;
     as->mrm.base = RID_NONE;
   } else if (ir->o == IR_STRREF) {
     asm_fusestrref(as, ir, allow);
+#endif
   } else {
     as->mrm.ofs = 0;
     if (canfuse(as, ir) && ir->o == IR_ADD && ra_noreg(ir->r)) {
@@ -301,7 +363,45 @@
   }
 }
 
-/* Fuse load into memory operand. */
+/* Fuse load of 64 bit IR constant into memory operand. */
+static Reg asm_fuseloadk64(ASMState *as, IRIns *ir)
+{
+  const uint64_t *k = &ir_k64(ir)->u64;
+  if (!LJ_GC64 || checki32((intptr_t)k)) {
+    as->mrm.ofs = ptr2addr(k);
+    as->mrm.base = RID_NONE;
+#if LJ_GC64
+  } else if (checki32(dispofs(as, k))) {
+    as->mrm.ofs = (int32_t)dispofs(as, k);
+    as->mrm.base = RID_DISPATCH;
+  } else if (checki32(mcpofs(as, k)) && checki32(mcpofs(as, k+1)) &&
+	     checki32(mctopofs(as, k)) && checki32(mctopofs(as, k+1))) {
+    as->mrm.ofs = (int32_t)mcpofs(as, k);
+    as->mrm.base = RID_RIP;
+  } else {
+    if (ir->i) {
+      lua_assert(*k == *(uint64_t*)(as->mctop - ir->i));
+    } else {
+      while ((uintptr_t)as->mcbot & 7) *as->mcbot++ = XI_INT3;
+      *(uint64_t*)as->mcbot = *k;
+      ir->i = (int32_t)(as->mctop - as->mcbot);
+      as->mcbot += 8;
+      as->mclim = as->mcbot + MCLIM_REDZONE;
+    }
+    as->mrm.ofs = (int32_t)mcpofs(as, as->mctop - ir->i);
+    as->mrm.base = RID_RIP;
+#endif
+  }
+  as->mrm.idx = RID_NONE;
+  return RID_MRM;
+}
+
+/* Fuse load into memory operand.
+**
+** Important caveat: this may emit RIP-relative loads! So don't place any
+** code emitters between this function and the use of its result.
+** The only permitted exception is asm_guardcc().
+*/
 static Reg asm_fuseload(ASMState *as, IRRef ref, RegSet allow)
 {
   IRIns *ir = IR(ref);
@@ -320,26 +420,35 @@
   if (ir->o == IR_KNUM) {
     RegSet avail = as->freeset & ~as->modset & RSET_FPR;
     lua_assert(allow != RSET_EMPTY);
-    if (!(avail & (avail-1))) {  /* Fuse if less than two regs available. */
-      as->mrm.ofs = ptr2addr(ir_knum(ir));
-      as->mrm.base = as->mrm.idx = RID_NONE;
-      return RID_MRM;
-    }
-  } else if (ir->o == IR_KINT64) {
+    if (!(avail & (avail-1)))  /* Fuse if less than two regs available. */
+      return asm_fuseloadk64(as, ir);
+  } else if (ref == REF_BASE || ir->o == IR_KINT64) {
     RegSet avail = as->freeset & ~as->modset & RSET_GPR;
     lua_assert(allow != RSET_EMPTY);
     if (!(avail & (avail-1))) {  /* Fuse if less than two regs available. */
-      as->mrm.ofs = ptr2addr(ir_kint64(ir));
-      as->mrm.base = as->mrm.idx = RID_NONE;
-      return RID_MRM;
+      if (ref == REF_BASE) {
+#if LJ_GC64
+	as->mrm.ofs = (int32_t)dispofs(as, &J2G(as->J)->jit_base);
+	as->mrm.base = RID_DISPATCH;
+#else
+	as->mrm.ofs = ptr2addr(&J2G(as->J)->jit_base);
+	as->mrm.base = RID_NONE;
+#endif
+	as->mrm.idx = RID_NONE;
+	return RID_MRM;
+      } else {
+	return asm_fuseloadk64(as, ir);
+      }
     }
   } else if (mayfuse(as, ref)) {
     RegSet xallow = (allow & RSET_GPR) ? allow : RSET_GPR;
     if (ir->o == IR_SLOAD) {
       if (!(ir->op2 & (IRSLOAD_PARENT|IRSLOAD_CONVERT)) &&
-	  noconflict(as, ref, IR_RETF, 0)) {
+	  noconflict(as, ref, IR_RETF, 0) &&
+	  !(LJ_GC64 && irt_isaddr(ir->t))) {
 	as->mrm.base = (uint8_t)ra_alloc1(as, REF_BASE, xallow);
-	as->mrm.ofs = 8*((int32_t)ir->op1-1) + ((ir->op2&IRSLOAD_FRAME)?4:0);
+	as->mrm.ofs = 8*((int32_t)ir->op1-1-LJ_FR2) +
+		      (!LJ_FR2 && (ir->op2 & IRSLOAD_FRAME) ? 4 : 0);
 	as->mrm.idx = RID_NONE;
 	return RID_MRM;
       }
@@ -351,7 +460,8 @@
 	return RID_MRM;
       }
     } else if (ir->o == IR_ALOAD || ir->o == IR_HLOAD || ir->o == IR_ULOAD) {
-      if (noconflict(as, ref, ir->o + IRDELTA_L2S, 0)) {
+      if (noconflict(as, ref, ir->o + IRDELTA_L2S, 0) &&
+	  !(LJ_GC64 && irt_isaddr(ir->t))) {
 	asm_fuseahuref(as, ir->op1, xallow);
 	return RID_MRM;
       }
@@ -364,12 +474,16 @@
 	asm_fusexref(as, ir->op1, xallow);
 	return RID_MRM;
       }
-    } else if (ir->o == IR_VLOAD) {
+    } else if (ir->o == IR_VLOAD && !(LJ_GC64 && irt_isaddr(ir->t))) {
       asm_fuseahuref(as, ir->op1, xallow);
       return RID_MRM;
     }
   }
-  if (!(as->freeset & allow) && !irref_isk(ref) &&
+  if (ir->o == IR_FLOAD && ir->op1 == REF_NIL) {
+    asm_fusefref(as, ir, RSET_EMPTY);
+    return RID_MRM;
+  }
+  if (!(as->freeset & allow) && !emit_canremat(ref) &&
       (allow == RSET_EMPTY || ra_hasspill(ir->s) || iscrossref(as, ref)))
     goto fusespill;
   return ra_allocref(as, ref, allow);
@@ -485,8 +599,8 @@
     if (r) {  /* Argument is in a register. */
       if (r < RID_MAX_GPR && ref < ASMREF_TMP1) {
 #if LJ_64
-	if (ir->o == IR_KINT64)
-	  emit_loadu64(as, r, ir_kint64(ir)->u64);
+	if (LJ_GC64 ? !(ir->o == IR_KINT || ir->o == IR_KNULL) : ir->o == IR_KINT64)
+	  emit_loadu64(as, r, ir_k64(ir)->u64);
 	else
 #endif
 	  emit_loadi(as, r, ir->i);
@@ -642,6 +756,9 @@
 static void asm_retf(ASMState *as, IRIns *ir)
 {
   Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);
+#if LJ_FR2
+  Reg rpc = ra_scratch(as, rset_exclude(RSET_GPR, base));
+#endif
   void *pc = ir_kptr(IR(ir->op2));
   int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));
   as->topslot -= (BCReg)delta;
@@ -650,7 +767,12 @@
   emit_setgl(as, base, jit_base);
   emit_addptr(as, base, -8*delta);
   asm_guardcc(as, CC_NE);
+#if LJ_FR2
+  emit_rmro(as, XO_CMP, rpc|REX_GC64, base, -8);
+  emit_loadu64(as, rpc, u64ptr(pc));
+#else
   emit_gmroi(as, XG_ARITHi(XOg_CMP), base, -4, ptr2addr(pc));
+#endif
 }
 
 /* -- Type conversions ---------------------------------------------------- */
@@ -674,8 +796,9 @@
   Reg tmp = ra_noreg(IR(ir->op1)->r) ?
 	      ra_alloc1(as, ir->op1, RSET_FPR) :
 	      ra_scratch(as, RSET_FPR);
-  Reg right = asm_fuseload(as, ir->op2, rset_exclude(RSET_FPR, tmp));
+  Reg right;
   emit_rr(as, XO_MOVDto, tmp, dest);
+  right = asm_fuseload(as, ir->op2, rset_exclude(RSET_FPR, tmp));
   emit_mrm(as, XO_ADDSD, tmp, right);
   ra_left(as, tmp, ir->op1);
 }
@@ -696,13 +819,13 @@
       if (left == dest) return;  /* Avoid the XO_XORPS. */
     } else if (LJ_32 && st == IRT_U32) {  /* U32 to FP conversion on x86. */
       /* number = (2^52+2^51 .. u32) - (2^52+2^51) */
-      cTValue *k = lj_ir_k64_find(as->J, U64x(43380000,00000000));
+      cTValue *k = &as->J->k64[LJ_K64_TOBIT];
       Reg bias = ra_scratch(as, rset_exclude(RSET_FPR, dest));
       if (irt_isfloat(ir->t))
 	emit_rr(as, XO_CVTSD2SS, dest, dest);
       emit_rr(as, XO_SUBSD, dest, bias);  /* Subtract 2^52+2^51 bias. */
       emit_rr(as, XO_XORPS, dest, bias);  /* Merge bias and integer. */
-      emit_loadn(as, bias, k);
+      emit_rma(as, XO_MOVSD, bias, k);
       emit_mrm(as, XO_MOVD, dest, asm_fuseload(as, lref, RSET_GPR));
       return;
     } else {  /* Integer to FP conversion. */
@@ -711,7 +834,7 @@
 		 asm_fuseloadm(as, lref, RSET_GPR, st64);
       if (LJ_64 && st == IRT_U64) {
 	MCLabel l_end = emit_label(as);
-	const void *k = lj_ir_k64_find(as->J, U64x(43f00000,00000000));
+	cTValue *k = &as->J->k64[LJ_K64_2P64];
 	emit_rma(as, XO_ADDSD, dest, k);  /* Add 2^64 to compensate. */
 	emit_sjcc(as, CC_NS, l_end);
 	emit_rr(as, XO_TEST, left|REX_64, left);  /* Check if u64 >= 2^63. */
@@ -738,23 +861,20 @@
 	  emit_gri(as, XG_ARITHi(XOg_ADD), dest, (int32_t)0x80000000);
 	emit_rr(as, op, dest|REX_64, tmp);
 	if (st == IRT_NUM)
-	  emit_rma(as, XO_ADDSD, tmp, lj_ir_k64_find(as->J,
-		   LJ_64 ? U64x(c3f00000,00000000) : U64x(c1e00000,00000000)));
+	  emit_rma(as, XO_ADDSD, tmp, &as->J->k64[LJ_K64_M2P64_31]);
 	else
-	  emit_rma(as, XO_ADDSS, tmp, lj_ir_k64_find(as->J,
-		   LJ_64 ? U64x(00000000,df800000) : U64x(00000000,cf000000)));
+	  emit_rma(as, XO_ADDSS, tmp, &as->J->k32[LJ_K32_M2P64_31]);
 	emit_sjcc(as, CC_NS, l_end);
 	emit_rr(as, XO_TEST, dest|REX_64, dest);  /* Check if dest negative. */
 	emit_rr(as, op, dest|REX_64, tmp);
 	ra_left(as, tmp, lref);
       } else {
-	Reg left = asm_fuseload(as, lref, RSET_FPR);
 	if (LJ_64 && irt_isu32(ir->t))
 	  emit_rr(as, XO_MOV, dest, dest);  /* Zero hiword. */
 	emit_mrm(as, op,
 		 dest|((LJ_64 &&
 			(irt_is64(ir->t) || irt_isu32(ir->t))) ? REX_64 : 0),
-		 left);
+		 asm_fuseload(as, lref, RSET_FPR));
       }
     }
   } else if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */
@@ -828,8 +948,7 @@
   if (((ir-1)->op2 & IRCONV_SRCMASK) == IRT_U64) {
     /* For inputs in [2^63,2^64-1] add 2^64 to compensate. */
     MCLabel l_end = emit_label(as);
-    emit_rma(as, XO_FADDq, XOg_FADDq,
-	     lj_ir_k64_find(as->J, U64x(43f00000,00000000)));
+    emit_rma(as, XO_FADDq, XOg_FADDq, &as->J->k64[LJ_K64_2P64]);
     emit_sjcc(as, CC_NS, l_end);
     emit_rr(as, XO_TEST, hi, hi);  /* Check if u64 >= 2^63. */
   } else {
@@ -869,8 +988,7 @@
       emit_rmro(as, XO_FISTTPq, XOg_FISTTPq, RID_ESP, 0);
     else
       emit_rmro(as, XO_FISTPq, XOg_FISTPq, RID_ESP, 0);
-    emit_rma(as, XO_FADDq, XOg_FADDq,
-	     lj_ir_k64_find(as->J, U64x(c3f00000,00000000)));
+    emit_rma(as, XO_FADDq, XOg_FADDq, &as->J->k64[LJ_K64_M2P64]);
     emit_sjcc(as, CC_NS, l_pop);
     emit_rr(as, XO_TEST, hi, hi);  /* Check if out-of-range (2^63). */
   }
@@ -934,6 +1052,25 @@
       emit_rmro(as, XO_LEA, dest|REX_64, RID_ESP, ra_spill(as, ir));
   } else {
     /* Otherwise use g->tmptv to hold the TValue. */
+#if LJ_GC64
+    if (irref_isk(ref)) {
+      TValue k;
+      lj_ir_kvalue(as->J->L, &k, ir);
+      emit_movmroi(as, dest, 4, k.u32.hi);
+      emit_movmroi(as, dest, 0, k.u32.lo);
+    } else {
+      /* TODO: 64 bit store + 32 bit load-modify-store is suboptimal. */
+      Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, dest));
+      if (irt_is64(ir->t)) {
+	emit_u32(as, irt_toitype(ir->t) << 15);
+	emit_rmro(as, XO_ARITHi, XOg_OR, dest, 4);
+      } else {
+	/* Currently, no caller passes integers that might end up here. */
+	emit_movmroi(as, dest, 4, (irt_toitype(ir->t) << 15));
+      }
+      emit_movtomro(as, REX_64IR(ir, src), dest, 0);
+    }
+#else
     if (!irref_isk(ref)) {
       Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, dest));
       emit_movtomro(as, REX_64IR(ir, src), dest, 0);
@@ -942,6 +1079,7 @@
     }
     if (!(LJ_64 && irt_islightud(ir->t)))
       emit_movmroi(as, dest, 4, irt_toitype(ir->t));
+#endif
     emit_loada(as, dest, &J2G(as->J)->tmptv);
   }
 }
@@ -951,9 +1089,9 @@
   Reg dest = ra_dest(as, ir, RSET_GPR);
   asm_fusearef(as, ir, RSET_GPR);
   if (!(as->mrm.idx == RID_NONE && as->mrm.ofs == 0))
-    emit_mrm(as, XO_LEA, dest, RID_MRM);
+    emit_mrm(as, XO_LEA, dest|REX_GC64, RID_MRM);
   else if (as->mrm.base != dest)
-    emit_rr(as, XO_MOV, dest, as->mrm.base);
+    emit_rr(as, XO_MOV, dest|REX_GC64, as->mrm.base);
 }
 
 /* Inlined hash lookup. Specialized for key type and for const keys.
@@ -980,7 +1118,7 @@
   if (!isk) {
     rset_clear(allow, tab);
     key = ra_alloc1(as, ir->op2, irt_isnum(kt) ? RSET_FPR : allow);
-    if (!irt_isstr(kt))
+    if (LJ_GC64 || !irt_isstr(kt))
       tmp = ra_scratch(as, rset_exclude(allow, key));
   }
 
@@ -993,8 +1131,8 @@
 
   /* Follow hash chain until the end. */
   l_loop = emit_sjcc_label(as, CC_NZ);
-  emit_rr(as, XO_TEST, dest, dest);
-  emit_rmro(as, XO_MOV, dest, dest, offsetof(Node, next));
+  emit_rr(as, XO_TEST, dest|REX_GC64, dest);
+  emit_rmro(as, XO_MOV, dest|REX_GC64, dest, offsetof(Node, next));
   l_next = emit_label(as);
 
   /* Type and value comparison. */
@@ -1015,7 +1153,7 @@
       emit_rmro(as, XO_UCOMISD, key, dest, offsetof(Node, key.n));
       emit_sjcc(as, CC_AE, l_next);
       /* The type check avoids NaN penalties and complaints from Valgrind. */
-#if LJ_64
+#if LJ_64 && !LJ_GC64
       emit_u32(as, LJ_TISNUM);
       emit_rmro(as, XO_ARITHi, XOg_CMP, dest, offsetof(Node, key.it));
 #else
@@ -1023,11 +1161,29 @@
       emit_rmro(as, XO_ARITHi8, XOg_CMP, dest, offsetof(Node, key.it));
 #endif
     }
-#if LJ_64
+#if LJ_64 && !LJ_GC64
   } else if (irt_islightud(kt)) {
     emit_rmro(as, XO_CMP, key|REX_64, dest, offsetof(Node, key.u64));
 #endif
+#if LJ_GC64
+  } else if (irt_isaddr(kt)) {
+    if (isk) {
+      TValue k;
+      k.u64 = ((uint64_t)irt_toitype(irkey->t) << 47) | irkey[1].tv.u64;
+      emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.u32.lo),
+		 k.u32.lo);
+      emit_sjcc(as, CC_NE, l_next);
+      emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.u32.hi),
+		 k.u32.hi);
+    } else {
+      emit_rmro(as, XO_CMP, tmp|REX_64, dest, offsetof(Node, key.u64));
+    }
   } else {
+    lua_assert(irt_ispri(kt) && !irt_isnil(kt));
+    emit_u32(as, (irt_toitype(kt)<<15)|0x7fff);
+    emit_rmro(as, XO_ARITHi, XOg_CMP, dest, offsetof(Node, key.it));
+#else
+  } else {
     if (!irt_ispri(kt)) {
       lua_assert(irt_isaddr(kt));
       if (isk)
@@ -1040,16 +1196,23 @@
     lua_assert(!irt_isnil(kt));
     emit_i8(as, irt_toitype(kt));
     emit_rmro(as, XO_ARITHi8, XOg_CMP, dest, offsetof(Node, key.it));
+#endif
   }
   emit_sfixup(as, l_loop);
   checkmclim(as);
+#if LJ_GC64
+  if (!isk && irt_isaddr(kt)) {
+    emit_rr(as, XO_OR, tmp|REX_64, key);
+    emit_loadu64(as, tmp, (uint64_t)irt_toitype(kt) << 47);
+  }
+#endif
 
   /* Load main position relative to tab->node into dest. */
   khash = isk ? ir_khash(irkey) : 1;
   if (khash == 0) {
-    emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, node));
+    emit_rmro(as, XO_MOV, dest|REX_GC64, tab, offsetof(GCtab, node));
   } else {
-    emit_rmro(as, XO_ARITH(XOg_ADD), dest, tab, offsetof(GCtab, node));
+    emit_rmro(as, XO_ARITH(XOg_ADD), dest|REX_GC64, tab, offsetof(GCtab,node));
     if ((as->flags & JIT_F_PREFER_IMUL)) {
       emit_i8(as, sizeof(Node));
       emit_rr(as, XO_IMULi8, dest, dest);
@@ -1084,7 +1247,19 @@
 #endif
       } else {
 	emit_rr(as, XO_MOV, tmp, key);
+#if LJ_GC64
+	checkmclim(as);
+	emit_gri(as, XG_ARITHi(XOg_XOR), dest, irt_toitype(kt) << 15);
+	if ((as->flags & JIT_F_BMI2)) {
+	  emit_i8(as, 32);
+	  emit_mrm(as, XV_RORX|VEX_64, dest, key);
+	} else {
+	  emit_shifti(as, XOg_SHR|REX_64, dest, 32);
+	  emit_rr(as, XO_MOV, dest|REX_64, key|REX_64);
+	}
+#else
 	emit_rmro(as, XO_LEA, dest, key, HASH_BIAS);
+#endif
       }
     }
   }
@@ -1104,11 +1279,11 @@
   if (ra_hasreg(dest)) {
     if (ofs != 0) {
       if (dest == node && !(as->flags & JIT_F_LEA_AGU))
-	emit_gri(as, XG_ARITHi(XOg_ADD), dest, ofs);
+	emit_gri(as, XG_ARITHi(XOg_ADD), dest|REX_GC64, ofs);
       else
-	emit_rmro(as, XO_LEA, dest, node, ofs);
+	emit_rmro(as, XO_LEA, dest|REX_GC64, node, ofs);
     } else if (dest != node) {
-      emit_rr(as, XO_MOV, dest, node);
+      emit_rr(as, XO_MOV, dest|REX_GC64, node);
     }
   }
   asm_guardcc(as, CC_NE);
@@ -1120,13 +1295,24 @@
     lua_assert(irt_isnum(irkey->t) || irt_isgcv(irkey->t));
     /* Assumes -0.0 is already canonicalized to +0.0. */
     emit_loadu64(as, key, irt_isnum(irkey->t) ? ir_knum(irkey)->u64 :
+#if LJ_GC64
+			  ((uint64_t)irt_toitype(irkey->t) << 47) |
+			  (uint64_t)ir_kgc(irkey));
+#else
 			  ((uint64_t)irt_toitype(irkey->t) << 32) |
 			  (uint64_t)(uint32_t)ptr2addr(ir_kgc(irkey)));
+#endif
   } else {
     lua_assert(!irt_isnil(irkey->t));
+#if LJ_GC64
+    emit_i32(as, (irt_toitype(irkey->t)<<15)|0x7fff);
+    emit_rmro(as, XO_ARITHi, XOg_CMP, node,
+	      ofs + (int32_t)offsetof(Node, key.it));
+#else
     emit_i8(as, irt_toitype(irkey->t));
     emit_rmro(as, XO_ARITHi8, XOg_CMP, node,
 	      ofs + (int32_t)offsetof(Node, key.it));
+#endif
   }
 #else
   l_exit = emit_label(as);
@@ -1157,25 +1343,25 @@
 
 static void asm_uref(ASMState *as, IRIns *ir)
 {
-  /* NYI: Check that UREFO is still open and not aliasing a slot. */
   Reg dest = ra_dest(as, ir, RSET_GPR);
   if (irref_isk(ir->op1)) {
     GCfunc *fn = ir_kfunc(IR(ir->op1));
     MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;
-    emit_rma(as, XO_MOV, dest, v);
+    emit_rma(as, XO_MOV, dest|REX_GC64, v);
   } else {
     Reg uv = ra_scratch(as, RSET_GPR);
     Reg func = ra_alloc1(as, ir->op1, RSET_GPR);
     if (ir->o == IR_UREFC) {
-      emit_rmro(as, XO_LEA, dest, uv, offsetof(GCupval, tv));
+      emit_rmro(as, XO_LEA, dest|REX_GC64, uv, offsetof(GCupval, tv));
       asm_guardcc(as, CC_NE);
       emit_i8(as, 1);
       emit_rmro(as, XO_ARITHib, XOg_CMP, uv, offsetof(GCupval, closed));
     } else {
-      emit_rmro(as, XO_MOV, dest, uv, offsetof(GCupval, v));
+      emit_rmro(as, XO_MOV, dest|REX_GC64, uv, offsetof(GCupval, v));
     }
-    emit_rmro(as, XO_MOV, uv, func,
-	      (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));
+    emit_rmro(as, XO_MOV, uv|REX_GC64, func,
+	      (int32_t)offsetof(GCfuncL, uvptr) +
+	      (int32_t)sizeof(MRef) * (int32_t)(ir->op2 >> 8));
   }
 }
 
@@ -1193,9 +1379,9 @@
   if (as->mrm.base == RID_NONE)
     emit_loadi(as, dest, as->mrm.ofs);
   else if (as->mrm.base == dest && as->mrm.idx == RID_NONE)
-    emit_gri(as, XG_ARITHi(XOg_ADD), dest, as->mrm.ofs);
+    emit_gri(as, XG_ARITHi(XOg_ADD), dest|REX_GC64, as->mrm.ofs);
   else
-    emit_mrm(as, XO_LEA, dest, RID_MRM);
+    emit_mrm(as, XO_LEA, dest|REX_GC64, RID_MRM);
 }
 
 /* -- Loads and stores ---------------------------------------------------- */
@@ -1264,7 +1450,7 @@
     case IRT_I16: case IRT_U16: xo = XO_MOVtow; break;
     case IRT_NUM: xo = XO_MOVSDto; break;
     case IRT_FLOAT: xo = XO_MOVSSto; break;
-#if LJ_64
+#if LJ_64 && !LJ_GC64
     case IRT_LIGHTUD: lua_assert(0);  /* NYI: mask 64 bit lightuserdata. */
 #endif
     default:
@@ -1296,7 +1482,7 @@
 #define asm_fstore(as, ir)	asm_fxstore(as, ir)
 #define asm_xstore(as, ir)	asm_fxstore(as, ir)
 
-#if LJ_64
+#if LJ_64 && !LJ_GC64
 static Reg asm_load_lightud64(ASMState *as, IRIns *ir, int typecheck)
 {
   if (ra_used(ir) || typecheck) {
@@ -1318,9 +1504,12 @@
 
 static void asm_ahuvload(ASMState *as, IRIns *ir)
 {
+#if LJ_GC64
+  Reg tmp = RID_NONE;
+#endif
   lua_assert(irt_isnum(ir->t) || irt_ispri(ir->t) || irt_isaddr(ir->t) ||
 	     (LJ_DUALNUM && irt_isint(ir->t)));
-#if LJ_64
+#if LJ_64 && !LJ_GC64
   if (irt_islightud(ir->t)) {
     Reg dest = asm_load_lightud64(as, ir, 1);
     if (ra_hasreg(dest)) {
@@ -1334,9 +1523,33 @@
     RegSet allow = irt_isnum(ir->t) ? RSET_FPR : RSET_GPR;
     Reg dest = ra_dest(as, ir, allow);
     asm_fuseahuref(as, ir->op1, RSET_GPR);
+#if LJ_GC64
+    if (irt_isaddr(ir->t)) {
+      emit_shifti(as, XOg_SHR|REX_64, dest, 17);
+      asm_guardcc(as, CC_NE);
+      emit_i8(as, irt_toitype(ir->t));
+      emit_rr(as, XO_ARITHi8, XOg_CMP, dest);
+      emit_i8(as, XI_O16);
+      if ((as->flags & JIT_F_BMI2)) {
+	emit_i8(as, 47);
+	emit_mrm(as, XV_RORX|VEX_64, dest, RID_MRM);
+      } else {
+	emit_shifti(as, XOg_ROR|REX_64, dest, 47);
+	emit_mrm(as, XO_MOV, dest|REX_64, RID_MRM);
+      }
+      return;
+    } else
+#endif
     emit_mrm(as, dest < RID_MAX_GPR ? XO_MOV : XO_MOVSD, dest, RID_MRM);
   } else {
-    asm_fuseahuref(as, ir->op1, RSET_GPR);
+    RegSet gpr = RSET_GPR;
+#if LJ_GC64
+    if (irt_isaddr(ir->t)) {
+      tmp = ra_scratch(as, RSET_GPR);
+      gpr = rset_exclude(gpr, tmp);
+    }
+#endif
+    asm_fuseahuref(as, ir->op1, gpr);
   }
   /* Always do the type check, even if the load result is unused. */
   as->mrm.ofs += 4;
@@ -1343,11 +1556,31 @@
   asm_guardcc(as, irt_isnum(ir->t) ? CC_AE : CC_NE);
   if (LJ_64 && irt_type(ir->t) >= IRT_NUM) {
     lua_assert(irt_isinteger(ir->t) || irt_isnum(ir->t));
+#if LJ_GC64
+    emit_u32(as, LJ_TISNUM << 15);
+#else
     emit_u32(as, LJ_TISNUM);
+#endif
     emit_mrm(as, XO_ARITHi, XOg_CMP, RID_MRM);
+#if LJ_GC64
+  } else if (irt_isaddr(ir->t)) {
+    as->mrm.ofs -= 4;
+    emit_i8(as, irt_toitype(ir->t));
+    emit_mrm(as, XO_ARITHi8, XOg_CMP, tmp);
+    emit_shifti(as, XOg_SAR|REX_64, tmp, 47);
+    emit_mrm(as, XO_MOV, tmp|REX_64, RID_MRM);
+  } else if (irt_isnil(ir->t)) {
+    as->mrm.ofs -= 4;
+    emit_i8(as, -1);
+    emit_mrm(as, XO_ARITHi8, XOg_CMP|REX_64, RID_MRM);
   } else {
+    emit_u32(as, (irt_toitype(ir->t) << 15) | 0x7fff);
+    emit_mrm(as, XO_ARITHi, XOg_CMP, RID_MRM);
+#else
+  } else {
     emit_i8(as, irt_toitype(ir->t));
     emit_mrm(as, XO_ARITHi8, XOg_CMP, RID_MRM);
+#endif
   }
 }
 
@@ -1359,12 +1592,28 @@
     Reg src = ra_alloc1(as, ir->op2, RSET_FPR);
     asm_fuseahuref(as, ir->op1, RSET_GPR);
     emit_mrm(as, XO_MOVSDto, src, RID_MRM);
-#if LJ_64
+#if LJ_64 && !LJ_GC64
   } else if (irt_islightud(ir->t)) {
     Reg src = ra_alloc1(as, ir->op2, RSET_GPR);
     asm_fuseahuref(as, ir->op1, rset_exclude(RSET_GPR, src));
     emit_mrm(as, XO_MOVto, src|REX_64, RID_MRM);
 #endif
+#if LJ_GC64
+  } else if (irref_isk(ir->op2)) {
+    TValue k;
+    lj_ir_kvalue(as->J->L, &k, IR(ir->op2));
+    asm_fuseahuref(as, ir->op1, RSET_GPR);
+    if (tvisnil(&k)) {
+      emit_i32(as, -1);
+      emit_mrm(as, XO_MOVmi, REX_64, RID_MRM);
+    } else {
+      emit_u32(as, k.u32.lo);
+      emit_mrm(as, XO_MOVmi, 0, RID_MRM);
+      as->mrm.ofs += 4;
+      emit_u32(as, k.u32.hi);
+      emit_mrm(as, XO_MOVmi, 0, RID_MRM);
+    }
+#endif
   } else {
     IRIns *irr = IR(ir->op2);
     RegSet allow = RSET_GPR;
@@ -1375,6 +1624,17 @@
     }
     asm_fuseahuref(as, ir->op1, allow);
     if (ra_hasreg(src)) {
+#if LJ_GC64
+      if (!(LJ_DUALNUM && irt_isinteger(ir->t))) {
+	/* TODO: 64 bit store + 32 bit load-modify-store is suboptimal. */
+	as->mrm.ofs += 4;
+	emit_u32(as, irt_toitype(ir->t) << 15);
+	emit_mrm(as, XO_ARITHi, XOg_OR, RID_MRM);
+	as->mrm.ofs -= 4;
+	emit_mrm(as, XO_MOVto, src|REX_64, RID_MRM);
+	return;
+      }
+#endif
       emit_mrm(as, XO_MOVto, src, RID_MRM);
     } else if (!irt_ispri(irr->t)) {
       lua_assert(irt_isaddr(ir->t) || (LJ_DUALNUM && irt_isinteger(ir->t)));
@@ -1382,7 +1642,12 @@
       emit_mrm(as, XO_MOVmi, 0, RID_MRM);
     }
     as->mrm.ofs += 4;
+#if LJ_GC64
+    lua_assert(LJ_DUALNUM && irt_isinteger(ir->t));
+    emit_i32(as, LJ_TNUMX << 15);
+#else
     emit_i32(as, (int32_t)irt_toitype(ir->t));
+#endif
     emit_mrm(as, XO_MOVmi, 0, RID_MRM);
   }
 }
@@ -1389,7 +1654,8 @@
 
 static void asm_sload(ASMState *as, IRIns *ir)
 {
-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);
+  int32_t ofs = 8*((int32_t)ir->op1-1-LJ_FR2) +
+		(!LJ_FR2 && (ir->op2 & IRSLOAD_FRAME) ? 4 : 0);
   IRType1 t = ir->t;
   Reg base;
   lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */
@@ -1402,7 +1668,7 @@
     base = ra_alloc1(as, REF_BASE, RSET_GPR);
     emit_rmro(as, XO_MOVSD, left, base, ofs);
     t.irt = IRT_NUM;  /* Continue with a regular number type check. */
-#if LJ_64
+#if LJ_64 && !LJ_GC64
   } else if (irt_islightud(t)) {
     Reg dest = asm_load_lightud64(as, ir, (ir->op2 & IRSLOAD_TYPECHECK));
     if (ra_hasreg(dest)) {
@@ -1420,6 +1686,36 @@
       t.irt = irt_isint(t) ? IRT_NUM : IRT_INT;  /* Check for original type. */
       emit_rmro(as, irt_isint(t) ? XO_CVTSI2SD : XO_CVTTSD2SI, dest, base, ofs);
     } else {
+#if LJ_GC64
+      if (irt_isaddr(t)) {
+	/* LJ_GC64 type check + tag removal without BMI2 and with BMI2:
+	**
+	**  mov r64, [addr]    rorx r64, [addr], 47
+	**  ror r64, 47
+	**  cmp r16, itype     cmp r16, itype
+	**  jne ->exit         jne ->exit
+	**  shr r64, 16        shr r64, 16
+	*/
+	emit_shifti(as, XOg_SHR|REX_64, dest, 17);
+	if ((ir->op2 & IRSLOAD_TYPECHECK)) {
+	  asm_guardcc(as, CC_NE);
+	  emit_i8(as, irt_toitype(t));
+	  emit_rr(as, XO_ARITHi8, XOg_CMP, dest);
+	  emit_i8(as, XI_O16);
+	}
+	if ((as->flags & JIT_F_BMI2)) {
+	  emit_i8(as, 47);
+	  emit_rmro(as, XV_RORX|VEX_64, dest, base, ofs);
+	} else {
+	  if ((ir->op2 & IRSLOAD_TYPECHECK))
+	    emit_shifti(as, XOg_ROR|REX_64, dest, 47);
+	  else
+	    emit_shifti(as, XOg_SHL|REX_64, dest, 17);
+	  emit_rmro(as, XO_MOV, dest|REX_64, base, ofs);
+	}
+	return;
+      } else
+#endif
       emit_rmro(as, irt_isnum(t) ? XO_MOVSD : XO_MOV, dest, base, ofs);
     }
   } else {
@@ -1432,11 +1728,42 @@
     asm_guardcc(as, irt_isnum(t) ? CC_AE : CC_NE);
     if (LJ_64 && irt_type(t) >= IRT_NUM) {
       lua_assert(irt_isinteger(t) || irt_isnum(t));
+#if LJ_GC64
+      emit_u32(as, LJ_TISNUM << 15);
+#else
       emit_u32(as, LJ_TISNUM);
+#endif
       emit_rmro(as, XO_ARITHi, XOg_CMP, base, ofs+4);
+#if LJ_GC64
+    } else if (irt_isnil(t)) {
+      /* LJ_GC64 type check for nil:
+      **
+      **   cmp qword [addr], -1
+      **   jne ->exit
+      */
+      emit_i8(as, -1);
+      emit_rmro(as, XO_ARITHi8, XOg_CMP|REX_64, base, ofs);
+    } else if (irt_ispri(t)) {
+      emit_u32(as, (irt_toitype(t) << 15) | 0x7fff);
+      emit_rmro(as, XO_ARITHi, XOg_CMP, base, ofs+4);
     } else {
+      /* LJ_GC64 type check only:
+      **
+      **   mov r64, [addr]
+      **   sar r64, 47
+      **   cmp r32, itype
+      **   jne ->exit
+      */
+      Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, base));
       emit_i8(as, irt_toitype(t));
+      emit_rr(as, XO_ARITHi8, XOg_CMP, tmp);
+      emit_shifti(as, XOg_SAR|REX_64, tmp, 47);
+      emit_rmro(as, XO_MOV, tmp|REX_64, base, ofs+4);
+#else
+    } else {
+      emit_i8(as, irt_toitype(t));
       emit_rmro(as, XO_ARITHi8, XOg_CMP, base, ofs+4);
+#endif
     }
   }
 }
@@ -1464,8 +1791,9 @@
     Reg r64 = sz == 8 ? REX_64 : 0;
     if (irref_isk(ir->op2)) {
       IRIns *irk = IR(ir->op2);
-      uint64_t k = irk->o == IR_KINT64 ? ir_k64(irk)->u64 :
-					 (uint64_t)(uint32_t)irk->i;
+      uint64_t k = (irk->o == IR_KINT64 ||
+		    (LJ_GC64 && (irk->o == IR_KPTR || irk->o == IR_KKPTR))) ?
+		   ir_k64(irk)->u64 : (uint64_t)(uint32_t)irk->i;
       if (sz == 4 || checki32((int64_t)k)) {
 	emit_i32(as, (int32_t)k);
 	emit_rmro(as, XO_MOVmi, r64, RID_RET, sizeof(GCcdata));
@@ -1530,7 +1858,7 @@
   Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);
   Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, tab));
   MCLabel l_end = emit_label(as);
-  emit_movtomro(as, tmp, tab, offsetof(GCtab, gclist));
+  emit_movtomro(as, tmp|REX_GC64, tab, offsetof(GCtab, gclist));
   emit_setgl(as, tab, gc.grayagain);
   emit_getgl(as, tmp, gc.grayagain);
   emit_i8(as, ~LJ_GC_BLACK);
@@ -1956,7 +2284,7 @@
 #define asm_bor(as, ir)		asm_intarith(as, ir, XOg_OR)
 #define asm_bxor(as, ir)	asm_intarith(as, ir, XOg_XOR)
 
-static void asm_bitshift(ASMState *as, IRIns *ir, x86Shift xs)
+static void asm_bitshift(ASMState *as, IRIns *ir, x86Shift xs, x86Op xv)
 {
   IRRef rref = ir->op2;
   IRIns *irr = IR(rref);
@@ -1965,11 +2293,27 @@
     int shift;
     dest = ra_dest(as, ir, RSET_GPR);
     shift = irr->i & (irt_is64(ir->t) ? 63 : 31);
+    if (!xv && shift && (as->flags & JIT_F_BMI2)) {
+      Reg left = asm_fuseloadm(as, ir->op1, RSET_GPR, irt_is64(ir->t));
+      if (left != dest) {  /* BMI2 rotate right by constant. */
+	emit_i8(as, xs == XOg_ROL ? -shift : shift);
+	emit_mrm(as, VEX_64IR(ir, XV_RORX), dest, left);
+	return;
+      }
+    }
     switch (shift) {
     case 0: break;
     case 1: emit_rr(as, XO_SHIFT1, REX_64IR(ir, xs), dest); break;
     default: emit_shifti(as, REX_64IR(ir, xs), dest, shift); break;
     }
+  } else if ((as->flags & JIT_F_BMI2) && xv) {	/* BMI2 variable shifts. */
+    Reg left, right;
+    dest = ra_dest(as, ir, RSET_GPR);
+    right = ra_alloc1(as, rref, RSET_GPR);
+    left = asm_fuseloadm(as, ir->op1, rset_exclude(RSET_GPR, right),
+			 irt_is64(ir->t));
+    emit_mrm(as, VEX_64IR(ir, xv) ^ (right << 19), dest, left);
+    return;
   } else {  /* Variable shifts implicitly use register cl (i.e. ecx). */
     Reg right;
     dest = ra_dest(as, ir, rset_exclude(RSET_GPR, RID_ECX));
@@ -1995,11 +2339,11 @@
   */
 }
 
-#define asm_bshl(as, ir)	asm_bitshift(as, ir, XOg_SHL)
-#define asm_bshr(as, ir)	asm_bitshift(as, ir, XOg_SHR)
-#define asm_bsar(as, ir)	asm_bitshift(as, ir, XOg_SAR)
-#define asm_brol(as, ir)	asm_bitshift(as, ir, XOg_ROL)
-#define asm_bror(as, ir)	asm_bitshift(as, ir, XOg_ROR)
+#define asm_bshl(as, ir)	asm_bitshift(as, ir, XOg_SHL, XV_SHLX)
+#define asm_bshr(as, ir)	asm_bitshift(as, ir, XOg_SHR, XV_SHRX)
+#define asm_bsar(as, ir)	asm_bitshift(as, ir, XOg_SAR, XV_SARX)
+#define asm_brol(as, ir)	asm_bitshift(as, ir, XOg_ROL, 0)
+#define asm_bror(as, ir)	asm_bitshift(as, ir, XOg_ROR, 0)
 
 /* -- Comparisons --------------------------------------------------------- */
 
@@ -2050,7 +2394,6 @@
       cc ^= (VCC_PS|(5<<4));  /* A <-> B, AE <-> BE, PS <-> none */
     }
     left = ra_alloc1(as, lref, RSET_FPR);
-    right = asm_fuseload(as, rref, rset_exclude(RSET_FPR, left));
     l_around = emit_label(as);
     asm_guardcc(as, cc >> 4);
     if (cc & VCC_P) {  /* Extra CC_P branch required? */
@@ -2067,6 +2410,7 @@
 	  emit_jcc(as, CC_P, as->mcp);
       }
     }
+    right = asm_fuseload(as, rref, rset_exclude(RSET_FPR, left));
     emit_mrm(as, XO_UCOMISD, left, right);
   } else {
     IRRef lref = ir->op1, rref = ir->op2;
@@ -2343,13 +2687,18 @@
     emit_rmro(as, XO_MOV, r|REX_64, RID_ESP, 0);
   else
     ra_modified(as, r);
-  emit_gri(as, XG_ARITHi(XOg_CMP), r, (int32_t)(8*topslot));
+  emit_gri(as, XG_ARITHi(XOg_CMP), r|REX_GC64, (int32_t)(8*topslot));
   if (ra_hasreg(pbase) && pbase != r)
-    emit_rr(as, XO_ARITH(XOg_SUB), r, pbase);
+    emit_rr(as, XO_ARITH(XOg_SUB), r|REX_GC64, pbase);
   else
+#if LJ_GC64
+    emit_rmro(as, XO_ARITH(XOg_SUB), r|REX_64, RID_DISPATCH,
+	      (int32_t)dispofs(as, &J2G(as->J)->jit_base));
+#else
     emit_rmro(as, XO_ARITH(XOg_SUB), r, RID_NONE,
 	      ptr2addr(&J2G(as->J)->jit_base));
-  emit_rmro(as, XO_MOV, r, r, offsetof(lua_State, maxstack));
+#endif
+  emit_rmro(as, XO_MOV, r|REX_GC64, r, offsetof(lua_State, maxstack));
   emit_getgl(as, r, cur_L);
   if (allow == RSET_EMPTY)  /* Spill temp. register. */
     emit_rmro(as, XO_MOVto, r|REX_64, RID_ESP, 0);
@@ -2359,13 +2708,15 @@
 static void asm_stack_restore(ASMState *as, SnapShot *snap)
 {
   SnapEntry *map = &as->T->snapmap[snap->mapofs];
-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];
+#if !LJ_FR2 || defined(LUA_USE_ASSERT)
+  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1-LJ_FR2];
+#endif
   MSize n, nent = snap->nent;
   /* Store the value of all modified slots to the Lua stack. */
   for (n = 0; n < nent; n++) {
     SnapEntry sn = map[n];
     BCReg s = snap_slot(sn);
-    int32_t ofs = 8*((int32_t)s-1);
+    int32_t ofs = 8*((int32_t)s-1-LJ_FR2);
     IRRef ref = snap_ref(sn);
     IRIns *ir = IR(ref);
     if ((sn & SNAP_NORESTORE))
@@ -2378,16 +2729,44 @@
 		 (LJ_DUALNUM && irt_isinteger(ir->t)));
       if (!irref_isk(ref)) {
 	Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, RID_BASE));
+#if LJ_GC64
+	if (irt_is64(ir->t)) {
+	  /* TODO: 64 bit store + 32 bit load-modify-store is suboptimal. */
+	  emit_u32(as, irt_toitype(ir->t) << 15);
+	  emit_rmro(as, XO_ARITHi, XOg_OR, RID_BASE, ofs+4);
+	} else if (LJ_DUALNUM && irt_isinteger(ir->t)) {
+	  emit_movmroi(as, RID_BASE, ofs+4, LJ_TISNUM << 15);
+	} else {
+	  emit_movmroi(as, RID_BASE, ofs+4, (irt_toitype(ir->t)<<15)|0x7fff);
+	}
+#endif
 	emit_movtomro(as, REX_64IR(ir, src), RID_BASE, ofs);
+#if LJ_GC64
+      } else {
+	TValue k;
+	lj_ir_kvalue(as->J->L, &k, ir);
+	if (tvisnil(&k)) {
+	  emit_i32(as, -1);
+	  emit_rmro(as, XO_MOVmi, REX_64, RID_BASE, ofs);
+	} else {
+	  emit_movmroi(as, RID_BASE, ofs+4, k.u32.hi);
+	  emit_movmroi(as, RID_BASE, ofs, k.u32.lo);
+	}
+#else
       } else if (!irt_ispri(ir->t)) {
 	emit_movmroi(as, RID_BASE, ofs, ir->i);
+#endif
       }
       if ((sn & (SNAP_CONT|SNAP_FRAME))) {
+#if !LJ_FR2
 	if (s != 0)  /* Do not overwrite link to previous frame. */
 	  emit_movmroi(as, RID_BASE, ofs+4, (int32_t)(*flinks--));
+#endif
+#if !LJ_GC64
       } else {
 	if (!(LJ_64 && irt_islightud(ir->t)))
 	  emit_movmroi(as, RID_BASE, ofs+4, irt_toitype(ir->t));
+#endif
       }
     }
     checkmclim(as);
@@ -2413,11 +2792,15 @@
   args[1] = ASMREF_TMP2;  /* MSize steps     */
   asm_gencall(as, ci, args);
   tmp = ra_releasetmp(as, ASMREF_TMP1);
+#if LJ_GC64
+  emit_rmro(as, XO_LEA, tmp|REX_64, RID_DISPATCH, GG_DISP2G);
+#else
   emit_loada(as, tmp, J2G(as->J));
+#endif
   emit_loadi(as, ra_releasetmp(as, ASMREF_TMP2), as->gcsteps);
   /* Jump around GC step if GC total < GC threshold. */
   emit_sjcc(as, CC_B, l_end);
-  emit_opgl(as, XO_ARITH(XOg_CMP), tmp, gc.threshold);
+  emit_opgl(as, XO_ARITH(XOg_CMP), tmp|REX_GC64, gc.threshold);
   emit_getgl(as, tmp, gc.total);
   as->gcsteps = 0;
   checkmclim(as);
@@ -2482,7 +2865,7 @@
     if (rset_test(as->modset, r) || irt_ismarked(ir->t))
       ir->r = RID_INIT;  /* No inheritance for modified BASE register. */
     if (r != RID_BASE)
-      emit_rr(as, XO_MOV, r, RID_BASE);
+      emit_rr(as, XO_MOV, r|REX_GC64, RID_BASE);
   }
 }
 
@@ -2498,8 +2881,9 @@
     if (irp->r == r) {
       rset_clear(allow, r);  /* Mark same BASE register as coalesced. */
     } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) {
+      /* Move from coalesced parent reg. */
       rset_clear(allow, irp->r);
-      emit_rr(as, XO_MOV, r, irp->r);  /* Move from coalesced parent reg. */
+      emit_rr(as, XO_MOV, r|REX_GC64, irp->r);
     } else {
       emit_getgl(as, r, jit_base);  /* Otherwise reload BASE. */
     }
@@ -2600,10 +2984,111 @@
 static void asm_setup_target(ASMState *as)
 {
   asm_exitstub_setup(as, as->T->nsnap);
+  as->mrm.base = 0;
 }
 
 /* -- Trace patching ------------------------------------------------------ */
 
+static const uint8_t map_op1[256] = {
+0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x20,
+0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,
+0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,
+0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,
+#if LJ_64
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
+#else
+0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,
+#endif
+0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,
+0x51,0x51,0x92,0x92,0x10,0x10,0x12,0x11,0x45,0x86,0x52,0x93,0x51,0x51,0x51,0x51,
+0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+0x93,0x86,0x93,0x93,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,
+0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x47,0x51,0x51,0x51,0x51,0x51,
+#if LJ_64
+0x59,0x59,0x59,0x59,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51,
+#else
+0x55,0x55,0x55,0x55,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51,
+#endif
+0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,
+0x93,0x93,0x53,0x51,0x70,0x71,0x93,0x86,0x54,0x51,0x53,0x51,0x51,0x52,0x51,0x51,
+0x92,0x92,0x92,0x92,0x52,0x52,0x51,0x51,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,
+0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x45,0x45,0x47,0x52,0x51,0x51,0x51,0x51,
+0x10,0x51,0x10,0x10,0x51,0x51,0x63,0x66,0x51,0x51,0x51,0x51,0x51,0x51,0x92,0x92
+};
+
+static const uint8_t map_op2[256] = {
+0x93,0x93,0x93,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x93,0x52,0x94,
+0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x34,0x51,0x35,0x51,0x51,0x51,0x51,0x51,
+0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x94,0x54,0x54,0x54,0x93,0x93,0x93,0x52,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
+0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x52,0x52,0x52,0x93,0x94,0x93,0x51,0x51,0x52,0x52,0x52,0x93,0x94,0x93,0x93,0x93,
+0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x94,0x93,0x93,0x93,0x93,0x93,
+0x93,0x93,0x94,0x93,0x94,0x94,0x94,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
+0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
+0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x52
+};
+
+static uint32_t asm_x86_inslen(const uint8_t* p)
+{
+  uint32_t result = 0;
+  uint32_t prefixes = 0;
+  uint32_t x = map_op1[*p];
+  for (;;) {
+    switch (x >> 4) {
+    case 0: return result + x + (prefixes & 4);
+    case 1: prefixes |= x; x = map_op1[*++p]; result++; break;
+    case 2: x = map_op2[*++p]; break;
+    case 3: p++; goto mrm;
+    case 4: result -= (prefixes & 2);  /* fallthrough */
+    case 5: return result + (x & 15);
+    case 6:  /* Group 3. */
+      if (p[1] & 0x38) x = 2;
+      else if ((prefixes & 2) && (x == 0x66)) x = 4;
+      goto mrm;
+    case 7: /* VEX c4/c5. */
+      if (LJ_32 && p[1] < 0xc0) {
+	x = 2;
+	goto mrm;
+      }
+      if (x == 0x70) {
+	x = *++p & 0x1f;
+	result++;
+	if (x >= 2) {
+	  p += 2;
+	  result += 2;
+	  goto mrm;
+	}
+      }
+      p++;
+      result++;
+      x = map_op2[*++p];
+      break;
+    case 8: result -= (prefixes & 2);  /* fallthrough */
+    case 9: mrm:  /* ModR/M and possibly SIB. */
+      result += (x & 15);
+      x = *++p;
+      switch (x >> 6) {
+      case 0: if ((x & 7) == 5) return result + 4; break;
+      case 1: result++; break;
+      case 2: result += 4; break;
+      case 3: return result;
+      }
+      if ((x & 7) == 4) {
+	result++;
+	if (x < 0x40 && (p[1] & 7) == 5) result += 4;
+      }
+      return result;
+    }
+  }
+}
+
 /* Patch exit jumps of existing machine code to a new target. */
 void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)
 {
@@ -2612,22 +3097,23 @@
   MSize len = T->szmcode;
   MCode *px = exitstub_addr(J, exitno) - 6;
   MCode *pe = p+len-6;
-  uint32_t stateaddr = u32ptr(&J2G(J)->vmstate);
+#if LJ_GC64
+  uint32_t statei = (uint32_t)(GG_OFS(g.vmstate) - GG_OFS(dispatch));
+#else
+  uint32_t statei = u32ptr(&J2G(J)->vmstate);
+#endif
   if (len > 5 && p[len-5] == XI_JMP && p+len-6 + *(int32_t *)(p+len-4) == px)
     *(int32_t *)(p+len-4) = jmprel(p+len, target);
   /* Do not patch parent exit for a stack check. Skip beyond vmstate update. */
-  for (; p < pe; p++)
-    if (*(uint32_t *)(p+(LJ_64 ? 3 : 2)) == stateaddr && p[0] == XI_MOVmi) {
-      p += LJ_64 ? 11 : 10;
+  for (; p < pe; p += asm_x86_inslen(p)) {
+    intptr_t ofs = LJ_GC64 ? (p[0] & 0xf0) == 0x40 : LJ_64;
+    if (*(uint32_t *)(p+2+ofs) == statei && p[ofs+LJ_GC64-LJ_64] == XI_MOVmi)
       break;
-    }
+  }
   lua_assert(p < pe);
-  for (; p < pe; p++) {
-    if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px) {
+  for (; p < pe; p += asm_x86_inslen(p))
+    if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px)
       *(int32_t *)(p+2) = jmprel(p+6, target);
-      p += 5;
-    }
-  }
   lj_mcode_sync(T->mcode, T->mcode + T->szmcode);
   lj_mcode_patch(J, mcarea, 1);
 }

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bc.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bc.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bc.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Bytecode instruction modes.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_bc_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bc.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bc.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bc.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Bytecode instruction format.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_BC_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcdump.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcdump.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcdump.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Bytecode dump definitions.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_BCDUMP_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcread.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcread.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcread.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Bytecode reader.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_bcread_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcwrite.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcwrite.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_bcwrite.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Bytecode writer.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_bcwrite_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_buf.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_buf.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_buf.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Buffer handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_buf_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_buf.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_buf.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_buf.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Buffer handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_BUF_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_carith.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_carith.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_carith.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C data arithmetic.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "lj_obj.h"

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_carith.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_carith.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_carith.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C data arithmetic.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CARITH_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccall.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccall.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccall.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** FFI C call handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "lj_obj.h"
@@ -301,7 +301,7 @@
   unsigned int cl = ccall_classify_struct(cts, ctr); \
   if ((cl & 4)) { /* Combine float HFA from separate registers. */ \
     CTSize i = (cl >> 8) - 1; \
-    do { ((uint32_t *)dp)[i] = cc->fpr[i].u32; } while (i--); \
+    do { ((uint32_t *)dp)[i] = cc->fpr[i].lo; } while (i--); \
   } else { \
     if (cl > 1) sp = (uint8_t *)&cc->fpr[0]; \
     memcpy(dp, sp, ctr->size); \
@@ -331,7 +331,7 @@
 
 #define CCALL_HANDLE_COMPLEXARG \
   /* Pass complex by value in separate (!) FPRs or on stack. */ \
-  isfp = ctr->size == 2*sizeof(float) ? 2 : 1;
+  isfp = sz == 2*sizeof(float) ? 2 : 1;
 
 #define CCALL_HANDLE_REGARG \
   if (LJ_TARGET_IOS && isva) { \
@@ -359,6 +359,13 @@
     } \
   }
 
+#if LJ_BE
+#define CCALL_HANDLE_RET \
+  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
+    sp = (uint8_t *)&cc->fpr[0].f;
+#endif
+
+
 #elif LJ_TARGET_PPC
 /* -- PPC calling conventions --------------------------------------------- */
 
@@ -407,8 +414,8 @@
   if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
     ctr = ctype_get(cts, CTID_DOUBLE);  /* FPRs always hold doubles. */
 
-#elif LJ_TARGET_MIPS
-/* -- MIPS calling conventions -------------------------------------------- */
+#elif LJ_TARGET_MIPS32
+/* -- MIPS o32 calling conventions ---------------------------------------- */
 
 #define CCALL_HANDLE_STRUCTRET \
   cc->retref = 1;  /* Return all structs by reference. */ \
@@ -483,6 +490,78 @@
     sp = (uint8_t *)&cc->fpr[0].f;
 #endif
 
+#elif LJ_TARGET_MIPS64
+/* -- MIPS n64 calling conventions ---------------------------------------- */
+
+#define CCALL_HANDLE_STRUCTRET \
+  cc->retref = !(sz <= 16); \
+  if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;
+
+#define CCALL_HANDLE_STRUCTRET2 \
+  ccall_copy_struct(cc, ctr, dp, sp, ccall_classify_struct(cts, ctr, ct));
+
+#define CCALL_HANDLE_COMPLEXRET \
+  /* Complex values are returned in 1 or 2 FPRs. */ \
+  cc->retref = 0;
+
+#if LJ_ABI_SOFTFP	/* MIPS64 soft-float */
+
+#define CCALL_HANDLE_COMPLEXRET2 \
+  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from GPRs. */ \
+    ((intptr_t *)dp)[0] = cc->gpr[0]; \
+  } else {  /* Copy complex double from GPRs. */ \
+    ((intptr_t *)dp)[0] = cc->gpr[0]; \
+    ((intptr_t *)dp)[1] = cc->gpr[1]; \
+  }
+
+#define CCALL_HANDLE_COMPLEXARG \
+  /* Pass complex by value in 2 or 4 GPRs. */
+
+/* Position of soft-float 'float' return value depends on endianess.  */
+#define CCALL_HANDLE_RET \
+  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
+    sp = (uint8_t *)cc->gpr + LJ_ENDIAN_SELECT(0, 4);
+
+#else			/* MIPS64 hard-float */
+
+#define CCALL_HANDLE_COMPLEXRET2 \
+  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from FPRs. */ \
+    ((float *)dp)[0] = cc->fpr[0].f; \
+    ((float *)dp)[1] = cc->fpr[1].f; \
+  } else {  /* Copy complex double from FPRs. */ \
+    ((double *)dp)[0] = cc->fpr[0].d; \
+    ((double *)dp)[1] = cc->fpr[1].d; \
+  }
+
+#define CCALL_HANDLE_COMPLEXARG \
+  if (sz == 2*sizeof(float)) { \
+    isfp = 2; \
+    if (ngpr < maxgpr) \
+      sz *= 2; \
+  }
+
+#define CCALL_HANDLE_RET \
+  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
+    sp = (uint8_t *)&cc->fpr[0].f;
+
+#endif
+
+#define CCALL_HANDLE_STRUCTARG \
+  /* Pass all structs by value in registers and/or on the stack. */
+
+#define CCALL_HANDLE_REGARG \
+  if (ngpr < maxgpr) { \
+    dp = &cc->gpr[ngpr]; \
+    if (ngpr + n > maxgpr) { \
+      nsp += ngpr + n - maxgpr;  /* Assumes contiguous gpr/stack fields. */ \
+      if (nsp > CCALL_MAXSTACK) goto err_nyi;  /* Too many arguments. */ \
+      ngpr = maxgpr; \
+    } else { \
+      ngpr += n; \
+    } \
+    goto done; \
+  }
+
 #else
 #error "Missing calling convention definitions for this architecture"
 #endif
@@ -722,6 +801,78 @@
 
 #endif
 
+/* -- MIPS64 ABI struct classification ---------------------------- */
+
+#if LJ_TARGET_MIPS64
+
+#define FTYPE_FLOAT	1
+#define FTYPE_DOUBLE	2
+
+/* Classify FP fields (max. 2) and their types. */
+static unsigned int ccall_classify_struct(CTState *cts, CType *ct, CType *ctf)
+{
+  int n = 0, ft = 0;
+  if ((ctf->info & CTF_VARARG) || (ct->info & CTF_UNION))
+    goto noth;
+  while (ct->sib) {
+    CType *sct;
+    ct = ctype_get(cts, ct->sib);
+    if (n == 2) {
+      goto noth;
+    } else if (ctype_isfield(ct->info)) {
+      sct = ctype_rawchild(cts, ct);
+      if (ctype_isfp(sct->info)) {
+	ft |= (sct->size == 4 ? FTYPE_FLOAT : FTYPE_DOUBLE) << 2*n;
+	n++;
+      } else {
+	goto noth;
+      }
+    } else if (ctype_isbitfield(ct->info) ||
+	       ctype_isxattrib(ct->info, CTA_SUBTYPE)) {
+      goto noth;
+    }
+  }
+  if (n <= 2)
+    return ft;
+noth:  /* Not a homogeneous float/double aggregate. */
+  return 0;  /* Struct is in GPRs. */
+}
+
+void ccall_copy_struct(CCallState *cc, CType *ctr, void *dp, void *sp, int ft)
+{
+  if (LJ_ABI_SOFTFP ? ft :
+      ((ft & 3) == FTYPE_FLOAT || (ft >> 2) == FTYPE_FLOAT)) {
+    int i, ofs = 0;
+    for (i = 0; ft != 0; i++, ft >>= 2) {
+      if ((ft & 3) == FTYPE_FLOAT) {
+#if LJ_ABI_SOFTFP
+	/* The 2nd FP struct result is in CARG1 (gpr[2]) and not CRET2. */
+	memcpy((uint8_t *)dp + ofs,
+	       (uint8_t *)&cc->gpr[2*i] + LJ_ENDIAN_SELECT(0, 4), 4);
+#else
+	*(float *)((uint8_t *)dp + ofs) = cc->fpr[i].f;
+#endif
+	ofs += 4;
+      } else {
+	ofs = (ofs + 7) & ~7;  /* 64 bit alignment. */
+#if LJ_ABI_SOFTFP
+	*(intptr_t *)((uint8_t *)dp + ofs) = cc->gpr[2*i];
+#else
+	*(double *)((uint8_t *)dp + ofs) = cc->fpr[i].d;
+#endif
+	ofs += 8;
+      }
+    }
+  } else {
+#if !LJ_ABI_SOFTFP
+    if (ft) sp = (uint8_t *)&cc->fpr[0];
+#endif
+    memcpy(dp, sp, ctr->size);
+  }
+}
+
+#endif
+
 /* -- Common C call handling ---------------------------------------------- */
 
 /* Infer the destination CTypeID for a vararg argument. */
@@ -889,6 +1040,19 @@
 	*(int32_t *)dp = d->size == 1 ? (int32_t)*(int8_t *)dp :
 					(int32_t)*(int16_t *)dp;
     }
+#if LJ_TARGET_ARM64 && LJ_BE
+    if (isfp && d->size == sizeof(float))
+      ((float *)dp)[1] = ((float *)dp)[0];  /* Floats occupy high slot. */
+#endif
+#if LJ_TARGET_MIPS64 || (LJ_TARGET_ARM64 && LJ_BE)
+    if ((ctype_isinteger_or_bool(d->info) || ctype_isenum(d->info)
+#if LJ_TARGET_MIPS64
+	 || (isfp && nsp == 0)
+#endif
+	 ) && d->size <= 4) {
+      *(int64_t *)dp = (int64_t)*(int32_t *)dp;  /* Sign-extend to 64 bit. */
+    }
+#endif
 #if LJ_TARGET_X64 && LJ_ABI_WIN
     if (isva) {  /* Windows/x64 mirrors varargs in both register sets. */
       if (nfpr == ngpr)
@@ -904,7 +1068,7 @@
       cc->fpr[nfpr-1].d[0] = cc->fpr[nfpr-2].d[1];  /* Split complex double. */
       cc->fpr[nfpr-2].d[1] = 0;
     }
-#elif LJ_TARGET_ARM64
+#elif LJ_TARGET_ARM64 || (LJ_TARGET_MIPS64 && !LJ_ABI_SOFTFP)
     if (isfp == 2 && (uint8_t *)dp < (uint8_t *)cc->stack) {
       /* Split float HFA or complex float into separate registers. */
       CTSize i = (sz >> 2) - 1;
@@ -951,7 +1115,8 @@
     CCALL_HANDLE_COMPLEXRET2
     return 1;  /* One GC step. */
   }
-  if (LJ_BE && ctype_isinteger_or_bool(ctr->info) && ctr->size < CTSIZE_PTR)
+  if (LJ_BE && ctr->size < CTSIZE_PTR &&
+      (ctype_isinteger_or_bool(ctr->info) || ctype_isenum(ctr->info)))
     sp += (CTSIZE_PTR - ctr->size);
 #if CCALL_NUM_FPR
   if (ctype_isfp(ctr->info) || ctype_isvector(ctr->info))

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccall.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccall.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccall.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** FFI C call handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CCALL_H
@@ -79,8 +79,8 @@
 typedef intptr_t GPRArg;
 typedef union FPRArg {
   double d;
-  float f;
-  uint32_t u32;
+  struct { LJ_ENDIAN_LOHI(float f; , float g;) };
+  struct { LJ_ENDIAN_LOHI(uint32_t lo; , uint32_t hi;) };
 } FPRArg;
 
 #elif LJ_TARGET_PPC
@@ -95,11 +95,11 @@
 typedef intptr_t GPRArg;
 typedef double FPRArg;
 
-#elif LJ_TARGET_MIPS
+#elif LJ_TARGET_MIPS32
 
 #define CCALL_NARG_GPR		4
 #define CCALL_NARG_FPR		(LJ_ABI_SOFTFP ? 0 : 2)
-#define CCALL_NRET_GPR		2
+#define CCALL_NRET_GPR		(LJ_ABI_SOFTFP ? 4 : 2)
 #define CCALL_NRET_FPR		(LJ_ABI_SOFTFP ? 0 : 2)
 #define CCALL_SPS_EXTRA		7
 #define CCALL_SPS_FREE		1
@@ -110,6 +110,22 @@
   struct { LJ_ENDIAN_LOHI(float f; , float g;) };
 } FPRArg;
 
+#elif LJ_TARGET_MIPS64
+
+/* FP args are positional and overlay the GPR array. */
+#define CCALL_NARG_GPR		8
+#define CCALL_NARG_FPR		0
+#define CCALL_NRET_GPR		2
+#define CCALL_NRET_FPR		(LJ_ABI_SOFTFP ? 0 : 2)
+#define CCALL_SPS_EXTRA		3
+#define CCALL_SPS_FREE		1
+
+typedef intptr_t GPRArg;
+typedef union FPRArg {
+  double d;
+  struct { LJ_ENDIAN_LOHI(float f; , float g;) };
+} FPRArg;
+
 #else
 #error "Missing calling convention definitions for this architecture"
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccallback.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccallback.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccallback.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** FFI C callback handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "lj_obj.h"
@@ -63,10 +63,14 @@
 
 #define CALLBACK_MCODE_HEAD		24
 
-#elif LJ_TARGET_MIPS
+#elif LJ_TARGET_MIPS32
 
-#define CALLBACK_MCODE_HEAD		24
+#define CALLBACK_MCODE_HEAD		20
 
+#elif LJ_TARGET_MIPS64
+
+#define CALLBACK_MCODE_HEAD		52
+
 #else
 
 /* Missing support for this architecture. */
@@ -169,16 +173,16 @@
   uint32_t *p = page;
   void *target = (void *)lj_vm_ffi_callback;
   MSize slot;
-  *p++ = A64I_LDRLx | A64F_D(RID_X11) | A64F_S19(4);
-  *p++ = A64I_LDRLx | A64F_D(RID_X10) | A64F_S19(5);
-  *p++ = A64I_BR | A64F_N(RID_X11);
-  *p++ = A64I_NOP;
+  *p++ = A64I_LE(A64I_LDRLx | A64F_D(RID_X11) | A64F_S19(4));
+  *p++ = A64I_LE(A64I_LDRLx | A64F_D(RID_X10) | A64F_S19(5));
+  *p++ = A64I_LE(A64I_BR | A64F_N(RID_X11));
+  *p++ = A64I_LE(A64I_NOP);
   ((void **)p)[0] = target;
   ((void **)p)[1] = g;
   p += 4;
   for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
-    *p++ = A64I_MOVZw | A64F_D(RID_X9) | A64F_U16(slot);
-    *p = A64I_B | A64F_S26((page-p) & 0x03ffffffu);
+    *p++ = A64I_LE(A64I_MOVZw | A64F_D(RID_X9) | A64F_U16(slot));
+    *p = A64I_LE(A64I_B | A64F_S26((page-p) & 0x03ffffffu));
     p++;
   }
   lua_assert(p - page <= CALLBACK_MCODE_SIZE);
@@ -206,14 +210,27 @@
 static void callback_mcode_init(global_State *g, uint32_t *page)
 {
   uint32_t *p = page;
-  void *target = (void *)lj_vm_ffi_callback;
+  uintptr_t target = (uintptr_t)(void *)lj_vm_ffi_callback;
+  uintptr_t ug = (uintptr_t)(void *)g;
   MSize slot;
-  *p++ = MIPSI_SW | MIPSF_T(RID_R1)|MIPSF_S(RID_SP) | 0;
-  *p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (u32ptr(target) >> 16);
-  *p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (u32ptr(g) >> 16);
-  *p++ = MIPSI_ORI | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) |(u32ptr(target)&0xffff);
+#if LJ_TARGET_MIPS32
+  *p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (target >> 16);
+  *p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (ug >> 16);
+#else
+  *p++ = MIPSI_LUI  | MIPSF_T(RID_R3) | (target >> 48);
+  *p++ = MIPSI_LUI  | MIPSF_T(RID_R2) | (ug >> 48);
+  *p++ = MIPSI_ORI  | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) | ((target >> 32) & 0xffff);
+  *p++ = MIPSI_ORI  | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | ((ug >> 32) & 0xffff);
+  *p++ = MIPSI_DSLL | MIPSF_D(RID_R3)|MIPSF_T(RID_R3) | MIPSF_A(16);
+  *p++ = MIPSI_DSLL | MIPSF_D(RID_R2)|MIPSF_T(RID_R2) | MIPSF_A(16);
+  *p++ = MIPSI_ORI  | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) | ((target >> 16) & 0xffff);
+  *p++ = MIPSI_ORI  | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | ((ug >> 16) & 0xffff);
+  *p++ = MIPSI_DSLL | MIPSF_D(RID_R3)|MIPSF_T(RID_R3) | MIPSF_A(16);
+  *p++ = MIPSI_DSLL | MIPSF_D(RID_R2)|MIPSF_T(RID_R2) | MIPSF_A(16);
+#endif
+  *p++ = MIPSI_ORI  | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) | (target & 0xffff);
   *p++ = MIPSI_JR | MIPSF_S(RID_R3);
-  *p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | (u32ptr(g)&0xffff);
+  *p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | (ug & 0xffff);
   for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
     *p = MIPSI_B | ((page-p-1) & 0x0000ffffu);
     p++;
@@ -425,7 +442,7 @@
   if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
     *(double *)dp = *(float *)dp;  /* FPRs always hold doubles. */
 
-#elif LJ_TARGET_MIPS
+#elif LJ_TARGET_MIPS32
 
 #define CALLBACK_HANDLE_GPR \
   if (n > 1) ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \
@@ -455,6 +472,29 @@
   if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
     ((float *)dp)[1] = *(float *)dp;
 
+#elif LJ_TARGET_MIPS64
+
+#if !LJ_ABI_SOFTFP	/* MIPS64 hard-float */
+#define CALLBACK_HANDLE_REGARG \
+  if (ngpr + n <= maxgpr) { \
+    sp = isfp ? (void*) &cts->cb.fpr[ngpr] : (void*) &cts->cb.gpr[ngpr]; \
+    ngpr += n; \
+    goto done; \
+  }
+#else			/* MIPS64 soft-float */
+#define CALLBACK_HANDLE_REGARG \
+  if (ngpr + n <= maxgpr) { \
+    UNUSED(isfp); \
+    sp = (void*) &cts->cb.gpr[ngpr]; \
+    ngpr += n; \
+    goto done; \
+  }
+#endif
+
+#define CALLBACK_HANDLE_RET \
+  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
+    ((float *)dp)[1] = *(float *)dp;
+
 #else
 #error "Missing calling convention definitions for this architecture"
 #endif
@@ -542,7 +582,11 @@
       nsp += n;
 
     done:
-      if (LJ_BE && cta->size < CTSIZE_PTR)
+      if (LJ_BE && cta->size < CTSIZE_PTR
+#if LJ_TARGET_MIPS64
+	  && !(isfp && nsp)
+#endif
+	 )
 	sp = (void *)((uint8_t *)sp + CTSIZE_PTR-cta->size);
       gcsteps += lj_cconv_tv_ct(cts, cta, 0, o++, sp);
     }
@@ -580,6 +624,10 @@
     if (ctype_isfp(ctr->info))
       dp = (uint8_t *)&cts->cb.fpr[0];
 #endif
+#if LJ_TARGET_ARM64 && LJ_BE
+    if (ctype_isfp(ctr->info) && ctr->size == sizeof(float))
+      dp = (uint8_t *)&cts->cb.fpr[0].f[1];
+#endif
     lj_cconv_ct_tv(cts, ctr, dp, o, 0);
 #ifdef CALLBACK_HANDLE_RET
     CALLBACK_HANDLE_RET
@@ -593,6 +641,12 @@
 	*(int32_t *)dp = ctr->size == 1 ? (int32_t)*(int8_t *)dp :
 					  (int32_t)*(int16_t *)dp;
     }
+#if LJ_TARGET_MIPS64 || (LJ_TARGET_ARM64 && LJ_BE)
+    /* Always sign-extend results to 64 bits. Even a soft-fp 'float'. */
+    if (ctr->size <= 4 &&
+	(LJ_ABI_SOFTFP || ctype_isinteger_or_bool(ctr->info)))
+      *(int64_t *)dp = (int64_t)*(int32_t *)dp;
+#endif
 #if LJ_TARGET_X86
     if (ctype_isfp(ctr->info))
       cts->cb.gpr[2] = ctr->size == sizeof(float) ? 1 : 2;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccallback.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccallback.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ccallback.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** FFI C callback handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CCALLBACK_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cconv.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cconv.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cconv.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C type conversions.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "lj_obj.h"
@@ -448,8 +448,10 @@
 	setintV(o, (int32_t)val);
     }
   } else {
+    uint32_t b = (val >> pos) & 1;
     lua_assert(bsz == 1);
-    setboolV(o, (val >> pos) & 1);
+    setboolV(o, b);
+    setboolV(&cts->g->tmptv2, b);  /* Remember for trace recorder. */
   }
   return 0;  /* No GC step needed. */
 }

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cconv.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cconv.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cconv.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C type conversions.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CCONV_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cdata.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cdata.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cdata.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C data management.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "lj_obj.h"
@@ -93,11 +93,13 @@
     setcdataV(L, &tmp, cd);
     lj_gc_anybarriert(L, t);
     tv = lj_tab_set(L, t, &tmp);
-    setgcV(L, tv, obj, it);
-    if (!tvisnil(tv))
+    if (it == LJ_TNIL) {
+      setnilV(tv);
+      cd->marked &= ~LJ_GC_CDATA_FIN;
+    } else {
+      setgcV(L, tv, obj, it);
       cd->marked |= LJ_GC_CDATA_FIN;
-    else
-      cd->marked &= ~LJ_GC_CDATA_FIN;
+    }
   }
 }
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cdata.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cdata.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cdata.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C data management.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CDATA_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_clib.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_clib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_clib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** FFI C library loader.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "lj_obj.h"
@@ -40,7 +40,7 @@
 
 #define clib_error(L, fmt, name)	clib_error_(L)
 
-#if defined(__CYGWIN__)
+#if LJ_TARGET_CYGWIN
 #define CLIB_SOPREFIX	"cyg"
 #else
 #define CLIB_SOPREFIX	"lib"
@@ -48,7 +48,7 @@
 
 #if LJ_TARGET_OSX
 #define CLIB_SOEXT	"%s.dylib"
-#elif defined(__CYGWIN__)
+#elif LJ_TARGET_CYGWIN
 #define CLIB_SOEXT	"%s.dll"
 #else
 #define CLIB_SOEXT	"%s.so"
@@ -57,7 +57,7 @@
 static const char *clib_extname(lua_State *L, const char *name)
 {
   if (!strchr(name, '/')
-#ifdef __CYGWIN__
+#if LJ_TARGET_CYGWIN
       && !strchr(name, '\\')
 #endif
      ) {
@@ -64,7 +64,7 @@
     if (!strchr(name, '.')) {
       name = lj_strfmt_pushf(L, CLIB_SOEXT, name);
       L->top--;
-#ifdef __CYGWIN__
+#if LJ_TARGET_CYGWIN
     } else {
       return name;
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_clib.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_clib.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_clib.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** FFI C library loader.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CLIB_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cparse.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cparse.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cparse.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C declaration parser.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "lj_obj.h"
@@ -297,13 +297,17 @@
       else return '/';
       break;
     case '|':
-      if (cp_get(cp) != '|') return '|'; cp_get(cp); return CTOK_OROR;
+      if (cp_get(cp) != '|') return '|';
+      cp_get(cp); return CTOK_OROR;
     case '&':
-      if (cp_get(cp) != '&') return '&'; cp_get(cp); return CTOK_ANDAND;
+      if (cp_get(cp) != '&') return '&';
+      cp_get(cp); return CTOK_ANDAND;
     case '=':
-      if (cp_get(cp) != '=') return '='; cp_get(cp); return CTOK_EQ;
+      if (cp_get(cp) != '=') return '=';
+      cp_get(cp); return CTOK_EQ;
     case '!':
-      if (cp_get(cp) != '=') return '!'; cp_get(cp); return CTOK_NE;
+      if (cp_get(cp) != '=') return '!';
+      cp_get(cp); return CTOK_NE;
     case '<':
       if (cp_get(cp) == '=') { cp_get(cp); return CTOK_LE; }
       else if (cp->c == '<') { cp_get(cp); return CTOK_SHL; }
@@ -313,7 +317,8 @@
       else if (cp->c == '>') { cp_get(cp); return CTOK_SHR; }
       return '>';
     case '-':
-      if (cp_get(cp) != '>') return '-'; cp_get(cp); return CTOK_DEREF;
+      if (cp_get(cp) != '>') return '-';
+      cp_get(cp); return CTOK_DEREF;
     case '$':
       return cp_param(cp);
     case '\0': return CTOK_EOF;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cparse.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cparse.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_cparse.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C declaration parser.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CPARSE_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_crecord.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_crecord.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_crecord.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Trace recorder for C data operations.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_ffrecord_c
@@ -712,6 +712,19 @@
   return tr;
 }
 
+/* Tailcall to function. */
+static void crec_tailcall(jit_State *J, RecordFFData *rd, cTValue *tv)
+{
+  TRef kfunc = lj_ir_kfunc(J, funcV(tv));
+#if LJ_FR2
+  J->base[-2] = kfunc;
+  J->base[-1] = TREF_FRAME;
+#else
+  J->base[-1] = kfunc | TREF_FRAME;
+#endif
+  rd->nres = -1;  /* Pending tailcall. */
+}
+
 /* Record ctype __index/__newindex metamethods. */
 static void crec_index_meta(jit_State *J, CTState *cts, CType *ct,
 			    RecordFFData *rd)
@@ -721,8 +734,7 @@
   if (!tv)
     lj_trace_err(J, LJ_TRERR_BADTYPE);
   if (tvisfunc(tv)) {
-    J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;
-    rd->nres = -1;  /* Pending tailcall. */
+    crec_tailcall(J, rd, tv);
   } else if (rd->data == 0 && tvistab(tv) && tref_isstr(J->base[1])) {
     /* Specialize to result of __index lookup. */
     cTValue *o = lj_tab_get(J->L, tabV(tv), &rd->argv[1]);
@@ -739,6 +751,48 @@
   }
 }
 
+/* Record bitfield load/store. */
+static void crec_index_bf(jit_State *J, RecordFFData *rd, TRef ptr, CTInfo info)
+{
+  IRType t = IRT_I8 + 2*lj_fls(ctype_bitcsz(info)) + ((info&CTF_UNSIGNED)?1:0);
+  TRef tr = emitir(IRT(IR_XLOAD, t), ptr, 0);
+  CTSize pos = ctype_bitpos(info), bsz = ctype_bitbsz(info), shift = 32 - bsz;
+  lua_assert(t <= IRT_U32);  /* NYI: 64 bit bitfields. */
+  if (rd->data == 0) {  /* __index metamethod. */
+    if ((info & CTF_BOOL)) {
+      tr = emitir(IRTI(IR_BAND), tr, lj_ir_kint(J, (int32_t)((1u << pos))));
+      /* Assume not equal to zero. Fixup and emit pending guard later. */
+      lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0));
+      J->postproc = LJ_POST_FIXGUARD;
+      tr = TREF_TRUE;
+    } else if (!(info & CTF_UNSIGNED)) {
+      tr = emitir(IRTI(IR_BSHL), tr, lj_ir_kint(J, shift - pos));
+      tr = emitir(IRTI(IR_BSAR), tr, lj_ir_kint(J, shift));
+    } else {
+      lua_assert(bsz < 32);  /* Full-size fields cannot end up here. */
+      tr = emitir(IRTI(IR_BSHR), tr, lj_ir_kint(J, pos));
+      tr = emitir(IRTI(IR_BAND), tr, lj_ir_kint(J, (int32_t)((1u << bsz)-1)));
+      /* We can omit the U32 to NUM conversion, since bsz < 32. */
+    }
+    J->base[0] = tr;
+  } else {  /* __newindex metamethod. */
+    CTState *cts = ctype_ctsG(J2G(J));
+    CType *ct = ctype_get(cts,
+			  (info & CTF_BOOL) ? CTID_BOOL :
+			  (info & CTF_UNSIGNED) ? CTID_UINT32 : CTID_INT32);
+    int32_t mask = (int32_t)(((1u << bsz)-1) << pos);
+    TRef sp = crec_ct_tv(J, ct, 0, J->base[2], &rd->argv[2]);
+    sp = emitir(IRTI(IR_BSHL), sp, lj_ir_kint(J, pos));
+    /* Use of the target type avoids forwarding conversions. */
+    sp = emitir(IRT(IR_BAND, t), sp, lj_ir_kint(J, mask));
+    tr = emitir(IRT(IR_BAND, t), tr, lj_ir_kint(J, (int32_t)~mask));
+    tr = emitir(IRT(IR_BOR, t), tr, sp);
+    emitir(IRT(IR_XSTORE, t), ptr, tr);
+    rd->nres = 0;
+    J->needsnap = 1;
+  }
+}
+
 void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd)
 {
   TRef idx, ptr = J->base[0];
@@ -813,6 +867,7 @@
       CType *fct;
       fct = lj_ctype_getfield(cts, ct, name, &fofs);
       if (fct) {
+	ofs += (ptrdiff_t)fofs;
 	/* Always specialize to the field name. */
 	emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name));
 	if (ctype_isconstval(fct->info)) {
@@ -824,12 +879,14 @@
 	  J->base[0] = lj_ir_kint(J, (int32_t)fct->size);
 	  return;  /* Interpreter will throw for newindex. */
 	} else if (ctype_isbitfield(fct->info)) {
-	  lj_trace_err(J, LJ_TRERR_NYICONV);
+	  if (ofs)
+	    ptr = emitir(IRT(IR_ADD, IRT_PTR), ptr, lj_ir_kintp(J, ofs));
+	  crec_index_bf(J, rd, ptr, fct->info);
+	  return;
 	} else {
 	  lua_assert(ctype_isfield(fct->info));
 	  sid = ctype_cid(fct->info);
 	}
-	ofs += (ptrdiff_t)fofs;
       }
     } else if (ctype_iscomplex(ct->info)) {
       if (name->len == 2 &&
@@ -1119,20 +1176,20 @@
   lua_State *L = J->L;
   TValue *base = L->base, *top = L->top;
   const BCIns *pc = J->pc;
-  TRef ftr = J->base[-1];
+  TRef ftr = J->base[-1-LJ_FR2];
   ptrdiff_t delta;
   if (!frame_islua(base-1) || J->framedepth <= 0)
     lj_trace_err(J, LJ_TRERR_NYICALL);
   J->pc = frame_pc(base-1); delta = 1+LJ_FR2+bc_a(J->pc[-1]);
   L->top = base; L->base = base - delta;
-  J->base[-1] = TREF_FALSE;
+  J->base[-1-LJ_FR2] = TREF_FALSE;
   J->base -= delta; J->baseslot -= (BCReg)delta;
-  J->maxslot = (BCReg)delta; J->framedepth--;
+  J->maxslot = (BCReg)delta-LJ_FR2; J->framedepth--;
   lj_snap_add(J);
   L->base = base; L->top = top;
   J->framedepth++; J->maxslot = 1;
   J->base += delta; J->baseslot += (BCReg)delta;
-  J->base[-1] = ftr; J->pc = pc;
+  J->base[-1-LJ_FR2] = ftr; J->pc = pc;
 }
 
 /* Record function call. */
@@ -1224,8 +1281,7 @@
   tv = lj_ctype_meta(cts, ctype_isptr(ct->info) ? ctype_cid(ct->info) : id, mm);
   if (tv) {
     if (tvisfunc(tv)) {
-      J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;
-      rd->nres = -1;  /* Pending tailcall. */
+      crec_tailcall(J, rd, tv);
       return;
     }
   } else if (mm == MM_new) {
@@ -1238,7 +1294,7 @@
 
 static TRef crec_arith_int64(jit_State *J, TRef *sp, CType **s, MMS mm)
 {
-  if (ctype_isnum(s[0]->info) && ctype_isnum(s[1]->info)) {
+  if (sp[0] && sp[1] && ctype_isnum(s[0]->info) && ctype_isnum(s[1]->info)) {
     IRType dt;
     CTypeID id;
     TRef tr;
@@ -1296,6 +1352,7 @@
 {
   CTState *cts = ctype_ctsG(J2G(J));
   CType *ctp = s[0];
+  if (!(sp[0] && sp[1])) return 0;
   if (ctype_isptr(ctp->info) || ctype_isrefarray(ctp->info)) {
     if ((mm == MM_sub || mm == MM_eq || mm == MM_lt || mm == MM_le) &&
 	(ctype_isptr(s[1]->info) || ctype_isrefarray(s[1]->info))) {
@@ -1373,8 +1430,7 @@
   }
   if (tv) {
     if (tvisfunc(tv)) {
-      J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;
-      rd->nres = -1;  /* Pending tailcall. */
+      crec_tailcall(J, rd, tv);
       return 0;
     }  /* NYI: non-function metamethods. */
   } else if ((MMS)rd->data == MM_eq) {  /* Fallback cdata pointer comparison. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_crecord.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_crecord.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_crecord.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Trace recorder for C data operations.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CRECORD_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ctype.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ctype.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ctype.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C type management.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include "lj_obj.h"

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ctype.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ctype.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ctype.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** C type management.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_CTYPE_H
@@ -42,18 +42,18 @@
 **  ---------- info ------------
 ** |type      flags...  A   cid | size   |  sib  | next  | name  |
 ** +----------------------------+--------+-------+-------+-------+--
-** |NUM       BFvcUL..  A       | size   |       | type  |       |
-** |STRUCT    ..vcU..V  A       | size   | field | name? | name? |
-** |PTR       ..vcR...  A   cid | size   |       | type  |       |
-** |ARRAY     VCvc...V  A   cid | size   |       | type  |       |
-** |VOID      ..vc....  A       | size   |       | type  |       |
+** |NUM       BFcvUL..  A       | size   |       | type  |       |
+** |STRUCT    ..cvU..V  A       | size   | field | name? | name? |
+** |PTR       ..cvR...  A   cid | size   |       | type  |       |
+** |ARRAY     VCcv...V  A   cid | size   |       | type  |       |
+** |VOID      ..cv....  A       | size   |       | type  |       |
 ** |ENUM                A   cid | size   | const | name? | name? |
 ** |FUNC      ....VS.. cc   cid | nargs  | field | name? | name? |
 ** |TYPEDEF                 cid |        |       | name  | name  |
 ** |ATTRIB        attrnum   cid | attr   | sib?  | type? |       |
 ** |FIELD                   cid | offset | field |       | name? |
-** |BITFIELD  B.vcU csz bsz pos | offset | field |       | name? |
-** |CONSTVAL     c          cid | value  | const | name  | name  |
+** |BITFIELD  B.cvU csz bsz pos | offset | field |       | name? |
+** |CONSTVAL    c           cid | value  | const | name  | name  |
 ** |EXTERN                  cid |        | sib?  | name  | name  |
 ** |KW                      tok | size   |       | name  | name  |
 ** +----------------------------+--------+-------+-------+-------+--

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_debug.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_debug.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_debug.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Debugging and introspection.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_debug_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_debug.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_debug.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_debug.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Debugging and introspection.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_DEBUG_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_def.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_def.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_def.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT common internal definitions.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_DEF_H
@@ -95,6 +95,9 @@
 #define U64x(hi, lo)	(((uint64_t)0x##hi << 32) + (uint64_t)0x##lo)
 #define i32ptr(p)	((int32_t)(intptr_t)(void *)(p))
 #define u32ptr(p)	((uint32_t)(intptr_t)(void *)(p))
+#define i64ptr(p)	((int64_t)(intptr_t)(void *)(p))
+#define u64ptr(p)	((uint64_t)(intptr_t)(void *)(p))
+#define igcptr(p)	(LJ_GC64 ? i64ptr(p) : i32ptr(p))
 
 #define checki8(x)	((x) == (int32_t)(int8_t)(x))
 #define checku8(x)	((x) == (int32_t)(uint8_t)(x))
@@ -103,14 +106,8 @@
 #define checki32(x)	((x) == (int32_t)(x))
 #define checku32(x)	((x) == (uint32_t)(x))
 #define checkptr32(x)	((uintptr_t)(x) == (uint32_t)(uintptr_t)(x))
-#define checkptr47(x)	(((uint64_t)(x) >> 47) == 0)
-#if LJ_GC64
-#define checkptrGC(x)	(checkptr47((x)))
-#elif LJ_64
-#define checkptrGC(x)	(checkptr32((x)))
-#else
-#define checkptrGC(x)	1
-#endif
+#define checkptr47(x)	(((uint64_t)(uintptr_t)(x) >> 47) == 0)
+#define checkptrGC(x)	(LJ_GC64 ? checkptr47((x)) : LJ_64 ? checkptr32((x)) :1)
 
 /* Every half-decent C compiler transforms this into a rotate instruction. */
 #define lj_rol(x, n)	(((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1))))

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_dispatch.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_dispatch.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_dispatch.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Instruction dispatch handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_dispatch_c
@@ -75,7 +75,7 @@
   for (i = 0; i < GG_NUM_ASMFF; i++)
     GG->bcff[i] = BCINS_AD(BC__MAX+i, 0, 0);
 #if LJ_TARGET_MIPS
-  memcpy(GG->got, dispatch_got, LJ_GOT__MAX*4);
+  memcpy(GG->got, dispatch_got, LJ_GOT__MAX*sizeof(ASMFunction *));
 #endif
 }
 
@@ -267,7 +267,7 @@
   case LUAJIT_MODE_FUNC:
   case LUAJIT_MODE_ALLFUNC:
   case LUAJIT_MODE_ALLSUBFUNC: {
-    cTValue *tv = idx == 0 ? frame_prev(L->base-1) :
+    cTValue *tv = idx == 0 ? frame_prev(L->base-1)-LJ_FR2 :
 		  idx > 0 ? L->base + (idx-1) : L->top + idx;
     GCproto *pt;
     if ((idx == 0 || tvisfunc(tv)) && isluafunc(&gcval(tv)->fn))

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_dispatch.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_dispatch.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_dispatch.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Instruction dispatch handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_DISPATCH_H
@@ -107,6 +107,7 @@
 #define J2G(J)		(&J2GG(J)->g)
 #define G2J(gl)		(&G2GG(gl)->J)
 #define L2J(L)		(&L2GG(L)->J)
+#define GG_G2J		(GG_OFS(J) - GG_OFS(g))
 #define GG_G2DISP	(GG_OFS(dispatch) - GG_OFS(g))
 #define GG_DISP2G	(GG_OFS(g) - GG_OFS(dispatch))
 #define GG_DISP2J	(GG_OFS(J) - GG_OFS(dispatch))

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_arm.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_arm.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_arm.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** ARM instruction emitter.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* -- Constant encoding --------------------------------------------------- */
@@ -207,7 +207,7 @@
 
 #define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))
 
-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);
+static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow);
 
 /* Get/set from constant pointer. */
 static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p)
@@ -219,8 +219,9 @@
 
 #if !LJ_SOFTFP
 /* Load a number constant into an FPR. */
-static void emit_loadn(ASMState *as, Reg r, cTValue *tv)
+static void emit_loadk64(ASMState *as, Reg r, IRIns *ir)
 {
+  cTValue *tv = ir_knum(ir);
   int32_t i;
   if ((as->flags & JIT_F_VFPV3) && !tv->u32.lo) {
     uint32_t hi = tv->u32.hi;
@@ -273,7 +274,7 @@
   ptrdiff_t delta = ((char *)target - (char *)p) - 8;
   if ((((delta>>2) + 0x00800000) >> 24) == 0) {
     if ((delta & 1))
-      *p = ARMI_BLX | ((uint32_t)(delta>>2) & 0x00ffffffu) | ((delta&2) << 27);
+      *p = ARMI_BLX | ((uint32_t)(delta>>2) & 0x00ffffffu) | ((delta&2) << 23);
     else
       *p = ARMI_BL | ((uint32_t)(delta>>2) & 0x00ffffffu);
   } else {  /* Target out of range: need indirect call. But don't use R0-R3. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_mips.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_mips.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_mips.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,8 +1,30 @@
 /*
 ** MIPS instruction emitter.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
+#if LJ_64
+static intptr_t get_k64val(IRIns *ir)
+{
+  if (ir->o == IR_KINT64) {
+    return (intptr_t)ir_kint64(ir)->u64;
+  } else if (ir->o == IR_KGC) {
+    return (intptr_t)ir_kgc(ir);
+  } else if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {
+    return (intptr_t)ir_kptr(ir);
+  } else {
+    lua_assert(ir->o == IR_KINT || ir->o == IR_KNULL);
+    return ir->i;  /* Sign-extended. */
+  }
+}
+#endif
+
+#if LJ_64
+#define get_kval(ir)		get_k64val(ir)
+#else
+#define get_kval(ir)		((ir)->i)
+#endif
+
 /* -- Emit basic instructions --------------------------------------------- */
 
 static void emit_dst(ASMState *as, MIPSIns mi, Reg rd, Reg rs, Reg rt)
@@ -35,7 +57,7 @@
 
 static void emit_rotr(ASMState *as, Reg dest, Reg src, Reg tmp, uint32_t shift)
 {
-  if ((as->flags & JIT_F_MIPS32R2)) {
+  if (LJ_64 || (as->flags & JIT_F_MIPSXXR2)) {
     emit_dta(as, MIPSI_ROTR, dest, src, shift);
   } else {
     emit_dst(as, MIPSI_OR, dest, dest, tmp);
@@ -44,6 +66,14 @@
   }
 }
 
+#if LJ_64
+static void emit_tsml(ASMState *as, MIPSIns mi, Reg rt, Reg rs, uint32_t msb,
+		      uint32_t lsb)
+{
+  *--as->mcp = mi | MIPSF_T(rt) | MIPSF_S(rs) | MIPSF_M(msb) | MIPSF_L(lsb);
+}
+#endif
+
 /* -- Emit loads/stores --------------------------------------------------- */
 
 /* Prefer rematerialization of BASE/L from global_State over spills. */
@@ -50,7 +80,7 @@
 #define emit_canremat(ref)	((ref) <= REF_BASE)
 
 /* Try to find a one step delta relative to another constant. */
-static int emit_kdelta1(ASMState *as, Reg t, int32_t i)
+static int emit_kdelta1(ASMState *as, Reg t, intptr_t i)
 {
   RegSet work = ~as->freeset & RSET_GPR;
   while (work) {
@@ -58,9 +88,10 @@
     IRRef ref = regcost_ref(as->cost[r]);
     lua_assert(r != t);
     if (ref < ASMREF_L) {
-      int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);
+      intptr_t delta = (intptr_t)((uintptr_t)i -
+	(uintptr_t)(ra_iskref(ref) ? ra_krefk(as, ref) : get_kval(IR(ref))));
       if (checki16(delta)) {
-	emit_tsi(as, MIPSI_ADDIU, t, r, delta);
+	emit_tsi(as, MIPSI_AADDIU, t, r, delta);
 	return 1;
       }
     }
@@ -76,8 +107,8 @@
     emit_ti(as, MIPSI_LI, r, i);
   } else {
     if ((i & 0xffff)) {
-      int32_t jgl = i32ptr(J2G(as->J));
-      if ((uint32_t)(i-jgl) < 65536) {
+      intptr_t jgl = (intptr_t)(void *)J2G(as->J);
+      if ((uintptr_t)(i-jgl) < 65536) {
 	emit_tsi(as, MIPSI_ADDIU, r, RID_JGL, i-jgl-32768);
 	return;
       } else if (emit_kdelta1(as, r, i)) {
@@ -92,16 +123,48 @@
   }
 }
 
+#if LJ_64
+/* Load a 64 bit constant into a GPR. */
+static void emit_loadu64(ASMState *as, Reg r, uint64_t u64)
+{
+  if (checki32((int64_t)u64)) {
+    emit_loadi(as, r, (int32_t)u64);
+  } else {
+    uint64_t delta = u64 - (uint64_t)(void *)J2G(as->J);
+    if (delta < 65536) {
+      emit_tsi(as, MIPSI_DADDIU, r, RID_JGL, (int32_t)(delta-32768));
+    } else if (emit_kdelta1(as, r, (intptr_t)u64)) {
+      return;
+    } else {
+      if ((u64 & 0xffff)) {
+	emit_tsi(as, MIPSI_ORI, r, r, u64 & 0xffff);
+      }
+      if (((u64 >> 16) & 0xffff)) {
+	emit_dta(as, MIPSI_DSLL, r, r, 16);
+	emit_tsi(as, MIPSI_ORI, r, r, (u64 >> 16) & 0xffff);
+	emit_dta(as, MIPSI_DSLL, r, r, 16);
+      } else {
+	emit_dta(as, MIPSI_DSLL32, r, r, 0);
+      }
+      emit_loadi(as, r, (int32_t)(u64 >> 32));
+    }
+    /* TODO: There are probably more optimization opportunities. */
+  }
+}
+
+#define emit_loada(as, r, addr)		emit_loadu64(as, (r), u64ptr((addr)))
+#else
 #define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))
+#endif
 
-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);
-static void ra_allockreg(ASMState *as, int32_t k, Reg r);
+static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow);
+static void ra_allockreg(ASMState *as, intptr_t k, Reg r);
 
 /* Get/set from constant pointer. */
 static void emit_lsptr(ASMState *as, MIPSIns mi, Reg r, void *p, RegSet allow)
 {
-  int32_t jgl = i32ptr(J2G(as->J));
-  int32_t i = i32ptr(p);
+  intptr_t jgl = (intptr_t)(J2G(as->J));
+  intptr_t i = (intptr_t)(p);
   Reg base;
   if ((uint32_t)(i-jgl) < 65536) {
     i = i-jgl-32768;
@@ -112,8 +175,24 @@
   emit_tsi(as, mi, r, base, i);
 }
 
-#define emit_loadn(as, r, tv) \
-  emit_lsptr(as, MIPSI_LDC1, ((r) & 31), (void *)(tv), RSET_GPR)
+#if LJ_64
+static void emit_loadk64(ASMState *as, Reg r, IRIns *ir)
+{
+  const uint64_t *k = &ir_k64(ir)->u64;
+  Reg r64 = r;
+  if (rset_test(RSET_FPR, r)) {
+    r64 = RID_TMP;
+    emit_tg(as, MIPSI_DMTC1, r64, r);
+  }
+  if ((uint32_t)((intptr_t)k-(intptr_t)J2G(as->J)) < 65536)
+    emit_lsptr(as, MIPSI_LD, r64, (void *)k, 0);
+  else
+    emit_loadu64(as, r64, *k);
+}
+#else
+#define emit_loadk64(as, r, ir) \
+  emit_lsptr(as, MIPSI_LDC1, ((r) & 31), (void *)&ir_knum((ir))->u64, RSET_GPR)
+#endif
 
 /* Get/set global_State fields. */
 static void emit_lsglptr(ASMState *as, MIPSIns mi, Reg r, int32_t ofs)
@@ -122,9 +201,9 @@
 }
 
 #define emit_getgl(as, r, field) \
-  emit_lsglptr(as, MIPSI_LW, (r), (int32_t)offsetof(global_State, field))
+  emit_lsglptr(as, MIPSI_AL, (r), (int32_t)offsetof(global_State, field))
 #define emit_setgl(as, r, field) \
-  emit_lsglptr(as, MIPSI_SW, (r), (int32_t)offsetof(global_State, field))
+  emit_lsglptr(as, MIPSI_AS, (r), (int32_t)offsetof(global_State, field))
 
 /* Trace number is determined from per-trace exit stubs. */
 #define emit_setvmstate(as, i)		UNUSED(i)
@@ -157,13 +236,14 @@
   MCode *p = as->mcp;
   *--p = MIPSI_NOP;
   if ((((uintptr_t)target ^ (uintptr_t)p) >> 28) == 0) {
-    *--p = MIPSI_JAL | (((uintptr_t)target >>2) & 0x03ffffffu);
+    *--p = (((uintptr_t)target & 1) ? MIPSI_JALX : MIPSI_JAL) |
+	   (((uintptr_t)target >>2) & 0x03ffffffu);
   } else {  /* Target out of range: need indirect call. */
     *--p = MIPSI_JALR | MIPSF_S(RID_CFUNCADDR);
     needcfa = 1;
   }
   as->mcp = p;
-  if (needcfa) ra_allockreg(as, i32ptr(target), RID_CFUNCADDR);
+  if (needcfa) ra_allockreg(as, (intptr_t)target, RID_CFUNCADDR);
 }
 
 /* -- Emit generic operations --------------------------------------------- */
@@ -184,7 +264,7 @@
 static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
 {
   if (r < RID_MAX_GPR)
-    emit_tsi(as, MIPSI_LW, r, base, ofs);
+    emit_tsi(as, irt_is64(ir->t) ? MIPSI_LD : MIPSI_LW, r, base, ofs);
   else
     emit_tsi(as, irt_isnum(ir->t) ? MIPSI_LDC1 : MIPSI_LWC1,
 	     (r & 31), base, ofs);
@@ -194,7 +274,7 @@
 static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
 {
   if (r < RID_MAX_GPR)
-    emit_tsi(as, MIPSI_SW, r, base, ofs);
+    emit_tsi(as, irt_is64(ir->t) ? MIPSI_SD : MIPSI_SW, r, base, ofs);
   else
     emit_tsi(as, irt_isnum(ir->t) ? MIPSI_SDC1 : MIPSI_SWC1,
 	     (r&31), base, ofs);
@@ -205,7 +285,7 @@
 {
   if (ofs) {
     lua_assert(checki16(ofs));
-    emit_tsi(as, MIPSI_ADDIU, r, r, ofs);
+    emit_tsi(as, MIPSI_AADDIU, r, r, ofs);
   }
 }
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_ppc.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_ppc.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_ppc.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** PPC instruction emitter.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* -- Emit basic instructions --------------------------------------------- */
@@ -98,7 +98,7 @@
 
 #define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))
 
-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);
+static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow);
 
 /* Get/set from constant pointer. */
 static void emit_lsptr(ASMState *as, PPCIns pi, Reg r, void *p, RegSet allow)
@@ -115,8 +115,8 @@
   emit_tai(as, pi, r, base, i);
 }
 
-#define emit_loadn(as, r, tv) \
-  emit_lsptr(as, PPCI_LFD, ((r) & 31), (void *)(tv), RSET_GPR)
+#define emit_loadk64(as, r, ir) \
+  emit_lsptr(as, PPCI_LFD, ((r) & 31), (void *)&ir_knum((ir))->u64, RSET_GPR)
 
 /* Get/set global_State fields. */
 static void emit_lsglptr(ASMState *as, PPCIns pi, Reg r, int32_t ofs)

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_x86.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_x86.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_emit_x86.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** x86/x64 instruction emitter.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* -- Emit basic instructions --------------------------------------------- */
@@ -13,11 +13,18 @@
       if (rex != 0x40) *--(p) = rex; }
 #define FORCE_REX		0x200
 #define REX_64			(FORCE_REX|0x080000)
+#define VEX_64			0x800000
 #else
 #define REXRB(p, rr, rb)	((void)0)
 #define FORCE_REX		0
 #define REX_64			0
+#define VEX_64			0
 #endif
+#if LJ_GC64
+#define REX_GC64		REX_64
+#else
+#define REX_GC64		0
+#endif
 
 #define emit_i8(as, i)		(*--as->mcp = (MCode)(i))
 #define emit_i32(as, i)		(*(int32_t *)(as->mcp-4) = (i), as->mcp -= 4)
@@ -31,6 +38,13 @@
 				 MCode *p, int delta)
 {
   int n = (int8_t)xo;
+  if (n == -60) {  /* VEX-encoded instruction */
+#if LJ_64
+    xo ^= (((rr>>1)&4)+((rx>>2)&2)+((rb>>3)&1))<<13;
+#endif
+    *(uint32_t *)(p+delta-5) = (uint32_t)xo;
+    return p+delta-5;
+  }
 #if defined(__GNUC__)
   if (__builtin_constant_p(xo) && n == -2)
     p[delta-2] = (MCode)(xo >> 24);
@@ -85,19 +99,6 @@
 #define ptr2addr(p)	(i32ptr((p)))
 #endif
 
-/* op r, [addr] */
-static void emit_rma(ASMState *as, x86Op xo, Reg rr, const void *addr)
-{
-  MCode *p = as->mcp;
-  *(int32_t *)(p-4) = ptr2addr(addr);
-#if LJ_64
-  p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP);
-  as->mcp = emit_opm(xo, XM_OFS0, rr, RID_ESP, p, -5);
-#else
-  as->mcp = emit_opm(xo, XM_OFS0, rr, RID_EBP, p, -4);
-#endif
-}
-
 /* op r, [base+ofs] */
 static void emit_rmro(ASMState *as, x86Op xo, Reg rr, Reg rb, int32_t ofs)
 {
@@ -104,8 +105,12 @@
   MCode *p = as->mcp;
   x86Mode mode;
   if (ra_hasreg(rb)) {
-    if (ofs == 0 && (rb&7) != RID_EBP) {
+    if (LJ_GC64 && rb == RID_RIP) {
       mode = XM_OFS0;
+      p -= 4;
+      *(int32_t *)p = ofs;
+    } else if (ofs == 0 && (rb&7) != RID_EBP) {
+      mode = XM_OFS0;
     } else if (checki8(ofs)) {
       *--p = (MCode)ofs;
       mode = XM_OFS8;
@@ -202,6 +207,11 @@
       *--p = MODRM(XM_SCALE1, RID_ESP, RID_EBP);
       rb = RID_ESP;
 #endif
+    } else if (LJ_GC64 && rb == RID_RIP) {
+      lua_assert(as->mrm.idx == RID_NONE);
+      mode = XM_OFS0;
+      p -= 4;
+      *(int32_t *)p = as->mrm.ofs;
     } else {
       if (as->mrm.ofs == 0 && (rb&7) != RID_EBP) {
 	mode = XM_OFS0;
@@ -255,8 +265,8 @@
 /* Get/set global_State fields. */
 #define emit_opgl(as, xo, r, field) \
   emit_rma(as, (xo), (r), (void *)&J2G(as->J)->field)
-#define emit_getgl(as, r, field)	emit_opgl(as, XO_MOV, (r), field)
-#define emit_setgl(as, r, field)	emit_opgl(as, XO_MOVto, (r), field)
+#define emit_getgl(as, r, field) emit_opgl(as, XO_MOV, (r)|REX_GC64, field)
+#define emit_setgl(as, r, field) emit_opgl(as, XO_MOVto, (r)|REX_GC64, field)
 
 #define emit_setvmstate(as, i) \
   (emit_i32(as, i), emit_opgl(as, XO_MOVmi, 0, vmstate))
@@ -279,9 +289,21 @@
   }
 }
 
+#if LJ_GC64
+#define dispofs(as, k) \
+  ((intptr_t)((uintptr_t)(k) - (uintptr_t)J2GG(as->J)->dispatch))
+#define mcpofs(as, k) \
+  ((intptr_t)((uintptr_t)(k) - (uintptr_t)as->mcp))
+#define mctopofs(as, k) \
+  ((intptr_t)((uintptr_t)(k) - (uintptr_t)as->mctop))
 /* mov r, addr */
 #define emit_loada(as, r, addr) \
+  emit_loadu64(as, (r), (uintptr_t)(addr))
+#else
+/* mov r, addr */
+#define emit_loada(as, r, addr) \
   emit_loadi(as, (r), ptr2addr((addr)))
+#endif
 
 #if LJ_64
 /* mov r, imm64 or shorter 32 bit extended load. */
@@ -293,6 +315,15 @@
     MCode *p = as->mcp;
     *(int32_t *)(p-4) = (int32_t)u64;
     as->mcp = emit_opm(XO_MOVmi, XM_REG, REX_64, r, p, -4);
+#if LJ_GC64
+  } else if (checki32(dispofs(as, u64))) {
+    emit_rmro(as, XO_LEA, r|REX_64, RID_DISPATCH, (int32_t)dispofs(as, u64));
+  } else if (checki32(mcpofs(as, u64)) && checki32(mctopofs(as, u64))) {
+    /* Since as->realign assumes the code size doesn't change, check
+    ** RIP-relative addressing reachability for both as->mcp and as->mctop.
+    */
+    emit_rmro(as, XO_LEA, r|REX_64, RID_RIP, (int32_t)mcpofs(as, u64));
+#endif
   } else {  /* Full-size 64 bit load. */
     MCode *p = as->mcp;
     *(uint64_t *)(p-8) = u64;
@@ -304,15 +335,73 @@
 }
 #endif
 
-/* movsd r, [&tv->n] / xorps r, r */
-static void emit_loadn(ASMState *as, Reg r, cTValue *tv)
+/* op r, [addr] */
+static void emit_rma(ASMState *as, x86Op xo, Reg rr, const void *addr)
 {
-  if (tvispzero(tv))  /* Use xor only for +0. */
-    emit_rr(as, XO_XORPS, r, r);
-  else
-    emit_rma(as, XO_MOVSD, r, &tv->n);
+#if LJ_GC64
+  if (checki32(dispofs(as, addr))) {
+    emit_rmro(as, xo, rr, RID_DISPATCH, (int32_t)dispofs(as, addr));
+  } else if (checki32(mcpofs(as, addr)) && checki32(mctopofs(as, addr))) {
+    emit_rmro(as, xo, rr, RID_RIP, (int32_t)mcpofs(as, addr));
+  } else if (!checki32((intptr_t)addr) && (xo == XO_MOV || xo == XO_MOVSD)) {
+    emit_rmro(as, xo, rr, rr, 0);
+    emit_loadu64(as, rr, (uintptr_t)addr);
+  } else
+#endif
+  {
+    MCode *p = as->mcp;
+    *(int32_t *)(p-4) = ptr2addr(addr);
+#if LJ_64
+    p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP);
+    as->mcp = emit_opm(xo, XM_OFS0, rr, RID_ESP, p, -5);
+#else
+    as->mcp = emit_opm(xo, XM_OFS0, rr, RID_EBP, p, -4);
+#endif
+  }
 }
 
+/* Load 64 bit IR constant into register. */
+static void emit_loadk64(ASMState *as, Reg r, IRIns *ir)
+{
+  Reg r64;
+  x86Op xo;
+  const uint64_t *k = &ir_k64(ir)->u64;
+  if (rset_test(RSET_FPR, r)) {
+    r64 = r;
+    xo = XO_MOVSD;
+  } else {
+    r64 = r | REX_64;
+    xo = XO_MOV;
+  }
+  if (*k == 0) {
+    emit_rr(as, rset_test(RSET_FPR, r) ? XO_XORPS : XO_ARITH(XOg_XOR), r, r);
+#if LJ_GC64
+  } else if (checki32((intptr_t)k) || checki32(dispofs(as, k)) ||
+	     (checki32(mcpofs(as, k)) && checki32(mctopofs(as, k)))) {
+    emit_rma(as, xo, r64, k);
+  } else {
+    if (ir->i) {
+      lua_assert(*k == *(uint64_t*)(as->mctop - ir->i));
+    } else if (as->curins <= as->stopins && rset_test(RSET_GPR, r)) {
+      emit_loadu64(as, r, *k);
+      return;
+    } else {
+      /* If all else fails, add the FP constant at the MCode area bottom. */
+      while ((uintptr_t)as->mcbot & 7) *as->mcbot++ = XI_INT3;
+      *(uint64_t *)as->mcbot = *k;
+      ir->i = (int32_t)(as->mctop - as->mcbot);
+      as->mcbot += 8;
+      as->mclim = as->mcbot + MCLIM_REDZONE;
+      lj_mcode_commitbot(as->J, as->mcbot);
+    }
+    emit_rmro(as, xo, r64, RID_RIP, (int32_t)mcpofs(as, as->mctop - ir->i));
+#else
+  } else {
+    emit_rma(as, xo, r64, k);
+#endif
+  }
+}
+
 /* -- Emit control-flow instructions -------------------------------------- */
 
 /* Label for short jumps. */
@@ -412,8 +501,10 @@
 /* Use 64 bit operations to handle 64 bit IR types. */
 #if LJ_64
 #define REX_64IR(ir, r)		((r) + (irt_is64((ir)->t) ? REX_64 : 0))
+#define VEX_64IR(ir, r)		((r) + (irt_is64((ir)->t) ? VEX_64 : 0))
 #else
 #define REX_64IR(ir, r)		(r)
+#define VEX_64IR(ir, r)		(r)
 #endif
 
 /* Generic move between two regs. */
@@ -449,9 +540,9 @@
 {
   if (ofs) {
     if ((as->flags & JIT_F_LEA_AGU))
-      emit_rmro(as, XO_LEA, r, r, ofs);
+      emit_rmro(as, XO_LEA, r|REX_GC64, r, ofs);
     else
-      emit_gri(as, XG_ARITHi(XOg_ADD), r, ofs);
+      emit_gri(as, XG_ARITHi(XOg_ADD), r|REX_GC64, ofs);
   }
 }
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_err.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_err.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_err.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Error handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_err_c
@@ -46,7 +46,8 @@
 **   the wrapper function feature. Lua errors thrown through C++ frames
 **   cannot be caught by C++ code and C++ destructors are not run.
 **
-** EXT is the default on x64 systems, INT is the default on all other systems.
+** EXT is the default on x64 systems and on Windows, INT is the default on all
+** other systems.
 **
 ** EXT can be manually enabled on POSIX systems using GCC and DWARF2 stack
 ** unwinding with -DLUAJIT_UNWIND_EXTERNAL. *All* C code must be compiled
@@ -55,7 +56,6 @@
 ** and all C libraries that have callbacks which may be used to call back
 ** into Lua. C++ code must *not* be compiled with -fno-exceptions.
 **
-** EXT cannot be enabled on WIN32 since system exceptions use code-driven SEH.
 ** EXT is mandatory on WIN64 since the calling convention has an abundance
 ** of callee-saved registers (rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15).
 ** The POSIX/x64 interpreter only saves r12/r13 for INT (e.g. PS4).
@@ -63,7 +63,7 @@
 
 #if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND
 #define LJ_UNWIND_EXT	1
-#elif LJ_TARGET_X64 && LJ_TARGET_WINDOWS
+#elif LJ_TARGET_WINDOWS
 #define LJ_UNWIND_EXT	1
 #endif
 
@@ -384,7 +384,7 @@
 
 #endif /* LJ_TARGET_ARM */
 
-#elif LJ_TARGET_X64 && LJ_ABI_WIN
+#elif LJ_ABI_WIN
 
 /*
 ** Someone in Redmond owes me several days of my life. A lot of this is
@@ -402,6 +402,7 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
+#if LJ_TARGET_X64
 /* Taken from: http://www.nynaeve.net/?p=99 */
 typedef struct UndocumentedDispatcherContext {
   ULONG64 ControlPc;
@@ -416,11 +417,14 @@
   ULONG ScopeIndex;
   ULONG Fill0;
 } UndocumentedDispatcherContext;
+#else
+typedef void *UndocumentedDispatcherContext;
+#endif
 
 /* Another wild guess. */
 extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);
 
-#ifdef MINGW_SDK_INIT
+#if LJ_TARGET_X64 && defined(MINGW_SDK_INIT)
 /* Workaround for broken MinGW64 declaration. */
 VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
 #define RtlUnwindEx RtlUnwindEx_FIXED
@@ -434,10 +438,15 @@
 #define LJ_EXCODE_CHECK(cl)	(((cl) ^ LJ_EXCODE) <= 0xff)
 #define LJ_EXCODE_ERRCODE(cl)	((int)((cl) & 0xff))
 
-/* Win64 exception handler for interpreter frame. */
-LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
-  void *cf, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)
+/* Windows exception handler for interpreter frame. */
+LJ_FUNCA int lj_err_unwind_win(EXCEPTION_RECORD *rec,
+  void *f, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)
 {
+#if LJ_TARGET_X64
+  void *cf = f;
+#else
+  void *cf = (char *)f - CFRAME_OFS_SEH;
+#endif
   lua_State *L = cframe_L(cf);
   int errcode = LJ_EXCODE_CHECK(rec->ExceptionCode) ?
 		LJ_EXCODE_ERRCODE(rec->ExceptionCode) : LUA_ERRRUN;
@@ -455,8 +464,9 @@
 	setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));
       } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) {
 	/* Don't catch access violations etc. */
-	return ExceptionContinueSearch;
+	return 1;  /* ExceptionContinueSearch */
       }
+#if LJ_TARGET_X64
       /* Unwind the stack and call all handlers for all lower C frames
       ** (including ourselves) again with EH_UNWINDING set. Then set
       ** rsp = cf, rax = errcode and jump to the specified target.
@@ -466,9 +476,21 @@
 			       lj_vm_unwind_c_eh),
 		  rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable);
       /* RtlUnwindEx should never return. */
+#else
+      UNUSED(ctx);
+      UNUSED(dispatch);
+      /* Call all handlers for all lower C frames (including ourselves) again
+      ** with EH_UNWINDING set. Then call the specified function, passing cf
+      ** and errcode.
+      */
+      lj_vm_rtlunwind(cf, (void *)rec,
+	(cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ?
+	(void *)lj_vm_unwind_ff : (void *)lj_vm_unwind_c, errcode);
+      /* lj_vm_rtlunwind does not return. */
+#endif
     }
   }
-  return ExceptionContinueSearch;
+  return 1;  /* ExceptionContinueSearch */
 }
 
 /* Raise Windows exception. */
@@ -487,7 +509,7 @@
   global_State *g = G(L);
   lj_trace_abort(g);
   setmref(g->jit_base, NULL);
-  L->status = 0;
+  L->status = LUA_OK;
 #if LJ_UNWIND_EXT
   err_raise_ext(errcode);
   /*

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_err.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_err.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_err.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Error handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_ERR_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_errmsg.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_errmsg.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_errmsg.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** VM error messages.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* This file may be included multiple times with different ERRDEF macros. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ff.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ff.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ff.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Fast function IDs.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_FF_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ffrecord.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ffrecord.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ffrecord.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Fast function call recorder.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_ffrecord_c
@@ -102,42 +102,41 @@
   ASMFunction cont = lj_cont_stitch;
   lua_State *L = J->L;
   TValue *base = L->base;
+  BCReg nslot = J->maxslot + 1 + LJ_FR2;
+  TValue *nframe = base + 1 + LJ_FR2;
   const BCIns *pc = frame_pc(base-1);
   TValue *pframe = frame_prevl(base-1);
-  TRef trcont;
 
-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle frame shift. */
   /* Move func + args up in Lua stack and insert continuation. */
-  memmove(&base[1], &base[-1], sizeof(TValue)*(J->maxslot+1));
-  setframe_ftsz(base+1, ((char *)(base+1) - (char *)pframe) + FRAME_CONT);
-  setcont(base, cont);
+  memmove(&base[1], &base[-1-LJ_FR2], sizeof(TValue)*nslot);
+  setframe_ftsz(nframe, ((char *)nframe - (char *)pframe) + FRAME_CONT);
+  setcont(base-LJ_FR2, cont);
   setframe_pc(base, pc);
-  setnilV(base-1);  /* Incorrect, but rec_check_slots() won't run anymore. */
-  L->base += 2;
-  L->top += 2;
+  setnilV(base-1-LJ_FR2);  /* Incorrect, but rec_check_slots() won't run anymore. */
+  L->base += 2 + LJ_FR2;
+  L->top += 2 + LJ_FR2;
 
   /* Ditto for the IR. */
-  memmove(&J->base[1], &J->base[-1], sizeof(TRef)*(J->maxslot+1));
-#if LJ_64
-  trcont = lj_ir_kptr(J, (void *)((int64_t)cont-(int64_t)lj_vm_asm_begin));
+  memmove(&J->base[1], &J->base[-1-LJ_FR2], sizeof(TRef)*nslot);
+#if LJ_FR2
+  J->base[2] = TREF_FRAME;
+  J->base[-1] = lj_ir_k64(J, IR_KNUM, u64ptr(contptr(cont)));
+  J->base[0] = lj_ir_k64(J, IR_KNUM, u64ptr(pc)) | TREF_CONT;
 #else
-  trcont = lj_ir_kptr(J, (void *)cont);
+  J->base[0] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;
 #endif
-  J->base[0] = trcont | TREF_CONT;
-  J->ktracep = lj_ir_k64_reserve(J);
-  lua_assert(irt_toitype_(IRT_P64) == LJ_TTRACE);
-  J->base[-1] = emitir(IRT(IR_XLOAD, IRT_P64), lj_ir_kptr(J, &J->ktracep->gcr), 0);
-  J->base += 2;
-  J->baseslot += 2;
+  J->ktrace = tref_ref((J->base[-1-LJ_FR2] = lj_ir_ktrace(J)));
+  J->base += 2 + LJ_FR2;
+  J->baseslot += 2 + LJ_FR2;
   J->framedepth++;
 
   lj_record_stop(J, LJ_TRLINK_STITCH, 0);
 
   /* Undo Lua stack changes. */
-  memmove(&base[-1], &base[1], sizeof(TValue)*(J->maxslot+1));
+  memmove(&base[-1-LJ_FR2], &base[1], sizeof(TValue)*nslot);
   setframe_pc(base-1, pc);
-  L->base -= 2;
-  L->top -= 2;
+  L->base -= 2 + LJ_FR2;
+  L->top -= 2 + LJ_FR2;
 }
 
 /* Fallback handler for fast functions that are not recorded (yet). */
@@ -179,7 +178,7 @@
 /* Emit BUFHDR for the global temporary buffer. */
 static TRef recff_bufhdr(jit_State *J)
 {
-  return emitir(IRT(IR_BUFHDR, IRT_P32),
+  return emitir(IRT(IR_BUFHDR, IRT_PGC),
 		lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
 }
 
@@ -229,7 +228,7 @@
     ix.tab = tr;
     copyTV(J->L, &ix.tabv, &rd->argv[0]);
     lj_record_mm_lookup(J, &ix, MM_metatable); /* Guard for no __metatable. */
-    fref = emitir(IRT(IR_FREF, IRT_P32), tr, IRFL_TAB_META);
+    fref = emitir(IRT(IR_FREF, IRT_PGC), tr, IRFL_TAB_META);
     mtref = tref_isnil(mt) ? lj_ir_knull(J, IRT_TAB) : mt;
     emitir(IRT(IR_FSTORE, IRT_TAB), fref, mtref);
     if (!tref_isnil(mt))
@@ -295,7 +294,7 @@
     if (strV(tv)->len == 1) {
       emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, strV(tv)));
     } else {
-      TRef trptr = emitir(IRT(IR_STRREF, IRT_P32), tr, lj_ir_kint(J, 0));
+      TRef trptr = emitir(IRT(IR_STRREF, IRT_PGC), tr, lj_ir_kint(J, 0));
       TRef trchar = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY);
       emitir(IRTG(IR_EQ, IRT_INT), trchar, lj_ir_kint(J, '#'));
     }
@@ -380,10 +379,10 @@
     int errcode;
     TValue argv0;
     /* Temporarily insert metamethod below object. */
-    J->base[1] = J->base[0];
+    J->base[1+LJ_FR2] = J->base[0];
     J->base[0] = ix.mobj;
     copyTV(J->L, &argv0, &rd->argv[0]);
-    copyTV(J->L, &rd->argv[1], &rd->argv[0]);
+    copyTV(J->L, &rd->argv[1+LJ_FR2], &rd->argv[0]);
     copyTV(J->L, &rd->argv[0], &ix.mobjv);
     /* Need to protect lj_record_tailcall because it may throw. */
     errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp);
@@ -450,6 +449,10 @@
 static void LJ_FASTCALL recff_pcall(jit_State *J, RecordFFData *rd)
 {
   if (J->maxslot >= 1) {
+#if LJ_FR2
+    /* Shift function arguments up. */
+    memmove(J->base + 1, J->base, sizeof(TRef) * J->maxslot);
+#endif
     lj_record_call(J, 0, J->maxslot - 1);
     rd->nres = -1;  /* Pending call. */
   }  /* else: Interpreter will throw. */
@@ -469,7 +472,6 @@
     TValue argv0, argv1;
     TRef tmp;
     int errcode;
-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */
     /* Swap function and traceback. */
     tmp = J->base[0]; J->base[0] = J->base[1]; J->base[1] = tmp;
     copyTV(J->L, &argv0, &rd->argv[0]);
@@ -476,6 +478,10 @@
     copyTV(J->L, &argv1, &rd->argv[1]);
     copyTV(J->L, &rd->argv[0], &argv1);
     copyTV(J->L, &rd->argv[1], &argv0);
+#if LJ_FR2
+    /* Shift function arguments up. */
+    memmove(J->base + 2, J->base + 1, sizeof(TRef) * (J->maxslot-1));
+#endif
     /* Need to protect lj_record_call because it may throw. */
     errcode = lj_vm_cpcall(J->L, NULL, J, recff_xpcall_cp);
     /* Always undo Lua stack swap to avoid confusing the interpreter. */
@@ -504,7 +510,7 @@
 static void LJ_FASTCALL recff_math_abs(jit_State *J, RecordFFData *rd)
 {
   TRef tr = lj_ir_tonum(J, J->base[0]);
-  J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_knum_abs(J));
+  J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_ksimd(J, LJ_KSIMD_ABS));
   UNUSED(rd);
 }
 
@@ -613,10 +619,8 @@
 
 static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd)
 {
-  TRef tr = lj_ir_tonum(J, J->base[0]);
-  if (!tref_isnumber_str(J->base[1]))
-    lj_trace_err(J, LJ_TRERR_BADTYPE);
-  J->base[0] = lj_opt_narrow_pow(J, tr, J->base[1], &rd->argv[1]);
+  J->base[0] = lj_opt_narrow_pow(J, J->base[0], J->base[1],
+				 &rd->argv[0], &rd->argv[1]);
   UNUSED(rd);
 }
 
@@ -822,7 +826,7 @@
       /* Also handle empty range here, to avoid extra traces. */
       TRef trptr, trslen = emitir(IRTI(IR_SUB), trend, trstart);
       emitir(IRTGI(IR_GE), trslen, tr0);
-      trptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);
+      trptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
       J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, trslen);
     } else {  /* Range underflow: return empty string. */
       emitir(IRTGI(IR_LT), trend, trstart);
@@ -838,7 +842,7 @@
       rd->nres = len;
       for (i = 0; i < len; i++) {
 	TRef tmp = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, (int32_t)i));
-	tmp = emitir(IRT(IR_STRREF, IRT_P32), trstr, tmp);
+	tmp = emitir(IRT(IR_STRREF, IRT_PGC), trstr, tmp);
 	J->base[i] = emitir(IRT(IR_XLOAD, IRT_U8), tmp, IRXLOAD_READONLY);
       }
     } else {  /* Empty range or range underflow: return no results. */
@@ -860,7 +864,7 @@
   if (i > 1) {  /* Concatenate the strings, if there's more than one. */
     TRef hdr = recff_bufhdr(J), tr = hdr;
     for (i = 0; J->base[i] != 0; i++)
-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]);
+      tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, J->base[i]);
     J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
   }
   UNUSED(rd);
@@ -877,14 +881,14 @@
     emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1));
     if (vrep > 1) {
       TRef hdr2 = recff_bufhdr(J);
-      TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), hdr2, sep);
-      tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), tr2, str);
+      TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), hdr2, sep);
+      tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), tr2, str);
       str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2);
     }
   }
   tr = hdr = recff_bufhdr(J);
   if (str2) {
-    tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, str);
+    tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, str);
     str = str2;
     rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1));
   }
@@ -935,8 +939,8 @@
   if ((J->base[2] && tref_istruecond(J->base[3])) ||
       (emitir(IRTG(IR_EQ, IRT_STR), trpat, lj_ir_kstr(J, pat)),
        !lj_str_haspattern(pat))) {  /* Search for fixed string. */
-    TRef trsptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);
-    TRef trpptr = emitir(IRT(IR_STRREF, IRT_P32), trpat, tr0);
+    TRef trsptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
+    TRef trpptr = emitir(IRT(IR_STRREF, IRT_PGC), trpat, tr0);
     TRef trslen = emitir(IRTI(IR_SUB), trlen, trstart);
     TRef trplen = emitir(IRTI(IR_FLOAD), trpat, IRFL_STR_LEN);
     TRef tr = lj_ir_call(J, IRCALL_lj_str_find, trsptr, trpptr, trslen, trplen);
@@ -944,13 +948,13 @@
     if (lj_str_find(strdata(str)+(MSize)start, strdata(pat),
 		    str->len-(MSize)start, pat->len)) {
       TRef pos;
-      emitir(IRTG(IR_NE, IRT_P32), tr, trp0);
-      pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_P32), trstr, tr0));
+      emitir(IRTG(IR_NE, IRT_PGC), tr, trp0);
+      pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_PGC), trstr, tr0));
       J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));
       J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);
       rd->nres = 2;
     } else {
-      emitir(IRTG(IR_EQ, IRT_P32), tr, trp0);
+      emitir(IRTG(IR_EQ, IRT_PGC), tr, trp0);
       J->base[0] = TREF_NIL;
     }
   } else {  /* Search for pattern. */
@@ -977,7 +981,7 @@
     IRCallID id;
     switch (STRFMT_TYPE(sf)) {
     case STRFMT_LIT:
-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
+      tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
 		  lj_ir_kstr(J, lj_str_new(J->L, fs.str, fs.len)));
       break;
     case STRFMT_INT:
@@ -986,7 +990,7 @@
       if (!tref_isinteger(tra))
 	goto handle_num;
       if (sf == STRFMT_INT) { /* Shortcut for plain %d. */
-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
+	tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
 		    emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_INT));
       } else {
 #if LJ_HASFFI
@@ -1016,7 +1020,7 @@
 	return;
       }
       if (sf == STRFMT_STR)  /* Shortcut for plain %s. */
-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, tra);
+	tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, tra);
       else if ((sf & STRFMT_T_QUOTED))
 	tr = lj_ir_call(J, IRCALL_lj_strfmt_putquoted, tr, tra);
       else
@@ -1025,7 +1029,7 @@
     case STRFMT_CHAR:
       tra = lj_opt_narrow_toint(J, tra);
       if (sf == STRFMT_CHAR)  /* Shortcut for plain %c. */
-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
+	tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
 		    emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_CHAR));
       else
 	tr = lj_ir_call(J, IRCALL_lj_strfmt_putfchar, tr, trsf, tra);
@@ -1110,8 +1114,13 @@
 {
   TRef tr, ud, fp;
   if (id) {  /* io.func() */
+#if LJ_GC64
+    /* TODO: fix ARM32 asm_fload(), so we can use this for all archs. */
+    ud = lj_ir_ggfload(J, IRT_UDATA, GG_OFS(g.gcroot[id]));
+#else
     tr = lj_ir_kptr(J, &J2G(J)->gcroot[id]);
     ud = emitir(IRT(IR_XLOAD, IRT_UDATA), tr, 0);
+#endif
   } else {  /* fp:method() */
     ud = J->base[0];
     if (!tref_isudata(ud))
@@ -1133,7 +1142,7 @@
   ptrdiff_t i = rd->data == 0 ? 1 : 0;
   for (; J->base[i]; i++) {
     TRef str = lj_ir_tostr(J, J->base[i]);
-    TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero);
+    TRef buf = emitir(IRT(IR_STRREF, IRT_PGC), str, zero);
     TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);
     if (tref_isk(len) && IR(tref_ref(len))->i == 1) {
       IRIns *irs = IR(tref_ref(str));

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ffrecord.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ffrecord.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ffrecord.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Fast function call recorder.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_FFRECORD_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_frame.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_frame.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_frame.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Stack frames.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_FRAME_H
@@ -116,6 +116,17 @@
 
 /* These definitions must match with the arch-specific *.dasc files. */
 #if LJ_TARGET_X86
+#if LJ_ABI_WIN
+#define CFRAME_OFS_ERRF		(19*4)
+#define CFRAME_OFS_NRES		(18*4)
+#define CFRAME_OFS_PREV		(17*4)
+#define CFRAME_OFS_L		(16*4)
+#define CFRAME_OFS_SEH		(9*4)
+#define CFRAME_OFS_PC		(6*4)
+#define CFRAME_OFS_MULTRES	(5*4)
+#define CFRAME_SIZE		(16*4)
+#define CFRAME_SHIFT_MULTRES	0
+#else
 #define CFRAME_OFS_ERRF		(15*4)
 #define CFRAME_OFS_NRES		(14*4)
 #define CFRAME_OFS_PREV		(13*4)
@@ -124,6 +135,7 @@
 #define CFRAME_OFS_MULTRES	(5*4)
 #define CFRAME_SIZE		(12*4)
 #define CFRAME_SHIFT_MULTRES	0
+#endif
 #elif LJ_TARGET_X64
 #if LJ_ABI_WIN
 #define CFRAME_OFS_PREV		(13*8)
@@ -217,26 +229,41 @@
 #define CFRAME_SIZE		272
 #define CFRAME_SHIFT_MULTRES	3
 #endif
-#elif LJ_TARGET_MIPS
+#elif LJ_TARGET_MIPS32
 #if LJ_ARCH_HASFPU
 #define CFRAME_OFS_ERRF		124
 #define CFRAME_OFS_NRES		120
 #define CFRAME_OFS_PREV		116
 #define CFRAME_OFS_L		112
-#define CFRAME_OFS_PC		20
-#define CFRAME_OFS_MULTRES	16
 #define CFRAME_SIZE		112
-#define CFRAME_SHIFT_MULTRES	3
 #else
 #define CFRAME_OFS_ERRF		76
 #define CFRAME_OFS_NRES		72
 #define CFRAME_OFS_PREV		68
 #define CFRAME_OFS_L		64
+#define CFRAME_SIZE		64
+#endif
 #define CFRAME_OFS_PC		20
 #define CFRAME_OFS_MULTRES	16
-#define CFRAME_SIZE		64
 #define CFRAME_SHIFT_MULTRES	3
+#elif LJ_TARGET_MIPS64
+#if LJ_ARCH_HASFPU
+#define CFRAME_OFS_ERRF		188
+#define CFRAME_OFS_NRES		184
+#define CFRAME_OFS_PREV		176
+#define CFRAME_OFS_L		168
+#define CFRAME_OFS_PC		160
+#define CFRAME_SIZE		192
+#else
+#define CFRAME_OFS_ERRF		124
+#define CFRAME_OFS_NRES		120
+#define CFRAME_OFS_PREV		112
+#define CFRAME_OFS_L		104
+#define CFRAME_OFS_PC		96
+#define CFRAME_SIZE		128
 #endif
+#define CFRAME_OFS_MULTRES	0
+#define CFRAME_SHIFT_MULTRES	3
 #else
 #error "Missing CFRAME_* definitions for this architecture"
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_func.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_func.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_func.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Function handling (prototypes, functions and upvalues).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -140,7 +140,9 @@
   /* NOBARRIER: The GCfunc is new (marked white). */
   for (i = 0; i < nuv; i++) {
     GCupval *uv = func_emptyuv(L);
-    uv->dhash = (uint32_t)(uintptr_t)pt ^ ((uint32_t)proto_uv(pt)[i] << 24);
+    int32_t v = proto_uv(pt)[i];
+    uv->immutable = ((v / PROTO_UV_IMMUTABLE) & 1);
+    uv->dhash = (uint32_t)(uintptr_t)pt ^ (v << 24);
     setgcref(fn->l.uvptr[i], obj2gco(uv));
   }
   fn->l.nupvalues = (uint8_t)nuv;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_func.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_func.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_func.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Function handling (prototypes, functions and upvalues).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_FUNC_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gc.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gc.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gc.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Garbage collector.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -169,12 +169,19 @@
     while ((c = *modestr++)) {
       if (c == 'k') weak |= LJ_GC_WEAKKEY;
       else if (c == 'v') weak |= LJ_GC_WEAKVAL;
-      else if (c == 'K') weak = (int)(~0u & ~LJ_GC_WEAKVAL);
     }
-    if (weak > 0) {  /* Weak tables are cleared in the atomic phase. */
-      t->marked = (uint8_t)((t->marked & ~LJ_GC_WEAK) | weak);
-      setgcrefr(t->gclist, g->gc.weak);
-      setgcref(g->gc.weak, obj2gco(t));
+    if (weak) {  /* Weak tables are cleared in the atomic phase. */
+#if LJ_HASFFI
+      CTState *cts = ctype_ctsG(g);
+      if (cts && cts->finalizer == t) {
+	weak = (int)(~0u & ~LJ_GC_WEAKVAL);
+      } else
+#endif
+      {
+	t->marked = (uint8_t)((t->marked & ~LJ_GC_WEAK) | weak);
+	setgcrefr(t->gclist, g->gc.weak);
+	setgcref(g->gc.weak, obj2gco(t));
+      }
     }
   }
   if (weak == LJ_GC_WEAK)  /* Nothing to mark if both keys/values are weak. */
@@ -238,6 +245,8 @@
     IRIns *ir = &T->ir[ref];
     if (ir->o == IR_KGC)
       gc_markobj(g, ir_kgc(ir));
+    if (irt_is64(ir->t) && ir->o != IR_KNULL)
+      ref++;
   }
   if (T->link) gc_marktrace(g, T->link);
   if (T->nextroot) gc_marktrace(g, T->nextroot);
@@ -308,7 +317,7 @@
     if (gc_traverse_tab(g, t) > 0)
       black2gray(o);  /* Keep weak tables gray. */
     return sizeof(GCtab) + sizeof(TValue) * t->asize +
-			   sizeof(Node) * (t->hmask + 1);
+			   (t->hmask ? sizeof(Node) * (t->hmask + 1) : 0);
   } else if (LJ_LIKELY(gct == ~LJ_TFUNC)) {
     GCfunc *fn = gco2func(o);
     gc_traverse_func(g, fn);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gc.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gc.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gc.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Garbage collector.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_GC_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gdbjit.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gdbjit.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gdbjit.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Client for the GDB JIT API.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_gdbjit_c
@@ -296,6 +296,9 @@
 #elif LJ_TARGET_ARM
   DW_REG_SP = 13,
   DW_REG_RA = 14,
+#elif LJ_TARGET_ARM64
+  DW_REG_SP = 31,
+  DW_REG_RA = 30,
 #elif LJ_TARGET_PPC
   DW_REG_SP = 1,
   DW_REG_RA = 65,
@@ -374,6 +377,8 @@
   .machine = 62,
 #elif LJ_TARGET_ARM
   .machine = 40,
+#elif LJ_TARGET_ARM64
+  .machine = 183,
 #elif LJ_TARGET_PPC
   .machine = 20,
 #elif LJ_TARGET_MIPS
@@ -563,6 +568,13 @@
       int i;
       for (i = 11; i >= 4; i--) { DB(DW_CFA_offset|i); DUV(2+(11-i)); }
     }
+#elif LJ_TARGET_ARM64
+    {
+      int i;
+      DB(DW_CFA_offset|31); DUV(2);
+      for (i = 28; i >= 19; i--) { DB(DW_CFA_offset|i); DUV(3+(28-i)); }
+      for (i = 15; i >= 8; i--) { DB(DW_CFA_offset|32|i); DUV(28-i); }
+    }
 #elif LJ_TARGET_PPC
     {
       int i;
@@ -719,6 +731,20 @@
 
 /* -- Interface to GDB JIT API -------------------------------------------- */
 
+static int gdbjit_lock;
+
+static void gdbjit_lock_acquire()
+{
+  while (__sync_lock_test_and_set(&gdbjit_lock, 1)) {
+    /* Just spin; futexes or pthreads aren't worth the portability cost. */
+  }
+}
+
+static void gdbjit_lock_release()
+{
+  __sync_lock_release(&gdbjit_lock);
+}
+
 /* Add new entry to GDB JIT symbol chain. */
 static void gdbjit_newentry(lua_State *L, GDBJITctx *ctx)
 {
@@ -730,6 +756,7 @@
   ctx->T->gdbjit_entry = (void *)eo;
   /* Link new entry to chain and register it. */
   eo->entry.prev_entry = NULL;
+  gdbjit_lock_acquire();
   eo->entry.next_entry = __jit_debug_descriptor.first_entry;
   if (eo->entry.next_entry)
     eo->entry.next_entry->prev_entry = &eo->entry;
@@ -739,6 +766,7 @@
   __jit_debug_descriptor.relevant_entry = &eo->entry;
   __jit_debug_descriptor.action_flag = GDBJIT_REGISTER;
   __jit_debug_register_code();
+  gdbjit_lock_release();
 }
 
 /* Add debug info for newly compiled trace and notify GDB. */
@@ -770,6 +798,7 @@
 {
   GDBJITentryobj *eo = (GDBJITentryobj *)T->gdbjit_entry;
   if (eo) {
+    gdbjit_lock_acquire();
     if (eo->entry.prev_entry)
       eo->entry.prev_entry->next_entry = eo->entry.next_entry;
     else
@@ -779,6 +808,7 @@
     __jit_debug_descriptor.relevant_entry = &eo->entry;
     __jit_debug_descriptor.action_flag = GDBJIT_UNREGISTER;
     __jit_debug_register_code();
+    gdbjit_lock_release();
     lj_mem_free(J2G(J), eo, eo->sz);
   }
 }

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gdbjit.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gdbjit.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_gdbjit.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Client for the GDB JIT API.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_GDBJIT_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ir.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ir.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ir.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** SSA IR (Intermediate Representation) emitter.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_ir_c
@@ -91,7 +91,7 @@
   IRIns *baseir = J->irbuf + J->irbotlim;
   MSize szins = J->irtoplim - J->irbotlim;
   lua_assert(szins != 0);
-  lua_assert(J->cur.nk == J->irbotlim);
+  lua_assert(J->cur.nk == J->irbotlim || J->cur.nk-1 == J->irbotlim);
   if (J->cur.nins + (szins >> 1) < J->irtoplim) {
     /* More than half of the buffer is free on top: shift up by a quarter. */
     MSize ofs = szins >> 2;
@@ -145,6 +145,16 @@
   return emitir(CCI_OPTYPE(ci), tr, id);
 }
 
+/* Load field of type t from GG_State + offset. Must be 32 bit aligned. */
+LJ_FUNC TRef lj_ir_ggfload(jit_State *J, IRType t, uintptr_t ofs)
+{
+  lua_assert((ofs & 3) == 0);
+  ofs >>= 2;
+  lua_assert(ofs >= IRFL__MAX && ofs <= 0x3ff);  /* 10 bit FOLD key limit. */
+  lj_ir_set(J, IRT(IR_FLOAD, t), REF_NIL, ofs);
+  return lj_opt_fold(J);
+}
+
 /* -- Interning of constants ---------------------------------------------- */
 
 /*
@@ -165,6 +175,24 @@
   return ref;
 }
 
+/* Get ref of next 64 bit IR constant and optionally grow IR.
+** Note: this may invalidate all IRIns *!
+*/
+static LJ_AINLINE IRRef ir_nextk64(jit_State *J)
+{
+  IRRef ref = J->cur.nk - 2;
+  lua_assert(J->state != LJ_TRACE_ASM);
+  if (LJ_UNLIKELY(ref < J->irbotlim)) lj_ir_growbot(J);
+  J->cur.nk = ref;
+  return ref;
+}
+
+#if LJ_GC64
+#define ir_nextkgc ir_nextk64
+#else
+#define ir_nextkgc ir_nextk
+#endif
+
 /* Intern int32_t constant. */
 TRef LJ_FASTCALL lj_ir_kint(jit_State *J, int32_t k)
 {
@@ -184,95 +212,21 @@
   return TREF(ref, IRT_INT);
 }
 
-/* The MRef inside the KNUM/KINT64 IR instructions holds the address of the
-** 64 bit constant. The constants themselves are stored in a chained array
-** and shared across traces.
-**
-** Rationale for choosing this data structure:
-** - The address of the constants is embedded in the generated machine code
-**   and must never move. A resizable array or hash table wouldn't work.
-** - Most apps need very few non-32 bit integer constants (less than a dozen).
-** - Linear search is hard to beat in terms of speed and low complexity.
-*/
-typedef struct K64Array {
-  MRef next;			/* Pointer to next list. */
-  MSize numk;			/* Number of used elements in this array. */
-  TValue k[LJ_MIN_K64SZ];	/* Array of constants. */
-} K64Array;
-
-/* Free all chained arrays. */
-void lj_ir_k64_freeall(jit_State *J)
+/* Intern 64 bit constant, given by its 64 bit pattern. */
+TRef lj_ir_k64(jit_State *J, IROp op, uint64_t u64)
 {
-  K64Array *k;
-  for (k = mref(J->k64, K64Array); k; ) {
-    K64Array *next = mref(k->next, K64Array);
-    lj_mem_free(J2G(J), k, sizeof(K64Array));
-    k = next;
-  }
-  setmref(J->k64, NULL);
-}
-
-/* Get new 64 bit constant slot. */
-static TValue *ir_k64_add(jit_State *J, K64Array *kp, uint64_t u64)
-{
-  TValue *ntv;
-  if (!(kp && kp->numk < LJ_MIN_K64SZ)) {  /* Allocate a new array. */
-    K64Array *kn = lj_mem_newt(J->L, sizeof(K64Array), K64Array);
-    setmref(kn->next, NULL);
-    kn->numk = 0;
-    if (kp)
-      setmref(kp->next, kn);  /* Chain to the end of the list. */
-    else
-      setmref(J->k64, kn);  /* Link first array. */
-    kp = kn;
-  }
-  ntv = &kp->k[kp->numk++];  /* Add to current array. */
-  ntv->u64 = u64;
-  return ntv;
-}
-
-/* Find 64 bit constant in chained array or add it. */
-cTValue *lj_ir_k64_find(jit_State *J, uint64_t u64)
-{
-  K64Array *k, *kp = NULL;
-  MSize idx;
-  /* Search for the constant in the whole chain of arrays. */
-  for (k = mref(J->k64, K64Array); k; k = mref(k->next, K64Array)) {
-    kp = k;  /* Remember previous element in list. */
-    for (idx = 0; idx < k->numk; idx++) {  /* Search one array. */
-      TValue *tv = &k->k[idx];
-      if (tv->u64 == u64)  /* Needed for +-0/NaN/absmask. */
-	return tv;
-    }
-  }
-  /* Otherwise add a new constant. */
-  return ir_k64_add(J, kp, u64);
-}
-
-TValue *lj_ir_k64_reserve(jit_State *J)
-{
-  K64Array *k, *kp = NULL;
-  lj_ir_k64_find(J, 0);  /* Intern dummy 0 to protect the reserved slot. */
-  /* Find last K64Array, if any. */
-  for (k = mref(J->k64, K64Array); k; k = mref(k->next, K64Array)) kp = k;
-  return ir_k64_add(J, kp, 0);  /* Set to 0. Final value is set later. */
-}
-
-/* Intern 64 bit constant, given by its address. */
-TRef lj_ir_k64(jit_State *J, IROp op, cTValue *tv)
-{
   IRIns *ir, *cir = J->cur.ir;
   IRRef ref;
   IRType t = op == IR_KNUM ? IRT_NUM : IRT_I64;
   for (ref = J->chain[op]; ref; ref = cir[ref].prev)
-    if (ir_k64(&cir[ref]) == tv)
+    if (ir_k64(&cir[ref])->u64 == u64)
       goto found;
-  ref = ir_nextk(J);
+  ref = ir_nextk64(J);
   ir = IR(ref);
-  lua_assert(checkptrGC(tv));
-  setmref(ir->ptr, tv);
+  ir[1].tv.u64 = u64;
   ir->t.irt = t;
   ir->o = op;
+  ir->op12 = 0;
   ir->prev = J->chain[op];
   J->chain[op] = (IRRef1)ref;
 found:
@@ -282,13 +236,13 @@
 /* Intern FP constant, given by its 64 bit pattern. */
 TRef lj_ir_knum_u64(jit_State *J, uint64_t u64)
 {
-  return lj_ir_k64(J, IR_KNUM, lj_ir_k64_find(J, u64));
+  return lj_ir_k64(J, IR_KNUM, u64);
 }
 
 /* Intern 64 bit integer constant. */
 TRef lj_ir_kint64(jit_State *J, uint64_t u64)
 {
-  return lj_ir_k64(J, IR_KINT64, lj_ir_k64_find(J, u64));
+  return lj_ir_k64(J, IR_KINT64, u64);
 }
 
 /* Check whether a number is int and return it. -0 is NOT considered an int. */
@@ -323,15 +277,15 @@
 {
   IRIns *ir, *cir = J->cur.ir;
   IRRef ref;
-  lua_assert(!LJ_GC64);  /* TODO_GC64: major changes required. */
   lua_assert(!isdead(J2G(J), o));
   for (ref = J->chain[IR_KGC]; ref; ref = cir[ref].prev)
     if (ir_kgc(&cir[ref]) == o)
       goto found;
-  ref = ir_nextk(J);
+  ref = ir_nextkgc(J);
   ir = IR(ref);
   /* NOBARRIER: Current trace is a GC root. */
-  setgcref(ir->gcr, o);
+  ir->op12 = 0;
+  setgcref(ir[LJ_GC64].gcr, o);
   ir->t.irt = (uint8_t)t;
   ir->o = IR_KGC;
   ir->prev = J->chain[IR_KGC];
@@ -340,24 +294,44 @@
   return TREF(ref, t);
 }
 
-/* Intern 32 bit pointer constant. */
+/* Allocate GCtrace constant placeholder (no interning). */
+TRef lj_ir_ktrace(jit_State *J)
+{
+  IRRef ref = ir_nextkgc(J);
+  IRIns *ir = IR(ref);
+  lua_assert(irt_toitype_(IRT_P64) == LJ_TTRACE);
+  ir->t.irt = IRT_P64;
+  ir->o = LJ_GC64 ? IR_KNUM : IR_KNULL;  /* Not IR_KGC yet, but same size. */
+  ir->op12 = 0;
+  ir->prev = 0;
+  return TREF(ref, IRT_P64);
+}
+
+/* Intern pointer constant. */
 TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr)
 {
   IRIns *ir, *cir = J->cur.ir;
   IRRef ref;
-  lua_assert((void *)(intptr_t)i32ptr(ptr) == ptr);
+#if LJ_64 && !LJ_GC64
+  lua_assert((void *)(uintptr_t)u32ptr(ptr) == ptr);
+#endif
   for (ref = J->chain[op]; ref; ref = cir[ref].prev)
-    if (mref(cir[ref].ptr, void) == ptr)
+    if (ir_kptr(&cir[ref]) == ptr)
       goto found;
+#if LJ_GC64
+  ref = ir_nextk64(J);
+#else
   ref = ir_nextk(J);
+#endif
   ir = IR(ref);
-  setmref(ir->ptr, ptr);
-  ir->t.irt = IRT_P32;
+  ir->op12 = 0;
+  setmref(ir[LJ_GC64].ptr, ptr);
+  ir->t.irt = IRT_PGC;
   ir->o = op;
   ir->prev = J->chain[op];
   J->chain[op] = (IRRef1)ref;
 found:
-  return TREF(ref, IRT_P32);
+  return TREF(ref, IRT_PGC);
 }
 
 /* Intern typed NULL constant. */
@@ -412,9 +386,8 @@
   case IR_KPRI: setpriV(tv, irt_toitype(ir->t)); break;
   case IR_KINT: setintV(tv, ir->i); break;
   case IR_KGC: setgcV(L, tv, ir_kgc(ir), irt_toitype(ir->t)); break;
-  case IR_KPTR: case IR_KKPTR: case IR_KNULL:
-    setlightudV(tv, mref(ir->ptr, void));
-    break;
+  case IR_KPTR: case IR_KKPTR: setlightudV(tv, ir_kptr(ir)); break;
+  case IR_KNULL: setlightudV(tv, NULL); break;
   case IR_KNUM: setnumV(tv, ir_knum(ir)->n); break;
 #if LJ_HASFFI
   case IR_KINT64: {

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ir.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ir.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ir.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** SSA IR (Intermediate Representation) format.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_IR_H
@@ -220,7 +220,7 @@
 
 /* SLOAD mode bits, stored in op2. */
 #define IRSLOAD_PARENT		0x01	/* Coalesce with parent trace. */
-#define IRSLOAD_FRAME		0x02	/* Load hiword of frame. */
+#define IRSLOAD_FRAME		0x02	/* Load 32 bits of ftsz. */
 #define IRSLOAD_TYPECHECK	0x04	/* Needs type check. */
 #define IRSLOAD_CONVERT		0x08	/* Number to integer conversion. */
 #define IRSLOAD_READONLY	0x10	/* Read-only, omit slot store. */
@@ -294,7 +294,9 @@
 
 /* -- IR instruction types ------------------------------------------------ */
 
-/* Map of itypes to non-negative numbers. ORDER LJ_T.
+#define IRTSIZE_PGC		(LJ_GC64 ? 8 : 4)
+
+/* Map of itypes to non-negative numbers and their sizes. ORDER LJ_T.
 ** LJ_TUPVAL/LJ_TTRACE never appear in a TValue. Use these itypes for
 ** IRT_P32 and IRT_P64, which never escape the IR.
 ** The various integers are only used in the IR and can only escape to
@@ -302,12 +304,13 @@
 ** contiguous and next to IRT_NUM (see the typerange macros below).
 */
 #define IRTDEF(_) \
-  _(NIL, 4) _(FALSE, 4) _(TRUE, 4) _(LIGHTUD, LJ_64 ? 8 : 4) _(STR, 4) \
-  _(P32, 4) _(THREAD, 4) _(PROTO, 4) _(FUNC, 4) _(P64, 8) _(CDATA, 4) \
-  _(TAB, 4) _(UDATA, 4) \
+  _(NIL, 4) _(FALSE, 4) _(TRUE, 4) _(LIGHTUD, LJ_64 ? 8 : 4) \
+  _(STR, IRTSIZE_PGC) _(P32, 4) _(THREAD, IRTSIZE_PGC) _(PROTO, IRTSIZE_PGC) \
+  _(FUNC, IRTSIZE_PGC) _(P64, 8) _(CDATA, IRTSIZE_PGC) _(TAB, IRTSIZE_PGC) \
+  _(UDATA, IRTSIZE_PGC) \
   _(FLOAT, 4) _(NUM, 8) _(I8, 1) _(U8, 1) _(I16, 2) _(U16, 2) \
   _(INT, 4) _(U32, 4) _(I64, 8) _(U64, 8) \
-  _(SOFTFP, 4)  /* There is room for 9 more types. */
+  _(SOFTFP, 4)  /* There is room for 8 more types. */
 
 /* IR result type and flags (8 bit). */
 typedef enum {
@@ -318,9 +321,10 @@
 
   /* Native pointer type and the corresponding integer type. */
   IRT_PTR = LJ_64 ? IRT_P64 : IRT_P32,
+  IRT_PGC = LJ_GC64 ? IRT_P64 : IRT_P32,
+  IRT_IGC = LJ_GC64 ? IRT_I64 : IRT_INT,
   IRT_INTP = LJ_64 ? IRT_I64 : IRT_INT,
   IRT_UINTP = LJ_64 ? IRT_U64 : IRT_U32,
-  /* TODO_GC64: major changes required for all uses of IRT_P32. */
 
   /* Additional flags. */
   IRT_MARK = 0x20,	/* Marker for misc. purposes. */
@@ -408,7 +412,7 @@
 
 static LJ_AINLINE uint32_t irt_toitype_(IRType t)
 {
-  lua_assert(!LJ_64 || t != IRT_LIGHTUD);
+  lua_assert(!LJ_64 || LJ_GC64 || t != IRT_LIGHTUD);
   if (LJ_DUALNUM && t > IRT_NUM) {
     return LJ_TISNUM;
   } else {
@@ -521,7 +525,9 @@
 ** +-------+-------+---+---+---+---+
 ** |  op1  |  op2  | t | o | r | s |
 ** +-------+-------+---+---+---+---+
-** |  op12/i/gco   |   ot  | prev  | (alternative fields in union)
+** |  op12/i/gco32 |   ot  | prev  | (alternative fields in union)
+** +-------+-------+---+---+---+---+
+** |  TValue/gco64                 | (2nd IR slot for 64 bit constants)
 ** +---------------+-------+-------+
 **        32           16      16
 **
@@ -549,22 +555,27 @@
     )
   };
   int32_t i;		/* 32 bit signed integer literal (overlaps op12). */
-  GCRef gcr;		/* GCobj constant (overlaps op12). */
-  MRef ptr;		/* Pointer constant (overlaps op12). */
+  GCRef gcr;		/* GCobj constant (overlaps op12 or entire slot). */
+  MRef ptr;		/* Pointer constant (overlaps op12 or entire slot). */
+  TValue tv;		/* TValue constant (overlaps entire slot). */
 } IRIns;
 
-/* TODO_GC64: major changes required. */
-#define ir_kgc(ir)	check_exp((ir)->o == IR_KGC, gcref((ir)->gcr))
+#define ir_kgc(ir)	check_exp((ir)->o == IR_KGC, gcref((ir)[LJ_GC64].gcr))
 #define ir_kstr(ir)	(gco2str(ir_kgc((ir))))
 #define ir_ktab(ir)	(gco2tab(ir_kgc((ir))))
 #define ir_kfunc(ir)	(gco2func(ir_kgc((ir))))
 #define ir_kcdata(ir)	(gco2cd(ir_kgc((ir))))
-#define ir_knum(ir)	check_exp((ir)->o == IR_KNUM, mref((ir)->ptr, cTValue))
-#define ir_kint64(ir)	check_exp((ir)->o == IR_KINT64, mref((ir)->ptr,cTValue))
+#define ir_knum(ir)	check_exp((ir)->o == IR_KNUM, &(ir)[1].tv)
+#define ir_kint64(ir)	check_exp((ir)->o == IR_KINT64, &(ir)[1].tv)
 #define ir_k64(ir) \
-  check_exp((ir)->o == IR_KNUM || (ir)->o == IR_KINT64, mref((ir)->ptr,cTValue))
+  check_exp((ir)->o == IR_KNUM || (ir)->o == IR_KINT64 || \
+	    (LJ_GC64 && \
+	     ((ir)->o == IR_KGC || \
+	      (ir)->o == IR_KPTR || (ir)->o == IR_KKPTR)), \
+	    &(ir)[1].tv)
 #define ir_kptr(ir) \
-  check_exp((ir)->o == IR_KPTR || (ir)->o == IR_KKPTR, mref((ir)->ptr, void))
+  check_exp((ir)->o == IR_KPTR || (ir)->o == IR_KKPTR, \
+    mref((ir)[LJ_GC64].ptr, void))
 
 /* A store or any other op with a non-weak guard has a side-effect. */
 static LJ_AINLINE int ir_sideeff(IRIns *ir)

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ircall.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ircall.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_ircall.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** IR CALL* instruction definitions.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_IRCALL_H
@@ -78,13 +78,13 @@
 #define IRCALLCOND_SOFTFP_FFI(x)	NULL
 #endif
 
-#if LJ_SOFTFP && LJ_TARGET_MIPS
+#if LJ_SOFTFP && LJ_TARGET_MIPS32
 #define IRCALLCOND_SOFTFP_MIPS(x)	x
 #else
 #define IRCALLCOND_SOFTFP_MIPS(x)	NULL
 #endif
 
-#define LJ_NEED_FP64	(LJ_TARGET_ARM || LJ_TARGET_PPC || LJ_TARGET_MIPS)
+#define LJ_NEED_FP64	(LJ_TARGET_ARM || LJ_TARGET_PPC || LJ_TARGET_MIPS32)
 
 #if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)
 #define IRCALLCOND_FP64_FFI(x)		x
@@ -104,12 +104,6 @@
 #define IRCALLCOND_FFI32(x)		NULL
 #endif
 
-#if LJ_TARGET_X86
-#define CCI_RANDFPR	0	/* Clang on OSX/x86 is overzealous. */
-#else
-#define CCI_RANDFPR	CCI_NOFPRCLOBBER
-#endif
-
 #if LJ_SOFTFP
 #define XA_FP		CCI_XA
 #define XA2_FP		(CCI_XA+CCI_XA)
@@ -129,40 +123,40 @@
 /* Function definitions for CALL* instructions. */
 #define IRCALLDEF(_) \
   _(ANY,	lj_str_cmp,		2,  FN, INT, CCI_NOFPRCLOBBER) \
-  _(ANY,	lj_str_find,		4,   N, P32, 0) \
+  _(ANY,	lj_str_find,		4,   N, PGC, 0) \
   _(ANY,	lj_str_new,		3,   S, STR, CCI_L) \
   _(ANY,	lj_strscan_num,		2,  FN, INT, 0) \
   _(ANY,	lj_strfmt_int,		2,  FN, STR, CCI_L) \
   _(ANY,	lj_strfmt_num,		2,  FN, STR, CCI_L) \
   _(ANY,	lj_strfmt_char,		2,  FN, STR, CCI_L) \
-  _(ANY,	lj_strfmt_putint,	2,  FL, P32, 0) \
-  _(ANY,	lj_strfmt_putnum,	2,  FL, P32, 0) \
-  _(ANY,	lj_strfmt_putquoted,	2,  FL, P32, 0) \
-  _(ANY,	lj_strfmt_putfxint,	3,   L, P32, XA_64) \
-  _(ANY,	lj_strfmt_putfnum_int,	3,   L, P32, XA_FP) \
-  _(ANY,	lj_strfmt_putfnum_uint,	3,   L, P32, XA_FP) \
-  _(ANY,	lj_strfmt_putfnum,	3,   L, P32, XA_FP) \
-  _(ANY,	lj_strfmt_putfstr,	3,   L, P32, 0) \
-  _(ANY,	lj_strfmt_putfchar,	3,   L, P32, 0) \
-  _(ANY,	lj_buf_putmem,		3,   S, P32, 0) \
-  _(ANY,	lj_buf_putstr,		2,  FL, P32, 0) \
-  _(ANY,	lj_buf_putchar,		2,  FL, P32, 0) \
-  _(ANY,	lj_buf_putstr_reverse,	2,  FL, P32, 0) \
-  _(ANY,	lj_buf_putstr_lower,	2,  FL, P32, 0) \
-  _(ANY,	lj_buf_putstr_upper,	2,  FL, P32, 0) \
-  _(ANY,	lj_buf_putstr_rep,	3,   L, P32, 0) \
-  _(ANY,	lj_buf_puttab,		5,   L, P32, 0) \
+  _(ANY,	lj_strfmt_putint,	2,  FL, PGC, 0) \
+  _(ANY,	lj_strfmt_putnum,	2,  FL, PGC, 0) \
+  _(ANY,	lj_strfmt_putquoted,	2,  FL, PGC, 0) \
+  _(ANY,	lj_strfmt_putfxint,	3,   L, PGC, XA_64) \
+  _(ANY,	lj_strfmt_putfnum_int,	3,   L, PGC, XA_FP) \
+  _(ANY,	lj_strfmt_putfnum_uint,	3,   L, PGC, XA_FP) \
+  _(ANY,	lj_strfmt_putfnum,	3,   L, PGC, XA_FP) \
+  _(ANY,	lj_strfmt_putfstr,	3,   L, PGC, 0) \
+  _(ANY,	lj_strfmt_putfchar,	3,   L, PGC, 0) \
+  _(ANY,	lj_buf_putmem,		3,   S, PGC, 0) \
+  _(ANY,	lj_buf_putstr,		2,  FL, PGC, 0) \
+  _(ANY,	lj_buf_putchar,		2,  FL, PGC, 0) \
+  _(ANY,	lj_buf_putstr_reverse,	2,  FL, PGC, 0) \
+  _(ANY,	lj_buf_putstr_lower,	2,  FL, PGC, 0) \
+  _(ANY,	lj_buf_putstr_upper,	2,  FL, PGC, 0) \
+  _(ANY,	lj_buf_putstr_rep,	3,   L, PGC, 0) \
+  _(ANY,	lj_buf_puttab,		5,   L, PGC, 0) \
   _(ANY,	lj_buf_tostr,		1,  FL, STR, 0) \
   _(ANY,	lj_tab_new_ah,		3,   A, TAB, CCI_L) \
   _(ANY,	lj_tab_new1,		2,  FS, TAB, CCI_L) \
   _(ANY,	lj_tab_dup,		2,  FS, TAB, CCI_L) \
   _(ANY,	lj_tab_clear,		1,  FS, NIL, 0) \
-  _(ANY,	lj_tab_newkey,		3,   S, P32, CCI_L) \
+  _(ANY,	lj_tab_newkey,		3,   S, PGC, CCI_L) \
   _(ANY,	lj_tab_len,		1,  FL, INT, 0) \
   _(ANY,	lj_gc_step_jit,		2,  FS, NIL, CCI_L) \
   _(ANY,	lj_gc_barrieruv,	2,  FS, NIL, 0) \
-  _(ANY,	lj_mem_newgco,		2,  FS, P32, CCI_L) \
-  _(ANY,	lj_math_random_step, 1, FS, NUM, CCI_CASTU64|CCI_RANDFPR)\
+  _(ANY,	lj_mem_newgco,		2,  FS, PGC, CCI_L) \
+  _(ANY,	lj_math_random_step, 1, FS, NUM, CCI_CASTU64) \
   _(ANY,	lj_vm_modi,		2,  FN, INT, 0) \
   _(ANY,	sinh,			1,   N, NUM, XA_FP) \
   _(ANY,	cosh,			1,   N, NUM, XA_FP) \

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_iropt.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_iropt.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_iropt.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Common header for IR emitter and optimizations.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_IROPT_H
@@ -36,12 +36,11 @@
   return ref;
 }
 
+LJ_FUNC TRef lj_ir_ggfload(jit_State *J, IRType t, uintptr_t ofs);
+
 /* Interning of constants. */
 LJ_FUNC TRef LJ_FASTCALL lj_ir_kint(jit_State *J, int32_t k);
-LJ_FUNC void lj_ir_k64_freeall(jit_State *J);
-LJ_FUNC TRef lj_ir_k64(jit_State *J, IROp op, cTValue *tv);
-LJ_FUNC TValue *lj_ir_k64_reserve(jit_State *J);
-LJ_FUNC cTValue *lj_ir_k64_find(jit_State *J, uint64_t u64);
+LJ_FUNC TRef lj_ir_k64(jit_State *J, IROp op, uint64_t u64);
 LJ_FUNC TRef lj_ir_knum_u64(jit_State *J, uint64_t u64);
 LJ_FUNC TRef lj_ir_knumint(jit_State *J, lua_Number n);
 LJ_FUNC TRef lj_ir_kint64(jit_State *J, uint64_t u64);
@@ -49,6 +48,7 @@
 LJ_FUNC TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr);
 LJ_FUNC TRef lj_ir_knull(jit_State *J, IRType t);
 LJ_FUNC TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot);
+LJ_FUNC TRef lj_ir_ktrace(jit_State *J);
 
 #if LJ_64
 #define lj_ir_kintp(J, k)	lj_ir_kint64(J, (uint64_t)(k))
@@ -75,8 +75,8 @@
 #define lj_ir_knum_tobit(J)	lj_ir_knum_u64(J, U64x(43380000,00000000))
 
 /* Special 128 bit SIMD constants. */
-#define lj_ir_knum_abs(J)	lj_ir_k64(J, IR_KNUM, LJ_KSIMD(J, LJ_KSIMD_ABS))
-#define lj_ir_knum_neg(J)	lj_ir_k64(J, IR_KNUM, LJ_KSIMD(J, LJ_KSIMD_NEG))
+#define lj_ir_ksimd(J, idx) \
+  lj_ir_ggfload(J, IRT_NUM, (uintptr_t)LJ_KSIMD(J, idx) - (uintptr_t)J2GG(J))
 
 /* Access to constants. */
 LJ_FUNC void lj_ir_kvalue(lua_State *L, TValue *tv, const IRIns *ir);
@@ -143,8 +143,8 @@
 LJ_FUNC TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc,
 				 TValue *vb, TValue *vc, IROp op);
 LJ_FUNC TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc);
-LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vc);
-LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vc);
+LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc);
+LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc);
 LJ_FUNC IRType lj_opt_narrow_forl(jit_State *J, cTValue *forbase);
 
 /* Optimization passes. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_jit.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_jit.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_jit.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Common definitions for the JIT compiler.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_JIT_H
@@ -19,10 +19,11 @@
 #define JIT_F_SSE4_1		0x00000040
 #define JIT_F_PREFER_IMUL	0x00000080
 #define JIT_F_LEA_AGU		0x00000100
+#define JIT_F_BMI2		0x00000200
 
 /* Names for the CPU-specific flags. Must match the order above. */
 #define JIT_F_CPU_FIRST		JIT_F_SSE2
-#define JIT_F_CPUSTRING		"\4SSE2\4SSE3\6SSE4.1\3AMD\4ATOM"
+#define JIT_F_CPUSTRING		"\4SSE2\4SSE3\6SSE4.1\3AMD\4ATOM\4BMI2"
 #elif LJ_TARGET_ARM
 #define JIT_F_ARMV6_		0x00000010
 #define JIT_F_ARMV6T2_		0x00000020
@@ -45,12 +46,16 @@
 #define JIT_F_CPU_FIRST		JIT_F_SQRT
 #define JIT_F_CPUSTRING		"\4SQRT\5ROUND"
 #elif LJ_TARGET_MIPS
-#define JIT_F_MIPS32R2		0x00000010
+#define JIT_F_MIPSXXR2		0x00000010
 
 /* Names for the CPU-specific flags. Must match the order above. */
-#define JIT_F_CPU_FIRST		JIT_F_MIPS32R2
+#define JIT_F_CPU_FIRST		JIT_F_MIPSXXR2
+#if LJ_TARGET_MIPS32
 #define JIT_F_CPUSTRING		"\010MIPS32R2"
 #else
+#define JIT_F_CPUSTRING		"\010MIPS64R2"
+#endif
+#else
 #define JIT_F_CPU_FIRST		0
 #define JIT_F_CPUSTRING		""
 #endif
@@ -178,14 +183,26 @@
 #define SNAP(slot, flags, ref)	(((SnapEntry)(slot) << 24) + (flags) + (ref))
 #define SNAP_TR(slot, tr) \
   (((SnapEntry)(slot) << 24) + ((tr) & (TREF_CONT|TREF_FRAME|TREF_REFMASK)))
+#if !LJ_FR2
 #define SNAP_MKPC(pc)		((SnapEntry)u32ptr(pc))
+#endif
 #define SNAP_MKFTSZ(ftsz)	((SnapEntry)(ftsz))
 #define snap_ref(sn)		((sn) & 0xffff)
 #define snap_slot(sn)		((BCReg)((sn) >> 24))
 #define snap_isframe(sn)	((sn) & SNAP_FRAME)
-#define snap_pc(sn)		((const BCIns *)(uintptr_t)(sn))
 #define snap_setref(sn, ref)	(((sn) & (0xffff0000&~SNAP_NORESTORE)) | (ref))
 
+static LJ_AINLINE const BCIns *snap_pc(SnapEntry *sn)
+{
+#if LJ_FR2
+  uint64_t pcbase;
+  memcpy(&pcbase, sn, sizeof(uint64_t));
+  return (const BCIns *)(pcbase >> 8);
+#else
+  return (const BCIns *)(uintptr_t)*sn;
+#endif
+}
+
 /* Snapshot and exit numbers. */
 typedef uint32_t SnapNo;
 typedef uint32_t ExitNo;
@@ -307,6 +324,45 @@
   LJ_KSIMD__MAX
 };
 
+enum {
+#if LJ_TARGET_X86ORX64
+  LJ_K64_TOBIT,		/* 2^52 + 2^51 */
+  LJ_K64_2P64,		/* 2^64 */
+  LJ_K64_M2P64,		/* -2^64 */
+#if LJ_32
+  LJ_K64_M2P64_31,	/* -2^64 or -2^31 */
+#else
+  LJ_K64_M2P64_31 = LJ_K64_M2P64,
+#endif
+#endif
+#if LJ_TARGET_MIPS
+  LJ_K64_2P31,		/* 2^31 */
+#if LJ_64
+  LJ_K64_2P63,		/* 2^63 */
+  LJ_K64_M2P64,		/* -2^64 */
+#endif
+#endif
+  LJ_K64__MAX,
+};
+
+enum {
+#if LJ_TARGET_X86ORX64
+  LJ_K32_M2P64_31,	/* -2^64 or -2^31 */
+#endif
+#if LJ_TARGET_PPC
+  LJ_K32_2P52_2P31,	/* 2^52 + 2^31 */
+  LJ_K32_2P52,		/* 2^52 */
+#endif
+#if LJ_TARGET_PPC || LJ_TARGET_MIPS
+  LJ_K32_2P31,		/* 2^31 */
+#endif
+#if LJ_TARGET_MIPS64
+  LJ_K32_2P63,		/* 2^63 */
+  LJ_K32_M2P64,		/* -2^64 */
+#endif
+  LJ_K32__MAX
+};
+
 /* Get 16 byte aligned pointer to SIMD constant. */
 #define LJ_KSIMD(J, n) \
   ((TValue *)(((intptr_t)&J->ksimd[2*(n)] + 15) & ~(intptr_t)15))
@@ -323,13 +379,14 @@
 /* Fold state is used to fold instructions on-the-fly. */
 typedef struct FoldState {
   IRIns ins;		/* Currently emitted instruction. */
-  IRIns left;		/* Instruction referenced by left operand. */
-  IRIns right;		/* Instruction referenced by right operand. */
+  IRIns left[2];	/* Instruction referenced by left operand. */
+  IRIns right[2];	/* Instruction referenced by right operand. */
 } FoldState;
 
 /* JIT compiler state. */
 typedef struct jit_State {
   GCtrace cur;		/* Current trace. */
+  GCtrace *curfinal;	/* Final address of current trace (set during asm). */
 
   lua_State *L;		/* Current Lua state. */
   const BCIns *pc;	/* Current PC. */
@@ -359,8 +416,9 @@
   int32_t framedepth;	/* Current frame depth. */
   int32_t retdepth;	/* Return frame depth (count of RETF). */
 
-  MRef k64;		/* Pointer to chained array of 64 bit constants. */
   TValue ksimd[LJ_KSIMD__MAX*2+1];  /* 16 byte aligned SIMD constants. */
+  TValue k64[LJ_K64__MAX];  /* Common 8 byte constants used by backends. */
+  uint32_t k32[LJ_K32__MAX];  /* Ditto for 4 byte constants. */
 
   IRIns *irbuf;		/* Temp. IR instruction buffer. Biased with REF_BIAS. */
   IRRef irtoplim;	/* Upper limit of instuction buffer (biased). */
@@ -381,7 +439,7 @@
   GCRef *trace;		/* Array of traces. */
   TraceNo freetrace;	/* Start of scan for next free trace. */
   MSize sizetrace;	/* Size of trace array. */
-  TValue *ktracep;	/* Pointer to K64Array slot with GCtrace pointer. */
+  IRRef1 ktrace;	/* Reference to KGC with GCtrace. */
 
   IRRef1 chain[IR__MAX];  /* IR instruction skip-list chain anchors. */
   TRef slot[LJ_MAX_JSLOTS+LJ_STACK_EXTRA];  /* Stack slot map. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lex.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lex.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lex.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Lexical analyzer.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lex.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lex.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lex.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Lexical analyzer.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_LEX_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lib.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Library function support.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_lib_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lib.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lib.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_lib.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Library function support.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_LIB_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_load.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_load.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_load.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Load and dump code.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include <errno.h>
@@ -166,6 +166,8 @@
     return 1;
 }
 
+
+
 /* -- Luajittex needs this one because it overloads loadfile  -- */
 LUALIB_API int RESERVED_load_aux_JIT(lua_State *L, int status, int envarg)
 {
@@ -182,3 +184,4 @@
     return 2;
   }
 }
+

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_mcode.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_mcode.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_mcode.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Machine code management.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_mcode_c
@@ -204,8 +204,8 @@
 
 /* -- MCode area allocation ----------------------------------------------- */
 
-#if LJ_TARGET_X64
-#define mcode_validptr(p)	((p) && (uintptr_t)(p) < (uintptr_t)1<<47)
+#if LJ_64
+#define mcode_validptr(p)	(p)
 #else
 #define mcode_validptr(p)	((p) && (uintptr_t)(p) < 0xffff0000)
 #endif
@@ -221,8 +221,8 @@
   */
 #if LJ_TARGET_MIPS
   /* Use the middle of the 256MB-aligned region. */
-  uintptr_t target = ((uintptr_t)(void *)lj_vm_exit_handler & 0xf0000000u) +
-		     0x08000000u;
+  uintptr_t target = ((uintptr_t)(void *)lj_vm_exit_handler &
+		      ~(uintptr_t)0x0fffffffu) + 0x08000000u;
 #else
   uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff;
 #endif
@@ -230,7 +230,8 @@
   /* First try a contiguous area below the last one. */
   uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0;
   int i;
-  for (i = 0; i < 32; i++) {  /* 32 attempts ought to be enough ... */
+  /* Limit probing iterations, depending on the available pool size. */
+  for (i = 0; i < LJ_TARGET_JUMPRANGE; i++) {
     if (mcode_validptr(hint)) {
       void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN);
 
@@ -239,11 +240,11 @@
 	return p;
       if (p) mcode_free(J, p, sz);  /* Free badly placed area. */
     }
-    /* Next try probing pseudo-random addresses. */
+    /* Next try probing 64K-aligned pseudo-random addresses. */
     do {
-      hint = (0x78fb ^ LJ_PRNG_BITS(J, 15)) << 16;  /* 64K aligned. */
-    } while (!(hint + sz < range));
-    hint = target + hint - (range>>1);
+      hint = LJ_PRNG_BITS(J, LJ_TARGET_JUMPRANGE-16) << 16;
+    } while (!(hint + sz < range+range));
+    hint = target + hint - range;
   }
   lj_trace_err(J, LJ_TRERR_MCODEAL);  /* Give up. OS probably ignores hints? */
   return NULL;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_mcode.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_mcode.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_mcode.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Machine code management.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_MCODE_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_meta.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_meta.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_meta.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Metamethod handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_meta.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_meta.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_meta.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Metamethod handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_META_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_obj.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_obj.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_obj.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Miscellaneous object handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_obj_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_obj.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_obj.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_obj.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT VM tags, values and objects.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -843,12 +843,16 @@
 #endif
 
 #if LJ_FR2
-#define setcont(o, f)		((o)->u64 = (uint64_t)(uintptr_t)(void *)(f))
+#define contptr(f)		((void *)(f))
+#define setcont(o, f)		((o)->u64 = (uint64_t)(uintptr_t)contptr(f))
 #elif LJ_64
+#define contptr(f) \
+  ((void *)(uintptr_t)(uint32_t)((intptr_t)(f) - (intptr_t)lj_vm_asm_begin))
 #define setcont(o, f) \
   ((o)->u64 = (uint64_t)(void *)(f) - (uint64_t)lj_vm_asm_begin)
 #else
-#define setcont(o, f)		setlightudV((o), (void *)(f))
+#define contptr(f)		((void *)(f))
+#define setcont(o, f)		setlightudV((o), contptr(f))
 #endif
 
 #define tvchecklive(L, o) \

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_dce.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_dce.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_dce.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** DCE: Dead Code Elimination. Pre-LOOP only -- ASM already performs DCE.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_opt_dce_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_fold.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_fold.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_fold.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -2,7 +2,7 @@
 ** FOLD: Constant Folding, Algebraic Simplifications and Reassociation.
 ** ABCelim: Array Bounds Check Elimination.
 ** CSE: Common-Subexpression Elimination.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_opt_fold_c
@@ -136,8 +136,8 @@
 /* Some local macros to save typing. Undef'd at the end. */
 #define IR(ref)		(&J->cur.ir[(ref)])
 #define fins		(&J->fold.ins)
-#define fleft		(&J->fold.left)
-#define fright		(&J->fold.right)
+#define fleft		(J->fold.left)
+#define fright		(J->fold.right)
 #define knumleft	(ir_knum(fleft)->n)
 #define knumright	(ir_knum(fright)->n)
 
@@ -173,8 +173,6 @@
 LJFOLD(SUB KNUM KNUM)
 LJFOLD(MUL KNUM KNUM)
 LJFOLD(DIV KNUM KNUM)
-LJFOLD(NEG KNUM KNUM)
-LJFOLD(ABS KNUM KNUM)
 LJFOLD(ATAN2 KNUM KNUM)
 LJFOLD(LDEXP KNUM KNUM)
 LJFOLD(MIN KNUM KNUM)
@@ -187,6 +185,15 @@
   return lj_ir_knum(J, y);
 }
 
+LJFOLD(NEG KNUM FLOAD)
+LJFOLD(ABS KNUM FLOAD)
+LJFOLDF(kfold_numabsneg)
+{
+  lua_Number a = knumleft;
+  lua_Number y = lj_vm_foldarith(a, a, fins->o - IR_ADD);
+  return lj_ir_knum(J, y);
+}
+
 LJFOLD(LDEXP KNUM KINT)
 LJFOLDF(kfold_ldexp)
 {
@@ -347,6 +354,11 @@
   case IR_BAND: k1 &= k2; break;
   case IR_BOR: k1 |= k2; break;
   case IR_BXOR: k1 ^= k2; break;
+  case IR_BSHL: k1 <<= (k2 & 63); break;
+  case IR_BSHR: k1 = (int32_t)((uint32_t)k1 >> (k2 & 63)); break;
+  case IR_BSAR: k1 >>= (k2 & 63); break;
+  case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 63)); break;
+  case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 63)); break;
 #endif
   default: UNUSED(k2); lua_assert(0); break;
   }
@@ -436,14 +448,14 @@
 #if LJ_HASFFI
   uint64_t a = ir_k64(fleft)->u64, b = ir_k64(fright)->u64;
   switch ((IROp)fins->o) {
-  case IR_LT: return CONDFOLD(a < b);
-  case IR_GE: return CONDFOLD(a >= b);
-  case IR_LE: return CONDFOLD(a <= b);
-  case IR_GT: return CONDFOLD(a > b);
-  case IR_ULT: return CONDFOLD((uint64_t)a < (uint64_t)b);
-  case IR_UGE: return CONDFOLD((uint64_t)a >= (uint64_t)b);
-  case IR_ULE: return CONDFOLD((uint64_t)a <= (uint64_t)b);
-  case IR_UGT: return CONDFOLD((uint64_t)a > (uint64_t)b);
+  case IR_LT: return CONDFOLD((int64_t)a < (int64_t)b);
+  case IR_GE: return CONDFOLD((int64_t)a >= (int64_t)b);
+  case IR_LE: return CONDFOLD((int64_t)a <= (int64_t)b);
+  case IR_GT: return CONDFOLD((int64_t)a > (int64_t)b);
+  case IR_ULT: return CONDFOLD(a < b);
+  case IR_UGE: return CONDFOLD(a >= b);
+  case IR_ULE: return CONDFOLD(a <= b);
+  case IR_UGT: return CONDFOLD(a > b);
   default: lua_assert(0); return FAILFOLD;
   }
 #else
@@ -502,7 +514,7 @@
       PHIBARRIER(ir);
       fins->op2 = emitir(IRTI(IR_ADD), ir->op2, fins->op2); /* Clobbers fins! */
       fins->op1 = str;
-      fins->ot = IRT(IR_STRREF, IRT_P32);
+      fins->ot = IRT(IR_STRREF, IRT_PGC);
       return RETRYFOLD;
     }
   }
@@ -911,13 +923,13 @@
   return NEXTFOLD;
 }
 
-LJFOLD(ABS ABS KNUM)
+LJFOLD(ABS ABS FLOAD)
 LJFOLDF(shortcut_left)
 {
   return LEFTFOLD;  /* f(g(x)) ==> g(x) */
 }
 
-LJFOLD(ABS NEG KNUM)
+LJFOLD(ABS NEG FLOAD)
 LJFOLDF(shortcut_dropleft)
 {
   PHIBARRIER(fleft);
@@ -998,8 +1010,10 @@
   if (n == 1.0) {  /* x o 1 ==> x */
     return LEFTFOLD;
   } else if (n == -1.0) {  /* x o -1 ==> -x */
+    IRRef op1 = fins->op1;
+    fins->op2 = (IRRef1)lj_ir_ksimd(J, LJ_KSIMD_NEG);  /* Modifies fins. */
+    fins->op1 = op1;
     fins->o = IR_NEG;
-    fins->op2 = (IRRef1)lj_ir_knum_neg(J);
     return RETRYFOLD;
   } else if (fins->o == IR_MUL && n == 2.0) {  /* x * 2 ==> x + x */
     fins->o = IR_ADD;
@@ -1651,6 +1665,14 @@
     fins->op2 = (IRRef1)lj_ir_kint(J, k);
     fins->ot = IRTI(IR_BAND);
     return RETRYFOLD;
+  } else if (irk->o == IR_KINT64) {
+    uint64_t k = kfold_int64arith(ir_k64(irk)->u64, fright->i, (IROp)fins->o);
+    IROpT ot = fleft->ot;
+    fins->op1 = fleft->op1;
+    fins->op1 = (IRRef1)lj_opt_fold(J);
+    fins->op2 = (IRRef1)lj_ir_kint64(J, k);
+    fins->ot = ot;
+    return RETRYFOLD;
   }
   return NEXTFOLD;
 }
@@ -1666,6 +1688,47 @@
   return NEXTFOLD;
 }
 
+LJFOLD(BAND BOR KINT)
+LJFOLD(BOR BAND KINT)
+LJFOLDF(simplify_andor_k)
+{
+  IRIns *irk = IR(fleft->op2);
+  PHIBARRIER(fleft);
+  if (irk->o == IR_KINT) {
+    int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);
+    /* (i | k1) & k2 ==> i & k2, if (k1 & k2) == 0. */
+    /* (i & k1) | k2 ==> i | k2, if (k1 | k2) == -1. */
+    if (k == (fins->o == IR_BAND ? 0 : -1)) {
+      fins->op1 = fleft->op1;
+      return RETRYFOLD;
+    }
+  }
+  return NEXTFOLD;
+}
+
+LJFOLD(BAND BOR KINT64)
+LJFOLD(BOR BAND KINT64)
+LJFOLDF(simplify_andor_k64)
+{
+#if LJ_HASFFI
+  IRIns *irk = IR(fleft->op2);
+  PHIBARRIER(fleft);
+  if (irk->o == IR_KINT64) {
+    uint64_t k = kfold_int64arith(ir_k64(irk)->u64,
+				  ir_k64(fright)->u64, (IROp)fins->o);
+    /* (i | k1) & k2 ==> i & k2, if (k1 & k2) == 0. */
+    /* (i & k1) | k2 ==> i | k2, if (k1 | k2) == -1. */
+    if (k == (fins->o == IR_BAND ? (uint64_t)0 : ~(uint64_t)0)) {
+      fins->op1 = fleft->op1;
+      return RETRYFOLD;
+    }
+  }
+  return NEXTFOLD;
+#else
+  UNUSED(J); lua_assert(0); return FAILFOLD;
+#endif
+}
+
 /* -- Reassociation ------------------------------------------------------- */
 
 LJFOLD(ADD ADD KINT)
@@ -2393,10 +2456,14 @@
   if (fins->op1 >= J->cur.nk) {
     key += (uint32_t)IR(fins->op1)->o << 10;
     *fleft = *IR(fins->op1);
+    if (fins->op1 < REF_TRUE)
+      fleft[1] = IR(fins->op1)[1];
   }
   if (fins->op2 >= J->cur.nk) {
     key += (uint32_t)IR(fins->op2)->o;
     *fright = *IR(fins->op2);
+    if (fins->op2 < REF_TRUE)
+      fright[1] = IR(fins->op2)[1];
   } else {
     key += (fins->op2 & 0x3ffu);  /* Literal mask. Must include IRCONV_*MASK. */
   }

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_loop.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_loop.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_loop.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LOOP: Loop Optimizations.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_opt_loop_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_mem.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_mem.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_mem.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -3,7 +3,7 @@
 ** AA: Alias Analysis using high-level semantic disambiguation.
 ** FWD: Load Forwarding (L2L) + Store Forwarding (S2L).
 ** DSE: Dead-Store Elimination.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_opt_mem_c
@@ -22,8 +22,8 @@
 /* Some local macros to save typing. Undef'd at the end. */
 #define IR(ref)		(&J->cur.ir[(ref)])
 #define fins		(&J->fold.ins)
-#define fleft		(&J->fold.left)
-#define fright		(&J->fold.right)
+#define fleft		(J->fold.left)
+#define fright		(J->fold.right)
 
 /*
 ** Caveat #1: return value is not always a TRef -- only use with tref_ref().

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_narrow.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_narrow.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_narrow.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 /*
 ** NARROW: Narrowing of numbers to integers (double to int32_t).
 ** STRIPOV: Stripping of overflow checks.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_opt_narrow_c
@@ -517,18 +517,24 @@
   return (n == (lua_Number)lj_num2int(n));
 }
 
+/* Convert string to number. Error out for non-numeric string values. */
+static TRef conv_str_tonum(jit_State *J, TRef tr, TValue *o)
+{
+  if (tref_isstr(tr)) {
+    tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);
+    /* Would need an inverted STRTO for this rare and useless case. */
+    if (!lj_strscan_num(strV(o), o))  /* Convert in-place. Value used below. */
+      lj_trace_err(J, LJ_TRERR_BADTYPE);  /* Punt if non-numeric. */
+  }
+  return tr;
+}
+
 /* Narrowing of arithmetic operations. */
 TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc,
 			 TValue *vb, TValue *vc, IROp op)
 {
-  if (tref_isstr(rb)) {
-    rb = emitir(IRTG(IR_STRTO, IRT_NUM), rb, 0);
-    lj_strscan_num(strV(vb), vb);
-  }
-  if (tref_isstr(rc)) {
-    rc = emitir(IRTG(IR_STRTO, IRT_NUM), rc, 0);
-    lj_strscan_num(strV(vc), vc);
-  }
+  rb = conv_str_tonum(J, rb, vb);
+  rc = conv_str_tonum(J, rc, vc);
   /* Must not narrow MUL in non-DUALNUM variant, because it loses -0. */
   if ((op >= IR_ADD && op <= (LJ_DUALNUM ? IR_MUL : IR_SUB)) &&
       tref_isinteger(rb) && tref_isinteger(rc) &&
@@ -543,24 +549,21 @@
 /* Narrowing of unary minus operator. */
 TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc)
 {
-  if (tref_isstr(rc)) {
-    rc = emitir(IRTG(IR_STRTO, IRT_NUM), rc, 0);
-    lj_strscan_num(strV(vc), vc);
-  }
+  rc = conv_str_tonum(J, rc, vc);
   if (tref_isinteger(rc)) {
     if ((uint32_t)numberVint(vc) != 0x80000000u)
       return emitir(IRTGI(IR_SUBOV), lj_ir_kint(J, 0), rc);
     rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT);
   }
-  return emitir(IRTN(IR_NEG), rc, lj_ir_knum_neg(J));
+  return emitir(IRTN(IR_NEG), rc, lj_ir_ksimd(J, LJ_KSIMD_NEG));
 }
 
 /* Narrowing of modulo operator. */
-TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vc)
+TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc)
 {
   TRef tmp;
-  if (tvisstr(vc) && !lj_strscan_num(strV(vc), vc))
-    lj_trace_err(J, LJ_TRERR_BADTYPE);
+  rb = conv_str_tonum(J, rb, vb);
+  rc = conv_str_tonum(J, rc, vc);
   if ((LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) &&
       tref_isinteger(rb) && tref_isinteger(rc) &&
       (tvisint(vc) ? intV(vc) != 0 : !tviszero(vc))) {
@@ -577,10 +580,11 @@
 }
 
 /* Narrowing of power operator or math.pow. */
-TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vc)
+TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc)
 {
-  if (tvisstr(vc) && !lj_strscan_num(strV(vc), vc))
-    lj_trace_err(J, LJ_TRERR_BADTYPE);
+  rb = conv_str_tonum(J, rb, vb);
+  rb = lj_ir_tonum(J, rb);  /* Left arg is always treated as an FP number. */
+  rc = conv_str_tonum(J, rc, vc);
   /* Narrowing must be unconditional to preserve (-x)^i semantics. */
   if (tvisint(vc) || numisint(numV(vc))) {
     int checkrange = 0;
@@ -591,8 +595,6 @@
       checkrange = 1;
     }
     if (!tref_isinteger(rc)) {
-      if (tref_isstr(rc))
-	rc = emitir(IRTG(IR_STRTO, IRT_NUM), rc, 0);
       /* Guarded conversion to integer! */
       rc = emitir(IRTGI(IR_CONV), rc, IRCONV_INT_NUM|IRCONV_CHECK);
     }

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_sink.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_sink.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_sink.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** SINK: Allocation Sinking and Store Sinking.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_opt_sink_c
@@ -153,10 +153,9 @@
     remark = 0;
     for (ir = IR(J->cur.nins-1); ir->o == IR_PHI; ir--) {
       IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);
-      if (((irl->t.irt ^ irr->t.irt) & IRT_MARK))
-	remark = 1;
-      else if (irl->prev == irr->prev)
+      if (!((irl->t.irt ^ irr->t.irt) & IRT_MARK) && irl->prev == irr->prev)
 	continue;
+      remark |= (~(irl->t.irt & irr->t.irt) & IRT_MARK);
       irt_setmark(IR(ir->op1)->t);
       irt_setmark(IR(ir->op2)->t);
     }
@@ -166,8 +165,8 @@
 /* Sweep instructions and tag sunken allocations and stores. */
 static void sink_sweep_ins(jit_State *J)
 {
-  IRIns *ir, *irfirst = IR(J->cur.nk);
-  for (ir = IR(J->cur.nins-1) ; ir >= irfirst; ir--) {
+  IRIns *ir, *irbase = IR(REF_BASE);
+  for (ir = IR(J->cur.nins-1) ; ir >= irbase; ir--) {
     switch (ir->o) {
     case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: {
       IRIns *ira = sink_checkalloc(J, ir);
@@ -217,6 +216,12 @@
       break;
     }
   }
+  for (ir = IR(J->cur.nk); ir < irbase; ir++) {
+    irt_clearmark(ir->t);
+    ir->prev = REGSP_INIT;
+    if (irt_is64(ir->t) && ir->o != IR_KNULL)
+      ir++;
+  }
 }
 
 /* Allocation sinking and store sinking.

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_split.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_split.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_opt_split.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** SPLIT: Split 64 bit IR instructions into 32 bit IR instructions.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_opt_split_c
@@ -16,6 +16,7 @@
 #include "lj_jit.h"
 #include "lj_ircall.h"
 #include "lj_iropt.h"
+#include "lj_dispatch.h"
 #include "lj_vm.h"
 
 /* SPLIT pass:
@@ -353,6 +354,8 @@
       ir->prev = ref;  /* Identity substitution for loword. */
       hisubst[ref] = 0;
     }
+    if (irt_is64(ir->t) && ir->o != IR_KNULL)
+      ref++;
   }
 
   /* Process old IR instructions. */
@@ -433,7 +436,8 @@
 	nir->o = IR_CONV;  /* Pass through loword. */
 	nir->op2 = (IRT_INT << 5) | IRT_INT;
 	hi = split_emit(J, IRT(ir->o == IR_NEG ? IR_BXOR : IR_BAND, IRT_SOFTFP),
-			hisubst[ir->op1], hisubst[ir->op2]);
+	       hisubst[ir->op1],
+	       lj_ir_kint(J, (int32_t)(0x7fffffffu + (ir->o == IR_NEG))));
 	break;
       case IR_SLOAD:
 	if ((nir->op2 & IRSLOAD_CONVERT)) {  /* Convert from int to number. */
@@ -448,6 +452,11 @@
       case IR_STRTO:
 	hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);
 	break;
+      case IR_FLOAD:
+	lua_assert(ir->op1 == REF_NIL);
+	hi = lj_ir_kint(J, *(int32_t*)((char*)J2GG(J) + ir->op2 + LJ_LE*4));
+	nir->op2 += LJ_BE*4;
+	break;
       case IR_XLOAD: {
 	IRIns inslo = *nir;  /* Save/undo the emit of the lo XLOAD. */
 	J->cur.nins--;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_parse.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_parse.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_parse.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Lua parser (source code -> bytecode).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -1282,12 +1282,14 @@
       MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc);
       ls->vtop = idx;  /* Drop break label immediately. */
       gola_resolve(ls, bl, idx);
+    } else {  /* Need the fixup step to propagate the breaks. */
+      gola_fixup(ls, bl);
       return;
-    }  /* else: need the fixup step to propagate the breaks. */
-  } else if (!(bl->flags & FSCOPE_GOLA)) {
-    return;
+    }
   }
-  gola_fixup(ls, bl);
+  if ((bl->flags & FSCOPE_GOLA)) {
+    gola_fixup(ls, bl);
+  }
 }
 
 /* Mark scope as having an upvalue. */
@@ -2177,6 +2179,8 @@
       bcemit_nil(fs, reg, (BCReg)extra);
     }
   }
+  if (nexps > nvars)
+    ls->fs->freereg -= nexps - nvars;  /* Drop leftover regs. */
 }
 
 /* Recursively parse assignment statement. */
@@ -2210,8 +2214,6 @@
       return;
     }
     assign_adjust(ls, nvars, nexps, &e);
-    if (nexps > nvars)
-      ls->fs->freereg -= nexps - nvars;  /* Drop leftover regs. */
   }
   /* Assign RHS to LHS and recurse downwards. */
   expr_init(&e, VNONRELOC, ls->fs->freereg-1);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_parse.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_parse.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_parse.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Lua parser (source code -> bytecode).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_PARSE_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_profile.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_profile.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_profile.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Low-overhead profiling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_profile_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_profile.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_profile.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_profile.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Low-overhead profiling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_PROFILE_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_record.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_record.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_record.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Trace recorder (bytecode -> SSA IR).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_record_c
@@ -51,7 +51,7 @@
 {
   IRRef i, nins = J->cur.nins, nk = J->cur.nk;
   lua_assert(nk <= REF_BIAS && nins >= REF_BIAS && nins < 65536);
-  for (i = nins-1; i >= nk; i--) {
+  for (i = nk; i < nins; i++) {
     IRIns *ir = IR(i);
     uint32_t mode = lj_ir_mode[ir->o];
     IRRef op1 = ir->op1;
@@ -61,7 +61,10 @@
     case IRMref: lua_assert(op1 >= nk);
       lua_assert(i >= REF_BIAS ? op1 < i : op1 > i); break;
     case IRMlit: break;
-    case IRMcst: lua_assert(i < REF_BIAS); continue;
+    case IRMcst: lua_assert(i < REF_BIAS);
+      if (irt_is64(ir->t) && ir->o != IR_KNULL)
+	i++;
+      continue;
     }
     switch (irm_op2(mode)) {
     case IRMnone: lua_assert(op2 == 0); break;
@@ -84,8 +87,8 @@
   BCReg s, nslots = J->baseslot + J->maxslot;
   int32_t depth = 0;
   cTValue *base = J->L->base - J->baseslot;
-  lua_assert(J->baseslot >= 1 && J->baseslot < LJ_MAX_JSLOTS);
-  lua_assert(J->baseslot == 1 || (J->slot[J->baseslot-1] & TREF_FRAME));
+  lua_assert(J->baseslot >= 1+LJ_FR2 && J->baseslot < LJ_MAX_JSLOTS);
+  lua_assert(J->baseslot == 1+LJ_FR2 || (J->slot[J->baseslot-1] & TREF_FRAME));
   lua_assert(nslots < LJ_MAX_JSLOTS);
   for (s = 0; s < nslots; s++) {
     TRef tr = J->slot[s];
@@ -92,22 +95,40 @@
     if (tr) {
       cTValue *tv = &base[s];
       IRRef ref = tref_ref(tr);
-      IRIns *ir;
-      lua_assert(ref >= J->cur.nk && ref < J->cur.nins);
-      ir = IR(ref);
-      lua_assert(irt_t(ir->t) == tref_t(tr));
+      IRIns *ir = NULL;  /* Silence compiler. */
+      if (!LJ_FR2 || ref || !(tr & (TREF_FRAME | TREF_CONT))) {
+	lua_assert(ref >= J->cur.nk && ref < J->cur.nins);
+	ir = IR(ref);
+	lua_assert(irt_t(ir->t) == tref_t(tr));
+      }
       if (s == 0) {
 	lua_assert(tref_isfunc(tr));
+#if LJ_FR2
+      } else if (s == 1) {
+	lua_assert((tr & ~TREF_FRAME) == 0);
+#endif
       } else if ((tr & TREF_FRAME)) {
 	GCfunc *fn = gco2func(frame_gc(tv));
 	BCReg delta = (BCReg)(tv - frame_prev(tv));
+#if LJ_FR2
+	if (ref)
+	  lua_assert(ir_knum(ir)->u64 == tv->u64);
+	tr = J->slot[s-1];
+	ir = IR(tref_ref(tr));
+#endif
 	lua_assert(tref_isfunc(tr));
 	if (tref_isk(tr)) lua_assert(fn == ir_kfunc(ir));
-	lua_assert(s > delta ? (J->slot[s-delta] & TREF_FRAME) : (s == delta));
+	lua_assert(s > delta + LJ_FR2 ? (J->slot[s-delta] & TREF_FRAME)
+				      : (s == delta + LJ_FR2));
 	depth++;
       } else if ((tr & TREF_CONT)) {
+#if LJ_FR2
+	if (ref)
+	  lua_assert(ir_knum(ir)->u64 == tv->u64);
+#else
 	lua_assert(ir_kptr(ir) == gcrefp(tv->gcr, void));
-	lua_assert((J->slot[s+1] & TREF_FRAME));
+#endif
+	lua_assert((J->slot[s+1+LJ_FR2] & TREF_FRAME));
 	depth++;
       } else {
 	if (tvisnumber(tv))
@@ -159,10 +180,10 @@
 /* Get TRef for current function. */
 static TRef getcurrf(jit_State *J)
 {
-  if (J->base[-1])
-    return J->base[-1];
-  lua_assert(J->baseslot == 1);
-  return sloadt(J, -1, IRT_FUNC, IRSLOAD_READONLY);
+  if (J->base[-1-LJ_FR2])
+    return J->base[-1-LJ_FR2];
+  lua_assert(J->baseslot == 1+LJ_FR2);
+  return sloadt(J, -1-LJ_FR2, IRT_FUNC, IRSLOAD_READONLY);
 }
 
 /* Compare for raw object equality.
@@ -506,7 +527,6 @@
 static LoopEvent rec_iterl(jit_State *J, const BCIns iterins)
 {
   BCReg ra = bc_a(iterins);
-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */
   if (!tref_isnil(getslot(J, ra))) {  /* Looping back? */
     J->base[ra-1] = J->base[ra];  /* Copy result of ITERC to control var. */
     J->maxslot = ra-1+bc_b(J->pc[-1]);
@@ -643,8 +663,8 @@
     GCproto *pt = funcproto(fn);
     /* Too many closures created? Probably not a monomorphic function. */
     if (pt->flags >= PROTO_CLC_POLY) {  /* Specialize to prototype instead. */
-      TRef trpt = emitir(IRT(IR_FLOAD, IRT_P32), tr, IRFL_FUNC_PC);
-      emitir(IRTG(IR_EQ, IRT_P32), trpt, lj_ir_kptr(J, proto_bc(pt)));
+      TRef trpt = emitir(IRT(IR_FLOAD, IRT_PGC), tr, IRFL_FUNC_PC);
+      emitir(IRTG(IR_EQ, IRT_PGC), trpt, lj_ir_kptr(J, proto_bc(pt)));
       (void)lj_ir_kgc(J, obj2gco(pt), IRT_PROTO);  /* Prevent GC of proto. */
       return tr;
     }
@@ -675,22 +695,31 @@
 {
   RecordIndex ix;
   TValue *functv = &J->L->base[func];
-  TRef *fbase = &J->base[func];
+  TRef kfunc, *fbase = &J->base[func];
   ptrdiff_t i;
-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */
-  for (i = 0; i <= nargs; i++)
-    (void)getslot(J, func+i);  /* Ensure func and all args have a reference. */
+  (void)getslot(J, func); /* Ensure func has a reference. */
+  for (i = 1; i <= nargs; i++)
+    (void)getslot(J, func+LJ_FR2+i);  /* Ensure all args have a reference. */
   if (!tref_isfunc(fbase[0])) {  /* Resolve __call metamethod. */
     ix.tab = fbase[0];
     copyTV(J->L, &ix.tabv, functv);
     if (!lj_record_mm_lookup(J, &ix, MM_call) || !tref_isfunc(ix.mobj))
       lj_trace_err(J, LJ_TRERR_NOMM);
-    for (i = ++nargs; i > 0; i--)  /* Shift arguments up. */
-      fbase[i] = fbase[i-1];
+    for (i = ++nargs; i > LJ_FR2; i--)  /* Shift arguments up. */
+      fbase[i+LJ_FR2] = fbase[i+LJ_FR2-1];
+#if LJ_FR2
+    fbase[2] = fbase[0];
+#endif
     fbase[0] = ix.mobj;  /* Replace function. */
     functv = &ix.mobjv;
   }
-  fbase[0] = TREF_FRAME | rec_call_specialize(J, funcV(functv), fbase[0]);
+  kfunc = rec_call_specialize(J, funcV(functv), fbase[0]);
+#if LJ_FR2
+  fbase[0] = kfunc;
+  fbase[1] = TREF_FRAME;
+#else
+  fbase[0] = kfunc | TREF_FRAME;
+#endif
   J->maxslot = (BCReg)nargs;
 }
 
@@ -700,8 +729,8 @@
   rec_call_setup(J, func, nargs);
   /* Bump frame. */
   J->framedepth++;
-  J->base += func+1;
-  J->baseslot += func+1;
+  J->base += func+1+LJ_FR2;
+  J->baseslot += func+1+LJ_FR2;
 }
 
 /* Record tail call. */
@@ -717,7 +746,9 @@
     func += cbase;
   }
   /* Move func + args down. */
-  memmove(&J->base[-1], &J->base[func], sizeof(TRef)*(J->maxslot+1));
+  if (LJ_FR2 && J->baseslot == 2)
+    J->base[func+1] = TREF_FRAME;
+  memmove(&J->base[-1-LJ_FR2], &J->base[func], sizeof(TRef)*(J->maxslot+1+LJ_FR2));
   /* Note: the new TREF_FRAME is now at J->base[-1] (even for slot #0). */
   /* Tailcalls can form a loop, so count towards the loop unroll limit. */
   if (++J->tailcalled > J->loopunroll)
@@ -758,9 +789,9 @@
     (void)getslot(J, rbase+i);  /* Ensure all results have a reference. */
   while (frame_ispcall(frame)) {  /* Immediately resolve pcall() returns. */
     BCReg cbase = (BCReg)frame_delta(frame);
-    if (--J->framedepth < 0)
+    if (--J->framedepth <= 0)
       lj_trace_err(J, LJ_TRERR_NYIRETL);
-    lua_assert(J->baseslot > 1);
+    lua_assert(J->baseslot > 1+LJ_FR2);
     gotresults++;
     rbase += cbase;
     J->baseslot -= (BCReg)cbase;
@@ -784,7 +815,7 @@
     BCReg cbase = (BCReg)frame_delta(frame);
     if (--J->framedepth < 0)  /* NYI: return of vararg func to lower frame. */
       lj_trace_err(J, LJ_TRERR_NYIRETL);
-    lua_assert(J->baseslot > 1);
+    lua_assert(J->baseslot > 1+LJ_FR2);
     rbase += cbase;
     J->baseslot -= (BCReg)cbase;
     J->base -= cbase;
@@ -794,8 +825,7 @@
     BCIns callins = *(frame_pc(frame)-1);
     ptrdiff_t nresults = bc_b(callins) ? (ptrdiff_t)bc_b(callins)-1 :gotresults;
     BCReg cbase = bc_a(callins);
-    GCproto *pt = funcproto(frame_func(frame - (cbase+1-LJ_FR2)));
-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame teardown. */
+    GCproto *pt = funcproto(frame_func(frame - (cbase+1+LJ_FR2)));
     if ((pt->flags & PROTO_NOJIT))
       lj_trace_err(J, LJ_TRERR_CJITOFF);
     if (J->framedepth == 0 && J->pt && frame == J->L->base - 1) {
@@ -808,13 +838,13 @@
       lj_snap_add(J);
     }
     for (i = 0; i < nresults; i++)  /* Adjust results. */
-      J->base[i-1] = i < gotresults ? J->base[rbase+i] : TREF_NIL;
+      J->base[i-1-LJ_FR2] = i < gotresults ? J->base[rbase+i] : TREF_NIL;
     J->maxslot = cbase+(BCReg)nresults;
     if (J->framedepth > 0) {  /* Return to a frame that is part of the trace. */
       J->framedepth--;
-      lua_assert(J->baseslot > cbase+1);
-      J->baseslot -= cbase+1;
-      J->base -= cbase+1;
+      lua_assert(J->baseslot > cbase+1+LJ_FR2);
+      J->baseslot -= cbase+1+LJ_FR2;
+      J->base -= cbase+1+LJ_FR2;
     } else if (J->parent == 0 && J->exitno == 0 &&
 	       !bc_isret(bc_op(J->cur.startins))) {
       /* Return to lower frame would leave the loop in a root trace. */
@@ -824,13 +854,13 @@
     } else {  /* Return to lower frame. Guard for the target we return to. */
       TRef trpt = lj_ir_kgc(J, obj2gco(pt), IRT_PROTO);
       TRef trpc = lj_ir_kptr(J, (void *)frame_pc(frame));
-      emitir(IRTG(IR_RETF, IRT_P32), trpt, trpc);
+      emitir(IRTG(IR_RETF, IRT_PGC), trpt, trpc);
       J->retdepth++;
       J->needsnap = 1;
-      lua_assert(J->baseslot == 1);
+      lua_assert(J->baseslot == 1+LJ_FR2);
       /* Shift result slots up and clear the slots of the new frame below. */
-      memmove(J->base + cbase, J->base-1, sizeof(TRef)*nresults);
-      memset(J->base-1, 0, sizeof(TRef)*(cbase+1));
+      memmove(J->base + cbase, J->base-1-LJ_FR2, sizeof(TRef)*nresults);
+      memset(J->base-1-LJ_FR2, 0, sizeof(TRef)*(cbase+1+LJ_FR2));
     }
   } else if (frame_iscont(frame)) {  /* Return to continuation frame. */
     ASMFunction cont = frame_contf(frame);
@@ -839,32 +869,39 @@
       lj_trace_err(J, LJ_TRERR_NYIRETL);
     J->baseslot -= (BCReg)cbase;
     J->base -= cbase;
-    J->maxslot = cbase-2;
+    J->maxslot = cbase-(2<<LJ_FR2);
     if (cont == lj_cont_ra) {
       /* Copy result to destination slot. */
       BCReg dst = bc_a(*(frame_contpc(frame)-1));
       J->base[dst] = gotresults ? J->base[cbase+rbase] : TREF_NIL;
-      if (dst >= J->maxslot) J->maxslot = dst+1;
+      if (dst >= J->maxslot) {
+	J->maxslot = dst+1;
+      }
     } else if (cont == lj_cont_nop) {
       /* Nothing to do here. */
     } else if (cont == lj_cont_cat) {
       BCReg bslot = bc_b(*(frame_contpc(frame)-1));
       TRef tr = gotresults ? J->base[cbase+rbase] : TREF_NIL;
-      if (bslot != cbase-2) {  /* Concatenate the remainder. */
+      if (bslot != J->maxslot) {  /* Concatenate the remainder. */
 	TValue *b = J->L->base, save;  /* Simulate lower frame and result. */
-	J->base[cbase-2] = tr;
-	copyTV(J->L, &save, b-2);
-	if (gotresults) copyTV(J->L, b-2, b+rbase); else setnilV(b-2);
+	J->base[J->maxslot] = tr;
+	copyTV(J->L, &save, b-(2<<LJ_FR2));
+	if (gotresults)
+	  copyTV(J->L, b-(2<<LJ_FR2), b+rbase);
+	else
+	  setnilV(b-(2<<LJ_FR2));
 	J->L->base = b - cbase;
-	tr = rec_cat(J, bslot, cbase-2);
+	tr = rec_cat(J, bslot, cbase-(2<<LJ_FR2));
 	b = J->L->base + cbase;  /* Undo. */
 	J->L->base = b;
-	copyTV(J->L, b-2, &save);
+	copyTV(J->L, b-(2<<LJ_FR2), &save);
       }
       if (tr) {  /* Store final result. */
 	BCReg dst = bc_a(*(frame_contpc(frame)-1));
 	J->base[dst] = tr;
-	if (dst >= J->maxslot) J->maxslot = dst+1;
+	if (dst >= J->maxslot) {
+	  J->maxslot = dst+1;
+	}
       }  /* Otherwise continue with another __concat call. */
     } else {
       /* Result type already specialized. */
@@ -873,7 +910,7 @@
   } else {
     lj_trace_err(J, LJ_TRERR_NYIRETL);  /* NYI: handle return to C frame. */
   }
-  lua_assert(J->baseslot >= 1);
+  lua_assert(J->baseslot >= 1+LJ_FR2);
 }
 
 /* -- Metamethod handling ------------------------------------------------- */
@@ -882,16 +919,16 @@
 static BCReg rec_mm_prep(jit_State *J, ASMFunction cont)
 {
   BCReg s, top = cont == lj_cont_cat ? J->maxslot : curr_proto(J->L)->framesize;
-#if LJ_64
-  TRef trcont = lj_ir_kptr(J, (void *)((int64_t)cont-(int64_t)lj_vm_asm_begin));
+#if LJ_FR2
+  J->base[top] = lj_ir_k64(J, IR_KNUM, u64ptr(contptr(cont)));
+  J->base[top+1] = TREF_CONT;
 #else
-  TRef trcont = lj_ir_kptr(J, (void *)cont);
+  J->base[top] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;
 #endif
-  J->base[top] = trcont | TREF_CONT;
   J->framedepth++;
   for (s = J->maxslot; s < top; s++)
     J->base[s] = 0;  /* Clear frame gap to avoid resurrecting previous refs. */
-  return top+1;
+  return top+1+LJ_FR2;
 }
 
 /* Record metamethod lookup. */
@@ -910,7 +947,7 @@
       cTValue *mo;
       if (LJ_HASFFI && udtype == UDTYPE_FFI_CLIB) {
 	/* Specialize to the C library namespace object. */
-	emitir(IRTG(IR_EQ, IRT_P32), ix->tab, lj_ir_kptr(J, udataV(&ix->tabv)));
+	emitir(IRTG(IR_EQ, IRT_PGC), ix->tab, lj_ir_kptr(J, udataV(&ix->tabv)));
       } else {
 	/* Specialize to the type of userdata. */
 	TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), ix->tab, IRFL_UDATA_UDTYPE);
@@ -939,7 +976,13 @@
     }
     /* The cdata metatable is treated as immutable. */
     if (LJ_HASFFI && tref_iscdata(ix->tab)) goto immutable_mt;
+#if LJ_GC64
+    /* TODO: fix ARM32 asm_fload(), so we can use this for all archs. */
+    ix->mt = mix.tab = lj_ir_ggfload(J, IRT_TAB,
+      GG_OFS(g.gcroot[GCROOT_BASEMT+itypemap(&ix->tabv)]));
+#else
     ix->mt = mix.tab = lj_ir_ktab(J, mt);
+#endif
     goto nocheck;
   }
   ix->mt = mt ? mix.tab : TREF_NIL;
@@ -969,9 +1012,9 @@
   BCReg func = rec_mm_prep(J, mm == MM_concat ? lj_cont_cat : lj_cont_ra);
   TRef *base = J->base + func;
   TValue *basev = J->L->base + func;
-  base[1] = ix->tab; base[2] = ix->key;
-  copyTV(J->L, basev+1, &ix->tabv);
-  copyTV(J->L, basev+2, &ix->keyv);
+  base[1+LJ_FR2] = ix->tab; base[2+LJ_FR2] = ix->key;
+  copyTV(J->L, basev+1+LJ_FR2, &ix->tabv);
+  copyTV(J->L, basev+2+LJ_FR2, &ix->keyv);
   if (!lj_record_mm_lookup(J, ix, mm)) {  /* Lookup mm on 1st operand. */
     if (mm != MM_unm) {
       ix->tab = ix->key;
@@ -982,8 +1025,10 @@
     lj_trace_err(J, LJ_TRERR_NOMM);
   }
 ok:
-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */
   base[0] = ix->mobj;
+#if LJ_FR2
+  base[1] = 0;
+#endif
   copyTV(J->L, basev+0, &ix->mobjv);
   lj_record_call(J, func, 2);
   return 0;  /* No result yet. */
@@ -999,8 +1044,9 @@
     BCReg func = rec_mm_prep(J, lj_cont_ra);
     TRef *base = J->base + func;
     TValue *basev = J->L->base + func;
-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */
     base[0] = ix.mobj; copyTV(J->L, basev+0, &ix.mobjv);
+    base += LJ_FR2;
+    basev += LJ_FR2;
     base[1] = tr; copyTV(J->L, basev+1, tv);
 #if LJ_52
     base[2] = tr; copyTV(J->L, basev+2, tv);
@@ -1020,11 +1066,10 @@
 static void rec_mm_callcomp(jit_State *J, RecordIndex *ix, int op)
 {
   BCReg func = rec_mm_prep(J, (op&1) ? lj_cont_condf : lj_cont_condt);
-  TRef *base = J->base + func;
-  TValue *tv = J->L->base + func;
-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */
-  base[0] = ix->mobj; base[1] = ix->val; base[2] = ix->key;
-  copyTV(J->L, tv+0, &ix->mobjv);
+  TRef *base = J->base + func + LJ_FR2;
+  TValue *tv = J->L->base + func + LJ_FR2;
+  base[-LJ_FR2] = ix->mobj; base[1] = ix->val; base[2] = ix->key;
+  copyTV(J->L, tv-LJ_FR2, &ix->mobjv);
   copyTV(J->L, tv+1, &ix->valv);
   copyTV(J->L, tv+2, &ix->keyv);
   lj_record_call(J, func, 2);
@@ -1257,8 +1302,8 @@
       if ((MSize)k < t->asize) {  /* Currently an array key? */
 	TRef arrayref;
 	rec_idx_abc(J, asizeref, ikey, t->asize);
-	arrayref = emitir(IRT(IR_FLOAD, IRT_P32), ix->tab, IRFL_TAB_ARRAY);
-	return emitir(IRT(IR_AREF, IRT_P32), arrayref, ikey);
+	arrayref = emitir(IRT(IR_FLOAD, IRT_PGC), ix->tab, IRFL_TAB_ARRAY);
+	return emitir(IRT(IR_AREF, IRT_PGC), arrayref, ikey);
       } else {  /* Currently not in array (may be an array extension)? */
 	emitir(IRTGI(IR_ULE), asizeref, ikey);  /* Inv. bounds check. */
 	if (k == 0 && tref_isk(key))
@@ -1298,13 +1343,13 @@
       *rbguard = J->guardemit;
       hm = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK);
       emitir(IRTGI(IR_EQ), hm, lj_ir_kint(J, (int32_t)t->hmask));
-      node = emitir(IRT(IR_FLOAD, IRT_P32), ix->tab, IRFL_TAB_NODE);
+      node = emitir(IRT(IR_FLOAD, IRT_PGC), ix->tab, IRFL_TAB_NODE);
       kslot = lj_ir_kslot(J, key, hslot / sizeof(Node));
-      return emitir(IRTG(IR_HREFK, IRT_P32), node, kslot);
+      return emitir(IRTG(IR_HREFK, IRT_PGC), node, kslot);
     }
   }
   /* Fall back to a regular hash lookup. */
-  return emitir(IRT(IR_HREF, IRT_P32), ix->tab, key);
+  return emitir(IRT(IR_HREF, IRT_PGC), ix->tab, key);
 }
 
 /* Determine whether a key is NOT one of the fast metamethod names. */
@@ -1341,11 +1386,10 @@
   handlemm:
     if (tref_isfunc(ix->mobj)) {  /* Handle metamethod call. */
       BCReg func = rec_mm_prep(J, ix->val ? lj_cont_nop : lj_cont_ra);
-      TRef *base = J->base + func;
-      TValue *tv = J->L->base + func;
-      lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */
-      base[0] = ix->mobj; base[1] = ix->tab; base[2] = ix->key;
-      setfuncV(J->L, tv+0, funcV(&ix->mobjv));
+      TRef *base = J->base + func + LJ_FR2;
+      TValue *tv = J->L->base + func + LJ_FR2;
+      base[-LJ_FR2] = ix->mobj; base[1] = ix->tab; base[2] = ix->key;
+      setfuncV(J->L, tv-LJ_FR2, funcV(&ix->mobjv));
       copyTV(J->L, tv+1, &ix->tabv);
       copyTV(J->L, tv+2, &ix->keyv);
       if (ix->val) {
@@ -1387,7 +1431,7 @@
     IRType t = itype2irt(oldv);
     TRef res;
     if (oldv == niltvg(J2G(J))) {
-      emitir(IRTG(IR_EQ, IRT_P32), xref, lj_ir_kkptr(J, niltvg(J2G(J))));
+      emitir(IRTG(IR_EQ, IRT_PGC), xref, lj_ir_kkptr(J, niltvg(J2G(J))));
       res = TREF_NIL;
     } else {
       res = emitir(IRTG(loadop, t), xref, 0);
@@ -1417,7 +1461,7 @@
       if (hasmm)
 	emitir(IRTG(loadop, IRT_NIL), xref, 0);  /* Guard for nil value. */
       else if (xrefop == IR_HREF)
-	emitir(IRTG(oldv == niltvg(J2G(J)) ? IR_EQ : IR_NE, IRT_P32),
+	emitir(IRTG(oldv == niltvg(J2G(J)) ? IR_EQ : IR_NE, IRT_PGC),
 	       xref, lj_ir_kkptr(J, niltvg(J2G(J))));
       if (ix->idxchain && lj_record_mm_lookup(J, ix, MM_newindex)) {
 	lua_assert(hasmm);
@@ -1428,7 +1472,7 @@
 	TRef key = ix->key;
 	if (tref_isinteger(key))  /* NEWREF needs a TValue as a key. */
 	  key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT);
-	xref = emitir(IRT(IR_NEWREF, IRT_P32), ix->tab, key);
+	xref = emitir(IRT(IR_NEWREF, IRT_PGC), ix->tab, key);
 	keybarrier = 0;  /* NEWREF already takes care of the key barrier. */
 #ifdef LUAJIT_ENABLE_TABLE_BUMP
 	if ((J->flags & JIT_F_OPT_SINK))  /* Avoid a separate flag. */
@@ -1438,7 +1482,7 @@
     } else if (!lj_opt_fwd_wasnonnil(J, loadop, tref_ref(xref))) {
       /* Cannot derive that the previous value was non-nil, must do checks. */
       if (xrefop == IR_HREF)  /* Guard against store to niltv. */
-	emitir(IRTG(IR_NE, IRT_P32), xref, lj_ir_kkptr(J, niltvg(J2G(J))));
+	emitir(IRTG(IR_NE, IRT_PGC), xref, lj_ir_kkptr(J, niltvg(J2G(J))));
       if (ix->idxchain) {  /* Metamethod lookup required? */
 	/* A check for NULL metatable is cheaper (hoistable) than a load. */
 	if (!mt) {
@@ -1460,7 +1504,7 @@
       emitir(IRT(IR_TBAR, IRT_NIL), ix->tab, 0);
     /* Invalidate neg. metamethod cache for stores with certain string keys. */
     if (!nommstr(J, ix->key)) {
-      TRef fref = emitir(IRT(IR_FREF, IRT_P32), ix->tab, IRFL_TAB_NOMM);
+      TRef fref = emitir(IRT(IR_FREF, IRT_PGC), ix->tab, IRFL_TAB_NOMM);
       emitir(IRT(IR_FSTORE, IRT_U8), fref, lj_ir_kint(J, 0));
     }
     J->needsnap = 1;
@@ -1535,7 +1579,11 @@
 	goto noconstify;
       kfunc = lj_ir_kfunc(J, J->fn);
       emitir(IRTG(IR_EQ, IRT_FUNC), fn, kfunc);
-      J->base[-1] = TREF_FRAME | kfunc;
+#if LJ_FR2
+      J->base[-2] = kfunc;
+#else
+      J->base[-1] = kfunc | TREF_FRAME;
+#endif
       fn = kfunc;
     }
     tr = lj_record_constify(J, uvval(uvp));
@@ -1546,13 +1594,17 @@
   /* Note: this effectively limits LJ_MAX_UPVAL to 127. */
   uv = (uv << 8) | (hashrot(uvp->dhash, uvp->dhash + HASH_BIAS) & 0xff);
   if (!uvp->closed) {
+    uref = tref_ref(emitir(IRTG(IR_UREFO, IRT_PGC), fn, uv));
     /* In current stack? */
     if (uvval(uvp) >= tvref(J->L->stack) &&
 	uvval(uvp) < tvref(J->L->maxstack)) {
       int32_t slot = (int32_t)(uvval(uvp) - (J->L->base - J->baseslot));
       if (slot >= 0) {  /* Aliases an SSA slot? */
+	emitir(IRTG(IR_EQ, IRT_PGC),
+	       REF_BASE,
+	       emitir(IRT(IR_ADD, IRT_PGC), uref,
+		      lj_ir_kint(J, (slot - 1 - LJ_FR2) * -8)));
 	slot -= (int32_t)J->baseslot;  /* Note: slot number may be negative! */
-	/* NYI: add IR to guard that it's still aliasing the same slot. */
 	if (val == 0) {
 	  return getslot(J, slot);
 	} else {
@@ -1562,10 +1614,12 @@
 	}
       }
     }
-    uref = tref_ref(emitir(IRTG(IR_UREFO, IRT_P32), fn, uv));
+    emitir(IRTG(IR_UGT, IRT_PGC),
+	   emitir(IRT(IR_SUB, IRT_PGC), uref, REF_BASE),
+	   lj_ir_kint(J, (J->baseslot + J->maxslot) * 8));
   } else {
     needbarrier = 1;
-    uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_P32), fn, uv));
+    uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_PGC), fn, uv));
   }
   if (val == 0) {  /* Upvalue load */
     IRType t = itype2irt(uvval(uvp));
@@ -1640,11 +1694,14 @@
 static void rec_func_vararg(jit_State *J)
 {
   GCproto *pt = J->pt;
-  BCReg s, fixargs, vframe = J->maxslot+1;
+  BCReg s, fixargs, vframe = J->maxslot+1+LJ_FR2;
   lua_assert((pt->flags & PROTO_VARARG));
   if (J->baseslot + vframe + pt->framesize >= LJ_MAX_JSLOTS)
     lj_trace_err(J, LJ_TRERR_STACKOV);
-  J->base[vframe-1] = J->base[-1];  /* Copy function up. */
+  J->base[vframe-1-LJ_FR2] = J->base[-1-LJ_FR2];  /* Copy function up. */
+#if LJ_FR2
+  J->base[vframe-1] = TREF_FRAME;
+#endif
   /* Copy fixarg slots up and set their original slots to nil. */
   fixargs = pt->numparams < J->maxslot ? pt->numparams : J->maxslot;
   for (s = 0; s < fixargs; s++) {
@@ -1693,8 +1750,11 @@
   BCIns ins = J->pc[1];
   if (bc_op(ins) == BC_CALLM && bc_b(ins) == 2 && bc_c(ins) == 1) {
     cTValue *func = &J->L->base[bc_a(ins)];
-    if (tvisfunc(func) && funcV(func)->c.ffid == FF_select)
+    if (tvisfunc(func) && funcV(func)->c.ffid == FF_select) {
+      TRef kfunc = lj_ir_kfunc(J, funcV(func));
+      emitir(IRTG(IR_EQ, IRT_FUNC), getslot(J, bc_a(ins)), kfunc);
       return 1;
+    }
   }
   return 0;
 }
@@ -1703,8 +1763,10 @@
 static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
 {
   int32_t numparams = J->pt->numparams;
-  ptrdiff_t nvararg = frame_delta(J->L->base-1) - numparams - 1;
+  ptrdiff_t nvararg = frame_delta(J->L->base-1) - numparams - 1 - LJ_FR2;
   lua_assert(frame_isvarg(J->L->base-1));
+  if (LJ_FR2 && dst > J->maxslot)
+    J->base[dst-1] = 0;  /* Prevent resurrection of unrelated slot. */
   if (J->framedepth > 0) {  /* Simple case: varargs defined on-trace. */
     ptrdiff_t i;
     if (nvararg < 0) nvararg = 0;
@@ -1715,10 +1777,10 @@
       J->maxslot = dst + (BCReg)nresults;
     }
     for (i = 0; i < nresults; i++)
-      J->base[dst+i] = i < nvararg ? getslot(J, i - nvararg - 1) : TREF_NIL;
+      J->base[dst+i] = i < nvararg ? getslot(J, i - nvararg - 1 - LJ_FR2) : TREF_NIL;
   } else {  /* Unknown number of varargs passed to trace. */
-    TRef fr = emitir(IRTI(IR_SLOAD), 0, IRSLOAD_READONLY|IRSLOAD_FRAME);
-    int32_t frofs = 8*(1+numparams)+FRAME_VARG;
+    TRef fr = emitir(IRTI(IR_SLOAD), LJ_FR2, IRSLOAD_READONLY|IRSLOAD_FRAME);
+    int32_t frofs = 8*(1+LJ_FR2+numparams)+FRAME_VARG;
     if (nresults >= 0) {  /* Known fixed number of results. */
       ptrdiff_t i;
       if (nvararg > 0) {
@@ -1729,11 +1791,11 @@
 	else
 	  emitir(IRTGI(IR_EQ), fr,
 		 lj_ir_kint(J, (int32_t)frame_ftsz(J->L->base-1)));
-	vbase = emitir(IRTI(IR_SUB), REF_BASE, fr);
-	vbase = emitir(IRT(IR_ADD, IRT_P32), vbase, lj_ir_kint(J, frofs-8));
+	vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr);
+	vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase, lj_ir_kint(J, frofs-8));
 	for (i = 0; i < nload; i++) {
-	  IRType t = itype2irt(&J->L->base[i-1-nvararg]);
-	  TRef aref = emitir(IRT(IR_AREF, IRT_P32),
+	  IRType t = itype2irt(&J->L->base[i-1-LJ_FR2-nvararg]);
+	  TRef aref = emitir(IRT(IR_AREF, IRT_PGC),
 			     vbase, lj_ir_kint(J, (int32_t)i));
 	  TRef tr = emitir(IRTG(IR_VLOAD, t), aref, 0);
 	  if (irtype_ispri(t)) tr = TREF_PRI(t);  /* Canonicalize primitives. */
@@ -1779,15 +1841,16 @@
       }
       if (idx != 0 && idx <= nvararg) {
 	IRType t;
-	TRef aref, vbase = emitir(IRTI(IR_SUB), REF_BASE, fr);
-	vbase = emitir(IRT(IR_ADD, IRT_P32), vbase, lj_ir_kint(J, frofs-8));
-	t = itype2irt(&J->L->base[idx-2-nvararg]);
-	aref = emitir(IRT(IR_AREF, IRT_P32), vbase, tridx);
+	TRef aref, vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr);
+	vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase,
+		       lj_ir_kint(J, frofs-(8<<LJ_FR2)));
+	t = itype2irt(&J->L->base[idx-2-LJ_FR2-nvararg]);
+	aref = emitir(IRT(IR_AREF, IRT_PGC), vbase, tridx);
 	tr = emitir(IRTG(IR_VLOAD, t), aref, 0);
 	if (irtype_ispri(t)) tr = TREF_PRI(t);  /* Canonicalize primitives. */
       }
-      J->base[dst-2] = tr;
-      J->maxslot = dst-1;
+      J->base[dst-2-LJ_FR2] = tr;
+      J->maxslot = dst-1-LJ_FR2;
       J->bcskip = 2;  /* Skip CALLM + select. */
     } else {
     nyivarg:
@@ -1836,10 +1899,10 @@
 	break;
     }
     xbase = ++trp;
-    tr = hdr = emitir(IRT(IR_BUFHDR, IRT_P32),
+    tr = hdr = emitir(IRT(IR_BUFHDR, IRT_PGC),
 		      lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
     do {
-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, *trp++);
+      tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, *trp++);
     } while (trp <= top);
     tr = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
     J->maxslot = (BCReg)(xbase - J->base);
@@ -1880,7 +1943,15 @@
   const BCIns *npc = pc + 2 + (cond ? bc_j(jmpins) : 0);
   SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];
   /* Set PC to opposite target to avoid re-recording the comp. in side trace. */
+#if LJ_FR2
+  SnapEntry *flink = &J->cur.snapmap[snap->mapofs + snap->nent];
+  uint64_t pcbase;
+  memcpy(&pcbase, flink, sizeof(uint64_t));
+  pcbase = (pcbase & 0xff) | (u64ptr(npc) << 8);
+  memcpy(flink, &pcbase, sizeof(uint64_t));
+#else
   J->cur.snapmap[snap->mapofs + snap->nent] = SNAP_MKPC(npc);
+#endif
   J->needsnap = 1;
   if (bc_a(jmpins) < J->maxslot) J->maxslot = bc_a(jmpins);
   lj_snap_shrink(J);  /* Shrink last snapshot if possible. */
@@ -2156,7 +2227,7 @@
   case BC_MODVN: case BC_MODVV:
   recmod:
     if (tref_isnumber_str(rb) && tref_isnumber_str(rc))
-      rc = lj_opt_narrow_mod(J, rb, rc, rcv);
+      rc = lj_opt_narrow_mod(J, rb, rc, rbv, rcv);
     else
       rc = rec_mm_arith(J, &ix, MM_mod);
     break;
@@ -2163,7 +2234,7 @@
 
   case BC_POW:
     if (tref_isnumber_str(rb) && tref_isnumber_str(rc))
-      rc = lj_opt_narrow_pow(J, lj_ir_tonum(J, rb), rc, rcv);
+      rc = lj_opt_narrow_pow(J, rb, rc, rbv, rcv);
     else
       rc = rec_mm_arith(J, &ix, MM_pow);
     break;
@@ -2178,7 +2249,13 @@
 
   case BC_MOV:
     /* Clear gap of method call to avoid resurrecting previous refs. */
-    if (ra > J->maxslot) J->base[ra-1] = 0;
+    if (ra > J->maxslot) {
+#if LJ_FR2
+      memset(J->base + J->maxslot, 0, (ra - J->maxslot) * sizeof(TRef));
+#else
+      J->base[ra-1] = 0;
+#endif
+    }
     break;
   case BC_KSTR: case BC_KNUM: case BC_KPRI:
     break;
@@ -2186,6 +2263,8 @@
     rc = lj_ir_kint(J, (int32_t)(int16_t)rc);
     break;
   case BC_KNIL:
+    if (LJ_FR2 && ra > J->maxslot)
+      J->base[ra-1] = 0;
     while (ra <= rc)
       J->base[ra++] = TREF_NIL;
     if (rc >= J->maxslot) J->maxslot = rc+1;
@@ -2247,14 +2326,14 @@
   /* -- Calls and vararg handling ----------------------------------------- */
 
   case BC_ITERC:
-    J->base[ra] = getslot(J, ra-3-LJ_FR2);
-    J->base[ra+1] = getslot(J, ra-2-LJ_FR2);
-    J->base[ra+2] = getslot(J, ra-1-LJ_FR2);
+    J->base[ra] = getslot(J, ra-3);
+    J->base[ra+1+LJ_FR2] = getslot(J, ra-2);
+    J->base[ra+2+LJ_FR2] = getslot(J, ra-1);
     { /* Do the actual copy now because lj_record_call needs the values. */
       TValue *b = &J->L->base[ra];
-      copyTV(J->L, b, b-3-LJ_FR2);
-      copyTV(J->L, b+1, b-2-LJ_FR2);
-      copyTV(J->L, b+2, b-1-LJ_FR2);
+      copyTV(J->L, b, b-3);
+      copyTV(J->L, b+1+LJ_FR2, b-2);
+      copyTV(J->L, b+2+LJ_FR2, b-1);
     }
     lj_record_call(J, ra, (ptrdiff_t)rc-1);
     break;
@@ -2377,7 +2456,12 @@
   /* rc == 0 if we have no result yet, e.g. pending __index metamethod call. */
   if (bcmode_a(op) == BCMdst && rc) {
     J->base[ra] = rc;
-    if (ra >= J->maxslot) J->maxslot = ra+1;
+    if (ra >= J->maxslot) {
+#if LJ_FR2
+      if (ra > J->maxslot) J->base[ra-1] = 0;
+#endif
+      J->maxslot = ra+1;
+    }
   }
 
 #undef rav
@@ -2462,7 +2546,7 @@
   J->scev.idx = REF_NIL;
   setmref(J->scev.pc, NULL);
 
-  J->baseslot = 1;  /* Invoking function is at base[-1]. */
+  J->baseslot = 1+LJ_FR2;  /* Invoking function is at base[-1-LJ_FR2]. */
   J->base = J->slot + J->baseslot;
   J->maxslot = 0;
   J->framedepth = 0;
@@ -2477,7 +2561,7 @@
   J->bc_extent = ~(MSize)0;
 
   /* Emit instructions for fixed references. Also triggers initial IR alloc. */
-  emitir_raw(IRT(IR_BASE, IRT_P32), J->parent, J->exitno);
+  emitir_raw(IRT(IR_BASE, IRT_PGC), J->parent, J->exitno);
   for (i = 0; i <= 2; i++) {
     IRIns *ir = IR(REF_NIL-i);
     ir->i = 0;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_record.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_record.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_record.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Trace recorder (bytecode -> SSA IR).
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_RECORD_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_snap.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_snap.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_snap.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Snapshot handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_snap_c
@@ -68,10 +68,22 @@
   for (s = 0; s < nslots; s++) {
     TRef tr = J->slot[s];
     IRRef ref = tref_ref(tr);
+#if LJ_FR2
+    if (s == 1) {  /* Ignore slot 1 in LJ_FR2 mode, except if tailcalled. */
+      if ((tr & TREF_FRAME))
+	map[n++] = SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL);
+      continue;
+    }
+    if ((tr & (TREF_FRAME | TREF_CONT)) && !ref) {
+      cTValue *base = J->L->base - J->baseslot;
+      tr = J->slot[s] = (tr & 0xff0000) | lj_ir_k64(J, IR_KNUM, base[s].u64);
+      ref = tref_ref(tr);
+    }
+#endif
     if (ref) {
       SnapEntry sn = SNAP_TR(s, tr);
       IRIns *ir = &J->cur.ir[ref];
-      if (!(sn & (SNAP_CONT|SNAP_FRAME)) &&
+      if ((LJ_FR2 || !(sn & (SNAP_CONT|SNAP_FRAME))) &&
 	  ir->o == IR_SLOAD && ir->op1 == s && ref > retf) {
 	/* No need to snapshot unmodified non-inherited slots. */
 	if (!(ir->op2 & IRSLOAD_INHERIT))
@@ -90,26 +102,37 @@
 }
 
 /* Add frame links at the end of the snapshot. */
-static BCReg snapshot_framelinks(jit_State *J, SnapEntry *map)
+static MSize snapshot_framelinks(jit_State *J, SnapEntry *map, uint8_t *topslot)
 {
   cTValue *frame = J->L->base - 1;
-  cTValue *lim = J->L->base - J->baseslot;
+  cTValue *lim = J->L->base - J->baseslot + LJ_FR2;
   GCfunc *fn = frame_func(frame);
   cTValue *ftop = isluafunc(fn) ? (frame+funcproto(fn)->framesize) : J->L->top;
+#if LJ_FR2
+  uint64_t pcbase = (u64ptr(J->pc) << 8) | (J->baseslot - 2);
+  lua_assert(2 <= J->baseslot && J->baseslot <= 257);
+  memcpy(map, &pcbase, sizeof(uint64_t));
+#else
   MSize f = 0;
-  lua_assert(!LJ_FR2);  /* TODO_FR2: store 64 bit PCs. */
   map[f++] = SNAP_MKPC(J->pc);  /* The current PC is always the first entry. */
+#endif
   while (frame > lim) {  /* Backwards traversal of all frames above base. */
     if (frame_islua(frame)) {
+#if !LJ_FR2
       map[f++] = SNAP_MKPC(frame_pc(frame));
+#endif
       frame = frame_prevl(frame);
     } else if (frame_iscont(frame)) {
+#if !LJ_FR2
       map[f++] = SNAP_MKFTSZ(frame_ftsz(frame));
       map[f++] = SNAP_MKPC(frame_contpc(frame));
+#endif
       frame = frame_prevd(frame);
     } else {
       lua_assert(!frame_isc(frame));
+#if !LJ_FR2
       map[f++] = SNAP_MKFTSZ(frame_ftsz(frame));
+#endif
       frame = frame_prevd(frame);
       continue;
     }
@@ -116,8 +139,14 @@
     if (frame + funcproto(frame_func(frame))->framesize > ftop)
       ftop = frame + funcproto(frame_func(frame))->framesize;
   }
+  *topslot = (uint8_t)(ftop - lim);
+#if LJ_FR2
+  lua_assert(sizeof(SnapEntry) * 2 == sizeof(uint64_t));
+  return 2;
+#else
   lua_assert(f == (MSize)(1 + J->framedepth));
-  return (BCReg)(ftop - lim);
+  return f;
+#endif
 }
 
 /* Take a snapshot of the current stack. */
@@ -127,16 +156,16 @@
   MSize nent;
   SnapEntry *p;
   /* Conservative estimate. */
-  lj_snap_grow_map(J, nsnapmap + nslots + (MSize)J->framedepth+1);
+  lj_snap_grow_map(J, nsnapmap + nslots + (MSize)(LJ_FR2?2:J->framedepth+1));
   p = &J->cur.snapmap[nsnapmap];
   nent = snapshot_slots(J, p, nslots);
-  snap->topslot = (uint8_t)snapshot_framelinks(J, p + nent);
+  snap->nent = (uint8_t)nent;
+  nent += snapshot_framelinks(J, p + nent, &snap->topslot);
   snap->mapofs = (uint16_t)nsnapmap;
   snap->ref = (IRRef1)J->cur.nins;
-  snap->nent = (uint8_t)nent;
   snap->nslots = (uint8_t)nslots;
   snap->count = 0;
-  J->cur.nsnapmap = (uint16_t)(nsnapmap + nent + 1 + J->framedepth);
+  J->cur.nsnapmap = (uint16_t)(nsnapmap + nent);
 }
 
 /* Add or merge a snapshot. */
@@ -284,8 +313,8 @@
   MSize n, m, nlim, nent = snap->nent;
   uint8_t udf[SNAP_USEDEF_SLOTS];
   BCReg maxslot = J->maxslot;
-  BCReg minslot = snap_usedef(J, udf, snap_pc(map[nent]), maxslot);
   BCReg baseslot = J->baseslot;
+  BCReg minslot = snap_usedef(J, udf, snap_pc(&map[nent]), maxslot);
   maxslot += baseslot;
   minslot += baseslot;
   snap->nslots = (uint8_t)maxslot;
@@ -371,8 +400,8 @@
   case IR_KPRI: return TREF_PRI(irt_type(ir->t));
   case IR_KINT: return lj_ir_kint(J, ir->i);
   case IR_KGC: return lj_ir_kgc(J, ir_kgc(ir), irt_t(ir->t));
-  case IR_KNUM: return lj_ir_k64(J, IR_KNUM, ir_knum(ir));
-  case IR_KINT64: return lj_ir_k64(J, IR_KINT64, ir_kint64(ir));
+  case IR_KNUM: case IR_KINT64:
+    return lj_ir_k64(J, (IROp)ir->o, ir_k64(ir)->u64);
   case IR_KPTR: return lj_ir_kptr(J, ir_kptr(ir));  /* Continuation. */
   default: lua_assert(0); return TREF_NIL; break;
   }
@@ -445,7 +474,11 @@
       goto setslot;
     bloomset(seen, ref);
     if (irref_isk(ref)) {
-      tr = snap_replay_const(J, ir);
+      /* See special treatment of LJ_FR2 slot 1 in snapshot_slots() above. */
+      if (LJ_FR2 && (sn == SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL)))
+	tr = 0;
+      else
+	tr = snap_replay_const(J, ir);
     } else if (!regsp_used(ir->prev)) {
       pass23 = 1;
       lua_assert(s != 0);
@@ -459,7 +492,7 @@
     }
   setslot:
     J->slot[s] = tr | (sn&(SNAP_CONT|SNAP_FRAME));  /* Same as TREF_* flags. */
-    J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && s);
+    J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && (s != LJ_FR2));
     if ((sn & SNAP_FRAME))
       J->baseslot = s+1;
   }
@@ -555,8 +588,7 @@
 		if (irref_isk(irs->op2) && irref_isk((irs+1)->op2)) {
 		  uint64_t k = (uint32_t)T->ir[irs->op2].i +
 			       ((uint64_t)T->ir[(irs+1)->op2].i << 32);
-		  val = lj_ir_k64(J, t == IRT_I64 ? IR_KINT64 : IR_KNUM,
-				  lj_ir_k64_find(J, k));
+		  val = lj_ir_k64(J, t == IRT_I64 ? IR_KINT64 : IR_KNUM, k);
 		} else {
 		  val = emitir_raw(IRT(IR_HIOP, t), val,
 			  snap_pref(J, T, map, nent, seen, (irs+1)->op2));
@@ -599,7 +631,6 @@
   }
   if (LJ_UNLIKELY(bloomtest(rfilt, ref)))
     rs = snap_renameref(T, snapno, ref, rs);
-  lua_assert(!LJ_GC64);  /* TODO_GC64: handle 64 bit references. */
   if (ra_hasspill(regsp_spill(rs))) {  /* Restore from spill slot. */
     int32_t *sps = &ex->spill[regsp_spill(rs)];
     if (irt_isinteger(t)) {
@@ -608,9 +639,11 @@
     } else if (irt_isnum(t)) {
       o->u64 = *(uint64_t *)sps;
 #endif
-    } else if (LJ_64 && irt_islightud(t)) {
+#if LJ_64 && !LJ_GC64
+    } else if (irt_islightud(t)) {
       /* 64 bit lightuserdata which may escape already has the tag bits. */
       o->u64 = *(uint64_t *)sps;
+#endif
     } else {
       lua_assert(!irt_ispri(t));  /* PRI refs never have a spill slot. */
       setgcV(J->L, o, (GCobj *)(uintptr_t)*(GCSize *)sps, irt_toitype(t));
@@ -628,9 +661,11 @@
     } else if (irt_isnum(t)) {
       setnumV(o, ex->fpr[r-RID_MIN_FPR]);
 #endif
-    } else if (LJ_64 && irt_is64(t)) {
+#if LJ_64 && !LJ_GC64
+    } else if (irt_is64(t)) {
       /* 64 bit values that already have the tag bits. */
       o->u64 = ex->gpr[r-RID_MIN_GPR];
+#endif
     } else if (irt_ispri(t)) {
       setpriV(o, irt_toitype(t));
     } else {
@@ -651,7 +686,7 @@
   uint64_t tmp;
   if (irref_isk(ref)) {
     if (ir->o == IR_KNUM || ir->o == IR_KINT64) {
-      src = mref(ir->ptr, int32_t);
+      src = (int32_t *)&ir[1];
     } else if (sz == 8) {
       tmp = (uint64_t)(uint32_t)ir->i;
       src = (int32_t *)&tmp;
@@ -688,8 +723,9 @@
 #else
 	if (LJ_BE && sz == 4) src++;
 #endif
-      }
+      } else
 #endif
+      if (LJ_64 && LJ_BE && sz == 4) src++;
     }
   }
   lua_assert(sz == 1 || sz == 2 || sz == 4 || sz == 8);
@@ -795,11 +831,15 @@
   SnapShot *snap = &T->snap[snapno];
   MSize n, nent = snap->nent;
   SnapEntry *map = &T->snapmap[snap->mapofs];
-  SnapEntry *flinks = &T->snapmap[snap_nextofs(T, snap)-1];
+#if !LJ_FR2 || defined(LUA_USE_ASSERT)
+  SnapEntry *flinks = &T->snapmap[snap_nextofs(T, snap)-1-LJ_FR2];
+#endif
+#if !LJ_FR2
   ptrdiff_t ftsz0;
+#endif
   TValue *frame;
   BloomFilter rfilt = snap_renamefilter(T, snapno);
-  const BCIns *pc = snap_pc(map[nent]);
+  const BCIns *pc = snap_pc(&map[nent]);
   lua_State *L = J->L;
 
   /* Set interpreter PC to the next PC to get correct error messages. */
@@ -812,8 +852,10 @@
   }
 
   /* Fill stack slots with data from the registers and spill slots. */
-  frame = L->base-1;
+  frame = L->base-1-LJ_FR2;
+#if !LJ_FR2
   ftsz0 = frame_ftsz(frame);  /* Preserve link to previous frame in slot #0. */
+#endif
   for (n = 0; n < nent; n++) {
     SnapEntry sn = map[n];
     if (!(sn & SNAP_NORESTORE)) {
@@ -836,14 +878,18 @@
 	TValue tmp;
 	snap_restoreval(J, T, ex, snapno, rfilt, ref+1, &tmp);
 	o->u32.hi = tmp.u32.lo;
+#if !LJ_FR2
       } else if ((sn & (SNAP_CONT|SNAP_FRAME))) {
-	lua_assert(!LJ_FR2);  /* TODO_FR2: store 64 bit PCs. */
 	/* Overwrite tag with frame link. */
 	setframe_ftsz(o, snap_slot(sn) != 0 ? (int32_t)*flinks-- : ftsz0);
 	L->base = o+1;
+#endif
       }
     }
   }
+#if LJ_FR2
+  L->base += (map[nent+LJ_BE] & 0xff);
+#endif
   lua_assert(map + nent == flinks);
 
   /* Compute current stack top. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_snap.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_snap.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_snap.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Snapshot handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_SNAP_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_state.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_state.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_state.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** State and stack handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -180,7 +180,7 @@
     g->allocf(g->allocd, G2GG(g), sizeof(GG_State), 0);
 }
 
-#if LJ_64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC))
+#if LJ_64 && !LJ_GC64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC))
 lua_State *lj_state_newstate(lua_Alloc f, void *ud)
 #else
 LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)
@@ -224,7 +224,7 @@
     close_state(L);
     return NULL;
   }
-  L->status = 0;
+  L->status = LUA_OK;
   return L;
 }
 
@@ -256,10 +256,10 @@
 #endif
   for (i = 0;;) {
     hook_enter(g);
-    L->status = 0;
+    L->status = LUA_OK;
     L->base = L->top = tvref(L->stack) + 1 + LJ_FR2;
     L->cframe = NULL;
-    if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) {
+    if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == LUA_OK) {
       if (++i >= 10) break;
       lj_gc_separateudata(g, 1);  /* Separate udata again. */
       if (gcref(g->gc.mmudata) == NULL)  /* Until nothing is left to do. */
@@ -274,7 +274,7 @@
   lua_State *L1 = lj_mem_newobj(L, lua_State);
   L1->gct = ~LJ_TTHREAD;
   L1->dummy_ffid = FF_C;
-  L1->status = 0;
+  L1->status = LUA_OK;
   L1->stacksize = 0;
   setmref(L1->stack, NULL);
   L1->cframe = NULL;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_state.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_state.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_state.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** State and stack handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_STATE_H
@@ -28,7 +28,7 @@
 
 LJ_FUNC lua_State *lj_state_new(lua_State *L);
 LJ_FUNC void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L);
-#if LJ_64
+#if LJ_64 && !LJ_GC64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC))
 LJ_FUNC lua_State *lj_state_newstate(lua_Alloc f, void *ud);
 #endif
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_str.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_str.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_str.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** String handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_str_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_str.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_str.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_str.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** String handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_STR_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** String formatting.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include <stdio.h>
@@ -98,11 +98,15 @@
   uint32_t u = (uint32_t)k;
   if (k < 0) { u = (uint32_t)-k; *p++ = '-'; }
   if (u < 10000) {
-    if (u < 10) goto dig1; if (u < 100) goto dig2; if (u < 1000) goto dig3;
+    if (u < 10) goto dig1;
+    if (u < 100) goto dig2;
+    if (u < 1000) goto dig3;
   } else {
     uint32_t v = u / 10000; u -= v * 10000;
     if (v < 10000) {
-      if (v < 10) goto dig5; if (v < 100) goto dig6; if (v < 1000) goto dig7;
+      if (v < 10) goto dig5;
+      if (v < 100) goto dig6;
+      if (v < 1000) goto dig7;
     } else {
       uint32_t w = v / 10000; v -= w * 10000;
       if (w >= 10) WINT_R(w, 10, 10)

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** String formatting.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_STRFMT_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt_num.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt_num.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strfmt_num.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** String formatting for floating-point numbers.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 ** Contributed by Peter Cawley.
 */
 
@@ -138,7 +138,7 @@
     }
     if (carry_in) {
       nd[++ndhi] = carry_in; carry_in = 0;
-      if(start++ == ndlo) ++ndlo;
+      if (start++ == ndlo) ++ndlo;
     }
     k -= ND_MUL2K_MAX_SHIFT;
   }
@@ -364,6 +364,7 @@
       /* Precision is sufficiently low that rescaling will probably work. */
       if ((ndebias = rescale_e[e >> 6])) {
 	t.n = n * rescale_n[e >> 6];
+	if (LJ_UNLIKELY(!e)) t.n *= 1e10, ndebias -= 10;
 	t.u64 -= 2; /* Convert 2ulp below (later we convert 2ulp above). */
 	nd[0] = 0x100000 | (t.u32.hi & 0xfffff);
 	e = ((t.u32.hi >> 20) & 0x7ff) - 1075 - (ND_MUL2K_MAX_SHIFT < 29);
@@ -479,7 +480,7 @@
       if ((prec | (sf & STRFMT_F_ALT))) {
 	/* Emit fractional part. */
 	p[1] = '.'; p += 2;
-	prec -= (q - p); p = q; /* Account for the digits already emitted. */
+	prec -= (MSize)(q - p); p = q; /* Account for digits already emitted. */
 	/* Then emit chunks of 9 digits (this may emit 8 digits too many). */
 	for (i = ndhi; (int32_t)prec > 0 && i != ndlo; prec -= 9) {
 	  i = (i - 1) & 0x3f;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strscan.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strscan.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strscan.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** String scanning.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include <math.h>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strscan.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strscan.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_strscan.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** String scanning.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_STRSCAN_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_tab.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_tab.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_tab.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Table handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -28,7 +28,6 @@
 
 #define hashlohi(t, lo, hi)	hashmask((t), hashrot((lo), (hi)))
 #define hashnum(t, o)		hashlohi((t), (o)->u32.lo, ((o)->u32.hi << 1))
-#define hashptr(t, p)		hashlohi((t), u32ptr(p), u32ptr(p) + HASH_BIAS)
 #if LJ_GC64
 #define hashgcref(t, r) \
   hashlohi((t), (uint32_t)gcrefu(r), (uint32_t)(gcrefu(r) >> 32))

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_tab.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_tab.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_tab.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Table handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_TAB_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Definitions for target CPU.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_TARGET_H
@@ -55,7 +55,7 @@
 /* Bitset for registers. 32 registers suffice for most architectures.
 ** Note that one set holds bits for both GPRs and FPRs.
 */
-#if LJ_TARGET_PPC || LJ_TARGET_MIPS
+#if LJ_TARGET_PPC || LJ_TARGET_MIPS || LJ_TARGET_ARM64
 typedef uint64_t RegSet;
 #else
 typedef uint32_t RegSet;
@@ -69,7 +69,7 @@
 #define rset_set(rs, r)		(rs |= RID2RSET(r))
 #define rset_clear(rs, r)	(rs &= ~RID2RSET(r))
 #define rset_exclude(rs, r)	(rs & ~RID2RSET(r))
-#if LJ_TARGET_PPC || LJ_TARGET_MIPS
+#if LJ_TARGET_PPC || LJ_TARGET_MIPS || LJ_TARGET_ARM64
 #define rset_picktop(rs)	((Reg)(__builtin_clzll(rs)^63))
 #define rset_pickbot(rs)	((Reg)__builtin_ctzll(rs))
 #else

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_arm.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_arm.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_arm.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Definitions for ARM CPUs.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_TARGET_ARM_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_arm64.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_arm64.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_arm64.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Definitions for ARM64 CPUs.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_TARGET_ARM64_H
@@ -55,7 +55,8 @@
 
 /* Make use of all registers, except for x18, fp, lr and sp. */
 #define RSET_FIXED \
-  (RID2RSET(RID_X18)|RID2RSET(RID_FP)|RID2RSET(RID_LR)|RID2RSET(RID_SP))
+  (RID2RSET(RID_X18)|RID2RSET(RID_FP)|RID2RSET(RID_LR)|RID2RSET(RID_SP)|\
+   RID2RSET(RID_GL))
 #define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)
 #define RSET_FPR	RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)
 #define RSET_ALL	(RSET_GPR|RSET_FPR)
@@ -73,25 +74,256 @@
 #define REGARG_LASTFPR		RID_D7
 #define REGARG_NUMFPR		8
 
+/* -- Spill slots --------------------------------------------------------- */
+
+/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.
+**
+** SPS_FIXED: Available fixed spill slots in interpreter frame.
+** This definition must match with the vm_arm64.dasc file.
+** Pre-allocate some slots to avoid sp adjust in every root trace.
+**
+** SPS_FIRST: First spill slot for general use. Reserve min. two 32 bit slots.
+*/
+#define SPS_FIXED	4
+#define SPS_FIRST	2
+
+#define SPOFS_TMP	0
+
+#define sps_scale(slot)		(4 * (int32_t)(slot))
+#define sps_align(slot)		(((slot) - SPS_FIXED + 3) & ~3)
+
+/* -- Exit state ---------------------------------------------------------- */
+
+/* This definition must match with the *.dasc file(s). */
+typedef struct {
+  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */
+  intptr_t gpr[RID_NUM_GPR];	/* General-purpose registers. */
+  int32_t spill[256];		/* Spill slots. */
+} ExitState;
+
+/* Highest exit + 1 indicates stack check. */
+#define EXITSTATE_CHECKEXIT	1
+
+/* Return the address of a per-trace exit stub. */
+static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno)
+{
+  while (*p == (LJ_LE ? 0xd503201f : 0x1f2003d5)) p++;  /* Skip A64I_NOP. */
+  return p + 3 + exitno;
+}
+/* Avoid dependence on lj_jit.h if only including lj_target.h. */
+#define exitstub_trace_addr(T, exitno) \
+  exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode), (exitno))
+
 /* -- Instructions -------------------------------------------------------- */
 
+/* ARM64 instructions are always little-endian. Swap for ARM64BE. */
+#if LJ_BE
+#define A64I_LE(x)	(lj_bswap(x))
+#else
+#define A64I_LE(x)	(x)
+#endif
+
 /* Instruction fields. */
 #define A64F_D(r)	(r)
-#define A64F_N(r)       ((r) << 5)
-#define A64F_A(r)       ((r) << 10)
-#define A64F_M(r)       ((r) << 16)
+#define A64F_N(r)	((r) << 5)
+#define A64F_A(r)	((r) << 10)
+#define A64F_M(r)	((r) << 16)
+#define A64F_IMMS(x)	((x) << 10)
+#define A64F_IMMR(x)	((x) << 16)
 #define A64F_U16(x)	((x) << 5)
+#define A64F_U12(x)	((x) << 10)
 #define A64F_S26(x)	(x)
-#define A64F_S19(x)	((x) << 5)
+#define A64F_S19(x)	(((uint32_t)(x) & 0x7ffffu) << 5)
+#define A64F_S14(x)	((x) << 5)
+#define A64F_S9(x)	((x) << 12)
+#define A64F_BIT(x)	((x) << 19)
+#define A64F_SH(sh, x)	(((sh) << 22) | ((x) << 10))
+#define A64F_EX(ex)	(A64I_EX | ((ex) << 13))
+#define A64F_EXSH(ex,x)	(A64I_EX | ((ex) << 13) | ((x) << 10))
+#define A64F_FP8(x)	((x) << 13)
+#define A64F_CC(cc)	((cc) << 12)
+#define A64F_LSL16(x)	(((x) / 16) << 21)
+#define A64F_BSH(sh)	((sh) << 10)
 
 typedef enum A64Ins {
+  A64I_S = 0x20000000,
+  A64I_X = 0x80000000,
+  A64I_EX = 0x00200000,
+  A64I_ON = 0x00200000,
+  A64I_K12 = 0x1a000000,
+  A64I_K13 = 0x18000000,
+  A64I_LS_U = 0x01000000,
+  A64I_LS_S = 0x00800000,
+  A64I_LS_R = 0x01200800,
+  A64I_LS_SH = 0x00001000,
+  A64I_LS_UXTWx = 0x00004000,
+  A64I_LS_SXTWx = 0x0000c000,
+  A64I_LS_SXTXx = 0x0000e000,
+  A64I_LS_LSLx = 0x00006000,
+
+  A64I_ADDw = 0x0b000000,
+  A64I_ADDx = 0x8b000000,
+  A64I_ADDSw = 0x2b000000,
+  A64I_ADDSx = 0xab000000,
+  A64I_NEGw = 0x4b0003e0,
+  A64I_NEGx = 0xcb0003e0,
+  A64I_SUBw = 0x4b000000,
+  A64I_SUBx = 0xcb000000,
+  A64I_SUBSw = 0x6b000000,
+  A64I_SUBSx = 0xeb000000,
+
+  A64I_MULw = 0x1b007c00,
+  A64I_MULx = 0x9b007c00,
+  A64I_SMULL = 0x9b207c00,
+
+  A64I_ANDw = 0x0a000000,
+  A64I_ANDx = 0x8a000000,
+  A64I_ANDSw = 0x6a000000,
+  A64I_ANDSx = 0xea000000,
+  A64I_EORw = 0x4a000000,
+  A64I_EORx = 0xca000000,
+  A64I_ORRw = 0x2a000000,
+  A64I_ORRx = 0xaa000000,
+  A64I_TSTw  = 0x6a00001f,
+  A64I_TSTx  = 0xea00001f,
+
+  A64I_CMPw = 0x6b00001f,
+  A64I_CMPx = 0xeb00001f,
+  A64I_CMNw = 0x2b00001f,
+  A64I_CMNx = 0xab00001f,
+  A64I_CCMPw = 0x7a400000,
+  A64I_CCMPx = 0xfa400000,
+  A64I_CSELw = 0x1a800000,
+  A64I_CSELx = 0x9a800000,
+
+  A64I_ASRw = 0x13007c00,
+  A64I_ASRx = 0x9340fc00,
+  A64I_LSLx = 0xd3400000,
+  A64I_LSRx = 0xd340fc00,
+  A64I_SHRw = 0x1ac02000,
+  A64I_SHRx = 0x9ac02000,	/* lsl/lsr/asr/ror x0, x0, x0 */
+  A64I_REVw = 0x5ac00800,
+  A64I_REVx = 0xdac00c00,
+
+  A64I_EXTRw = 0x13800000,
+  A64I_EXTRx = 0x93c00000,
+  A64I_SBFMw = 0x13000000,
+  A64I_SBFMx = 0x93400000,
+  A64I_SXTBw = 0x13001c00,
+  A64I_SXTHw = 0x13003c00,
+  A64I_SXTW = 0x93407c00,
+  A64I_UBFMw = 0x53000000,
+  A64I_UBFMx = 0xd3400000,
+  A64I_UXTBw = 0x53001c00,
+  A64I_UXTHw = 0x53003c00,
+
+  A64I_MOVw = 0x2a0003e0,
+  A64I_MOVx = 0xaa0003e0,
+  A64I_MVNw = 0x2a2003e0,
+  A64I_MVNx = 0xaa2003e0,
+  A64I_MOVKw = 0x72800000,
+  A64I_MOVKx = 0xf2800000,
   A64I_MOVZw = 0x52800000,
   A64I_MOVZx = 0xd2800000,
+  A64I_MOVNw = 0x12800000,
+  A64I_MOVNx = 0x92800000,
+
+  A64I_LDRB = 0x39400000,
+  A64I_LDRH = 0x79400000,
+  A64I_LDRw = 0xb9400000,
+  A64I_LDRx = 0xf9400000,
   A64I_LDRLw = 0x18000000,
   A64I_LDRLx = 0x58000000,
-  A64I_NOP = 0xd503201f,
+  A64I_STRB = 0x39000000,
+  A64I_STRH = 0x79000000,
+  A64I_STRw = 0xb9000000,
+  A64I_STRx = 0xf9000000,
+  A64I_STPw = 0x29000000,
+  A64I_STPx = 0xa9000000,
+  A64I_LDPw = 0x29400000,
+  A64I_LDPx = 0xa9400000,
+
   A64I_B = 0x14000000,
+  A64I_BCC = 0x54000000,
+  A64I_BL = 0x94000000,
   A64I_BR = 0xd61f0000,
+  A64I_BLR = 0xd63f0000,
+  A64I_TBZ = 0x36000000,
+  A64I_TBNZ = 0x37000000,
+  A64I_CBZ = 0x34000000,
+  A64I_CBNZ = 0x35000000,
+
+  A64I_NOP = 0xd503201f,
+
+  /* FP */
+  A64I_FADDd = 0x1e602800,
+  A64I_FSUBd = 0x1e603800,
+  A64I_FMADDd = 0x1f400000,
+  A64I_FMSUBd = 0x1f408000,
+  A64I_FNMADDd = 0x1f600000,
+  A64I_FNMSUBd = 0x1f608000,
+  A64I_FMULd = 0x1e600800,
+  A64I_FDIVd = 0x1e601800,
+  A64I_FNEGd = 0x1e614000,
+  A64I_FABS = 0x1e60c000,
+  A64I_FSQRTd = 0x1e61c000,
+  A64I_LDRs = 0xbd400000,
+  A64I_LDRd = 0xfd400000,
+  A64I_STRs = 0xbd000000,
+  A64I_STRd = 0xfd000000,
+  A64I_LDPs = 0x2d400000,
+  A64I_LDPd = 0x6d400000,
+  A64I_STPs = 0x2d000000,
+  A64I_STPd = 0x6d000000,
+  A64I_FCMPd = 0x1e602000,
+  A64I_FCMPZd = 0x1e602008,
+  A64I_FCSELd = 0x1e600c00,
+  A64I_FRINTMd = 0x1e654000,
+  A64I_FRINTPd = 0x1e64c000,
+  A64I_FRINTZd = 0x1e65c000,
+
+  A64I_FCVT_F32_F64 = 0x1e624000,
+  A64I_FCVT_F64_F32 = 0x1e22c000,
+  A64I_FCVT_F32_S32 = 0x1e220000,
+  A64I_FCVT_F64_S32 = 0x1e620000,
+  A64I_FCVT_F32_U32 = 0x1e230000,
+  A64I_FCVT_F64_U32 = 0x1e630000,
+  A64I_FCVT_F32_S64 = 0x9e220000,
+  A64I_FCVT_F64_S64 = 0x9e620000,
+  A64I_FCVT_F32_U64 = 0x9e230000,
+  A64I_FCVT_F64_U64 = 0x9e630000,
+  A64I_FCVT_S32_F64 = 0x1e780000,
+  A64I_FCVT_S32_F32 = 0x1e380000,
+  A64I_FCVT_U32_F64 = 0x1e790000,
+  A64I_FCVT_U32_F32 = 0x1e390000,
+  A64I_FCVT_S64_F64 = 0x9e780000,
+  A64I_FCVT_S64_F32 = 0x9e380000,
+  A64I_FCVT_U64_F64 = 0x9e790000,
+  A64I_FCVT_U64_F32 = 0x9e390000,
+
+  A64I_FMOV_S = 0x1e204000,
+  A64I_FMOV_D = 0x1e604000,
+  A64I_FMOV_R_S = 0x1e260000,
+  A64I_FMOV_S_R = 0x1e270000,
+  A64I_FMOV_R_D = 0x9e660000,
+  A64I_FMOV_D_R = 0x9e670000,
+  A64I_FMOV_DI = 0x1e601000,
 } A64Ins;
 
+typedef enum A64Shift {
+  A64SH_LSL, A64SH_LSR, A64SH_ASR, A64SH_ROR
+} A64Shift;
+
+typedef enum A64Extend {
+  A64EX_UXTB, A64EX_UXTH, A64EX_UXTW, A64EX_UXTX,
+  A64EX_SXTB, A64EX_SXTH, A64EX_SXTW, A64EX_SXTX,
+} A64Extend;
+
+/* ARM condition codes. */
+typedef enum A64CC {
+  CC_EQ, CC_NE, CC_CS, CC_CC, CC_MI, CC_PL, CC_VS, CC_VC,
+  CC_HI, CC_LS, CC_GE, CC_LT, CC_GT, CC_LE, CC_AL,
+  CC_HS = CC_CS, CC_LO = CC_CC
+} A64CC;
+
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_mips.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_mips.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_mips.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Definitions for MIPS CPUs.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_TARGET_MIPS_H
@@ -32,6 +32,7 @@
   RID_MAX,
   RID_ZERO = RID_R0,
   RID_TMP = RID_RA,
+  RID_GP = RID_R28,
 
   /* Calling conventions. */
   RID_RET = RID_R2,
@@ -74,38 +75,51 @@
 
 /* -- Register sets ------------------------------------------------------- */
 
-/* Make use of all registers, except ZERO, TMP, SP, SYS1, SYS2 and JGL. */
+/* Make use of all registers, except ZERO, TMP, SP, SYS1, SYS2, JGL and GP. */
 #define RSET_FIXED \
   (RID2RSET(RID_ZERO)|RID2RSET(RID_TMP)|RID2RSET(RID_SP)|\
-   RID2RSET(RID_SYS1)|RID2RSET(RID_SYS2)|RID2RSET(RID_JGL))
+   RID2RSET(RID_SYS1)|RID2RSET(RID_SYS2)|RID2RSET(RID_JGL)|RID2RSET(RID_GP))
 #define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)
 #if LJ_SOFTFP
-#define RSET_FPR	0
+#define RSET_FPR		0
 #else
+#if LJ_32
 #define RSET_FPR \
   (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\
    RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\
    RID2RSET(RID_F16)|RID2RSET(RID_F18)|RID2RSET(RID_F20)|RID2RSET(RID_F22)|\
    RID2RSET(RID_F24)|RID2RSET(RID_F26)|RID2RSET(RID_F28)|RID2RSET(RID_F30))
+#else
+#define RSET_FPR		RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)
 #endif
-#define RSET_ALL	(RSET_GPR|RSET_FPR)
-#define RSET_INIT	RSET_ALL
+#endif
+#define RSET_ALL		(RSET_GPR|RSET_FPR)
+#define RSET_INIT		RSET_ALL
 
 #define RSET_SCRATCH_GPR \
   (RSET_RANGE(RID_R1, RID_R15+1)|\
-   RID2RSET(RID_R24)|RID2RSET(RID_R25)|RID2RSET(RID_R28))
+   RID2RSET(RID_R24)|RID2RSET(RID_R25))
 #if LJ_SOFTFP
 #define RSET_SCRATCH_FPR	0
 #else
+#if LJ_32
 #define RSET_SCRATCH_FPR \
   (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\
    RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\
    RID2RSET(RID_F16)|RID2RSET(RID_F18))
+#else
+#define RSET_SCRATCH_FPR	RSET_RANGE(RID_F0, RID_F24)
 #endif
+#endif
 #define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)
 #define REGARG_FIRSTGPR		RID_R4
+#if LJ_32
 #define REGARG_LASTGPR		RID_R7
 #define REGARG_NUMGPR		4
+#else
+#define REGARG_LASTGPR		RID_R11
+#define REGARG_NUMGPR		8
+#endif
 #if LJ_ABI_SOFTFP
 #define REGARG_FIRSTFPR		0
 #define REGARG_LASTFPR		0
@@ -112,9 +126,14 @@
 #define REGARG_NUMFPR		0
 #else
 #define REGARG_FIRSTFPR		RID_F12
+#if LJ_32
 #define REGARG_LASTFPR		RID_F14
 #define REGARG_NUMFPR		2
+#else
+#define REGARG_LASTFPR		RID_F19
+#define REGARG_NUMFPR		8
 #endif
+#endif
 
 /* -- Spill slots --------------------------------------------------------- */
 
@@ -125,7 +144,11 @@
 **
 ** SPS_FIRST: First spill slot for general use.
 */
+#if LJ_32
 #define SPS_FIXED	5
+#else
+#define SPS_FIXED	4
+#endif
 #define SPS_FIRST	4
 
 #define SPOFS_TMP	0
@@ -140,7 +163,7 @@
 #if !LJ_SOFTFP
   lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */
 #endif
-  int32_t gpr[RID_NUM_GPR];	/* General-purpose registers. */
+  intptr_t gpr[RID_NUM_GPR];	/* General-purpose registers. */
   int32_t spill[256];		/* Spill slots. */
 } ExitState;
 
@@ -169,10 +192,14 @@
 #define MIPSF_F(r)	((r) << 6)
 #define MIPSF_A(n)	((n) << 6)
 #define MIPSF_M(n)	((n) << 11)
+#define MIPSF_L(n)	((n) << 6)
 
 typedef enum MIPSIns {
+  MIPSI_D = 0x38,
+  MIPSI_DV = 0x10,
+  MIPSI_D32 = 0x3c,
   /* Integer instructions. */
-  MIPSI_MOVE = 0x00000021,
+  MIPSI_MOVE = 0x00000025,
   MIPSI_NOP = 0x00000000,
 
   MIPSI_LI = 0x24000000,
@@ -179,22 +206,27 @@
   MIPSI_LU = 0x34000000,
   MIPSI_LUI = 0x3c000000,
 
-  MIPSI_ADDIU = 0x24000000,
+  MIPSI_AND = 0x00000024,
   MIPSI_ANDI = 0x30000000,
+  MIPSI_OR = 0x00000025,
   MIPSI_ORI = 0x34000000,
+  MIPSI_XOR = 0x00000026,
   MIPSI_XORI = 0x38000000,
+  MIPSI_NOR = 0x00000027,
+
+  MIPSI_SLT = 0x0000002a,
+  MIPSI_SLTU = 0x0000002b,
   MIPSI_SLTI = 0x28000000,
   MIPSI_SLTIU = 0x2c000000,
 
   MIPSI_ADDU = 0x00000021,
+  MIPSI_ADDIU = 0x24000000,
+  MIPSI_SUB = 0x00000022,
   MIPSI_SUBU = 0x00000023,
   MIPSI_MUL = 0x70000002,
-  MIPSI_AND = 0x00000024,
-  MIPSI_OR = 0x00000025,
-  MIPSI_XOR = 0x00000026,
-  MIPSI_NOR = 0x00000027,
-  MIPSI_SLT = 0x0000002a,
-  MIPSI_SLTU = 0x0000002b,
+  MIPSI_DIV = 0x0000001a,
+  MIPSI_DIVU = 0x0000001b,
+
   MIPSI_MOVZ = 0x0000000a,
   MIPSI_MOVN = 0x0000000b,
   MIPSI_MFHI = 0x00000010,
@@ -204,19 +236,24 @@
   MIPSI_SLL = 0x00000000,
   MIPSI_SRL = 0x00000002,
   MIPSI_SRA = 0x00000003,
-  MIPSI_ROTR = 0x00200002,	/* MIPS32R2 */
+  MIPSI_ROTR = 0x00200002,	/* MIPSXXR2 */
+  MIPSI_DROTR = 0x0020003a,
+  MIPSI_DROTR32 = 0x0020003e,
   MIPSI_SLLV = 0x00000004,
   MIPSI_SRLV = 0x00000006,
   MIPSI_SRAV = 0x00000007,
-  MIPSI_ROTRV = 0x00000046,	/* MIPS32R2 */
+  MIPSI_ROTRV = 0x00000046,	/* MIPSXXR2 */
+  MIPSI_DROTRV = 0x00000056,
 
-  MIPSI_SEB = 0x7c000420,	/* MIPS32R2 */
-  MIPSI_SEH = 0x7c000620,	/* MIPS32R2 */
-  MIPSI_WSBH = 0x7c0000a0,	/* MIPS32R2 */
+  MIPSI_SEB = 0x7c000420,	/* MIPSXXR2 */
+  MIPSI_SEH = 0x7c000620,	/* MIPSXXR2 */
+  MIPSI_WSBH = 0x7c0000a0,	/* MIPSXXR2 */
+  MIPSI_DSBH = 0x7c0000a4,
 
   MIPSI_B = 0x10000000,
   MIPSI_J = 0x08000000,
   MIPSI_JAL = 0x0c000000,
+  MIPSI_JALX = 0x74000000,
   MIPSI_JR = 0x00000008,
   MIPSI_JALR = 0x0000f809,
 
@@ -229,7 +266,9 @@
 
   /* Load/store instructions. */
   MIPSI_LW = 0x8c000000,
+  MIPSI_LD = 0xdc000000,
   MIPSI_SW = 0xac000000,
+  MIPSI_SD = 0xfc000000,
   MIPSI_LB = 0x80000000,
   MIPSI_SB = 0xa0000000,
   MIPSI_LH = 0x84000000,
@@ -241,6 +280,50 @@
   MIPSI_LDC1 = 0xd4000000,
   MIPSI_SDC1 = 0xf4000000,
 
+  /* MIPS64 instructions. */
+  MIPSI_DADD = 0x0000002c,
+  MIPSI_DADDI = 0x60000000,
+  MIPSI_DADDU = 0x0000002d,
+  MIPSI_DADDIU = 0x64000000,
+  MIPSI_DSUB = 0x0000002e,
+  MIPSI_DSUBU = 0x0000002f,
+  MIPSI_DDIV = 0x0000001e,
+  MIPSI_DDIVU = 0x0000001f,
+  MIPSI_DMULT = 0x0000001c,
+  MIPSI_DMULTU = 0x0000001d,
+
+  MIPSI_DSLL = 0x00000038,
+  MIPSI_DSRL = 0x0000003a,
+  MIPSI_DSLLV = 0x00000014,
+  MIPSI_DSRLV = 0x00000016,
+  MIPSI_DSRA = 0x0000003b,
+  MIPSI_DSRAV = 0x00000017,
+  MIPSI_DSRA32 = 0x0000003f,
+  MIPSI_DSLL32 = 0x0000003c,
+  MIPSI_DSRL32 = 0x0000003e,
+  MIPSI_DSHD = 0x7c000164,
+
+  MIPSI_AADDU = LJ_32 ? MIPSI_ADDU : MIPSI_DADDU,
+  MIPSI_AADDIU = LJ_32 ? MIPSI_ADDIU : MIPSI_DADDIU,
+  MIPSI_ASUBU = LJ_32 ? MIPSI_SUBU : MIPSI_DSUBU,
+  MIPSI_AL = LJ_32 ? MIPSI_LW : MIPSI_LD,
+  MIPSI_AS = LJ_32 ? MIPSI_SW : MIPSI_SD,
+
+  /* Extract/insert instructions. */
+  MIPSI_DEXTM = 0x7c000001,
+  MIPSI_DEXTU = 0x7c000002,
+  MIPSI_DEXT = 0x7c000003,
+  MIPSI_DINSM = 0x7c000005,
+  MIPSI_DINSU = 0x7c000006,
+  MIPSI_DINS = 0x7c000007,
+
+  MIPSI_RINT_D = 0x4620001a,
+  MIPSI_RINT_S = 0x4600001a,
+  MIPSI_RINT = 0x4400001a,
+  MIPSI_FLOOR_D = 0x4620000b,
+  MIPSI_CEIL_D = 0x4620000a,
+  MIPSI_ROUND_D = 0x46200008,
+
   /* FP instructions. */
   MIPSI_MOV_S = 0x46000006,
   MIPSI_MOV_D = 0x46200006,
@@ -265,24 +348,30 @@
   MIPSI_CVT_W_D = 0x46200024,
   MIPSI_CVT_S_W = 0x46800020,
   MIPSI_CVT_D_W = 0x46800021,
+  MIPSI_CVT_S_L = 0x46a00020,
+  MIPSI_CVT_D_L = 0x46a00021,
 
   MIPSI_TRUNC_W_S = 0x4600000d,
   MIPSI_TRUNC_W_D = 0x4620000d,
+  MIPSI_TRUNC_L_S = 0x46000009,
+  MIPSI_TRUNC_L_D = 0x46200009,
   MIPSI_FLOOR_W_S = 0x4600000f,
   MIPSI_FLOOR_W_D = 0x4620000f,
 
   MIPSI_MFC1 = 0x44000000,
   MIPSI_MTC1 = 0x44800000,
+  MIPSI_DMTC1 = 0x44a00000,
+  MIPSI_DMFC1 = 0x44200000,
 
   MIPSI_BC1F = 0x45000000,
   MIPSI_BC1T = 0x45010000,
 
   MIPSI_C_EQ_D = 0x46200032,
+  MIPSI_C_OLT_S = 0x46000034,
   MIPSI_C_OLT_D = 0x46200034,
   MIPSI_C_ULT_D = 0x46200035,
   MIPSI_C_OLE_D = 0x46200036,
   MIPSI_C_ULE_D = 0x46200037,
-
 } MIPSIns;
 
 #endif

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_ppc.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_ppc.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_ppc.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Definitions for PPC CPUs.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_TARGET_PPC_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_x86.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_x86.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_target_x86.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Definitions for x86 and x64 CPUs.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_TARGET_X86_H
@@ -22,7 +22,7 @@
   _(XMM0) _(XMM1) _(XMM2) _(XMM3) _(XMM4) _(XMM5) _(XMM6) _(XMM7)
 #endif
 #define VRIDDEF(_) \
-  _(MRM)
+  _(MRM) _(RIP)
 
 #define RIDENUM(name)	RID_##name,
 
@@ -31,6 +31,7 @@
   FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */
   RID_MAX,
   RID_MRM = RID_MAX,		/* Pseudo-id for ModRM operand. */
+  RID_RIP = RID_MAX+5,		/* Pseudo-id for RIP (x64 only), rm bits = 5. */
 
   /* Calling conventions. */
   RID_SP = RID_ESP,
@@ -63,8 +64,10 @@
 
 /* -- Register sets ------------------------------------------------------- */
 
-/* Make use of all registers, except the stack pointer. */
-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR)-RID2RSET(RID_ESP))
+/* Make use of all registers, except the stack pointer (and maybe DISPATCH). */
+#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) \
+			 - RID2RSET(RID_ESP) \
+			 - LJ_GC64*RID2RSET(RID_DISPATCH))
 #define RSET_FPR	(RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR))
 #define RSET_ALL	(RSET_GPR|RSET_FPR)
 #define RSET_INIT	RSET_ALL
@@ -189,6 +192,11 @@
 #define XO_f20f(o)	((uint32_t)(0x0ff2fc + (0x##o<<24)))
 #define XO_f30f(o)	((uint32_t)(0x0ff3fc + (0x##o<<24)))
 
+#define XV_660f38(o)	((uint32_t)(0x79e2c4 + (0x##o<<24)))
+#define XV_f20f38(o)	((uint32_t)(0x7be2c4 + (0x##o<<24)))
+#define XV_f20f3a(o)	((uint32_t)(0x7be3c4 + (0x##o<<24)))
+#define XV_f30f38(o)	((uint32_t)(0x7ae2c4 + (0x##o<<24)))
+
 /* This list of x86 opcodes is not intended to be complete. Opcodes are only
 ** included when needed. Take a look at DynASM or jit.dis_x86 to see the
 ** whole mess.
@@ -195,6 +203,7 @@
 */
 typedef enum {
   /* Fixed length opcodes. XI_* prefix. */
+  XI_O16 =	0x66,
   XI_NOP =	0x90,
   XI_XCHGa =	0x90,
   XI_CALL =	0xe8,
@@ -212,6 +221,7 @@
   XI_PUSHi8 =	0x6a,
   XI_TESTb =	0x84,
   XI_TEST =	0x85,
+  XI_INT3 =	0xcc,
   XI_MOVmi =	0xc7,
   XI_GROUP5 =	0xff,
 
@@ -231,7 +241,14 @@
   XI_FSCALE =	0xfdd9,
   XI_FYL2X =	0xf1d9,
 
+  /* VEX-encoded instructions. XV_* prefix. */
+  XV_RORX =	XV_f20f3a(f0),
+  XV_SARX =	XV_f30f38(f7),
+  XV_SHLX =	XV_660f38(f7),
+  XV_SHRX =	XV_f20f38(f7),
+
   /* Variable-length opcodes. XO_* prefix. */
+  XO_OR =	XO_(0b),
   XO_MOV =	XO_(8b),
   XO_MOVto =	XO_(89),
   XO_MOVtow =	XO_66(89),

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_trace.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_trace.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_trace.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Trace management.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_trace_c
@@ -117,15 +117,26 @@
 }
 #endif
 
-/* Allocate space for copy of trace. */
-static GCtrace *trace_save_alloc(jit_State *J)
+/* Allocate space for copy of T. */
+GCtrace * LJ_FASTCALL lj_trace_alloc(lua_State *L, GCtrace *T)
 {
   size_t sztr = ((sizeof(GCtrace)+7)&~7);
-  size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns);
+  size_t szins = (T->nins-T->nk)*sizeof(IRIns);
   size_t sz = sztr + szins +
-	      J->cur.nsnap*sizeof(SnapShot) +
-	      J->cur.nsnapmap*sizeof(SnapEntry);
-  return lj_mem_newt(J->L, (MSize)sz, GCtrace);
+	      T->nsnap*sizeof(SnapShot) +
+	      T->nsnapmap*sizeof(SnapEntry);
+  GCtrace *T2 = lj_mem_newt(L, (MSize)sz, GCtrace);
+  char *p = (char *)T2 + sztr;
+  T2->gct = ~LJ_TTRACE;
+  T2->marked = 0;
+  T2->traceno = 0;
+  T2->ir = (IRIns *)p - T->nk;
+  T2->nins = T->nins;
+  T2->nk = T->nk;
+  T2->nsnap = T->nsnap;
+  T2->nsnapmap = T->nsnapmap;
+  memcpy(p, T->ir + T->nk, szins);
+  return T2;
 }
 
 /* Save current trace by copying and compacting it. */
@@ -139,12 +150,12 @@
   setgcrefp(J2G(J)->gc.root, T);
   newwhite(J2G(J), T);
   T->gct = ~LJ_TTRACE;
-  T->ir = (IRIns *)p - J->cur.nk;
-  memcpy(p, J->cur.ir+J->cur.nk, szins);
+  T->ir = (IRIns *)p - J->cur.nk;  /* The IR has already been copied above. */
   p += szins;
   TRACE_APPENDVEC(snap, nsnap, SnapShot)
   TRACE_APPENDVEC(snapmap, nsnapmap, SnapEntry)
   J->cur.traceno = 0;
+  J->curfinal = NULL;
   setgcrefp(J->trace[T->traceno], T);
   lj_gc_barriertrace(J2G(J), T->traceno);
   lj_gdbjit_addtrace(J, T);
@@ -284,7 +295,6 @@
   memset(J->penalty, 0, sizeof(J->penalty));
   /* Free the whole machine code and invalidate all exit stub groups. */
   lj_mcode_free(J);
-  lj_ir_k64_freeall(J);
   memset(J->exitstubgroup, 0, sizeof(J->exitstubgroup));
   lj_vmevent_send(L, TRACE,
     setstrV(L, L->top++, lj_str_newlit(L, "flush"));
@@ -297,7 +307,8 @@
 {
   jit_State *J = G2J(g);
   TValue *tv;
-  /* Initialize SIMD constants. */
+
+  /* Initialize aligned SIMD constants. */
   tv = LJ_KSIMD(J, LJ_KSIMD_ABS);
   tv[0].u64 = U64x(7fffffff,ffffffff);
   tv[1].u64 = U64x(7fffffff,ffffffff);
@@ -304,6 +315,34 @@
   tv = LJ_KSIMD(J, LJ_KSIMD_NEG);
   tv[0].u64 = U64x(80000000,00000000);
   tv[1].u64 = U64x(80000000,00000000);
+
+  /* Initialize 32/64 bit constants. */
+#if LJ_TARGET_X86ORX64
+  J->k64[LJ_K64_TOBIT].u64 = U64x(43380000,00000000);
+#if LJ_32
+  J->k64[LJ_K64_M2P64_31].u64 = U64x(c1e00000,00000000);
+#endif
+  J->k64[LJ_K64_2P64].u64 = U64x(43f00000,00000000);
+  J->k32[LJ_K32_M2P64_31] = LJ_64 ? 0xdf800000 : 0xcf000000;
+#endif
+#if LJ_TARGET_X86ORX64 || LJ_TARGET_MIPS64
+  J->k64[LJ_K64_M2P64].u64 = U64x(c3f00000,00000000);
+#endif
+#if LJ_TARGET_PPC
+  J->k32[LJ_K32_2P52_2P31] = 0x59800004;
+  J->k32[LJ_K32_2P52] = 0x59800000;
+#endif
+#if LJ_TARGET_PPC || LJ_TARGET_MIPS
+  J->k32[LJ_K32_2P31] = 0x4f000000;
+#endif
+#if LJ_TARGET_MIPS
+  J->k64[LJ_K64_2P31].u64 = U64x(41e00000,00000000);
+#if LJ_64
+  J->k64[LJ_K64_2P63].u64 = U64x(43e00000,00000000);
+  J->k32[LJ_K32_2P63] = 0x5f000000;
+  J->k32[LJ_K32_M2P64] = 0xdf800000;
+#endif
+#endif
 }
 
 /* Free everything associated with the JIT compiler state. */
@@ -318,7 +357,6 @@
   }
 #endif
   lj_mcode_free(J);
-  lj_ir_k64_freeall(J);
   lj_mem_freevec(g, J->snapmapbuf, J->sizesnapmap, SnapEntry);
   lj_mem_freevec(g, J->snapbuf, J->sizesnap, SnapShot);
   lj_mem_freevec(g, J->irbuf + J->irbotlim, J->irtoplim - J->irbotlim, IRIns);
@@ -403,7 +441,7 @@
   J->postproc = LJ_POST_NONE;
   lj_resetsplit(J);
   J->retryrec = 0;
-  J->ktracep = NULL;
+  J->ktrace = 0;
   setgcref(J->cur.startpt, obj2gco(J->pt));
 
   L = J->L;
@@ -415,6 +453,12 @@
     if (J->parent) {
       setintV(L->top++, J->parent);
       setintV(L->top++, J->exitno);
+    } else {
+      BCOp op = bc_op(*J->pc);
+      if (op == BC_CALLM || op == BC_CALL || op == BC_ITERC) {
+	setintV(L->top++, J->exitno);  /* Parent of stitched trace. */
+	setintV(L->top++, -1);
+      }
     }
   );
   lj_record_setup(J);
@@ -427,7 +471,7 @@
   BCOp op = bc_op(J->cur.startins);
   GCproto *pt = &gcref(J->cur.startpt)->pt;
   TraceNo traceno = J->cur.traceno;
-  GCtrace *T = trace_save_alloc(J);  /* Do this first. May throw OOM. */
+  GCtrace *T = J->curfinal;
   lua_State *L;
 
   switch (op) {
@@ -479,9 +523,6 @@
   lj_mcode_commit(J, J->cur.mcode);
   J->postproc = LJ_POST_NONE;
   trace_save(J, T);
-  if (J->ktracep) {  /* Patch K64Array slot with the final GCtrace pointer. */
-    setgcV(J->L, J->ktracep, obj2gco(T), LJ_TTRACE);
-  }
 
   L = J->L;
   lj_vmevent_send(L, TRACE,
@@ -515,6 +556,10 @@
 
   J->postproc = LJ_POST_NONE;
   lj_mcode_abort(J);
+  if (J->curfinal) {
+    lj_trace_free(J2G(J), J->curfinal);
+    J->curfinal = NULL;
+  }
   if (tvisnumber(L->top-1))
     e = (TraceError)numberVint(L->top-1);
   if (e == LJ_TRERR_MCODELM) {
@@ -849,7 +894,7 @@
   ERRNO_RESTORE
   switch (bc_op(*pc)) {
   case BC_CALLM: case BC_CALLMT:
-    return (int)((BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc) + LJ_FR2);
+    return (int)((BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc) - LJ_FR2);
   case BC_RETM:
     return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc));
   case BC_TSETM:

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_trace.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_trace.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_trace.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Trace management.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_TRACE_H
@@ -23,6 +23,7 @@
 LJ_FUNC_NORET void lj_trace_err_info(jit_State *J, TraceError e);
 
 /* Trace management. */
+LJ_FUNC GCtrace * LJ_FASTCALL lj_trace_alloc(lua_State *L, GCtrace *T);
 LJ_FUNC void LJ_FASTCALL lj_trace_free(global_State *g, GCtrace *T);
 LJ_FUNC void lj_trace_reenableproto(GCproto *pt);
 LJ_FUNC void lj_trace_flushproto(global_State *g, GCproto *pt);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_traceerr.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_traceerr.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_traceerr.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Trace compiler error messages.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /* This file may be included multiple times with different TREDEF macros. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_udata.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_udata.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_udata.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Userdata handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_udata_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_udata.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_udata.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_udata.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Userdata handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_UDATA_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vm.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vm.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vm.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Assembler VM interface definitions.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_VM_H
@@ -17,6 +17,10 @@
 LJ_ASMF int lj_vm_resume(lua_State *L, TValue *base, int nres1, ptrdiff_t ef);
 LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_c(void *cframe, int errcode);
 LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_ff(void *cframe);
+#if LJ_ABI_WIN && LJ_TARGET_X86
+LJ_ASMF_NORET void LJ_FASTCALL lj_vm_rtlunwind(void *cframe, void *excptrec,
+					       void *unwinder, int errcode);
+#endif
 LJ_ASMF void lj_vm_unwind_c_eh(void);
 LJ_ASMF void lj_vm_unwind_ff_eh(void);
 #if LJ_TARGET_X86ORX64

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmevent.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmevent.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmevent.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** VM event handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #include <stdio.h>

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmevent.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmevent.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmevent.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** VM event handling.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LJ_VMEVENT_H

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmmath.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmmath.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lj_vmmath.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Math helper functions for assembler VM.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #define lj_vmmath_c

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/ljamalg.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/ljamalg.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/ljamalg.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT core and libraries amalgamation.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 /*

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lua.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lua.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lua.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -39,7 +39,8 @@
 #define lua_upvalueindex(i)	(LUA_GLOBALSINDEX-(i))
 
 
-/* thread status; 0 is OK */
+/* thread status */
+#define LUA_OK		0
 #define LUA_YIELD	1
 #define LUA_ERRRUN	2
 #define LUA_ERRSYNTAX	3
@@ -102,11 +103,9 @@
 /* type for integer functions */
 typedef LUA_INTEGER lua_Integer;
 
-
 /* communication with LuaJiTTeX */
 LUA_API int luajittex_choose_hash_function; 
 
-
 /*
 ** state manipulation
 */
@@ -350,16 +349,21 @@
 LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2);
 LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt,
 		       const char *chunkname, const char *mode);
+LUA_API const lua_Number *lua_version (lua_State *L);
+LUA_API void lua_copy (lua_State *L, int fromidx, int toidx);
+LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *isnum);
+LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum);
 
 
 #define LUA_OPEQ 0
 #define LUA_OPLT 1
 #define LUA_OPLE 2
-#define LUA_OK  0
-
+ 
 /* see http://comments.gmane.org/gmane.comp.programming.swig/18673 */
 # define lua_rawlen lua_objlen 
 
+/* From Lua 5.3. */
+LUA_API int lua_isyieldable (lua_State *L);
 
 
 struct lua_Debug {

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/luaconf.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/luaconf.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/luaconf.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Configuration header.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef luaconf_h
@@ -37,7 +37,7 @@
 #endif
 #define LUA_LROOT	"/usr/local"
 #define LUA_LUADIR	"/lua/5.1/"
-#define LUA_LJDIR	"/luajit-2.1.0-beta2/"
+#define LUA_LJDIR	"/luajit-2.1.0-beta3/"
 
 #ifdef LUA_ROOT
 #define LUA_JROOT	LUA_ROOT
@@ -79,7 +79,7 @@
 #define LUA_IGMARK	"-"
 #define LUA_PATH_CONFIG \
   LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" \
-  LUA_EXECDIR "\n" LUA_IGMARK
+  LUA_EXECDIR "\n" LUA_IGMARK "\n"
 
 /* Quoting in error messages. */
 #define LUA_QL(x)	"'" x "'"
@@ -92,10 +92,6 @@
 #define LUAI_GCMUL	200	/* Run GC at 200% of allocation speed. */
 #define LUA_MAXCAPTURES	32	/* Max. pattern captures. */
 
-/* Compatibility with older library function names. */
-#define LUA_COMPAT_MOD		/* OLD: math.mod, NEW: math.fmod */
-#define LUA_COMPAT_GFIND	/* OLD: string.gfind, NEW: string.gmatch */
-
 /* Configuration for the frontend (the luajit executable). */
 #if defined(luajit_c)
 #define LUA_PROGNAME	"luajit"  /* Fallback frontend name. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/luajit.c
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/luajit.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/luajit.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** LuaJIT frontend. Runs commands, scripts, read-eval-print (REPL) etc.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 **
 ** Major portions taken verbatim or adapted from the Lua interpreter.
 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -124,7 +124,7 @@
 #endif
   lua_remove(L, base);  /* remove traceback function */
   /* force a complete garbage collection in case of errors */
-  if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0);
+  if (status != LUA_OK) lua_gc(L, LUA_GCCOLLECT, 0);
   return status;
 }
 
@@ -152,22 +152,15 @@
   putc('\n', stdout);
 }
 
-static int getargs(lua_State *L, char **argv, int n)
+static void createargtable(lua_State *L, char **argv, int argc, int argf)
 {
-  int narg;
   int i;
-  int argc = 0;
-  while (argv[argc]) argc++;  /* count total number of arguments */
-  narg = argc - (n + 1);  /* number of arguments to the script */
-  luaL_checkstack(L, narg + 3, "too many arguments to script");
-  for (i = n+1; i < argc; i++)
-    lua_pushstring(L, argv[i]);
-  lua_createtable(L, narg, n + 1);
+  lua_createtable(L, argc - argf, argf);
   for (i = 0; i < argc; i++) {
     lua_pushstring(L, argv[i]);
-    lua_rawseti(L, -2, i - n);
+    lua_rawseti(L, -2, i - argf);
   }
-  return narg;
+  lua_setglobal(L, "arg");
 }
 
 static int dofile(lua_State *L, const char *name)
@@ -256,9 +249,9 @@
   const char *oldprogname = progname;
   progname = NULL;
   while ((status = loadline(L)) != -1) {
-    if (status == 0) status = docall(L, 0, 0);
+    if (status == LUA_OK) status = docall(L, 0, 0);
     report(L, status);
-    if (status == 0 && lua_gettop(L) > 0) {  /* any result to print? */
+    if (status == LUA_OK && lua_gettop(L) > 0) {  /* any result to print? */
       lua_getglobal(L, "print");
       lua_insert(L, 1);
       if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0)
@@ -273,21 +266,30 @@
   progname = oldprogname;
 }
 
-static int handle_script(lua_State *L, char **argv, int n)
+static int handle_script(lua_State *L, char **argx)
 {
   int status;
-  const char *fname;
-  int narg = getargs(L, argv, n);  /* collect arguments */
-  lua_setglobal(L, "arg");
-  fname = argv[n];
-  if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0)
+  const char *fname = argx[0];
+  if (strcmp(fname, "-") == 0 && strcmp(argx[-1], "--") != 0)
     fname = NULL;  /* stdin */
   status = luaL_loadfile(L, fname);
-  lua_insert(L, -(narg+1));
-  if (status == 0)
+  if (status == LUA_OK) {
+    /* Fetch args from arg table. LUA_INIT or -e might have changed them. */
+    int narg = 0;
+    lua_getglobal(L, "arg");
+    if (lua_istable(L, -1)) {
+      do {
+	narg++;
+	lua_rawgeti(L, -narg, narg);
+      } while (!lua_isnil(L, -1));
+      lua_pop(L, 1);
+      lua_remove(L, -narg);
+      narg--;
+    } else {
+      lua_pop(L, 1);
+    }
     status = docall(L, narg, 0);
-  else
-    lua_pop(L, narg);
+  }
   return report(L, status);
 }
 
@@ -384,7 +386,8 @@
   }
   for (argv++; *argv != NULL; narg++, argv++)
     lua_pushstring(L, *argv);
-  return report(L, lua_pcall(L, narg, 0, 0));
+  report(L, lua_pcall(L, narg, 0, 0));
+  return -1;
 }
 
 /* check that argument has no extra characters at the end */
@@ -405,7 +408,7 @@
     switch (argv[i][1]) {  /* Check option. */
     case '-':
       notail(argv[i]);
-      return (argv[i+1] != NULL ? i+1 : 0);
+      return i+1;
     case '\0':
       return i;
     case 'i':
@@ -430,7 +433,7 @@
     case 'b':  /* LuaJIT extension */
       if (*flags) return -1;
       *flags |= FLAGS_EXEC;
-      return 0;
+      return i+1;
     case 'E':
       *flags |= FLAGS_NOENV;
       break;
@@ -437,16 +440,16 @@
     default: return -1;  /* invalid option */
     }
   }
-  return 0;
+  return i;
 }
 
-static int runargs(lua_State *L, char **argv, int n)
+static int runargs(lua_State *L, char **argv, int argn)
 {
   int i;
-  for (i = 1; i < n; i++) {
+  for (i = 1; i < argn; i++) {
     if (argv[i] == NULL) continue;
     lua_assert(argv[i][0] == '-');
-    switch (argv[i][1]) {  /* option */
+    switch (argv[i][1]) {
     case 'e': {
       const char *chunk = argv[i] + 2;
       if (*chunk == '\0') chunk = argv[++i];
@@ -460,10 +463,10 @@
       if (*filename == '\0') filename = argv[++i];
       lua_assert(filename != NULL);
       if (dolibrary(L, filename))
-	return 1;  /* stop if file fails */
+	return 1;
       break;
       }
-    case 'j': {  /* LuaJIT extension */
+    case 'j': {  /* LuaJIT extension. */
       const char *cmd = argv[i] + 2;
       if (*cmd == '\0') cmd = argv[++i];
       lua_assert(cmd != NULL);
@@ -471,16 +474,16 @@
 	return 1;
       break;
       }
-    case 'O':  /* LuaJIT extension */
+    case 'O':  /* LuaJIT extension. */
       if (dojitopt(L, argv[i] + 2))
 	return 1;
       break;
-    case 'b':  /* LuaJIT extension */
+    case 'b':  /* LuaJIT extension. */
       return dobytecode(L, argv+i);
     default: break;
     }
   }
-  return 0;
+  return LUA_OK;
 }
 
 static int handle_luainit(lua_State *L)
@@ -491,7 +494,7 @@
   const char *init = getenv(LUA_INIT);
 #endif
   if (init == NULL)
-    return 0;  /* status OK */
+    return LUA_OK;
   else if (init[0] == '@')
     return dofile(L, init+1);
   else
@@ -508,45 +511,57 @@
 {
   struct Smain *s = &smain;
   char **argv = s->argv;
-  int script;
+  int argn;
   int flags = 0;
   globalL = L;
   if (argv[0] && argv[0][0]) progname = argv[0];
-  LUAJIT_VERSION_SYM();  /* linker-enforced version check */
-  script = collectargs(argv, &flags);
-  if (script < 0) {  /* invalid args? */
+
+  LUAJIT_VERSION_SYM();  /* Linker-enforced version check. */
+
+  argn = collectargs(argv, &flags);
+  if (argn < 0) {  /* Invalid args? */
     print_usage();
     s->status = 1;
     return 0;
   }
+
   if ((flags & FLAGS_NOENV)) {
     lua_pushboolean(L, 1);
     lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
   }
-  lua_gc(L, LUA_GCSTOP, 0);  /* stop collector during initialization */
-  luaL_openlibs(L);  /* open libraries */
+
+  /* Stop collector during library initialization. */
+  lua_gc(L, LUA_GCSTOP, 0);
+  luaL_openlibs(L);
   lua_gc(L, LUA_GCRESTART, -1);
+
+  createargtable(L, argv, s->argc, argn);
+
   if (!(flags & FLAGS_NOENV)) {
     s->status = handle_luainit(L);
-    if (s->status != 0) return 0;
+    if (s->status != LUA_OK) return 0;
   }
+
   if ((flags & FLAGS_VERSION)) print_version();
-  s->status = runargs(L, argv, (script > 0) ? script : s->argc);
-  if (s->status != 0) return 0;
-  if (script) {
-    s->status = handle_script(L, argv, script);
-    if (s->status != 0) return 0;
+
+  s->status = runargs(L, argv, argn);
+  if (s->status != LUA_OK) return 0;
+
+  if (s->argc > argn) {
+    s->status = handle_script(L, argv + argn);
+    if (s->status != LUA_OK) return 0;
   }
+
   if ((flags & FLAGS_INTERACTIVE)) {
     print_jit_status(L);
     dotty(L);
-  } else if (script == 0 && !(flags & (FLAGS_EXEC|FLAGS_VERSION))) {
+  } else if (s->argc == argn && !(flags & (FLAGS_EXEC|FLAGS_VERSION))) {
     if (lua_stdin_is_tty()) {
       print_version();
       print_jit_status(L);
       dotty(L);
     } else {
-      dofile(L, NULL);  /* executes stdin as a file */
+      dofile(L, NULL);  /* Executes stdin as a file. */
     }
   }
   return 0;
@@ -555,7 +570,7 @@
 int main(int argc, char **argv)
 {
   int status;
-  lua_State *L = lua_open();  /* create state */
+  lua_State *L = lua_open();
   if (L == NULL) {
     l_message(argv[0], "cannot create state: not enough memory");
     return EXIT_FAILURE;
@@ -565,6 +580,6 @@
   status = lua_cpcall(L, pmain, NULL);
   report(L, status);
   lua_close(L);
-  return (status || smain.status) ? EXIT_FAILURE : EXIT_SUCCESS;
+  return (status || smain.status > 0) ? EXIT_FAILURE : EXIT_SUCCESS;
 }
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/luajit.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/luajit.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/luajit.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 /*
 ** LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/
 **
-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.
+** Copyright (C) 2005-2017 Mike Pall. All rights reserved.
 **
 ** Permission is hereby granted, free of charge, to any person obtaining
 ** a copy of this software and associated documentation files (the
@@ -30,10 +30,10 @@
 
 #include "lua.h"
 
-#define LUAJIT_VERSION		"LuaJIT 2.1.0-beta2"
+#define LUAJIT_VERSION		"LuaJIT 2.1.0-beta3"
 #define LUAJIT_VERSION_NUM	20100  /* Version 2.1.0 = 02.01.00. */
-#define LUAJIT_VERSION_SYM	luaJIT_version_2_1_0_beta2
-#define LUAJIT_COPYRIGHT	"Copyright (C) 2005-2016 Mike Pall"
+#define LUAJIT_VERSION_SYM	luaJIT_version_2_1_0_beta3
+#define LUAJIT_COPYRIGHT	"Copyright (C) 2005-2017 Mike Pall"
 #define LUAJIT_URL		"http://luajit.org/"
 
 /* Modes for luaJIT_setmode. */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/lualib.h
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/lualib.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/lualib.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 /*
 ** Standard library header.
-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 */
 
 #ifndef _LUALIB_H
@@ -23,7 +23,7 @@
 #define LUA_FFILIBNAME	"ffi"
 
 #define LUA_BITLIBNAME_32  "bit32"
-
+ 
 LUALIB_API int luaopen_base(lua_State *L);
 LUALIB_API int luaopen_math(lua_State *L);
 LUALIB_API int luaopen_string(lua_State *L);

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/msvcbuild.bat
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/msvcbuild.bat	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/msvcbuild.bat	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,5 +1,5 @@
 @rem Script to build LuaJIT with MSVC.
- at rem Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+ at rem Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 @rem
 @rem Either open a "Visual Studio .NET Command Prompt"
 @rem (Note that the Express Edition does not contain an x64 compiler)
@@ -14,12 +14,13 @@
 @if not defined INCLUDE goto :FAIL
 
 @setlocal
- at set LJCOMPILE=cl /nologo /c /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE
+ at set LJCOMPILE=cl /nologo /c /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE /D_CRT_STDIO_INLINE=__declspec(dllexport)__inline
 @set LJLINK=link /nologo
 @set LJMT=mt /nologo
 @set LJLIB=lib /nologo /nodefaultlib
 @set DASMDIR=..\dynasm
 @set DASM=%DASMDIR%\dynasm.lua
+ at set DASC=vm_x86.dasc
 @set LJDLLNAME=lua51.dll
 @set LJLIBNAME=lua51.lib
 @set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c
@@ -39,7 +40,12 @@
 @set LJARCH=x86
 @set LJCOMPILE=%LJCOMPILE% /arch:SSE2
 :X64
-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc
+ at if "%1" neq "gc64" goto :NOGC64
+ at shift
+ at set DASC=vm_x64.dasc
+ at set LJCOMPILE=%LJCOMPILE% /DLUAJIT_ENABLE_GC64
+:NOGC64
+minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h %DASC%
 @if errorlevel 1 goto :BAD
 
 %LJCOMPILE% /I "." /I %DASMDIR% host\buildvm*.c
@@ -67,7 +73,7 @@
 @if "%1" neq "debug" goto :NODEBUG
 @shift
 @set LJCOMPILE=%LJCOMPILE% /Zi
- at set LJLINK=%LJLINK% /debug
+ at set LJLINK=%LJLINK% /debug /opt:ref /opt:icf /incremental:no
 :NODEBUG
 @if "%1"=="amalg" goto :AMALGDLL
 @if "%1"=="static" goto :STATIC
@@ -99,6 +105,8 @@
   %LJMT% -manifest luajit.exe.manifest -outputresource:luajit.exe
 
 @del *.obj *.manifest minilua.exe buildvm.exe
+ at del host\buildvm_arch.h
+ at del lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h
 @echo.
 @echo === Successfully built LuaJIT for Windows/%LJARCH% ===
 

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_arm.dasc
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_arm.dasc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_arm.dasc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 |// Low-level VM code for ARM CPUs.
 |// Bytecode interpreter, fast functions and helper functions.
-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+|// Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 |
 |.arch arm
 |.section code_op, code_sub

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_arm64.dasc
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_arm64.dasc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_arm64.dasc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 |// Low-level VM code for ARM64 CPUs.
 |// Bytecode interpreter, fast functions and helper functions.
-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+|// Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 |
 |.arch arm64
 |.section code_op, code_sub
@@ -151,6 +151,21 @@
 |.define FRAME_FUNC,	#-16
 |.define FRAME_PC,	#-8
 |
+|// Endian-specific defines.
+|.if ENDIAN_LE
+|.define LO,		0
+|.define OFS_RD,	2
+|.define OFS_RB,	3
+|.define OFS_RA,	1
+|.define OFS_OP,	0
+|.else
+|.define LO,		4
+|.define OFS_RD,	0
+|.define OFS_RB,	0
+|.define OFS_RA,	2
+|.define OFS_OP,	3
+|.endif
+|
 |.macro decode_RA, dst, ins; ubfx dst, ins, #8, #8; .endmacro
 |.macro decode_RB, dst, ins; ubfx dst, ins, #24, #8; .endmacro
 |.macro decode_RC, dst, ins; ubfx dst, ins, #16, #8; .endmacro
@@ -236,12 +251,17 @@
 |.macro mov_false, reg; movn reg, #0x8000, lsl #32; .endmacro
 |.macro mov_true, reg; movn reg, #0x0001, lsl #48; .endmacro
 |
-#define GL_J(field)	(GG_OFS(J) + (int)offsetof(jit_State, field))
+#define GL_J(field)	(GG_G2J + (int)offsetof(jit_State, field))
 |
 #define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))
 |
 |.macro hotcheck, delta
-|  NYI
+|  lsr CARG1, PC, #1
+|  and CARG1, CARG1, #126
+|  add CARG1, CARG1, #GG_G2DISP+GG_DISP2HOT
+|  ldrh CARG2w, [GL, CARG1]
+|  subs CARG2, CARG2, #delta
+|  strh CARG2w, [GL, CARG1]
 |.endmacro
 |
 |.macro hotloop
@@ -712,7 +732,7 @@
   |  cmp CRET1, #1
   |  bhi ->vmeta_binop
   |4:
-  |   ldrh RBw, [PC, #2]
+  |   ldrh RBw, [PC, # OFS_RD]
   |    add PC, PC, #4
   |   add RB, PC, RB, lsl #2
   |   sub RB, RB, #0x20000
@@ -869,7 +889,7 @@
   |  bl extern lj_meta_for	// (lua_State *L, TValue *base)
   |  ldr INSw, [PC, #-4]
   |.if JIT
-  |   uxtb TMP0, INS
+  |   uxtb TMP0w, INSw
   |.endif
   |  decode_RA RA, INS
   |  decode_RD RC, INS
@@ -1495,7 +1515,12 @@
   |  bne ->fff_fallback
   |  checkint CARG1, ->fff_fallback
   |  mov CARG3, #1
-  |  mov CARG2, BASE			// Points to stack. Little-endian.
+  |  // Point to the char inside the integer in the stack slot.
+  |.if ENDIAN_LE
+  |  mov CARG2, BASE
+  |.else
+  |  add CARG2, BASE, #7
+  |.endif
   |->fff_newstr:
   |  // CARG2 = str, CARG3 = len.
   |   str BASE, L->base
@@ -1698,7 +1723,7 @@
   |  ands TMP0, PC, #FRAME_TYPE
   |   and TMP1, PC, #~FRAME_TYPEP
   |  bne >3
-  |  ldrb RAw, [PC, #-3]
+  |  ldrb RAw, [PC, #-4+OFS_RA]
   |  lsl RA, RA, #3
   |  add TMP1, RA, #16
   |3:
@@ -1732,7 +1757,20 @@
   |//-----------------------------------------------------------------------
   |
   |->vm_record:				// Dispatch target for recording phase.
-  |  NYI
+  |.if JIT
+  |  ldrb CARG1w, GL->hookmask
+  |  tst CARG1, #HOOK_VMEVENT		// No recording while in vmevent.
+  |  bne >5
+  |  // Decrement the hookcount for consistency, but always do the call.
+  |   ldr CARG2w, GL->hookcount
+  |  tst CARG1, #HOOK_ACTIVE
+  |  bne >1
+  |   sub CARG2w, CARG2w, #1
+  |  tst CARG1, #LUA_MASKLINE|LUA_MASKCOUNT
+  |  beq >1
+  |   str CARG2w, GL->hookcount
+  |  b >1
+  |.endif
   |
   |->vm_rethook:			// Dispatch target for return hooks.
   |  ldrb TMP2w, GL->hookmask
@@ -1774,7 +1812,21 @@
   |  b <4
   |
   |->vm_hotloop:			// Hot loop counter underflow.
-  |  NYI
+  |.if JIT
+  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Same as curr_topL(L).
+  |   add CARG1, GL, #GG_G2DISP+GG_DISP2J
+  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK
+  |   str PC, SAVE_PC
+  |  ldr CARG3, LFUNC:CARG3->pc
+  |   mov CARG2, PC
+  |   str L, [GL, #GL_J(L)]
+  |  ldrb CARG3w, [CARG3, #PC2PROTO(framesize)]
+  |   str BASE, L->base
+  |  add CARG3, BASE, CARG3, lsl #3
+  |  str CARG3, L->top
+  |  bl extern lj_trace_hot		// (jit_State *J, const BCIns *pc)
+  |  b <3
+  |.endif
   |
   |->vm_callhook:			// Dispatch target for call hooks.
   |  mov CARG2, PC
@@ -1804,8 +1856,55 @@
   |  br CRET1
   |
   |->cont_stitch:			// Trace stitching.
-  |  NYI
+  |.if JIT
+  |  // RA = resultptr, CARG4 = meta base
+  |   ldr RBw, SAVE_MULTRES
+  |  ldr INSw, [PC, #-4]
+  |    ldr TRACE:CARG3, [CARG4, #-40]	// Save previous trace.
+  |   subs RB, RB, #8
+  |  decode_RA RC, INS			// Call base.
+  |    and CARG3, CARG3, #LJ_GCVMASK
+  |   beq >2
+  |1:  // Move results down.
+  |  ldr CARG1, [RA]
+  |    add RA, RA, #8
+  |   subs RB, RB, #8
+  |  str CARG1, [BASE, RC, lsl #3]
+  |    add RC, RC, #1
+  |   bne <1
+  |2:
+  |   decode_RA RA, INS
+  |   decode_RB RB, INS
+  |   add RA, RA, RB
+  |3:
+  |   cmp RA, RC
+  |   bhi >9				// More results wanted?
   |
+  |  ldrh RAw, TRACE:CARG3->traceno
+  |  ldrh RCw, TRACE:CARG3->link
+  |  cmp RCw, RAw
+  |  beq ->cont_nop			// Blacklisted.
+  |  cmp RCw, #0
+  |  bne =>BC_JLOOP			// Jump to stitched trace.
+  |
+  |  // Stitch a new trace to the previous trace.
+  |  mov CARG1, #GL_J(exitno)
+  |  str RAw, [GL, CARG1]
+  |  mov CARG1, #GL_J(L)
+  |  str L, [GL, CARG1]
+  |  str BASE, L->base
+  |  add CARG1, GL, #GG_G2J
+  |  mov CARG2, PC
+  |  bl extern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)
+  |  ldr BASE, L->base
+  |  b ->cont_nop
+  |
+  |9:  // Fill up results with nil.
+  |  str TISNIL, [BASE, RC, lsl #3]
+  |  add RC, RC, #1
+  |  b <3
+  |.endif
+  |
   |->vm_profhook:			// Dispatch target for profiler hook.
 #if LJ_HASPROFILE
   |  mov CARG1, L
@@ -1822,11 +1921,123 @@
   |//-- Trace exit handler -------------------------------------------------
   |//-----------------------------------------------------------------------
   |
+  |.macro savex_, a, b
+  |  stp d..a, d..b, [sp, #a*8]
+  |  stp x..a, x..b, [sp, #32*8+a*8]
+  |.endmacro
+  |
   |->vm_exit_handler:
-  |  NYI
+  |.if JIT
+  |  sub     sp, sp, #(64*8)
+  |  savex_, 0, 1
+  |  savex_, 2, 3
+  |  savex_, 4, 5
+  |  savex_, 6, 7
+  |  savex_, 8, 9
+  |  savex_, 10, 11
+  |  savex_, 12, 13
+  |  savex_, 14, 15
+  |  savex_, 16, 17
+  |  savex_, 18, 19
+  |  savex_, 20, 21
+  |  savex_, 22, 23
+  |  savex_, 24, 25
+  |  savex_, 26, 27
+  |  savex_, 28, 29
+  |  stp d30, d31, [sp, #30*8]
+  |  ldr CARG1, [sp, #64*8]	// Load original value of lr.
+  |   add CARG3, sp, #64*8	// Recompute original value of sp.
+  |    mv_vmstate CARG4w, EXIT
+  |   stp xzr, CARG3, [sp, #62*8]	// Store 0/sp in RID_LR/RID_SP.
+  |  sub CARG1, CARG1, lr
+  |   ldr L, GL->cur_L
+  |  lsr CARG1, CARG1, #2
+  |   ldr BASE, GL->jit_base
+  |  sub CARG1, CARG1, #2
+  |   ldr CARG2w, [lr]		// Load trace number.
+  |    st_vmstate CARG4w
+  |.if ENDIAN_BE
+  |   rev32 CARG2, CARG2
+  |.endif
+  |   str BASE, L->base
+  |  ubfx CARG2w, CARG2w, #5, #16
+  |  str CARG1w, [GL, #GL_J(exitno)]
+  |   str CARG2w, [GL, #GL_J(parent)]
+  |   str L, [GL, #GL_J(L)]
+  |  str xzr, GL->jit_base
+  |  add CARG1, GL, #GG_G2J
+  |  mov CARG2, sp
+  |  bl extern lj_trace_exit		// (jit_State *J, ExitState *ex)
+  |  // Returns MULTRES (unscaled) or negated error code.
+  |  ldr CARG2, L->cframe
+  |   ldr BASE, L->base
+  |  and sp, CARG2, #CFRAME_RAWMASK
+  |   ldr PC, SAVE_PC			// Get SAVE_PC.
+  |  str L, SAVE_L			// Set SAVE_L (on-trace resume/yield).
+  |  b >1
+  |.endif
+  |
   |->vm_exit_interp:
-  |  NYI
+  |  // CARG1 = MULTRES or negated error code, BASE, PC and GL set.
+  |.if JIT
+  |  ldr L, SAVE_L
+  |1:
+  |  cmp CARG1w, #0
+  |  blt >9				// Check for error from exit.
+  |   lsl RC, CARG1, #3
+  |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC]
+  |    movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48
+  |    movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16
+  |    movn TISNIL, #0
+  |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK
+  |   str RCw, SAVE_MULTRES
+  |   str BASE, L->base
+  |  ldr CARG2, LFUNC:CARG2->pc
+  |   str xzr, GL->jit_base
+  |    mv_vmstate CARG4w, INTERP
+  |  ldr KBASE, [CARG2, #PC2PROTO(k)]
+  |  // Modified copy of ins_next which handles function header dispatch, too.
+  |  ldrb RBw, [PC, # OFS_OP]
+  |   ldr INSw, [PC], #4
+  |    st_vmstate CARG4w
+  |  cmp RBw, #BC_FUNCC+2		// Fast function?
+  |   add TMP1, GL, INS, uxtb #3
+  |  bhs >4
+  |2:
+  |  cmp RBw, #BC_FUNCF			// Function header?
+  |  add TMP0, GL, RB, uxtb #3
+  |  ldr RB, [TMP0, #GG_G2DISP]
+  |   decode_RA RA, INS
+  |   lsr TMP0, INS, #16
+  |   csel RC, TMP0, RC, lo
+  |   blo >5
+  |   ldr CARG3, [BASE, FRAME_FUNC]
+  |   sub RC, RC, #8
+  |   add RA, BASE, RA, lsl #3	// Yes: RA = BASE+framesize*8, RC = nargs*8
+  |   and LFUNC:CARG3, CARG3, #LJ_GCVMASK
+  |5:
+  |  br RB
   |
+  |4:  // Check frame below fast function.
+  |  ldr CARG1, [BASE, FRAME_PC]
+  |  ands CARG2, CARG1, #FRAME_TYPE
+  |  bne <2			// Trace stitching continuation?
+  |  // Otherwise set KBASE for Lua function below fast function.
+  |  ldr CARG3w, [CARG1, #-4]
+  |  decode_RA CARG1, CARG3
+  |  sub CARG2, BASE, CARG1, lsl #3
+  |  ldr LFUNC:CARG3, [CARG2, #-32]
+  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK
+  |  ldr CARG3, LFUNC:CARG3->pc
+  |  ldr KBASE, [CARG3, #PC2PROTO(k)]
+  |  b <2
+  |
+  |9:  // Rethrow error from the right C frame.
+  |  neg CARG2, CARG1
+  |  mov CARG1, L
+  |  bl extern lj_err_throw		// (lua_State *L, int errcode)
+  |.endif
+  |
   |//-----------------------------------------------------------------------
   |//-- Math helper functions ----------------------------------------------
   |//-----------------------------------------------------------------------
@@ -1965,7 +2176,7 @@
   case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
     |  // RA = src1, RC = src2, JMP with RC = target
     |  ldr CARG1, [BASE, RA, lsl #3]
-    |    ldrh RBw, [PC, #2]
+    |    ldrh RBw, [PC, # OFS_RD]
     |   ldr CARG2, [BASE, RC, lsl #3]
     |    add PC, PC, #4
     |    add RB, PC, RB, lsl #2
@@ -2022,7 +2233,7 @@
     |  // RA = src1, RC = src2, JMP with RC = target
     |  ldr CARG1, [BASE, RA, lsl #3]
     |   add RC, BASE, RC, lsl #3
-    |    ldrh RBw, [PC, #2]
+    |    ldrh RBw, [PC, # OFS_RD]
     |   ldr CARG3, [RC]
     |    add PC, PC, #4
     |    add RB, PC, RB, lsl #2
@@ -2083,7 +2294,7 @@
     |  // RA = src, RC = str_const (~), JMP with RC = target
     |  ldr CARG1, [BASE, RA, lsl #3]
     |   mvn RC, RC
-    |    ldrh RBw, [PC, #2]
+    |    ldrh RBw, [PC, # OFS_RD]
     |   ldr CARG2, [KBASE, RC, lsl #3]
     |    add PC, PC, #4
     |   movn TMP0, #~LJ_TSTR
@@ -2111,7 +2322,7 @@
     |  // RA = src, RC = num_const (~), JMP with RC = target
     |  ldr CARG1, [BASE, RA, lsl #3]
     |   add RC, KBASE, RC, lsl #3
-    |    ldrh RBw, [PC, #2]
+    |    ldrh RBw, [PC, # OFS_RD]
     |   ldr CARG3, [RC]
     |    add PC, PC, #4
     |    add RB, PC, RB, lsl #2
@@ -2171,7 +2382,7 @@
     vk = op == BC_ISEQP;
     |  // RA = src, RC = primitive_type (~), JMP with RC = target
     |  ldr TMP0, [BASE, RA, lsl #3]
-    |   ldrh RBw, [PC, #2]
+    |   ldrh RBw, [PC, # OFS_RD]
     |   add PC, PC, #4
     |  add RC, RC, #1
     |   add RB, PC, RB, lsl #2
@@ -2196,7 +2407,7 @@
 
   case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
     |  // RA = dst or unused, RC = src, JMP with RC = target
-    |   ldrh RBw, [PC, #2]
+    |   ldrh RBw, [PC, # OFS_RD]
     |  ldr TMP0, [BASE, RC, lsl #3]
     |   add PC, PC, #4
     |  mov_false TMP1
@@ -2443,7 +2654,7 @@
     |   str PC, SAVE_PC
     |  bl extern lj_meta_cat		// (lua_State *L, TValue *top, int left)
     |  // Returns NULL (finished) or TValue * (metamethod).
-    |  ldrb RBw, [PC, #-1]
+    |  ldrb RBw, [PC, #-4+OFS_RB]
     |   ldr BASE, L->base
     |   cbnz CRET1, ->vmeta_binop
     |  ldr TMP0, [BASE, RB, lsl #3]
@@ -3074,7 +3285,7 @@
     |  ins_callt
     |
     |5:  // Tailcall to a fast function with a Lua frame below.
-    |  ldrb RAw, [PC, #-3]
+    |  ldrb RAw, [PC, #-4+OFS_RA]
     |  sub CARG1, BASE, RA, lsl #3
     |  ldr LFUNC:CARG1, [CARG1, #-32]
     |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK
@@ -3115,8 +3326,8 @@
     |.endif
     |  add RA, BASE, RA, lsl #3
     |  ldr TAB:RB, [RA, #-16]
-    |    ldrh TMP3w, [PC, #2]
-    |  ldr CARG1w, [RA, #-8]		// Get index from control var.
+    |    ldrh TMP3w, [PC, # OFS_RD]
+    |  ldr CARG1w, [RA, #-8+LO]		// Get index from control var.
     |    add PC, PC, #4
     |    add TMP3, PC, TMP3, lsl #2
     |  and TAB:RB, RB, #LJ_GCVMASK
@@ -3135,7 +3346,7 @@
     |   stp CARG1, TMP0, [RA]
     |    add CARG1, CARG1, #1
     |3:
-    |    str CARG1w, [RA, #-8]		// Update control var.
+    |    str CARG1w, [RA, #-8+LO]	// Update control var.
     |  mov PC, TMP3
     |4:
     |  ins_next
@@ -3181,8 +3392,8 @@
     |5:  // Despecialize bytecode if any of the checks fail.
     |  mov TMP0, #BC_JMP
     |   mov TMP1, #BC_ITERC
-    |  strb TMP0w, [PC, #-4]
-    |   strb TMP1w, [RC]
+    |  strb TMP0w, [PC, #-4+OFS_OP]
+    |   strb TMP1w, [RC, # OFS_OP]
     |  b <1
     break;
 
@@ -3387,7 +3598,8 @@
     if (op == BC_FORI) {
       |  csel PC, RC, PC, gt
     } else if (op == BC_JFORI) {
-      |  ldrh RCw, [RC, #-2]
+      |  mov PC, RC
+      |  ldrh RCw, [RC, #-4+OFS_RD]
     } else if (op == BC_IFORL) {
       |  csel PC, RC, PC, le
     }
@@ -3428,7 +3640,7 @@
     if (op == BC_FORI) {
       |  csel PC, RC, PC, hi
     } else if (op == BC_JFORI) {
-      |  ldrh RCw, [RC, #-2]
+      |  ldrh RCw, [RC, #-4+OFS_RD]
       |  bls =>BC_JLOOP
     } else if (op == BC_IFORL) {
       |  csel PC, RC, PC, ls
@@ -3488,7 +3700,16 @@
 
   case BC_JLOOP:
     |.if JIT
-    |  NYI
+    |  // RA = base (ignored), RC = traceno
+    |  ldr CARG1, [GL, #GL_J(trace)]
+    |   mov CARG2w, #0  // Traces on ARM64 don't store the trace #, so use 0.
+    |  ldr TRACE:RC, [CARG1, RC, lsl #3]
+    |   st_vmstate CARG2w
+    |  ldr RA, TRACE:RC->mcode
+    |   str BASE, GL->jit_base
+    |   str L, GL->tmpbuf.L
+    |  sub sp, sp, #16	// See SPS_FIXED. Avoids sp adjust in every root trace.
+    |  br RA
     |.endif
     break;
 
@@ -3546,10 +3767,12 @@
   case BC_IFUNCV:
     |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8
     |  ldr CARG1, L->maxstack
+    |   movn TMP0, #~LJ_TFUNC
     |   add TMP2, BASE, RC
+    |   add LFUNC:CARG3, CARG3, TMP0, lsl #47
     |  add RA, RA, RC
     |   add TMP0, RC, #16+FRAME_VARG
-    |   str LFUNC:CARG3, [TMP2], #8	// Store (untagged) copy of LFUNC.
+    |   str LFUNC:CARG3, [TMP2], #8	// Store (tagged) copy of LFUNC.
     |    ldr KBASE, [PC, #-4+PC2PROTO(k)]
     |  cmp RA, CARG1
     |   str TMP0, [TMP2], #8		// Store delta + FRAME_VARG.
@@ -3736,8 +3959,8 @@
 	"\t.uleb128 0x1\n"
 	"\t.sleb128 -8\n"
 	"\t.byte 30\n"				/* Return address is in lr. */
-	"\t.uleb128 1\n"                        /* augmentation length */
-	"\t.byte 0x1b\n"                        /* pcrel|sdata4 */
+	"\t.uleb128 1\n"			/* augmentation length */
+	"\t.byte 0x1b\n"			/* pcrel|sdata4 */
 	"\t.byte 0xc\n\t.uleb128 31\n\t.uleb128 0\n"	/* def_cfa sp */
 	"\t.align 3\n"
 	".LECIE2:\n\n");
@@ -3748,7 +3971,7 @@
 	"\t.long .LASFDE3-.Lframe2\n"
 	"\t.long lj_vm_ffi_call-.\n"
 	"\t.long %d\n"
-	"\t.uleb128 0\n"                        /* augmentation length */
+	"\t.uleb128 0\n"			/* augmentation length */
 	"\t.byte 0xe\n\t.uleb128 32\n"		/* def_cfa_offset */
 	"\t.byte 0x9d\n\t.uleb128 4\n"		/* offset fp */
 	"\t.byte 0x9e\n\t.uleb128 3\n"		/* offset lr */

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_mips.dasc
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_mips.dasc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_mips.dasc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 |// Low-level VM code for MIPS CPUs.
 |// Bytecode interpreter, fast functions and helper functions.
-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+|// Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 |//
 |// MIPS soft-float support contributed by Djordje Kovacevic and
 |// Stefan Pejic from RT-RK.com, sponsored by Cisco Systems, Inc.
@@ -57,7 +57,7 @@
 |.define TMP2,		r14
 |.define TMP3,		r15
 |
-|// Calling conventions.
+|// MIPS o32 calling convention.
 |.define CFUNCADDR,	r25
 |.define CARG1,		r4
 |.define CARG2,		r5
@@ -1875,7 +1875,8 @@
   |
   |.ffunc string_char			// Only handle the 1-arg case here.
   |  ffgccheck
-  |.  lw CARG3, HI(BASE)
+  |.  nop
+  |  lw CARG3, HI(BASE)
   |   lw CARG1, LO(BASE)
   |  li TMP1, 255
   |  xori AT, NARGS8:RC, 8		// Exactly 1 argument.
@@ -1902,7 +1903,8 @@
   |
   |.ffunc string_sub
   |  ffgccheck
-  |.  addiu AT, NARGS8:RC, -16
+  |.  nop
+  |  addiu AT, NARGS8:RC, -16
   |   lw CARG3, 16+HI(BASE)
   |   lw TMP0, HI(BASE)
   |    lw STR:CARG1, LO(BASE)
@@ -1946,7 +1948,8 @@
   |.macro ffstring_op, name
   |  .ffunc string_ .. name
   |  ffgccheck
-  |.  lw CARG3, HI(BASE)
+  |.  nop
+  |  lw CARG3, HI(BASE)
   |   lw STR:CARG2, LO(BASE)
   |  beqz NARGS8:RC, ->fff_fallback
   |.  li AT, LJ_TSTR
@@ -4314,7 +4317,7 @@
     |  ins_next2
     |
     |7:  // Possible table write barrier for the value. Skip valiswhite check.
-    |  barrierback TAB:RB, TMP3, TMP0, <2
+    |  barrierback TAB:CARG2, TMP3, TMP0, <2
     break;
 
   case BC_TSETM:
@@ -4543,24 +4546,24 @@
   case BC_ISNEXT:
     |  // RA = base*8, RD = target (points to ITERN)
     |  addu RA, BASE, RA
-    |  lw TMP0, -24+HI(RA)
-    |  lw CFUNC:TMP1, -24+LO(RA)
-    |   lw TMP2, -16+HI(RA)
-    |    lw TMP3, -8+HI(RA)
+    |    srl TMP0, RD, 1
+    |  lw CARG1, -24+HI(RA)
+    |  lw CFUNC:CARG2, -24+LO(RA)
+    |    addu TMP0, PC, TMP0
+    |   lw CARG3, -16+HI(RA)
+    |   lw CARG4, -8+HI(RA)
     |  li AT, LJ_TFUNC
-    |  bne TMP0, AT, >5
-    |.  addiu TMP2, TMP2, -LJ_TTAB
-    |  lbu TMP1, CFUNC:TMP1->ffid
-    |  addiu TMP3, TMP3, -LJ_TNIL
-    |   srl TMP0, RD, 1
-    |  or TMP2, TMP2, TMP3
-    |  addiu TMP1, TMP1, -FF_next_N
-    |   addu TMP0, PC, TMP0
-    |  or TMP1, TMP1, TMP2
-    |  bnez TMP1, >5
-    |.  lui TMP2, (-(BCBIAS_J*4 >> 16) & 65535)
+    |  bne CARG1, AT, >5
+    |.   lui TMP2, (-(BCBIAS_J*4 >> 16) & 65535)
+    |  lbu CARG2, CFUNC:CARG2->ffid
+    |   addiu CARG3, CARG3, -LJ_TTAB
+    |   addiu CARG4, CARG4, -LJ_TNIL
+    |   or CARG3, CARG3, CARG4
+    |  addiu CARG2, CARG2, -FF_next_N
+    |  or CARG2, CARG2, CARG3
+    |  bnez CARG2, >5
+    |.  lui TMP1, 0xfffe
     |  addu PC, TMP0, TMP2
-    |  lui TMP1, 0xfffe
     |  ori TMP1, TMP1, 0x7fff
     |  sw r0, -8+LO(RA)			// Initialize control var.
     |  sw TMP1, -8+HI(RA)
@@ -4570,7 +4573,7 @@
     |  li TMP3, BC_JMP
     |   li TMP1, BC_ITERC
     |  sb TMP3, -4+OFS_OP(PC)
-    |   addu PC, TMP0, TMP2
+    |    addu PC, TMP0, TMP2
     |  b <1
     |.  sb TMP1, OFS_OP(PC)
     break;

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_ppc.dasc
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_ppc.dasc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_ppc.dasc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 |// Low-level VM code for PowerPC 32 bit or 32on64 bit mode.
 |// Bytecode interpreter, fast functions and helper functions.
-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+|// Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 |
 |.arch ppc
 |.section code_op, code_sub

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_x64.dasc
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_x64.dasc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_x64.dasc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 |// Low-level VM code for x64 CPUs in LJ_GC64 mode.
 |// Bytecode interpreter, fast functions and helper functions.
-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+|// Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 |
 |.arch x64
 |.section code_op, code_sub
@@ -250,11 +250,11 @@
 |// Macros to clear or set tags.
 |.macro cleartp, reg; shl reg, 17; shr reg, 17; .endmacro
 |.macro settp, reg, tp
-|  mov64 ITYPE, ((int64_t)tp<<47)
+|  mov64 ITYPE, ((uint64_t)tp<<47)
 |  or reg, ITYPE
 |.endmacro
 |.macro settp, dst, reg, tp
-|  mov64 dst, ((int64_t)tp<<47)
+|  mov64 dst, ((uint64_t)tp<<47)
 |  or dst, reg
 |.endmacro
 |.macro setint, reg
@@ -1105,11 +1105,11 @@
   |  mov BASE, L:RB->base
   |  mov NARGS:RDd, TMP1d
   |  mov LFUNC:RB, [RA-16]
-  |  cleartp LFUNC:RB
   |  add NARGS:RDd, 1
   |  // This is fragile. L->base must not move, KBASE must always be defined.
   |  cmp KBASE, BASE			// Continue with CALLT if flag set.
   |  je ->BC_CALLT_Z
+  |  cleartp LFUNC:RB
   |  mov BASE, RA
   |  ins_call				// Otherwise call resolved metamethod.
   |
@@ -1469,7 +1469,7 @@
   |  mov [BASE-16], CFUNC:RD
   |  mov [BASE-8], TMPR
   |.if DUALNUM
-  |  mov64 RD, ((int64_t)LJ_TISNUM<<47)
+  |  mov64 RD, ((uint64_t)LJ_TISNUM<<47)
   |  mov [BASE], RD
   |.else
   |  mov qword [BASE], 0
@@ -1804,12 +1804,12 @@
   |  jmp ->fff_res1
   |
   |.ffunc_n math_frexp
+  |  mov RB, BASE
   |.if X64WIN
-  |  lea CARG2, TMP1
+  |  lea CARG2, TMP1		// Caveat: CARG2 == BASE
   |.else
   |  lea CARG1, TMP1
   |.endif
-  |  mov RB, BASE
   |  call extern frexp
   |  mov BASE, RB
   |  mov RBd, TMP1d
@@ -1826,13 +1826,12 @@
   |  jmp ->fff_res
   |
   |.ffunc_n math_modf
+  |  mov RB, BASE
   |.if X64WIN
-  |  lea CARG2, [BASE-16]
+  |  lea CARG2, [BASE-16]	// Caveat: CARG2 == BASE
   |.else
   |  lea CARG1, [BASE-16]
   |.endif
-  |  mov PC, [BASE-8]
-  |  mov RB, BASE
   |  call extern modf
   |  mov BASE, RB
   |  mov PC, [BASE-8]
@@ -2325,7 +2324,8 @@
   |->cont_stitch:			// Trace stitching.
   |.if JIT
   |  // BASE = base, RC = result, RB = mbase
-  |  mov ITYPEd, [RB-24]		// Save previous trace number.
+  |  mov TRACE:ITYPE, [RB-40]		// Save previous trace.
+  |  cleartp TRACE:ITYPE
   |  mov TMPRd, MULTRES
   |  movzx RAd, PC_RA
   |  lea RA, [BASE+RA*8]		// Call base.
@@ -2347,11 +2347,10 @@
   |  cmp RC, RA
   |  ja >9				// More results wanted?
   |
-  |  mov RA, [DISPATCH+DISPATCH_J(trace)]
-  |  mov TRACE:RD, [RA+ITYPE*8]
-  |  test TRACE:RD, TRACE:RD
+  |  test TRACE:ITYPE, TRACE:ITYPE
   |  jz ->cont_nop
-  |  movzx RDd, word TRACE:RD->link
+  |  movzx RBd, word TRACE:ITYPE->traceno
+  |  movzx RDd, word TRACE:ITYPE->link
   |  cmp RDd, RBd
   |  je ->cont_nop			// Blacklisted.
   |  test RDd, RDd
@@ -2402,12 +2401,11 @@
   |  movzx RCd, byte [rbp-8]		// Reconstruct exit number.
   |  mov RCH, byte [rbp-16]
   |  mov [rbp-8], r15; mov [rbp-16], r14
-  |  // Caveat: DISPATCH is rbx.
-  |  mov DISPATCH, [ebp]
-  |  mov RA, [DISPATCH+DISPATCH_GL(vmstate)]	// Get trace number.
+  |  // DISPATCH is preserved on-trace in LJ_GC64 mode.
+  |  mov RAd, [DISPATCH+DISPATCH_GL(vmstate)]	// Get trace number.
   |  set_vmstate EXIT
-  |  mov [DISPATCH+DISPATCH_J(exitno)], RC
-  |  mov [DISPATCH+DISPATCH_J(parent)], RA
+  |  mov [DISPATCH+DISPATCH_J(exitno)], RCd
+  |  mov [DISPATCH+DISPATCH_J(parent)], RAd
   |.if X64WIN
   |  sub rsp, 16*8+4*8			// Room for SSE regs + save area.
   |.else
@@ -2433,7 +2431,7 @@
   |  mov CARG2, rsp
   |.endif
   |  lea CARG1, [DISPATCH+GG_DISP2J]
-  |  mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0
+  |  mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0
   |  call extern lj_trace_exit		// (jit_State *J, ExitState *ex)
   |  // MULTRES or negated error code returned in eax (RD).
   |  mov RA, L:RB->cframe
@@ -2480,7 +2478,7 @@
   |  mov KBASE, LFUNC:KBASE->pc
   |  mov KBASE, [KBASE+PC2PROTO(k)]
   |  mov L:RB->base, BASE
-  |  mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0
+  |  mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0
   |  set_vmstate INTERP
   |  // Modified copy of ins_next which handles function header dispatch, too.
   |  mov RCd, [PC]
@@ -2504,7 +2502,7 @@
   |  // Otherwise set KBASE for Lua function below fast function.
   |  movzx RCd, byte [RC-3]
   |  neg RC
-  |  mov LFUNC:KBASE, [BASE+RC*8-24]
+  |  mov LFUNC:KBASE, [BASE+RC*8-32]
   |  cleartp LFUNC:KBASE
   |  mov KBASE, LFUNC:KBASE->pc
   |  mov KBASE, [KBASE+PC2PROTO(k)]
@@ -2639,6 +2637,7 @@
   |  mov eax, CARG1d
   |  .if X64WIN; push rsi; mov rsi, CARG2; .endif
   |  push rbx
+  |  xor ecx, ecx
   |  cpuid
   |  mov [rsi], eax
   |  mov [rsi+4], ebx
@@ -3516,7 +3515,7 @@
     |  ins_AD	// RA = level, RD = target
     |  branchPC RD			// Do this first to free RD.
     |  mov L:RB, SAVE_L
-    |  cmp dword L:RB->openupval, 0
+    |  cmp aword L:RB->openupval, 0
     |  je >1
     |  mov L:RB->base, BASE
     |  lea CARG2, [BASE+RA*8]		// Caveat: CARG2 == BASE
@@ -4050,7 +4049,7 @@
     |  mov RC, [RA-24]			// Copy control var. fb[1] = fb[-3].
     |  mov [RA], RB
     |  mov [RA+8], RC
-    |  mov LFUNC:RB, [RA-40]		// Copy callable. fb[-1] = fb[-5]
+    |  mov LFUNC:RB, [RA-40]		// Copy callable. fb[-2] = fb[-5]
     |  mov [RA-16], LFUNC:RB
     |  mov NARGS:RDd, 2+1		// Handle like a regular 2-arg call.
     |  checkfunc LFUNC:RB, ->vmeta_call

Modified: trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_x86.dasc
===================================================================
--- trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_x86.dasc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/LuaJIT-src/src/vm_x86.dasc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 |// Low-level VM code for x86 CPUs.
 |// Bytecode interpreter, fast functions and helper functions.
-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
+|// Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
 |
 |.if P64
 |.arch x64
@@ -121,19 +121,68 @@
 |//-----------------------------------------------------------------------
 |.if not X64		// x86 stack layout.
 |
+|.if WIN
+|
+|.define CFRAME_SPACE,	aword*9			// Delta for esp (see <--).
+|.macro saveregs_
+|  push edi; push esi; push ebx
+|  push extern lj_err_unwind_win
+|  fs; push dword [0]
+|  fs; mov [0], esp
+|  sub esp, CFRAME_SPACE
+|.endmacro
+|.macro restoreregs
+|  add esp, CFRAME_SPACE
+|  fs; pop dword [0]
+|  pop edi	// Short for esp += 4.
+|  pop ebx; pop esi; pop edi; pop ebp
+|.endmacro
+|
+|.else
+|
 |.define CFRAME_SPACE,	aword*7			// Delta for esp (see <--).
 |.macro saveregs_
 |  push edi; push esi; push ebx
 |  sub esp, CFRAME_SPACE
 |.endmacro
-|.macro saveregs
-|  push ebp; saveregs_
-|.endmacro
 |.macro restoreregs
 |  add esp, CFRAME_SPACE
 |  pop ebx; pop esi; pop edi; pop ebp
 |.endmacro
 |
+|.endif
+|
+|.macro saveregs
+|  push ebp; saveregs_
+|.endmacro
+|
+|.if WIN
+|.define SAVE_ERRF,	aword [esp+aword*19]	// vm_pcall/vm_cpcall only.
+|.define SAVE_NRES,	aword [esp+aword*18]
+|.define SAVE_CFRAME,	aword [esp+aword*17]
+|.define SAVE_L,	aword [esp+aword*16]
+|//----- 16 byte aligned, ^^^ arguments from C caller
+|.define SAVE_RET,	aword [esp+aword*15]	//<-- esp entering interpreter.
+|.define SAVE_R4,	aword [esp+aword*14]
+|.define SAVE_R3,	aword [esp+aword*13]
+|.define SAVE_R2,	aword [esp+aword*12]
+|//----- 16 byte aligned
+|.define SAVE_R1,	aword [esp+aword*11]
+|.define SEH_FUNC,	aword [esp+aword*10]
+|.define SEH_NEXT,	aword [esp+aword*9]	//<-- esp after register saves.
+|.define UNUSED2,	aword [esp+aword*8]
+|//----- 16 byte aligned
+|.define UNUSED1,	aword [esp+aword*7]
+|.define SAVE_PC,	aword [esp+aword*6]
+|.define TMP2,		aword [esp+aword*5]
+|.define TMP1,		aword [esp+aword*4]
+|//----- 16 byte aligned
+|.define ARG4,		aword [esp+aword*3]
+|.define ARG3,		aword [esp+aword*2]
+|.define ARG2,		aword [esp+aword*1]
+|.define ARG1,		aword [esp]		//<-- esp while in interpreter.
+|//----- 16 byte aligned, ^^^ arguments for C callee
+|.else
 |.define SAVE_ERRF,	aword [esp+aword*15]	// vm_pcall/vm_cpcall only.
 |.define SAVE_NRES,	aword [esp+aword*14]
 |.define SAVE_CFRAME,	aword [esp+aword*13]
@@ -154,6 +203,7 @@
 |.define ARG2,		aword [esp+aword*1]
 |.define ARG1,		aword [esp]		//<-- esp while in interpreter.
 |//----- 16 byte aligned, ^^^ arguments for C callee
+|.endif
 |
 |// FPARGx overlaps ARGx and ARG(x+1) on x86.
 |.define FPARG3,	qword [esp+qword*1]
@@ -554,7 +604,11 @@
   |.else
   |  mov eax, FCARG2			// Error return status for vm_pcall.
   |  mov esp, FCARG1
+  |.if WIN
+  |  lea FCARG1, SEH_NEXT
+  |  fs; mov [0], FCARG1
   |.endif
+  |.endif
   |->vm_unwind_c_eh:			// Landing pad for external unwinder.
   |  mov L:RB, SAVE_L
   |  mov GL:RB, L:RB->glref
@@ -577,7 +631,11 @@
   |.else
   |  and FCARG1, CFRAME_RAWMASK
   |  mov esp, FCARG1
+  |.if WIN
+  |  lea FCARG1, SEH_NEXT
+  |  fs; mov [0], FCARG1
   |.endif
+  |.endif
   |->vm_unwind_ff_eh:			// Landing pad for external unwinder.
   |  mov L:RB, SAVE_L
   |  mov RAa, -8			// Results start at BASE+RA = BASE-8.
@@ -590,6 +648,19 @@
   |  set_vmstate INTERP
   |  jmp ->vm_returnc			// Increments RD/MULTRES and returns.
   |
+  |.if WIN and not X64
+  |->vm_rtlunwind at 16:			// Thin layer around RtlUnwind.
+  |  // (void *cframe, void *excptrec, void *unwinder, int errcode)
+  |  mov [esp], FCARG1			// Return value for RtlUnwind.
+  |  push FCARG2			// Exception record for RtlUnwind.
+  |  push 0				// Ignored by RtlUnwind.
+  |  push dword [FCARG1+CFRAME_OFS_SEH]
+  |  call extern RtlUnwind at 16		// Violates ABI (clobbers too much).
+  |  mov FCARG1, eax
+  |  mov FCARG2, [esp+4]		// errcode (for vm_unwind_c).
+  |  ret				// Jump to unwinder.
+  |.endif
+  |
   |//-----------------------------------------------------------------------
   |//-- Grow stack for calls -----------------------------------------------
   |//-----------------------------------------------------------------------
@@ -3026,6 +3097,7 @@
   |  mov eax, CARG1d
   |  .if X64WIN; push rsi; mov rsi, CARG2; .endif
   |  push rbx
+  |  xor ecx, ecx
   |  cpuid
   |  mov [rsi], eax
   |  mov [rsi+4], ebx
@@ -3049,6 +3121,7 @@
   |  mov eax, [esp+4]			// Argument 1 is function number.
   |  push edi
   |  push ebx
+  |  xor ecx, ecx
   |  cpuid
   |  mov edi, [esp+16]			// Argument 2 is result area.
   |  mov [edi], eax

Modified: trunk/Build/source/libs/luajit/Makefile.in
===================================================================
--- trunk/Build/source/libs/luajit/Makefile.in	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/Makefile.in	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -662,6 +662,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -1528,7 +1529,7 @@
 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
 	$(am__post_remove_distdir)
 
 dist-bzip2: distdir
@@ -1554,7 +1555,7 @@
 	@echo WARNING: "Support for shar distribution archives is" \
 	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -1572,7 +1573,7 @@
 distcheck: dist
 	case '$(DIST_ARCHIVES)' in \
 	*.tar.gz*) \
-	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
 	*.tar.lz*) \
@@ -1582,7 +1583,7 @@
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
-	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
 	esac

Modified: trunk/Build/source/libs/luajit/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/ChangeLog	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/TLpatches/ChangeLog	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,3 +1,8 @@
+2017-20-06 Luigi Scarso <luigi.scarso at gmail.com>
+	* Luajit-2.1.0-beta3
+	* Removed lj_bcdef.h, lj_ffdef.h, lj_folddef.h, lj_libdef.h
+	  lj_recdef.h, they are generated at building time.
+
 2016-03-07 Luigi Scarso <luigi.scarso at gmail.com>
 	Luajit-2.1.0-beta2
 

Added: trunk/Build/source/libs/luajit/TLpatches/patch-01
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-01	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-01	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,21 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/Makefile LuaJIT-2.1.0-beta3/src/Makefile
+--- LuaJIT-2.1.0-beta3-orig/src/Makefile	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/Makefile	2017-06-16 17:14:56.792102569 +0200
+@@ -99,7 +99,7 @@
+ # enabled by default. Some other features that *might* break some existing
+ # code (e.g. __pairs or os.execute() return values) can be enabled here.
+ # Note: this does not provide full compatibility with Lua 5.2 at this time.
+-#XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT
++XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT
+ #
+ # Disable the JIT compiler, i.e. turn LuaJIT into a pure interpreter.
+ #XCFLAGS+= -DLUAJIT_DISABLE_JIT
+@@ -475,7 +475,7 @@
+ LJVM_BOUT= $(LJVM_S)
+ LJVM_MODE= elfasm
+ 
+-LJLIB_O= lib_base.o lib_math.o lib_bit.o lib_string.o lib_table.o \
++LJLIB_O= lib_base.o lib_math.o lbitlib.o lib_bit.o lib_string.o lib_table.o \
+ 	 lib_io.o lib_os.o lib_package.o lib_debug.o lib_jit.o lib_ffi.o
+ LJLIB_C= $(LJLIB_O:.o=.c)
+ 

Deleted: trunk/Build/source/libs/luajit/TLpatches/patch-01-LuaJITTeX
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-01-LuaJITTeX	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-01-LuaJITTeX	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,221 +0,0 @@
-diff -bur LuaJIT-src-orig/src/lauxlib.h LuaJIT-src/src/lauxlib.h
---- LuaJIT-src-orig/src/lauxlib.h	2016-03-07 09:43:42.708069718 +0100
-+++ LuaJIT-src/src/lauxlib.h	2016-03-04 16:52:23.000000000 +0100
-@@ -86,6 +86,32 @@
- 				int level);
- 
- 
-+
-+/*
-+** {======================================================
-+** File handles for IO library
-+** =======================================================
-+*/
-+
-+/*
-+** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and
-+** initial structure 'luaL_Stream' (it may contain other fields
-+** after that initial structure).
-+*/
-+
-+#define LUA_FILEHANDLE          "FILE*"
-+
-+
-+typedef struct luaL_Stream {
-+  FILE *f;  /* stream (NULL for incompletely created streams) */
-+  lua_CFunction closef;  /* to close stream (NULL for closed streams) */
-+} luaL_Stream;
-+
-+/* }====================================================== */
-+
-+
-+
-+
- /*
- ** ===============================================================
- ** some useful macros
-@@ -144,6 +170,8 @@
- LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
- LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
- 
-+/* Luajittex needs this one because it overloads loadfile */
-+LUALIB_API int (RESERVED_load_aux_JIT) (lua_State *L, int status, int envarg);
- 
- /* }====================================================== */
- 
-diff -bur LuaJIT-src-orig/src/lib_init.c LuaJIT-src/src/lib_init.c
---- LuaJIT-src-orig/src/lib_init.c	2016-03-07 09:43:42.720069718 +0100
-+++ LuaJIT-src/src/lib_init.c	2016-03-07 11:47:15.847946480 +0100
-@@ -26,6 +26,7 @@
-   { LUA_DBLIBNAME,	luaopen_debug },
-   { LUA_BITLIBNAME,	luaopen_bit },
-   { LUA_JITLIBNAME,	luaopen_jit },
-+  { LUA_BITLIBNAME_32,	luaopen_bit32 },
-   { NULL,		NULL }
- };
- 
-diff -bur LuaJIT-src-orig/src/lib_package.c LuaJIT-src/src/lib_package.c
---- LuaJIT-src-orig/src/lib_package.c	2016-03-07 09:43:42.712069718 +0100
-+++ LuaJIT-src/src/lib_package.c	2016-03-07 11:49:15.655944489 +0100
-@@ -362,6 +362,29 @@
-   return 1;  /* library loaded successfully */
- }
- 
-+#define LUA_POF		"luaopen_"
-+#define LUA_OFSEP	"_"
-+#define POF		LUA_POF
-+
-+static const char *mkfuncname (lua_State *L, const char *modname) {
-+  const char *funcname;
-+  const char *mark = strchr(modname, *LUA_IGMARK);
-+  if (mark) modname = mark + 1;
-+  funcname = luaL_gsub(L, modname, ".", LUA_OFSEP);
-+  funcname = lua_pushfstring(L, POF"%s", funcname);
-+  lua_remove(L, -2);  /* remove 'gsub' result */
-+  return funcname;
-+}
-+
-+
-+int loader_C_luatex (lua_State *L, const char *name, const char *filename) {
-+  const char *funcname;
-+  funcname = mkfuncname(L, name);
-+  if (ll_loadfunc(L, filename, funcname,0) != 0)
-+    loaderror(L, filename);
-+  return 1;  /* library loaded successfully */
-+}
-+
- static int lj_cf_package_loader_croot(lua_State *L)
- {
-   const char *filename;
-@@ -381,6 +404,21 @@
-   return 1;
- }
- 
-+int loader_Call_luatex (lua_State *L, const char *name, const char *filename) {
-+  const char *funcname;
-+  int stat;
-+  if (filename == NULL) return 1;  /* root not found */
-+  funcname = mkfuncname(L, name);
-+  if ((stat = ll_loadfunc(L, filename, funcname,0)) != 0) {
-+    if (stat != PACKAGE_ERR_FUNC) loaderror(L, filename);  /* real error */
-+    lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS,
-+                       name, filename);
-+    return 1;  /* function not found */
-+  }
-+  return 1;  /* library loaded successfully */
-+}
-+
-+
- static int lj_cf_package_loader_preload(lua_State *L)
- {
-   const char *name = luaL_checkstring(L, 1);
-
-diff -bur LuaJIT-src-orig/src/lj_load.c LuaJIT-src/src/lj_load.c
---- LuaJIT-src-orig/src/lj_load.c	2016-03-07 09:43:42.716069718 +0100
-+++ LuaJIT-src/src/lj_load.c	2016-03-07 12:09:10.771924621 +0100
-@@ -166,3 +166,19 @@
-     return 1;
- }
- 
-+/* -- Luajittex needs this one because it overloads loadfile  -- */
-+LUALIB_API int RESERVED_load_aux_JIT(lua_State *L, int status, int envarg)
-+{
-+  if (status == 0) {
-+    if (tvistab(L->base+envarg-1)) {
-+      GCfunc *fn = funcV(L->top-1);
-+      GCtab *t = tabV(L->base+envarg-1);
-+      setgcref(fn->c.env, obj2gco(t));
-+      lj_gc_objbarrier(L, fn, t);
-+    }
-+    return 1;
-+  } else {
-+    setnilV(L->top-2);
-+    return 2;
-+  }
-+}
-
-diff -bur LuaJIT-src-orig/src/lua.h LuaJIT-src/src/lua.h
---- LuaJIT-src-orig/src/lua.h	2016-03-07 09:43:42.716069718 +0100
-+++ LuaJIT-src/src/lua.h	2016-03-07 11:56:24.855937353 +0100
-@@ -103,6 +103,9 @@
- typedef LUA_INTEGER lua_Integer;
- 
- 
-+/* communication with LuaJiTTeX */
-+LUA_API int luajittex_choose_hash_function; 
-+
- 
- /*
- ** state manipulation
-@@ -349,6 +352,16 @@
- 		       const char *chunkname, const char *mode);
- 
- 
-+#define LUA_OPEQ 0
-+#define LUA_OPLT 1
-+#define LUA_OPLE 2
-+#define LUA_OK  0
-+
-+/* see http://comments.gmane.org/gmane.comp.programming.swig/18673 */
-+# define lua_rawlen lua_objlen 
-+
-+
-+
- struct lua_Debug {
-   int event;
-   const char *name;	/* (n) */
-
-diff -bur LuaJIT-src-orig/src/lualib.h LuaJIT-src/src/lualib.h
---- LuaJIT-src-orig/src/lualib.h	2016-03-07 09:43:42.724069718 +0100
-+++ LuaJIT-src/src/lualib.h	2016-03-07 11:58:19.151935453 +0100
-@@ -22,6 +22,8 @@
- #define LUA_JITLIBNAME	"jit"
- #define LUA_FFILIBNAME	"ffi"
- 
-+#define LUA_BITLIBNAME_32  "bit32"
-+
- LUALIB_API int luaopen_base(lua_State *L);
- LUALIB_API int luaopen_math(lua_State *L);
- LUALIB_API int luaopen_string(lua_State *L);
-@@ -34,6 +36,8 @@
- LUALIB_API int luaopen_jit(lua_State *L);
- LUALIB_API int luaopen_ffi(lua_State *L);
- 
-+LUALIB_API int luaopen_bit32(lua_State *L);
-+
- LUALIB_API void luaL_openlibs(lua_State *L);
- 
- #ifndef lua_assert
-
-diff -bur LuaJIT-src-orig/src/Makefile LuaJIT-src/src/Makefile
---- LuaJIT-src-orig/src/Makefile	2016-03-07 09:43:42.716069718 +0100
-+++ LuaJIT-src/src/Makefile	2016-03-07 12:02:42.319931078 +0100
-@@ -99,7 +99,7 @@
- # enabled by default. Some other features that *might* break some existing
- # code (e.g. __pairs or os.execute() return values) can be enabled here.
- # Note: this does not provide full compatibility with Lua 5.2 at this time.
--#XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT
-+XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT
- #
- # Disable the JIT compiler, i.e. turn LuaJIT into a pure interpreter.
- #XCFLAGS+= -DLUAJIT_DISABLE_JIT
-@@ -471,7 +471,7 @@
- LJVM_BOUT= $(LJVM_S)
- LJVM_MODE= elfasm
- 
--LJLIB_O= lib_base.o lib_math.o lib_bit.o lib_string.o lib_table.o \
-+LJLIB_O= lib_base.o lib_math.o lbitlib.o lib_bit.o lib_string.o lib_table.o \
- 	 lib_io.o lib_os.o lib_package.o lib_debug.o lib_jit.o lib_ffi.o
- LJLIB_C= $(LJLIB_O:.o=.c)
- 
-diff -bur LuaJIT-src-orig/src/Makefile.dep LuaJIT-src/src/Makefile.dep
---- LuaJIT-src-orig/src/Makefile.dep	2016-03-07 09:43:42.696069718 +0100
-+++ LuaJIT-src/src/Makefile.dep	2016-03-07 12:05:19.343928468 +0100
-@@ -6,6 +6,7 @@
-  lj_tab.h lj_meta.h lj_state.h lj_ctype.h lj_cconv.h lj_bc.h lj_ff.h \
-  lj_ffdef.h lj_dispatch.h lj_jit.h lj_ir.h lj_char.h lj_strscan.h \
-  lj_strfmt.h lj_lib.h lj_libdef.h
-+lbitlib.o: lbitlib.c lua.h luaconf.h lauxlib.h lualib.h
- lib_bit.o: lib_bit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \
-  lj_arch.h lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_strscan.h \
-  lj_strfmt.h lj_ctype.h lj_cdata.h lj_cconv.h lj_carith.h lj_ff.h \

Added: trunk/Build/source/libs/luajit/TLpatches/patch-02
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-02	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-02	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,11 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/Makefile.dep LuaJIT-2.1.0-beta3/src/Makefile.dep
+--- LuaJIT-2.1.0-beta3-orig/src/Makefile.dep	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/Makefile.dep	2017-06-16 18:35:00.582631351 +0200
+@@ -6,6 +6,7 @@
+  lj_tab.h lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_cconv.h \
+  lj_ff.h lj_ffdef.h lj_dispatch.h lj_jit.h lj_ir.h lj_char.h lj_strscan.h \
+  lj_strfmt.h lj_lib.h lj_libdef.h
++lbitlib.o: lbitlib.c lua.h luaconf.h lauxlib.h lualib.h
+ lib_bit.o: lib_bit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \
+  lj_arch.h lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_strscan.h \
+  lj_strfmt.h lj_ctype.h lj_cdata.h lj_cconv.h lj_carith.h lj_ff.h \

Added: trunk/Build/source/libs/luajit/TLpatches/patch-03
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-03	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-03	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,12 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/host/buildvm.c LuaJIT-2.1.0-beta3/src/host/buildvm.c
+--- LuaJIT-2.1.0-beta3-orig/src/host/buildvm.c	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/host/buildvm.c	2017-06-16 18:56:14.538560987 +0200
+@@ -113,7 +113,7 @@
+       name[0] = name[1] == 'R' ? '_' : '@';  /* Just for _RtlUnwind at 16. */
+     else
+       *p = '\0';
+-#elif LJ_TARGET_PPC && !LJ_TARGET_CONSOLE
++#elif LJ_TARGET_PPC && !LJ_TARGET_OSX && !LJ_TARGET_CONSOLE
+     /* Keep @plt etc. */
+ #else
+     *p = '\0';

Added: trunk/Build/source/libs/luajit/TLpatches/patch-04
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-04	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-04	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,44 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lauxlib.h LuaJIT-2.1.0-beta3/src/lauxlib.h
+--- LuaJIT-2.1.0-beta3-orig/src/lauxlib.h	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lauxlib.h	2017-06-16 19:12:18.325405265 +0200
+@@ -92,6 +92,31 @@
+ LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname);
+ 
+ 
++
++/*
++** {======================================================
++** File handles for IO library
++** =======================================================
++*/
++
++/*
++** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and
++** initial structure 'luaL_Stream' (it may contain other fields
++** after that initial structure).
++*/
++
++#define LUA_FILEHANDLE          "FILE*"
++
++
++typedef struct luaL_Stream {
++  FILE *f;  /* stream (NULL for incompletely created streams) */
++  lua_CFunction closef;  /* to close stream (NULL for closed streams) */
++} luaL_Stream;
++
++/* }====================================================== */
++
++
++
+ /*
+ ** ===============================================================
+ ** some useful macros
+@@ -155,6 +180,8 @@
+ LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
+ LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
+ 
++/* Luajittex needs this one because it overloads loadfile */
++LUALIB_API int (RESERVED_load_aux_JIT) (lua_State *L, int status, int envarg);
+ 
+ /* }====================================================== */
+ 

Added: trunk/Build/source/libs/luajit/TLpatches/patch-05
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-05	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-05	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,11 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lib_init.c LuaJIT-2.1.0-beta3/src/lib_init.c
+--- LuaJIT-2.1.0-beta3-orig/src/lib_init.c	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lib_init.c	2017-06-16 19:19:00.352961298 +0200
+@@ -26,6 +26,7 @@
+   { LUA_DBLIBNAME,	luaopen_debug },
+   { LUA_BITLIBNAME,	luaopen_bit },
+   { LUA_JITLIBNAME,	luaopen_jit },
++  { LUA_BITLIBNAME_32,	luaopen_bit32 },
+   { NULL,		NULL }
+ };
+ 

Deleted: trunk/Build/source/libs/luajit/TLpatches/patch-05-LuaJITTeX
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-05-LuaJITTeX	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-05-LuaJITTeX	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,86 +0,0 @@
-diff -bur LuaJIT-src-orig/src/lj_def.h LuaJIT-src/src/lj_def.h
---- LuaJIT-src-orig/src/lj_def.h	2016-03-07 09:43:42.728069718 +0100
-+++ LuaJIT-src/src/lj_def.h	2016-03-07 12:23:43.327910115 +0100
-@@ -66,7 +66,7 @@
- #define LJ_MAX_BCINS	(1<<26)		/* Max. # of bytecode instructions. */
- #define LJ_MAX_SLOTS	250		/* Max. # of slots in a Lua func. */
- #define LJ_MAX_LOCVAR	200		/* Max. # of local variables. */
--#define LJ_MAX_UPVAL	60		/* Max. # of upvalues. */
-+#define LJ_MAX_UPVAL	249		/* Max. # of upvalues. */
- 
- #define LJ_MAX_IDXCHAIN	100		/* __index/__newindex chain limit. */
- #define LJ_STACK_EXTRA	(5+2*LJ_FR2)	/* Extra stack space (metamethods). */
-
-diff -bur LuaJIT-src-orig/src/lj_str.c LuaJIT-src/src/lj_str.c
---- LuaJIT-src-orig/src/lj_str.c	2016-03-07 09:43:42.696069718 +0100
-+++ LuaJIT-src/src/lj_str.c	2016-03-07 12:25:22.031908474 +0100
-@@ -118,6 +118,16 @@
-   g->strhash = newhash;
- }
- 
-+/*
-+** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to
-+** compute its hash
-+*/
-+#if !defined(LUAI_HASHLIMIT)
-+#define LUAI_HASHLIMIT		5
-+#endif
-+
-+#define cast(t, exp)	((t)(exp))
-+int luajittex_choose_hash_function = 0 ; 
- /* Intern a string and return string object. */
- GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)
- {
-@@ -126,9 +136,22 @@
-   GCobj *o;
-   MSize len = (MSize)lenx;
-   MSize a, b, h = len;
-+  size_t step ;
-+  size_t l1 ;
-   if (lenx >= LJ_MAX_STR)
-     lj_err_msg(L, LJ_ERR_STROV);
-   g = G(L);
-+
-+  if (len==0)
-+    return &g->strempty; 
-+  if (luajittex_choose_hash_function==0) { 
-+    /* Lua 5.1.5 hash function */
-+    /* for 5.2 max methods we also need to patch the vm eq */ 
-+    step = (len>>LUAI_HASHLIMIT)+1;  /* if string is too long, don't hash all its chars */
-+    for (l1=len; l1>=step; l1-=step)  /* compute hash */
-+      h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); 
-+   } else { 
-+  /* LuaJIT 2.0.2 hash function */
-   /* Compute string hash. Constants taken from lookup3 hash by Bob Jenkins. */
-   if (len >= 4) {  /* Caveat: unaligned access! */
-     a = lj_getu32(str);
-@@ -142,11 +165,15 @@
-     b = *(const uint8_t *)(str+(len>>1));
-     h ^= b; h -= lj_rol(b, 14);
-   } else {
-+       /* Already done, kept for reference */ 
-     return &g->strempty;
-   }
-   a ^= h; a -= lj_rol(h, 11);
-   b ^= a; b -= lj_rol(a, 25);
-   h ^= b; h -= lj_rol(b, 16);
-+  } 
-+
-+
-   /* Check if the string has already been interned. */
-   o = gcref(g->strhash[h & g->strmask]);
-   if (LJ_LIKELY((((uintptr_t)str+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) {
-
-diff -bur LuaJIT-src-orig/src/lj_err.c LuaJIT-src/src/lj_err.c
---- LuaJIT-src-orig/src/lj_err.c	2016-03-15 12:06:56.844436191 +0100
-+++ LuaJIT-src/src/lj_err.c	2016-03-15 11:58:30.000000000 +0100
-@@ -310,7 +310,6 @@
- #define _US_FORCE_UNWIND                8
- 
- typedef struct _Unwind_Control_Block _Unwind_Control_Block;
--typedef struct _Unwind_Context _Unwind_Context;
- 
- struct _Unwind_Control_Block {
-   uint64_t exclass;
-
-

Added: trunk/Build/source/libs/luajit/TLpatches/patch-06
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-06	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-06	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,53 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lib_package.c LuaJIT-2.1.0-beta3/src/lib_package.c
+--- LuaJIT-2.1.0-beta3-orig/src/lib_package.c	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lib_package.c	2017-06-19 16:54:20.092831408 +0200
+@@ -361,6 +361,28 @@
+   return 1;  /* library loaded successfully */
+ }
+ 
++#define LUA_POF         "luaopen_"
++#define LUA_OFSEP       "_"
++#define POF             LUA_POF
++
++static const char *mkfuncname (lua_State *L, const char *modname) {
++  const char *funcname;
++  const char *mark = strchr(modname, *LUA_IGMARK);
++  if (mark) modname = mark + 1;
++  funcname = luaL_gsub(L, modname, ".", LUA_OFSEP);
++  funcname = lua_pushfstring(L, POF"%s", funcname);
++  lua_remove(L, -2);  /* remove 'gsub' result */
++  return funcname;
++}
++
++int loader_C_luatex (lua_State *L, const char *name, const char *filename) {
++  const char *funcname;
++  funcname = mkfuncname(L, name);
++  if (ll_loadfunc(L, filename, funcname,0) != 0)
++    loaderror(L, filename);
++  return 1;  /* library loaded successfully */
++}
++
+ static int lj_cf_package_loader_croot(lua_State *L)
+ {
+   const char *filename;
+@@ -380,6 +402,20 @@
+   return 1;
+ }
+ 
++int loader_Call_luatex (lua_State *L, const char *name, const char *filename) {
++  const char *funcname;
++  int stat;
++  if (filename == NULL) return 1;  /* root not found */
++  funcname = mkfuncname(L, name);
++  if ((stat = ll_loadfunc(L, filename, funcname,0)) != 0) {
++    if (stat != PACKAGE_ERR_FUNC) loaderror(L, filename);  /* real error */
++    lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS,
++                       name, filename);
++    return 1;  /* function not found */
++  }
++  return 1;  /* library loaded successfully */
++}
++
+ static int lj_cf_package_loader_preload(lua_State *L)
+ {
+   const char *name = luaL_checkstring(L, 1);

Deleted: trunk/Build/source/libs/luajit/TLpatches/patch-06-ppc-darwin
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-06-ppc-darwin	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-06-ppc-darwin	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,25 +0,0 @@
-diff -bur LuaJIT-src-orig/src/host/buildvm.c LuaJIT-src/src/host/buildvm.c
---- LuaJIT-src-orig/src/host/buildvm.c	2016-03-07 09:43:42.728069718 +0100
-+++ LuaJIT-src/src/host/buildvm.c	2016-03-07 12:29:03.891904786 +0100
-@@ -113,7 +113,7 @@
-       name[0] = '@';
-     else
-       *p = '\0';
--#elif LJ_TARGET_PPC && !LJ_TARGET_CONSOLE
-+#elif LJ_TARGET_PPC && !LJ_TARGET_OSX && !LJ_TARGET_CONSOLE
-     /* Keep @plt etc. */
- #else
-     *p = '\0';
-
-diff -bur LuaJIT-src-orig/src/lj_arch.h LuaJIT-src/src/lj_arch.h
---- LuaJIT-src-orig/src/lj_arch.h	2016-03-07 09:43:42.712069718 +0100
-+++ LuaJIT-src/src/lj_arch.h	2016-03-07 12:31:33.351902301 +0100
-@@ -350,7 +350,7 @@
- #if __GNUC__ < 4
- #error "Need at least GCC 4.0 or newer"
- #endif
--#elif LJ_TARGET_ARM
-+#elif LJ_TARGET_ARM || LJ_TARGET_PPC
- #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)
- #error "Need at least GCC 4.2 or newer"
- #endif

Added: trunk/Build/source/libs/luajit/TLpatches/patch-07
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-07	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-07	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,12 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lj_arch.h LuaJIT-2.1.0-beta3/src/lj_arch.h
+--- LuaJIT-2.1.0-beta3-orig/src/lj_arch.h	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lj_arch.h	2017-06-19 17:51:41.683624004 +0200
+@@ -376,7 +376,7 @@
+ #if __GNUC__ < 4
+ #error "Need at least GCC 4.0 or newer"
+ #endif
+-#elif LJ_TARGET_ARM
++#elif LJ_TARGET_ARM  || LJ_TARGET_PPC
+ #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)
+ #error "Need at least GCC 4.2 or newer"
+ #endif

Deleted: trunk/Build/source/libs/luajit/TLpatches/patch-07-x86_64-cygwin
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-07-x86_64-cygwin	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-07-x86_64-cygwin	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,12 +0,0 @@
-diff -bur LuaJIT-src-orig/src/lj_arch.h LuaJIT-src/src/lj_arch.h
---- LuaJIT-src-orig/src/lj_arch.h	2016-03-07 09:43:42.712069718 +0100
-+++ LuaJIT-src/src/lj_arch.h	2016-03-07 12:31:33.351902301 +0100
-@@ -350,7 +350,7 @@
- #if __GNUC__ < 4
- #error "Need at least GCC 4.0 or newer"
- #endif
--#elif LJ_TARGET_ARM
-+#elif LJ_TARGET_ARM || LJ_TARGET_PPC
- #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)
- #error "Need at least GCC 4.2 or newer"
- #endif

Added: trunk/Build/source/libs/luajit/TLpatches/patch-08
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-08	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-08	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,12 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lj_def.h LuaJIT-2.1.0-beta3/src/lj_def.h
+--- LuaJIT-2.1.0-beta3-orig/src/lj_def.h	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lj_def.h	2017-06-19 17:52:54.085933629 +0200
+@@ -66,7 +66,7 @@
+ #define LJ_MAX_BCINS	(1<<26)		/* Max. # of bytecode instructions. */
+ #define LJ_MAX_SLOTS	250		/* Max. # of slots in a Lua func. */
+ #define LJ_MAX_LOCVAR	200		/* Max. # of local variables. */
+-#define LJ_MAX_UPVAL	60		/* Max. # of upvalues. */
++#define LJ_MAX_UPVAL	249		/* Max. # of upvalues. */
+ 
+ #define LJ_MAX_IDXCHAIN	100		/* __index/__newindex chain limit. */
+ #define LJ_STACK_EXTRA	(5+2*LJ_FR2)	/* Extra stack space (metamethods). */

Added: trunk/Build/source/libs/luajit/TLpatches/patch-09
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-09	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-09	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,26 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lj_load.c LuaJIT-2.1.0-beta3/src/lj_load.c
+--- LuaJIT-2.1.0-beta3-orig/src/lj_load.c	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lj_load.c	2017-06-19 18:05:35.864190001 +0200
+@@ -166,3 +166,22 @@
+     return 1;
+ }
+ 
++
++
++/* -- Luajittex needs this one because it overloads loadfile  -- */
++LUALIB_API int RESERVED_load_aux_JIT(lua_State *L, int status, int envarg)
++{
++  if (status == 0) {
++    if (tvistab(L->base+envarg-1)) {
++      GCfunc *fn = funcV(L->top-1);
++      GCtab *t = tabV(L->base+envarg-1);
++      setgcref(fn->c.env, obj2gco(t));
++      lj_gc_objbarrier(L, fn, t);
++    }
++    return 1;
++  } else {
++    setnilV(L->top-2);
++    return 2;
++  }
++}
++

Added: trunk/Build/source/libs/luajit/TLpatches/patch-10
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-10	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-10	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,59 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lj_str.c LuaJIT-2.1.0-beta3/src/lj_str.c
+--- LuaJIT-2.1.0-beta3-orig/src/lj_str.c	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lj_str.c	2017-06-19 18:20:09.668443066 +0200
+@@ -118,6 +118,16 @@
+   g->strhash = newhash;
+ }
+ 
++/*
++** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to
++** compute its hash
++*/
++#if !defined(LUAI_HASHLIMIT)
++#define LUAI_HASHLIMIT		5
++#endif
++
++#define cast(t, exp)	((t)(exp))
++int luajittex_choose_hash_function = 0 ; 
+ /* Intern a string and return string object. */
+ GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)
+ {
+@@ -126,9 +136,22 @@
+   GCobj *o;
+   MSize len = (MSize)lenx;
+   MSize a, b, h = len;
++  size_t step ;
++  size_t l1 ;
+   if (lenx >= LJ_MAX_STR)
+     lj_err_msg(L, LJ_ERR_STROV);
+   g = G(L);
++
++  if (len==0)
++    return &g->strempty; 
++  if (luajittex_choose_hash_function==0) { 
++    /* Lua 5.1.5 hash function */
++    /* for 5.2 max methods we also need to patch the vm eq */ 
++    step = (len>>LUAI_HASHLIMIT)+1;  /* if string is too long, don't hash all its chars */
++    for (l1=len; l1>=step; l1-=step)  /* compute hash */
++      h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); 
++   } else { 
++  /* LuaJIT 2.0.2 hash function */
+   /* Compute string hash. Constants taken from lookup3 hash by Bob Jenkins. */
+   if (len >= 4) {  /* Caveat: unaligned access! */
+     a = lj_getu32(str);
+@@ -142,11 +165,15 @@
+     b = *(const uint8_t *)(str+(len>>1));
+     h ^= b; h -= lj_rol(b, 14);
+   } else {
++       /* Already done, kept for reference */ 
+     return &g->strempty;
+   }
+   a ^= h; a -= lj_rol(h, 11);
+   b ^= a; b -= lj_rol(a, 25);
+   h ^= b; h -= lj_rol(b, 16);
++  } 
++
++
+   /* Check if the string has already been interned. */
+   o = gcref(g->strhash[h & g->strmask]);
+   if (LJ_LIKELY((((uintptr_t)str+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) {

Added: trunk/Build/source/libs/luajit/TLpatches/patch-11
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-11	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-11	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,28 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lua.h LuaJIT-2.1.0-beta3/src/lua.h
+--- LuaJIT-2.1.0-beta3-orig/src/lua.h	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lua.h	2017-06-19 18:26:51.143299683 +0200
+@@ -103,7 +103,8 @@
+ /* type for integer functions */
+ typedef LUA_INTEGER lua_Integer;
+ 
+-
++/* communication with LuaJiTTeX */
++LUA_API int luajittex_choose_hash_function; 
+ 
+ /*
+ ** state manipulation
+@@ -353,6 +354,14 @@
+ LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *isnum);
+ LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum);
+ 
++
++#define LUA_OPEQ 0
++#define LUA_OPLT 1
++#define LUA_OPLE 2
++ 
++/* see http://comments.gmane.org/gmane.comp.programming.swig/18673 */
++# define lua_rawlen lua_objlen 
++
+ /* From Lua 5.3. */
+ LUA_API int lua_isyieldable (lua_State *L);
+ 

Added: trunk/Build/source/libs/luajit/TLpatches/patch-12
===================================================================
--- trunk/Build/source/libs/luajit/TLpatches/patch-12	                        (rev 0)
+++ trunk/Build/source/libs/luajit/TLpatches/patch-12	2018-01-09 23:43:20 UTC (rev 46269)
@@ -0,0 +1,21 @@
+diff -bur LuaJIT-2.1.0-beta3-orig/src/lualib.h LuaJIT-2.1.0-beta3/src/lualib.h
+--- LuaJIT-2.1.0-beta3-orig/src/lualib.h	2017-05-01 21:05:00.000000000 +0200
++++ LuaJIT-2.1.0-beta3/src/lualib.h	2017-06-19 18:27:55.065836605 +0200
+@@ -22,6 +22,8 @@
+ #define LUA_JITLIBNAME	"jit"
+ #define LUA_FFILIBNAME	"ffi"
+ 
++#define LUA_BITLIBNAME_32  "bit32"
++ 
+ LUALIB_API int luaopen_base(lua_State *L);
+ LUALIB_API int luaopen_math(lua_State *L);
+ LUALIB_API int luaopen_string(lua_State *L);
+@@ -34,6 +36,8 @@
+ LUALIB_API int luaopen_jit(lua_State *L);
+ LUALIB_API int luaopen_ffi(lua_State *L);
+ 
++LUALIB_API int luaopen_bit32(lua_State *L);
++
+ LUALIB_API void luaL_openlibs(lua_State *L);
+ 
+ #ifndef lua_assert

Modified: trunk/Build/source/libs/luajit/aclocal.m4
===================================================================
--- trunk/Build/source/libs/luajit/aclocal.m4	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/aclocal.m4	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@
 [am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.15.1], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,7 +51,7 @@
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -58,7 +58,7 @@
 
 # Figure out how to run the assembler.                      -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -78,7 +78,7 @@
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -130,7 +130,7 @@
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -161,7 +161,7 @@
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -352,7 +352,7 @@
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -428,7 +428,7 @@
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -625,7 +625,7 @@
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -646,7 +646,7 @@
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2017 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -668,7 +668,7 @@
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -703,7 +703,7 @@
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -753,7 +753,7 @@
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -792,7 +792,7 @@
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -821,7 +821,7 @@
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -868,7 +868,7 @@
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -887,7 +887,7 @@
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -968,7 +968,7 @@
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2017 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1028,7 +1028,7 @@
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1056,7 +1056,7 @@
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2017 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1075,7 +1075,7 @@
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2017 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,

Modified: trunk/Build/source/libs/luajit/configure
===================================================================
--- trunk/Build/source/libs/luajit/configure	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/configure	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for luajit for TeX Live 2.1.0-beta2.
+# Generated by GNU Autoconf 2.69 for luajit for TeX Live 2.1.0-beta3.
 #
 # Report bugs to <tex-k at tug.org>.
 #
@@ -590,8 +590,8 @@
 # Identity of this package.
 PACKAGE_NAME='luajit for TeX Live'
 PACKAGE_TARNAME='luajit-for-tex-live'
-PACKAGE_VERSION='2.1.0-beta2'
-PACKAGE_STRING='luajit for TeX Live 2.1.0-beta2'
+PACKAGE_VERSION='2.1.0-beta3'
+PACKAGE_STRING='luajit for TeX Live 2.1.0-beta3'
 PACKAGE_BUGREPORT='tex-k at tug.org'
 PACKAGE_URL=''
 
@@ -758,6 +758,7 @@
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -844,6 +845,7 @@
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1096,6 +1098,15 @@
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1233,7 +1244,7 @@
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1346,7 +1357,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures luajit for TeX Live 2.1.0-beta2 to adapt to many kinds of systems.
+\`configure' configures luajit for TeX Live 2.1.0-beta3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1386,6 +1397,7 @@
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1417,7 +1429,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of luajit for TeX Live 2.1.0-beta2:";;
+     short | recursive ) echo "Configuration of luajit for TeX Live 2.1.0-beta3:";;
    esac
   cat <<\_ACEOF
 
@@ -1536,7 +1548,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-luajit for TeX Live configure 2.1.0-beta2
+luajit for TeX Live configure 2.1.0-beta3
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2043,7 +2055,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by luajit for TeX Live $as_me 2.1.0-beta2, which was
+It was created by luajit for TeX Live $as_me 2.1.0-beta3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3966,7 +3978,7 @@
 
 # Define the identity of the package.
  PACKAGE='luajit-for-tex-live'
- VERSION='2.1.0-beta2'
+ VERSION='2.1.0-beta3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5384,7 +5396,7 @@
 fi
 
 
-LUAJITVERSION=2.1.0-beta2
+LUAJITVERSION=2.1.0-beta3
 
 
 LUAJIT_LT_VERSINFO=3:0:1
@@ -13902,7 +13914,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -13948,7 +13960,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -13972,7 +13984,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -14017,7 +14029,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -14041,7 +14053,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -14973,7 +14985,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by luajit for TeX Live $as_me 2.1.0-beta2, which was
+This file was extended by luajit for TeX Live $as_me 2.1.0-beta3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -15039,7 +15051,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-luajit for TeX Live config.status 2.1.0-beta2
+luajit for TeX Live config.status 2.1.0-beta3
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 

Modified: trunk/Build/source/libs/luajit/include/Makefile.in
===================================================================
--- trunk/Build/source/libs/luajit/include/Makefile.in	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/include/Makefile.in	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -257,6 +257,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@

Modified: trunk/Build/source/libs/luajit/native/Makefile.in
===================================================================
--- trunk/Build/source/libs/luajit/native/Makefile.in	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/native/Makefile.in	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -303,6 +303,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -612,7 +613,7 @@
 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
 	$(am__post_remove_distdir)
 
 dist-bzip2: distdir
@@ -638,7 +639,7 @@
 	@echo WARNING: "Support for shar distribution archives is" \
 	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -656,7 +657,7 @@
 distcheck: dist
 	case '$(DIST_ARCHIVES)' in \
 	*.tar.gz*) \
-	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
 	*.tar.lz*) \
@@ -666,7 +667,7 @@
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
-	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
 	esac

Modified: trunk/Build/source/libs/luajit/native/aclocal.m4
===================================================================
--- trunk/Build/source/libs/luajit/native/aclocal.m4	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/native/aclocal.m4	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@
 [am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.15.1], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,7 +51,7 @@
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -58,7 +58,7 @@
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -332,7 +332,7 @@
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -408,7 +408,7 @@
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -605,7 +605,7 @@
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -626,7 +626,7 @@
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2017 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -648,7 +648,7 @@
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -683,7 +683,7 @@
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -733,7 +733,7 @@
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -772,7 +772,7 @@
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -801,7 +801,7 @@
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -848,7 +848,7 @@
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -867,7 +867,7 @@
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -948,7 +948,7 @@
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2017 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1008,7 +1008,7 @@
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1036,7 +1036,7 @@
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2017 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1055,7 +1055,7 @@
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2017 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,

Modified: trunk/Build/source/libs/luajit/native/configure
===================================================================
--- trunk/Build/source/libs/luajit/native/configure	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/native/configure	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for luajit native 2.1.0-beta2.
+# Generated by GNU Autoconf 2.69 for luajit native 2.1.0-beta3.
 #
 # Report bugs to <tex-k at tug.org>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='luajit native'
 PACKAGE_TARNAME='luajit-native'
-PACKAGE_VERSION='2.1.0-beta2'
-PACKAGE_STRING='luajit native 2.1.0-beta2'
+PACKAGE_VERSION='2.1.0-beta3'
+PACKAGE_STRING='luajit native 2.1.0-beta3'
 PACKAGE_BUGREPORT='tex-k at tug.org'
 PACKAGE_URL=''
 
@@ -710,6 +710,7 @@
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -784,6 +785,7 @@
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1036,6 +1038,15 @@
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1173,7 +1184,7 @@
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1286,7 +1297,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures luajit native 2.1.0-beta2 to adapt to many kinds of systems.
+\`configure' configures luajit native 2.1.0-beta3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1326,6 +1337,7 @@
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1356,7 +1368,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of luajit native 2.1.0-beta2:";;
+     short | recursive ) echo "Configuration of luajit native 2.1.0-beta3:";;
    esac
   cat <<\_ACEOF
 
@@ -1453,7 +1465,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-luajit native configure 2.1.0-beta2
+luajit native configure 2.1.0-beta3
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1847,7 +1859,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by luajit native $as_me 2.1.0-beta2, which was
+It was created by luajit native $as_me 2.1.0-beta3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3770,7 +3782,7 @@
 
 # Define the identity of the package.
  PACKAGE='luajit-native'
- VERSION='2.1.0-beta2'
+ VERSION='2.1.0-beta3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5851,7 +5863,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by luajit native $as_me 2.1.0-beta2, which was
+This file was extended by luajit native $as_me 2.1.0-beta3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5917,7 +5929,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-luajit native config.status 2.1.0-beta2
+luajit native config.status 2.1.0-beta3
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 

Modified: trunk/Build/source/libs/luajit/version.ac
===================================================================
--- trunk/Build/source/libs/luajit/version.ac	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/libs/luajit/version.ac	2018-01-09 23:43:20 UTC (rev 46269)
@@ -8,4 +8,4 @@
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current luajit version
-m4_define([luajit_version], [2.1.0-beta2])
+m4_define([luajit_version], [2.1.0-beta3])

Modified: trunk/Build/source/texk/web2c/luatexdir/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/ChangeLog	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/ChangeLog	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,24 +1,65 @@
-2017-09-18  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+2017-10-03  Luigi Scarso <luigi.scarso at gmail.com>
+	A not exhaustive list of changes:
 
-	* luatex.c : Import comment from the upstream.
+	* luaffi/: Fix to compile with gcc 7.1, 
+	patch for callbacks.
+	* lpeg/: version 1.0.1
 
-2017-09-05  Karl Berry  <karl at tug.org>
-        and Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+	* luatex.c: We conform to the way Web2c does handle trailing tabs and spaces. This
+	decade old behaviour was changed in September 2017 and can introduce
+	compatibility issues in existing workflows. Because we don't want too
+	many differences with upstream TeXlive we just follow up on that patch
+	and it's up to macro packages to deal with possible issues (which can be
+	done via the usual callbacks. One can wonder why we then still prune
+	spaces but we leave that to the reader.
 
-	* luatex.c (IS_SPC_OR_EOL): new macro.
-	(topenin): use it, instead of ISBLANK.
-	(input_line): remove only trailing space characters
-	instead of using ISBLANK.
-	See also analogous change in lib/texmfmp.c.
-	Original bug report from Evan Aad,
-	http://tug.org/pipermail/tex-k/2017-August/002801.html.
-	Fix a bug to skip BOM (w32 only).
+	* option to set exit code (status.setexitcode) (HH). Changed paths:
+	luatexdir/tex/errors.h, luatexdir/tex/errors.w
 
+	* missing_glyph callback (HH). Changed paths:
+	luatexdir/font/texfont.h, luatexdir/font/texfont.w,luatexdir/lua/lcallbacklib.c
+	luatexdir/luatexcallbackids.h, 	luatexdir/pdf/pdffont.w, luatexdir/pdf/pdfglyph.w;
+
+	* \mathdelimitersmode (see manual) (HH). Changed paths:
+	luatexdir/tex/mlist.w, luatexdir/tex/texnodes.h
+
+	* fixes in protect/unprotect and list support in set/getglue (HH). Changed paths:
+	luatexdir/lua/lnodelib.c
+
+	* 'class' string in pdf vf command optional (HH). Changed paths:
+	luatexdir/font/luafont.w
+
+	* cleanup expansion (HH). Changed paths:
+	luatexdir/font/luafont.w, luatexdir/font/texfont.h, luatexdir/font/texfont.w
+	luatexdir/lua/lfontlib.c, luatexdir/lua/luatex-api.h, luatexdir/tex/dumpdata.w
+
+	* possibly better fix for extended font embedding (HH). Changed paths:
+	luatexdir/font/writefont.w
+
+	* protect_glyphs accepts range and also made consistent with manual (HH). Changed path:
+	luatexdir/lua/lnodelib.c
+
+	* some more control over syntex fields (HH). Changed paths:
+	luatexdir/tex/texnodes.w
+
+	* fix for neg display skips (HH). Changed paths:
+	luatexdir/tex/texmath.w
+
+	* \breakafterdirmode (value 1 will honor glue breaks after a dir node) (HH). Changed paths:
+	luatexdir/tex/commands.w, luatexdir/tex/dumpdata.w, luatexdir/tex/equivalents.h,
+	luatexdir/tex/linebreak.w, luatexdir/tex/texnodes.h
+
+	* fix width array of extended font (shared with normal)(HH). Changed paths:
+	luatexdir/font/writefont.w
+
+
+
 2017-02-07  Luigi Scarso <luigi.scarso at gmail.com>
 
 	* luaffi/: First attempt to implement the ffi module in lua
 	compatible with the ffi module of luajit.
 
+
 2015-11-01  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	* luatex.c: Improve a little (w32 only).
@@ -529,11 +570,11 @@
 	* lua/lepdflib.cc: No need to test for Annot::decRefCnt with
 	poppler 0.18 or better.
 
-2012-11-06  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+2012-11-06  Akira Kakuto  <kakuto at fuk.kinidai.ac.jp>
 
 	* pdf/pdflistout.w: sync with r4471 (a bug fix by H. Henkel).
 
-2012-10-13  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+2012-10-13  Akira Kakuto  <kakuto at fuk.kinidai.ac.jp>
 
 	* tex/texfileio.w: input by pipe was impossible. enable it.
 
@@ -541,7 +582,7 @@
 
 	* lua/luainit.w (lua_initialize): Free two malloc()ed strings.
 
-2012-10-10  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+2012-10-10  Akira Kakuto  <kakuto at fuk.kinidai.ac.jp>
 
 	* luatex.c: Modify determination of fullpath for restricted shell
 	escape commands.
@@ -567,7 +608,7 @@
 
 	* lua/luainit.w (parse_options): Avoid cast const => non-const.
 
-2012-09-13  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+2012-09-13  Akira Kakuto  <kakuto at fuk.kinidai.ac.jp>
 
 	* lua/luainit.w (parse_options): allow lualatex "\input" "a b" on
 	Windows.
@@ -577,7 +618,7 @@
 	* luatex-api.h: Avoid conflicting extern declaration of environ,
 	declared in <stdlib.h> for WIN32 (from W32TeX).
 
-2012-08-21  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+2012-08-21  Akira Kakuto  <kakuto at fuk.kinidai.ac.jp>
 
 	* tex/texdeffont.w (tex_def_font): Recover the old code, because the
 	new code seems not to work.

Modified: trunk/Build/source/texk/web2c/luatexdir/am/luatex.am
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/am/luatex.am	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/am/luatex.am	2018-01-09 23:43:20 UTC (rev 46269)
@@ -72,8 +72,7 @@
 	mplibdir/lmplib.c
 
 EXTRA_DIST += \
-	$(luatex_sources) \
-	luatexdir/getluatexsvnversion.sh
+	$(luatex_sources) 
 
 call_luatex_CPPFLAGS = -DEXEPROG=\"luatex.exe\"
 nodist_call_luatex_SOURCES = callexe.c

Modified: trunk/Build/source/texk/web2c/luatexdir/font/luafont.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/font/luafont.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/font/luafont.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -461,9 +461,6 @@
     if (font_step(f) != 0) {
         dump_intfield(L,step,font_step(f));
     }
-    if (font_auto_expand(f) != 0) {
-        dump_booleanfield(L,auto_expand,font_auto_expand(f));
-    }
     if (pdf_font_attr(f) != 0) {
         char *s = makecstring(pdf_font_attr(f));
         dump_stringfield(L,attributes,s);
@@ -623,6 +620,7 @@
 static int count_char_packet_bytes(lua_State * L)
 {
     register int i;
+    register int ts;
     register int l = 0;
     int ff = 0;
     for (i = 1; i <= (int) lua_rawlen(L, -1); i++) {
@@ -642,7 +640,6 @@
                     ff = 1;
                 } else if (lua_key_eq(s, slot)) {
                     l += 10;
-                    ff = 1;
                 } else if (lua_key_eq(s, comment) || lua_key_eq(s, nop)) {
                     ;
                 } else if (lua_key_eq(s, push) || lua_key_eq(s, pop)) {
@@ -649,32 +646,51 @@
                     l++;
                 } else if (lua_key_eq(s, rule)) {
                     l += 9;
-                } else if (lua_key_eq(s, right) || lua_key_eq(s, node)
-                           || lua_key_eq(s, down) || lua_key_eq(s, image)) {
+                } else if (lua_key_eq(s, right) || lua_key_eq(s, node) || lua_key_eq(s, down) || lua_key_eq(s, image)) {
                     l += 5;
                 } else if (lua_key_eq(s, scale)) {
                     l += sizeof(float) + 1;
+                } else if (lua_key_eq(s, pdf)) {
+                    size_t len;
+                    l += 5;
+                    ts = lua_rawlen(L, -2);
+                    lua_rawgeti(L, -2, 2);
+                    if (ts == 3) {
+                        if (lua_type(L,-1) == LUA_TSTRING) {
+                            /* no need to do something */
+                        } else if (lua_type(L,-1) == LUA_TNUMBER) {
+                            /* no need to do something */
+                        } else {
+                            normal_error("vf command","invalid packet pdf literal category");
+                        }
+                        lua_rawgeti(L, -3, 3);
+                    }
+                    if (lua_type(L,-1) == LUA_TSTRING) {
+                        (void) lua_tolstring(L, -1, &len);
+                        if (len > 0) {
+                            l = (int) (l + 5 + (int) len);
+                        }
+                    } else {
+                        normal_error("vf command","invalid packet pdf literal");
+                    }
+                    lua_pop(L, ts == 3 ? 2 : 1);
                 } else if (lua_key_eq(s, special) || lua_key_eq(s, lua)) {
                     size_t len;
                     lua_rawgeti(L, -2, 2);
                     if (lua_type(L,-1) == LUA_TSTRING) {
                         (void) lua_tolstring(L, -1, &len);
-                        lua_pop(L, 1);
                         if (len > 0) {
                             l = (int) (l + 5 + (int) len);
                         }
                     } else {
-                        lua_pop(L, 1);
                         normal_error("vf command","invalid packet special");
-                        /* fprintf(stdout, "invalid packet special!\n"); */
                     }
+                    lua_pop(L, 1);
                 } else {
                     normal_error("vf command","unknown packet command");
-                    /* fprintf(stdout, "unknown packet command %s!\n", s); */
                 }
             } else {
                 normal_error("vf command","no packet command");
-             /* fprintf(stdout, "no packet command!\n"); */
             }
             lua_pop(L, 1);      /* command name */
         }
@@ -700,6 +716,8 @@
     const char *s;
     eight_bits *cpackets, *cp;
     int ff = 0;
+    int sf = 0;
+    int ts = 0;
     int max_f = 0;
     int pc = count_char_packet_bytes(L);
     if (pc <= 0)
@@ -725,19 +743,20 @@
                         do_store_four(ff);
                     }
                 } else if (lua_key_eq(s, slot)) {
+                    /* we could be sparse but no real reason */
                     cmd = packet_nop_code;
                     lua_rawgeti(L, -2, 2);
-                    n = (int) luaL_checkinteger(L, -1);
-                    if (n ==0) {
-                        ff = f;
+                    n = (int) lua_roundnumber(L, -1);
+                    if (n == 0) {
+                        sf = f;
                     } else {
-                        ff = (n > max_f ? l_fonts[1] : l_fonts[n]);
+                        sf = (n > max_f ? l_fonts[1] : l_fonts[n]);
                     }
                     lua_rawgeti(L, -3, 3);
-                    n = (int) luaL_checkinteger(L, -1);
+                    n = (int) lua_roundnumber(L, -1);
                     lua_pop(L, 2);
                     append_packet(packet_font_code);
-                    do_store_four(ff);
+                    do_store_four(sf);
                     append_packet(packet_char_code);
                     do_store_four(n);
                 } else if (lua_key_eq(s, comment) || lua_key_eq(s, nop)) {
@@ -754,6 +773,8 @@
                     cmd = packet_right_code;
                 } else if (lua_key_eq(s, down)) {
                     cmd = packet_down_code;
+                } else if (lua_key_eq(s, pdf)) {
+                    cmd = packet_pdf_code;
                 } else if (lua_key_eq(s, special)) {
                     cmd = packet_special_code;
                 } else if (lua_key_eq(s, image)) {
@@ -771,7 +792,7 @@
                     case packet_font_code:
                         append_packet(cmd);
                         lua_rawgeti(L, -2, 2);
-                        n = (int) luaL_checkinteger(L, -1);
+                        n = (int) lua_roundnumber(L, -1);
                         if (n == 0) {
                             ff = n;
                         } else {
@@ -790,7 +811,7 @@
                     case packet_char_code:
                         append_packet(cmd);
                         lua_rawgeti(L, -2, 2);
-                        n = (int) luaL_checkinteger(L, -1);
+                        n = (int) lua_roundnumber(L, -1);
                         do_store_four(n);
                         lua_pop(L, 1);
                         break;
@@ -798,7 +819,7 @@
                     case packet_down_code:
                         append_packet(cmd);
                         lua_rawgeti(L, -2, 2);
-                        n = (int) luaL_checkinteger(L, -1);
+                        n = (int) lua_roundnumber(L, -1);
                         do_store_four(sp_to_dvi(n, atsize));
                         lua_pop(L, 1);
                         break;
@@ -805,13 +826,55 @@
                     case packet_rule_code:
                         append_packet(cmd);
                         lua_rawgeti(L, -2, 2);
-                        n = (int) luaL_checkinteger(L, -1);
+                        n = (int) lua_roundnumber(L, -1);
                         do_store_four(sp_to_dvi(n, atsize));
                         lua_rawgeti(L, -3, 3);
-                        n = (int) luaL_checkinteger(L, -1);
+                        n = (int) lua_roundnumber(L, -1);
                         do_store_four(sp_to_dvi(n, atsize));
                         lua_pop(L, 2);
                         break;
+                    case packet_pdf_code:
+                        append_packet(cmd);
+                        ts = (int) lua_rawlen(L, -2);
+                        lua_rawgeti(L, -2, 2);
+                        if (ts == 3) {
+                            if (lua_type(L, -1) == LUA_TSTRING) {
+                                s = lua_tostring(L, -1);
+                                if (lua_key_eq(s, direct)) {
+                                    n = direct_always;
+                                } else if (lua_key_eq(s, page)) {
+                                    n = direct_page;
+                                } else if (lua_key_eq(s, raw)) {
+                                    n = direct_raw;
+                                } else if (lua_key_eq(s, origin)) {
+                                    n = set_origin;
+                                } else {
+                                 /* normal_warning("vf command","invalid pdf literal type"); */
+                                    n = set_origin ;
+                                }
+                            } else {
+                                n = (int) lua_roundnumber(L, -1);
+                                if (n < set_origin || n > direct_raw) {
+                                    n = set_origin ;
+                                }
+                            }
+                            lua_rawgeti(L, -3, 3);
+                        } else {
+                            n = set_origin;
+                        }
+                        do_store_four(n);
+                        s = luaL_checklstring(L, -1, &l);
+                        if (l > 0) {
+                            do_store_four(l);
+                            m = (int) l;
+                            while (m > 0) {
+                                n = *s++;
+                                m--;
+                                append_packet(n);
+                            }
+                        }
+                        lua_pop(L,ts == 3 ? 2 : 1);
+                        break;
                     case packet_special_code:
                     case packet_lua_code:
                         append_packet(cmd);
@@ -1144,8 +1207,7 @@
                     set_charinfo_tag(co, ext_tag);
                     set_charinfo_extensible(co, top, bot, mid, rep);
                 } else {
-                    formatted_warning("font", "lua-loaded font %s char U+%X has an invalid extensible field",
-                        font_name(f), (int) i);
+                    formatted_warning("font", "lua-loaded font %s char U+%X has an invalid extensible field", font_name(f), (int) i);
                 }
             }
             lua_pop(L, 1);
@@ -1248,8 +1310,7 @@
                     set_kern_item(ckerns[ctr], k, j);
                     ctr++;
                 } else {
-                    formatted_warning("font", "lua-loaded font %s char U+%X has an invalid kern field",
-                        font_name(f), (int) i);
+                    formatted_warning("font", "lua-loaded font %s char U+%X has an invalid kern field", font_name(f), (int) i);
                 }
                 lua_pop(L, 1);
             }
@@ -1258,13 +1319,13 @@
                 set_kern_item(ckerns[ctr], end_kern, 0);
                 set_charinfo_kerns(co, ckerns);
             } else {
-                formatted_warning("font", "lua-loaded font %s char U+%X has an invalid kerns field",
-                    font_name(f), (int) i);
+                formatted_warning("font", "lua-loaded font %s char U+%X has an invalid kerns field", font_name(f), (int) i);
             }
             lua_pop(L, 1);
         }
 
         /* packet commands */
+
         lua_key_rawgeti(commands);
         if (lua_istable(L, -1)) {
             lua_pushnil(L);     /* first key */
@@ -1307,8 +1368,7 @@
                     set_ligature_item(cligs[ctr], (char) ((t * 2) + 1), k, r);
                     ctr++;
                 } else {
-                    formatted_warning("font", "lua-loaded font %s char U+%X has an invalid ligature field",
-                        font_name(f), (int) i);
+                    formatted_warning("font", "lua-loaded font %s char U+%X has an invalid ligature field", font_name(f), (int) i);
                 }
                 lua_pop(L, 1);      /* iterator value */
             }
@@ -1317,8 +1377,7 @@
                 set_ligature_item(cligs[ctr], 0, end_ligature, 0);
                 set_charinfo_ligatures(co, cligs);
             } else {
-                formatted_warning("font", "lua-loaded font %s char U+%X has an invalid ligatures field",
-                    font_name(f), (int) i);
+                formatted_warning("font", "lua-loaded font %s char U+%X has an invalid ligatures field", font_name(f), (int) i);
             }
             lua_pop(L, 1);      /* ligatures table */
         }
@@ -1353,7 +1412,6 @@
     lua_pop(L,1);
 
     /* the table is at stack index -1 */
-
     s = n_string_field_copy(L,lua_key_index(area), "");
     set_font_area(f, s);
     s = n_string_field_copy(L, lua_key_index(filename), NULL);
@@ -1468,13 +1526,13 @@
                     l_fonts[i] = find_font_id(ss, t);
                 lua_settop(L, s_top);
             } else {
-                formatted_error("font","invalid local font in lua-loaded font '%s'", font_name(f));
+                formatted_error("font","invalid local font at index %i in lua-loaded font '%s' (1)",i,font_name(f));
             }
             lua_pop(L, 1); /* pop list entry */
         }
         lua_pop(L, 1); /* pop font table */
     } else if (font_type(f) == virtual_font_type) {
-        formatted_error("font","invalid local fonts in lua-loaded font '%s'", font_name(f));
+        formatted_error("font","invalid local fonts in lua-loaded font '%s' (2)", font_name(f));
     } else {
         l_fonts = xmalloc(3 * sizeof(int));
         l_fonts[0] = 0;
@@ -1481,7 +1539,6 @@
         l_fonts[1] = f;
         l_fonts[2] = 0;
     }
-
     /* parameters */
     no_math = n_boolean_field(L, lua_key_index(nomath), 0);
     read_lua_parameters(L, f);
@@ -1536,11 +1593,9 @@
                 } else if (lt == LUA_TSTRING) {
                     const char *ss1 = lua_tostring(L, -2);
                     if (lua_key_eq(ss1, left_boundary)) {
-                        font_char_from_lua(L, f, left_boundarychar, l_fonts,
-                                           !no_math);
+                        font_char_from_lua(L, f, left_boundarychar, l_fonts, !no_math);
                     } else if (lua_key_eq(ss1, right_boundary)) {
-                        font_char_from_lua(L, f, right_boundarychar, l_fonts,
-                                           !no_math);
+                        font_char_from_lua(L, f, right_boundarychar, l_fonts, !no_math);
                     }
                 }
                 lua_pop(L, 1);
@@ -1561,7 +1616,6 @@
                 if (fstep != 0) {
                     int fshrink = lua_numeric_field_by_index(L, lua_key_index(shrink), 0);
                     int fstretch =lua_numeric_field_by_index(L, lua_key_index(stretch), 0);
-                    int fexpand = n_boolean_field(L, lua_key_index(auto_expand), 0);
                     if (fshrink < 0)
                         fshrink = 0;
                     if (fshrink > 500)
@@ -1576,7 +1630,7 @@
                     fstretch -= (fstretch % fstep);
                     if (fstretch < 0)
                         fstretch = 0;
-                    set_expand_params(f, fexpand, fstretch, fshrink, fstep);
+                    set_expand_params(f, fstretch, fshrink, fstep);
                 }
             }
 
@@ -1601,6 +1655,129 @@
     return true;
 }
 
+int characters_from_lua(lua_State * L, int f)
+{
+    int i, n, t, lt;
+    int *l_fonts = NULL;
+    int s_top;
+    const char *ss;
+    boolean no_math = false;
+    /* speedup */
+    no_math = n_boolean_field(L, lua_key_index(nomath), 0);
+    /* type */
+    i = n_enum_field(L, lua_key_index(type), font_type(f), font_type_strings);
+    set_font_type(f, i);
+    /* fonts */
+    count_hash_items(L, fonts, n);
+    if (n > 0) {
+        /* font table still on stack */
+        l_fonts = xmalloc((unsigned) ((unsigned) (n + 2) * sizeof(int)));
+        memset(l_fonts, 0, (size_t) ((unsigned) (n + 2) * sizeof(int)));
+        for (i = 1; i <= n; i++) {
+            lua_rawgeti(L, -1, i);
+            if (lua_istable(L, -1)) {
+                lua_key_rawgeti(id);
+                if (lua_isnumber(L, -1)) {
+                    l_fonts[i] = (int) lua_tointeger(L, -1);
+                    if (l_fonts[i] == 0) {
+                        l_fonts[i] = (int) f;
+                    }
+                    lua_pop(L, 2); /* pop id and entry */
+                    continue;
+                }
+                lua_pop(L, 1); /* pop id */
+            };
+            ss = NULL;
+            if (lua_istable(L, -1)) {
+                ss = n_string_field(L, lua_key_index(name));
+                /* string is anchored */
+                lua_pop(L,1);
+            }
+            if (ss != NULL) {
+                t = lua_numeric_field_by_index(L, lua_key_index(size), -1000);
+                /* TODO: the stack is messed up, otherwise this explicit resizing would not be needed */
+                s_top = lua_gettop(L);
+                if (strcmp(font_name(f), ss) == 0)
+                    l_fonts[i] = f;
+                else
+                    l_fonts[i] = find_font_id(ss, t);
+                lua_settop(L, s_top);
+            } else {
+                formatted_error("font","invalid local font in lua-loaded font '%s' (3)", font_name(f));
+            }
+            lua_pop(L, 1); /* pop list entry */
+        }
+        lua_pop(L, 1); /* pop font table */
+    } else if (font_type(f) == virtual_font_type) {
+        formatted_error("font","invalid local fonts in lua-loaded font '%s' (4)", font_name(f));
+    } else {
+        l_fonts = xmalloc(3 * sizeof(int));
+        l_fonts[0] = 0;
+        l_fonts[1] = f;
+        l_fonts[2] = 0;
+    }
+    /* characters */
+    lua_key_rawgeti(characters);
+    if (lua_istable(L, -1)) {
+        /* find the array size values */
+        int num = 0;            /* number of charinfo's to add */
+        int todo = 0;
+        int bc = font_bc(f);
+        int ec = font_ec(f);
+        lua_pushnil(L);         /* first key */
+        while (lua_next(L, -2) != 0) {
+            if (lua_isnumber(L, -2)) {
+                i = (int) lua_tointeger(L, -2);
+                if (i >= 0) {
+                    if (lua_istable(L, -1)) {
+                        todo++;
+                        if (! quick_char_exists(f,i)) {
+                            num++;
+                            if (i > ec)
+                                ec = i;
+                            if (bc < 0)
+                                bc = i;
+                            if (bc >= 0 && i < bc)
+                                bc = i;
+                        }
+                    }
+                }
+            }
+            lua_pop(L, 1);
+        }
+        if (todo > 0) {
+            font_malloc_charinfo(f, num);
+            set_font_bc(f, bc);
+            set_font_ec(f, ec);
+            lua_pushnil(L);     /* first key */
+            while (lua_next(L, -2) != 0) {
+                lt = lua_type(L,-2);
+                if (lt == LUA_TNUMBER) {
+                    i = (int) lua_tointeger(L, -2);
+                    if (i >= 0) {
+                        if (quick_char_exists(f,i)) {
+                            charinfo *co = char_info(f, i);
+                            set_charinfo_name(co, NULL);
+                            set_charinfo_tounicode(co, NULL);
+                            set_charinfo_packets(co, NULL);
+                            set_charinfo_ligatures(co, NULL);
+                            set_charinfo_kerns(co, NULL);
+                            set_charinfo_vert_variants(co, NULL);
+                            set_charinfo_hor_variants(co, NULL);
+                        }
+                        font_char_from_lua(L, f, i, l_fonts, !no_math);
+                    }
+                }
+                lua_pop(L, 1);
+            }
+            lua_pop(L, 1);
+        }
+    }
+    if (l_fonts != NULL)
+        free(l_fonts);
+    return true;
+}
+
 @* Ligaturing.
 
 @c
@@ -1995,8 +2172,9 @@
         vlink(tail) = null;
     }
 
-    /* |if (fix_node_lists)| */
-    fix_node_list(head);
+    if (fix_node_lists) {
+        fix_node_list(head);
+    }
 
     prev = head;
     cur = vlink(prev);
@@ -2184,7 +2362,9 @@
         luatex_error(Luas, (i == LUA_ERRRUN ? 0 : 1));
         return tail;
     }
-    fix_node_list(head);
+    if (fix_node_lists) {
+        fix_node_list(head);
+    }
     lua_settop(Luas, top);
     return tail;
 }

Modified: trunk/Build/source/texk/web2c/luatexdir/font/texfont.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/font/texfont.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/font/texfont.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -144,7 +144,6 @@
     int font_max_shrink;
     int font_max_stretch;
     int _font_step;             /* amount of one step of expansion */
-    boolean _font_auto_expand;  /* this font is auto-expanded? */
 
     char _font_tounicode;       /* 1 if info is present */
     fm_entry *_font_map;
@@ -345,9 +344,6 @@
 #  define font_step(a)                   font_tables[a]->_font_step
 #  define set_font_step(a,b)             font_step(a) = b
 
-#  define font_auto_expand(a)            font_tables[a]->_font_auto_expand
-#  define set_font_auto_expand(a,b)      font_auto_expand(a) = b
-
 #  define font_tounicode(a)              font_tables[a]->_font_tounicode
 #  define set_font_tounicode(a,b)        font_tounicode(a) = b
 
@@ -439,6 +435,7 @@
 
 extern charinfo *get_charinfo(internal_font_number f, int c);
 extern int char_exists(internal_font_number f, int c);
+extern int lua_glyph_not_found_callback(internal_font_number f, int c);
 extern charinfo *char_info(internal_font_number f, int c);
 
 /*
@@ -627,6 +624,7 @@
     packet_end_code,
     packet_scale_code,
     packet_lua_code,
+    packet_pdf_code,
 } packet_command_codes;
 
 extern scaled store_scaled_f(scaled sq, int fw);
@@ -655,9 +653,7 @@
 
 extern int fix_expand_value(internal_font_number f, int e);
 
-extern void set_expand_params(internal_font_number f, boolean auto_expand,
-                              int stretch_limit, int shrink_limit,
-                              int font_step);
+extern void set_expand_params(internal_font_number f, int stretch_limit, int shrink_limit, int font_step);
 
 extern void read_expand_font(void);
 extern void new_letterspaced_font(small_number a);

Modified: trunk/Build/source/texk/web2c/luatexdir/font/texfont.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/font/texfont.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/font/texfont.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -348,12 +348,11 @@
 }
 
 @ @c
-#if 0
-static int lua_char_exists_callback(internal_font_number f, int c)
+int lua_glyph_not_found_callback(internal_font_number f, int c)
 {
     int callback_id;
     int ret = 0;
-    callback_id = callback_defined(char_exists_callback);
+    callback_id = callback_defined(glyph_not_found_callback);
     if (callback_id != 0) {
         if (!get_callback(Luas, callback_id)) {
             lua_pop(Luas, 2);
@@ -368,10 +367,11 @@
         } else {
             ret = lua_toboolean(Luas, -1);
         }
+    } else {
+        char_warning(f,c);
     }
     return ret;
 }
-#endif
 
 @ @c
 extinfo *new_variant(int glyph, int startconnect, int endconnect,
@@ -1535,7 +1535,6 @@
     dump_int(f->font_max_shrink);
     dump_int(f->font_max_stretch);
     dump_int(f->_font_step);
-    dump_int(f->_font_auto_expand);
     dump_int(f->_font_tounicode);
     dump_int(f->_font_type);
     dump_int(f->_font_format);
@@ -1715,7 +1714,6 @@
     undump_int(x); f->font_max_shrink = x;
     undump_int(x); f->font_max_stretch = x;
     undump_int(x); f->_font_step = x;
-    undump_int(x); f->_font_auto_expand = x;
     undump_int(x); f->_font_tounicode = (char)x;
     undump_int(x); f->_font_type = x;
     undump_int(x); f->_font_format = x;
@@ -1845,11 +1843,9 @@
 }
 
 @ @c
-void set_expand_params(internal_font_number f, boolean auto_expand,
-                       int stretch_limit, int shrink_limit, int font_step)
-{                               /* expand a font with given parameters */
+void set_expand_params(internal_font_number f, int stretch_limit, int shrink_limit, int font_step)
+{
     set_font_step(f, font_step);
-    set_font_auto_expand(f, auto_expand);
     set_font_max_shrink(f, shrink_limit);
     set_font_max_stretch(f, stretch_limit);
 }
@@ -1859,7 +1855,6 @@
 {                               /* read font expansion spec and load expanded font */
     int shrink_limit, stretch_limit, font_step;
     internal_font_number f;
-    boolean auto_expand;
     /* read font expansion parameters */
     scan_font_ident();
     f = cur_val;
@@ -1885,15 +1880,13 @@
         shrink_limit = 0;
     if ((stretch_limit == 0) && (shrink_limit == 0))
         normal_error("font expansion", "invalid limit(s)");
-    auto_expand = false;
     if (scan_keyword("autoexpand")) {
-        auto_expand = true;
+        normal_warning("font expansion", "autoexpand not supported");
         /* Scan an optional space */
         get_x_token();
         if (cur_cmd != spacer_cmd)
             back_input();
     }
-
     if (font_step(f) != 0) {
         /* this font has been expanded, ensure the expansion parameters are identical */
         if (font_step(f) != font_step)
@@ -1908,14 +1901,10 @@
             ((font_max_shrink(f) > 0)
              && (font_max_shrink(f) != shrink_limit)))
             normal_error("font expansion","font has been expanded with different shrink limit");
-
-        if (font_auto_expand(f) != auto_expand)
-            normal_error("font expansion","font has been expanded with different auto expansion value");
     } else {
         if (font_used(f))
             normal_warning("font expansion", "font should be expanded before its first use");
-        set_expand_params(f, auto_expand, stretch_limit, shrink_limit,
-                          font_step);
+        set_expand_params(f, stretch_limit, shrink_limit, font_step);
     }
 }
 

Modified: trunk/Build/source/texk/web2c/luatexdir/font/vfpacket.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/font/vfpacket.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/font/vfpacket.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -88,6 +88,9 @@
         case packet_rule_code:
             vfp += 8;
             break;
+        case packet_pdf_code:
+            vfp += 4;
+            /* plus a string so we fall through */
         case packet_special_code:
             packet_number(k);   /* +4 */
             vfp += (int) k;
@@ -104,7 +107,7 @@
 @c
 const char *packet_command_names[] = {
     "char", "font", "pop", "push", "special", "image",
-    "right", "down", "rule", "node", "nop", "end", "scale", "lua", NULL
+    "right", "down", "rule", "node", "nop", "end", "scale", "lua", "pdf", NULL
 };
 
 @ @c
@@ -135,7 +138,7 @@
     eight_bits *vfp;
     posstructure *save_posstruct, localpos;
     vf_struct *save_vfstruct, localvfstruct, *vp;
-    int cmd, w;
+    int cmd, w, mode;
     unsigned k;
     scaledpos size;
     scaled i;
@@ -218,7 +221,7 @@
             packet_scaled(size.h, vp->fs_f);
             if (size.h > 0 && size.v > 0)
                 backend_out[rule_node](pdf, 0, size);  /* the 0 is unused */
-           mat_p->pos.h += size.h;
+            mat_p->pos.h += size.h;
             break;
         case packet_right_code:
             packet_scaled(i, vp->fs_f);
@@ -228,6 +231,18 @@
             packet_scaled(i, vp->fs_f);
             mat_p->pos.v += i;
             break;
+        case packet_pdf_code:
+            packet_number(mode);
+            packet_number(k);
+            str_room(k);
+            while (k > 0) {
+                k--;
+                append_char(*(vfp++));
+            }
+            s = make_string();
+            pdf_literal(pdf, s, mode, false);
+            flush_str(s);
+            break;
         case packet_special_code:
             packet_number(k);
             str_room(k);
@@ -387,6 +402,9 @@
                 case packet_rule_code:
                     vfp += 8;
                     break;
+                case packet_pdf_code:
+                    vfp += 4;
+                    /* plus a string so we fall through */
                 case packet_special_code:
                     packet_number(k);
                     vfp += k;

Modified: trunk/Build/source/texk/web2c/luatexdir/font/writefont.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/font/writefont.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/font/writefont.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -578,7 +578,7 @@
                 assert(0);
         }
     }
-    if ((! pdf->omit_cidset) && (cidset != 0)) {
+    if ((! pdf->omit_cidset) && (pdf->major_version == 1) && (cidset != 0) ) {
         pdf_dict_add_ref(pdf, "CIDSet", cidset);
     }
     /*
@@ -901,6 +901,13 @@
 limited to 16-bit values.
 
 @c
+/*
+    This is old code ... it fails when the order of using the same font at
+    different extends changes. Probably because widths get overwritten or
+    set wrong. The loop also looks kind of weird (why a loop).
+*/
+
+/*
 static void mark_cid_subset_glyphs(fo_entry * fo, internal_font_number f)
 {
     int i, k, l;
@@ -925,7 +932,33 @@
         }
     }
 }
+*/
 
+/*
+    So, let's try the following.
+*/
+
+static void mark_cid_subset_glyphs(fo_entry * fo, internal_font_number f)
+{
+    glw_entry *j;
+    void *aa;
+    int l = font_size(f);
+    int i;
+    for (i = font_bc(f); i <= font_ec(f); i++) {
+        if (quick_char_exists(f, i) && char_used(f, i)) {
+            j = xtalloc(1, glw_entry);
+            j->id = (unsigned) char_index(f, i);
+            j->wd = divide_scaled_n(char_width(f, i), l, 10000.0);
+            if ((glw_entry *) avl_find(fo->fd->gl_tree, j) == NULL) {
+                aa = avl_probe(fo->fd->gl_tree, j);
+                assert(aa != NULL);
+            } else {
+                xfree(j);
+            }
+        }
+    }
+}
+
 @ It is possible to compress the widths array even better, by using the
 alternate 'range' syntax and possibly even using /DW to set a default
 value.

Modified: trunk/Build/source/texk/web2c/luatexdir/font/writetype2.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/font/writetype2.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/font/writetype2.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -387,24 +387,26 @@
     /* CIDSet: a table of bits indexed by cid, bytes with high order bit first,
        each (set) bit is a (present) CID. */
     if (is_subsetted(fd->fm)) {
-        cidset = pdf_create_obj(pdf, obj_type_others, 0);
-        if (cidset != 0) {
-            size_t l = (last_cid / 8) + 1;
-            char *stream = xmalloc(l);
-            memset(stream, 0, l);
-            for (cid = 1; cid <= (long) last_cid; cid++) {
-                if (used_chars[cid]) {
-                    stream[(cid / 8)] |= (1 << (7 - (cid % 8)));
+        if ((! pdf->omit_cidset) && (pdf->major_version == 1)) {
+            cidset = pdf_create_obj(pdf, obj_type_others, 0);
+            if (cidset != 0) {
+                size_t l = (last_cid / 8) + 1;
+                char *stream = xmalloc(l);
+                memset(stream, 0, l);
+                for (cid = 1; cid <= (long) last_cid; cid++) {
+                    if (used_chars[cid]) {
+                        stream[(cid / 8)] |= (1 << (7 - (cid % 8)));
+                    }
                 }
+                pdf_begin_obj(pdf, cidset, OBJSTM_NEVER);
+                pdf_begin_dict(pdf);
+                pdf_dict_add_streaminfo(pdf);
+                pdf_end_dict(pdf);
+                pdf_begin_stream(pdf);
+                pdf_out_block(pdf, stream, l);
+                pdf_end_stream(pdf);
+                pdf_end_obj(pdf);
             }
-            pdf_begin_obj(pdf, cidset, OBJSTM_NEVER);
-            pdf_begin_dict(pdf);
-            pdf_dict_add_streaminfo(pdf);
-            pdf_end_dict(pdf);
-            pdf_begin_stream(pdf);
-            pdf_out_block(pdf, stream, l);
-            pdf_end_stream(pdf);
-            pdf_end_obj(pdf);
         }
     }
 

Modified: trunk/Build/source/texk/web2c/luatexdir/image/image.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/image/image.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/image/image.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -126,6 +126,7 @@
     int luaref ;
     boolean keepopen;
     int errorlevel;
+    int pdfmajorversion;
     int pdfminorversion;
     union {
         pdf_stream_struct *pdfstream;
@@ -171,6 +172,7 @@
 #  define img_luaref(N)           ((N)->luaref)
 #  define img_keepopen(N)         ((N)->keepopen)
 #  define img_errorlevel(N)       ((N)->errorlevel)
+#  define img_pdfmajorversion(N)  ((N)->pdfmajorversion)
 #  define img_pdfminorversion(N)  ((N)->pdfminorversion)
 
 #  define img_pdfstream_ptr(N)    ((N)->img_struct.pdfstream)

Modified: trunk/Build/source/texk/web2c/luatexdir/image/pdftoepdf.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/image/pdftoepdf.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/image/pdftoepdf.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -27,6 +27,10 @@
 /*
     This file is mostly C and not very much C++; it's just used to interface
     the functions of poppler, which happens to be written in C++.
+    Patches for the new poppler 0.59 from
+    https://www.mail-archive.com/arch-commits@archlinux.org/msg357548.html
+    with some modifications to comply the poppler API.
+
 */
 
 extern void md5(Guchar *msg, int msgLen, Guchar *digest);
@@ -71,7 +75,7 @@
         ck = (char *) malloc(PDF_CHECKSUM_SIZE);
         if (ck == NULL)
             formatted_error("pdf inclusion","out of memory while processing '%s'", a);
-        snprintf(ck, PDF_CHECKSUM_SIZE, "%" PRIu64 "_%" PRIu64, (uint64_t) size,(uint64_t) mtime);
+        snprintf(ck, PDF_CHECKSUM_SIZE, "%"@= @>PRIu64@= @>"_%"@=  @>PRIu64, (uint64_t) size,(uint64_t) mtime);
    } else {
         switch (fe) {
             case FE_FAIL:
@@ -224,7 +228,7 @@
         free(checksum);
     }
     if (pdf_doc->doc == NULL) {
-        docmemstream = new MemStream( docstream,0,streamsize, obj.initNull() );
+        docmemstream = new MemStream( docstream,0,streamsize, Object(objNull) );
         doc = new PDFDoc(docmemstream); /* takes ownership of docmemstream */
         pdf_doc->pc++;
         if (!doc->isOk() || !doc->okToPrint()) {
@@ -408,9 +412,8 @@
     Object obj1;
     pdf_begin_array(pdf);
     for (i = 0, l = array->getLength(); i < l; ++i) {
-        array->getNF(i, &obj1);
+        obj1 = array->getNF(i);
         copyObject(pdf, pdf_doc, &obj1);
-        obj1.free();
     }
     pdf_end_array(pdf);
 }
@@ -422,9 +425,8 @@
     pdf_begin_dict(pdf);
     for (i = 0, l = dict->getLength(); i < l; ++i) {
         copyName(pdf, dict->getKey(i));
-        dict->getValNF(i, &obj1);
+        obj1 = dict->getValNF(i);
         copyObject(pdf, pdf_doc, &obj1);
-        obj1.free();
     }
     pdf_end_dict(pdf);
 }
@@ -510,13 +512,12 @@
     PDFDoc *doc = pdf_doc->doc;
     xref = doc->getXRef();
     for (r = pdf_doc->inObjList; r != NULL;) {
-        xref->fetch(r->ref.num, r->ref.gen, &obj1);
+        obj1 = xref->fetch(r->ref.num, r->ref.gen);
         if (obj1.isStream())
             pdf_begin_obj(pdf, r->num, OBJSTM_NEVER);
         else
             pdf_begin_obj(pdf, r->num, 2);
         copyObject(pdf, pdf_doc, &obj1);
-        obj1.free();
         pdf_end_obj(pdf);
         n = r->next;
         delete r;
@@ -596,7 +597,7 @@
         pdf_doc = refPdfDocument(img_filepath(idict), FE_FAIL);
     else if (img_type(idict) == IMG_TYPE_PDFMEMSTREAM) {
         pdf_doc = findPdfDocument(img_filepath(idict)) ;
-        if (pdf_doc == NULL ) 
+        if (pdf_doc == NULL )
            normal_error("pdf inclusion", "memstream not initialized");
         if (pdf_doc->doc == NULL)
            normal_error("pdf inclusion", "memstream document is empty");
@@ -613,12 +614,12 @@
     */
     pdf_major_version_found = doc->getPDFMajorVersion();
     pdf_minor_version_found = doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > 1) || (pdf_minor_version_found > img_pdfminorversion(idict))) {
-        const char *msg = "PDF inclusion: found PDF version '%d.%d', but at most version '1.%d' allowed";
+    if ((100 * pdf_major_version_found + pdf_major_version_found) > (100 * img_pdfmajorversion(idict) + img_pdfminorversion(idict))) {
+        const char *msg = "PDF inclusion: found PDF version '%d.%d', but at most version '%d.%d' allowed";
         if (img_errorlevel(idict) > 0) {
-            formatted_error("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfminorversion(idict));
+            formatted_error("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfmajorversion(idict), img_pdfminorversion(idict));
         } else {
-            formatted_warning("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfminorversion(idict));
+            formatted_warning("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfmajorversion(idict), img_pdfminorversion(idict));
         }
     }
     img_totalpages(idict) = catalog->getNumPages();
@@ -740,7 +741,7 @@
     catalog = doc->getCatalog();
     page = catalog->getPage(img_pagenum(idict));
     pageref = catalog->getPageRef(img_pagenum(idict));
-    doc->getXRef()->fetch(pageref->num, pageref->gen, &pageobj);
+    pageobj = doc->getXRef()->fetch(pageref->num, pageref->gen);
     pageDict = pageobj.getDict();
     /* write the Page header */
     pdf_begin_obj(pdf, img_objnum(idict), OBJSTM_NEVER);
@@ -757,12 +758,11 @@
         pdf_dict_add_int(pdf, "PTEX.PageNumber", (int) img_pagenum(idict));
     }
     if ((suppress_optional_info & 8) == 0) {
-        doc->getDocInfoNF(&obj1);
+        obj1 = doc->getDocInfoNF();
         if (obj1.isRef()) {
             /* the info dict must be indirect (PDF Ref p. 61) */
             pdf_dict_add_ref(pdf, "PTEX.InfoDict", addInObj(pdf, pdf_doc, obj1.getRef()));
         }
-        obj1.free();
     }
     if (img_is_bbox(idict)) {
         bbox[0] = sp2bp(img_bbox(idict)[0]);
@@ -788,19 +788,17 @@
         Now all relevant parts of the Page dictionary are copied. Metadata validity
         check is needed(as a stream it must be indirect).
     */
-    pageDict->lookupNF("Metadata", &obj1);
+    obj1 = pageDict->lookupNF("Metadata");
     if (!obj1.isNull() && !obj1.isRef())
         formatted_warning("pdf inclusion","/Metadata must be indirect object");
-    obj1.free();
     /* copy selected items in Page dictionary */
     for (i = 0; pagedictkeys[i] != NULL; i++) {
-        pageDict->lookupNF(pagedictkeys[i], &obj1);
+        obj1 = pageDict->lookupNF(pagedictkeys[i]);
         if (!obj1.isNull()) {
             pdf_add_name(pdf, pagedictkeys[i]);
             /* preserves indirection */
             copyObject(pdf, pdf_doc, &obj1);
         }
-        obj1.free();
     }
     /*
         If there are no Resources in the Page dict of the embedded page,
@@ -808,32 +806,28 @@
         PDF file, climbing up the tree until the Resources are found.
         (This fixes a problem with Scribus 1.3.3.14.)
     */
-    pageDict->lookupNF("Resources", &obj1);
+    obj1 = pageDict->lookupNF("Resources");
     if (obj1.isNull()) {
         op1 = &pagesobj1;
         op2 = &pagesobj2;
-        pageDict->lookup("Parent", op1);
+        *op1 = pageDict->lookup("Parent");
         while (op1->isDict()) {
-            obj1.free();
-            op1->dictLookupNF("Resources", &obj1);
+            obj1 = op1->dictLookupNF("Resources");
             if (!obj1.isNull()) {
                 pdf_add_name(pdf, "Resources");
                 copyObject(pdf, pdf_doc, &obj1);
                 break;
             }
-            op1->dictLookup("Parent", op2);
+            *op2 = op1->dictLookup("Parent");
             optmp = op1;
             op1 = op2;
             op2 = optmp;
-            op2->free();
         };
         if (!op1->isDict())
             formatted_warning("pdf inclusion","Page /Resources missing");
-        op1->free();
     }
-    obj1.free();
     /* Write the Page contents. */
-    page->getContents(&contents);
+    contents = page->getContents();
     if (contents.isStream()) {
         /*
             Variant A: get stream and recompress under control of \pdfcompresslevel
@@ -844,27 +838,23 @@
 
             Variant B: copy stream without recompressing
         */
-        contents.streamGetDict()->lookup("F", &obj1);
+        obj1 = contents.streamGetDict()->lookup("F");
         if (!obj1.isNull()) {
             normal_error("pdf inclusion","unsupported external stream");
         }
-        obj1.free();
-        contents.streamGetDict()->lookup("Length", &obj1);
+        obj1 = contents.streamGetDict()->lookup("Length");
         pdf_add_name(pdf, "Length");
         copyObject(pdf, pdf_doc, &obj1);
-        obj1.free();
-        contents.streamGetDict()->lookup("Filter", &obj1);
+        obj1 = contents.streamGetDict()->lookup("Filter");
         if (!obj1.isNull()) {
             pdf_add_name(pdf, "Filter");
             copyObject(pdf, pdf_doc, &obj1);
-            obj1.free();
-            contents.streamGetDict()->lookup("DecodeParms", &obj1);
+            obj1 = contents.streamGetDict()->lookup("DecodeParms");
             if (!obj1.isNull()) {
                 pdf_add_name(pdf, "DecodeParms");
                 copyObject(pdf, pdf_doc, &obj1);
             }
         }
-        obj1.free();
         pdf_end_dict(pdf);
         pdf_begin_stream(pdf);
         copyStreamStream(pdf, contents.getStream()->getUndecodedStream());
@@ -875,8 +865,8 @@
         pdf_end_dict(pdf);
         pdf_begin_stream(pdf);
         for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            copyStreamStream(pdf, (contents.arrayGet(i, &obj1))->getStream());
-            obj1.free();
+            obj1 = contents.arrayGet(i);
+            copyStreamStream(pdf, obj1.getStream());
             if (i < (l - 1)) {
                 /*
                     Put a space between streams to be on the safe side (streams
@@ -897,8 +887,6 @@
     }
     /* write out all indirect objects */
     writeRefs(pdf, pdf_doc);
-    contents.free();
-    pageobj.free();
     /*
         unrefPdfDocument() must come after contents.free() and pageobj.free()!
         TH: The next line makes repeated pdf inclusion unacceptably slow

Modified: trunk/Build/source/texk/web2c/luatexdir/image/writeimg.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/image/writeimg.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/image/writeimg.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -100,7 +100,7 @@
 #define HEADER_PNG "\x89PNG\r\n\x1A\n"
 #define HEADER_JBIG2 "\x97\x4A\x42\x32\x0D\x0A\x1A\x0A"
 #define HEADER_JP2 "\x6A\x50\x20\x20"
-#define HEADER_PDF "%PDF-1."
+#define HEADER_PDF "%PDF-"
 #define MAX_HEADER (sizeof(HEADER_PNG)-1)
 #define HEADER_PDF_MEMSTREAM "data:application/pdf," /* see epdf.h */
 #define LEN_PDF_MEMSTREAM 21 /* see epdf.h */
@@ -217,7 +217,8 @@
     img_index(p) = -1; /* -1 = unused, used count from 0 */
     img_luaref(p) = 0;
     img_errorlevel(p) = pdf_inclusion_errorlevel;
-    fix_pdf_minorversion(static_pdf);
+    fix_pdf_version(static_pdf);
+    img_pdfmajorversion(p) = pdf_major_version;
     img_pdfminorversion(p) = pdf_minor_version;
     return p;
 }

Modified: trunk/Build/source/texk/web2c/luatexdir/image/writejbig2.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/image/writejbig2.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/image/writejbig2.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -762,7 +762,7 @@
 @ @c
 boolean supported_jbig2(image_dict * idict)
 {
-    if (img_pdfminorversion(idict) < 4) {
+    if (img_pdfmajorversion(idict) < 2 && img_pdfminorversion(idict) < 4) {
         normal_error("readjbig2","you need to generate at least PDF 1.4");
         return false;
     } else {

Modified: trunk/Build/source/texk/web2c/luatexdir/image/writejpg.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/image/writejpg.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/image/writejpg.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -132,9 +132,9 @@
 XResolution, YResolution and ResolutionUnit (tag 282, 283 and 296)
 as well as PixelPerUnitX, PixelPerUnitY and PixelUnit (tag 0x5111,
 0x5112 and 0x5110). Tags 282, 293 and 296 have the priority,
-with ResolutionUnit set to inch by default, then 
+with ResolutionUnit set to inch by default, then
 tag 0x5110, 0x5111 and 0x5112, where the only valid value for PixelUnit is 0.0254,
-and finally the given value xx and yy, 
+and finally the given value xx and yy,
 choosen if the Exif x and y resolution are not strictly positive.
 
 
@@ -256,7 +256,7 @@
 		        res_unit_ms = 0.0254; /* Unit is meter */
 			break;
 		    default:
-  		        res_unit_ms = 0; 
+  		        res_unit_ms = 0;
 		}
 	   case 0x5111: /* PixelPerUnitX */
                 found_x_ms = true ;
@@ -269,13 +269,13 @@
            }
 
 
-    }    
+    }
     if (found_x && found_y && res_unit>0) {
-     found_res = true; 
+     found_res = true;
      tempx = (int)(xres * res_unit+0.5);
      tempy = (int)(yres * res_unit+0.5);
     } else if (found_x_ms && found_y_ms && res_unit_ms==0.0254) {
-     found_res = true; 
+     found_res = true;
      tempx = (int)(xres_ms * res_unit_ms+0.5);
      tempy = (int)(yres_ms * res_unit_ms+0.5);
     }
@@ -394,7 +394,7 @@
                 formatted_error("readjpg","unsupported compression SOF_%d", i - M_SOF0);
                 break;
             case M_SOF2:
-                if (img_pdfminorversion(idict) <= 2) {
+                if (img_pdfmajorversion(idict) < 2 && img_pdfminorversion(idict) <= 2) {
                     normal_error("readjpg","progressive DCT with PDF-1.2 is not permitted");
                 }
             case M_SOF0:

Modified: trunk/Build/source/texk/web2c/luatexdir/lang/hyphen.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lang/hyphen.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lang/hyphen.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -776,6 +776,8 @@
 }
 
 @ @c
+extern halfword insert_syllable_discretionary(halfword t, lang_variables * lan);
+
 void hnj_hyphen_hyphenate(HyphenDict * dict,
                           halfword first1,
                           halfword last1,
@@ -791,9 +793,9 @@
     char *hyphens = hnj_malloc(hyphen_len + 1);
 
     /* Add a '.' to beginning and end to facilitate matching */
-    set_vlink(begin_point, first1);
-    set_vlink(end_point, get_vlink(last1));
-    set_vlink(last1, end_point);
+    vlink(begin_point) = first1;
+    vlink(end_point) = vlink(last1);
+    vlink(last1) = end_point;
 
     for (char_num = 0; char_num < hyphen_len; char_num++) {
         hyphens[char_num] = '0';
@@ -801,16 +803,16 @@
     hyphens[hyphen_len] = 0;
 
     /* now, run the finite state machine */
-    for (char_num = 0, here = begin_point; here != get_vlink(end_point);
-         here = get_vlink(here)) {
+    for (char_num = 0, here = begin_point; here != vlink(end_point);
+         here = vlink(here)) {
 
         int ch;
         if (here == begin_point || here == end_point) {
             ch = '.';
         } else {
-            ch = get_hj_code(char_lang(here),get_character(here));
+            ch = get_hj_code(char_lang(here),character(here));
             if (ch <= 32) {
-                ch = get_character(here);
+                ch = character(here);
             }
         }
         while (state != -1) {
@@ -857,14 +859,14 @@
     }
 
     /* restore the correct pointers */
-    set_vlink(last1, get_vlink(end_point));
+    vlink(last1) = vlink(end_point);
 
     /* pattern is \.{\^.\^w\^o\^r\^d\^.\^}   |word_len|=4, |ext_word_len|=6, |hyphens|=7
      * check      \.{    \^ \^ \^    }   so drop first two and stop after |word_len-1|
      */
-    for (here = first1, char_num = 2; here != left; here = get_vlink(here))
+    for (here = first1, char_num = 2; here != left; here = vlink(here))
         char_num++;
-    for (; here != right; here = get_vlink(here)) {
+    for (; here != right; here = vlink(here)) {
         if (hyphens[char_num] & 1)
             here = insert_syllable_discretionary(here, lan);
         char_num++;

Modified: trunk/Build/source/texk/web2c/luatexdir/lang/texlang.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lang/texlang.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lang/texlang.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -67,7 +67,7 @@
 extern void set_hyphenation_min(int lan, int val);
 extern int get_hyphenation_min(int lan);
 
-extern halfword compound_word_break(halfword t, int clang);
+/* extern halfword compound_word_break(halfword t, int clang); */
 
 extern void dump_language_data(void);
 extern void undump_language_data(void);
@@ -82,5 +82,7 @@
 extern void new_hyphenation_min(void);
 extern void new_hj_code(void);
 
+extern void set_disc_field(halfword f, halfword t);
+extern halfword insert_syllable_discretionary(halfword t, lang_variables * lan);
 
 #endif

Modified: trunk/Build/source/texk/web2c/luatexdir/lang/texlang.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lang/texlang.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lang/texlang.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -60,7 +60,8 @@
         lang->post_exhyphen_char = 0;
         lang->hyphenation_min = -1;
         if (saving_hyph_codes_par) {
-            hj_codes_from_lc_codes(l); /* for now, we might just use specific value for whatever task */
+            /* for now, we might just use specific value for whatever task */
+            hj_codes_from_lc_codes(l);
         }
         return lang;
     } else {
@@ -198,10 +199,10 @@
 const char *clean_hyphenation(int id, const char *buff, char **cleaned)
 {
     int items = 0;
-    unsigned char word[MAX_WORD_LEN + 1]; /* work buffer for bytes */
-    unsigned uword[MAX_WORD_LEN + 1] = { 0 };  /* work buffer for unicode */
-    int u = 0; /* unicode buffer value */
-    int i = 0; /* index into buffer */
+    unsigned char word[MAX_WORD_LEN + 1];     /* work buffer for bytes */
+    unsigned uword[MAX_WORD_LEN + 1] = { 0 }; /* work buffer for unicode */
+    int u = 0;                                /* unicode buffer value */
+    int i = 0;                                /* index into buffer */
     char *uindex = (char *)word;
     const char *s = buff;
 
@@ -218,12 +219,12 @@
     /* now convert the input to unicode */
     word[i] = '\0';
     utf2uni_strcpy(uword, (const char *)word);
-
     /* build the new word string */
     i = 0;
     while (uword[i]>0) {
         u = uword[i++];
-        if (u == '-') {        /* skip */
+        if (u == '-') {
+            /* skip */
         } else if (u == '=') {
             STORE_CHAR(id,'-');
         } else if (u == '{') {
@@ -253,7 +254,7 @@
             if (u == '}') {
                 items++;
             }
-            if (items != 3) {   /* syntax error */
+            if (items != 3) {
                 *cleaned = NULL;
                 tex_error("exception syntax error", NULL);
                 return s;
@@ -322,51 +323,61 @@
 }
 
 @ @c
-halfword insert_discretionary(halfword t, halfword pre, halfword post, halfword replace, int penalty)
+static halfword insert_discretionary(halfword t, halfword pre, halfword post, halfword replace, int penalty)
 {
-    halfword g, n;
+    halfword g;
     int f;
-    n = new_node(disc_node, syllable_disc);
-    disc_penalty(n) = penalty;
-    try_couple_nodes(n, vlink(t));
-    couple_nodes(t, n);
-    if (replace != null)
+    halfword d = new_node(disc_node, syllable_disc);
+    int attr = node_attr(t) ;
+    disc_penalty(d) = penalty;
+    if (t == replace) {
+        /* prev disc next-next */
+        try_couple_nodes(d, vlink(t));
+        try_couple_nodes(alink(t), d);
+        alink(t) = null;
+        vlink(t) = null;
+        replace = t ;
+    } else {
+        /* prev disc next */
+        try_couple_nodes(d, vlink(t));
+        couple_nodes(t, d);
+    }
+    if (replace != null) {
         f = font(replace);
-    else
-        f = get_cur_font();     /* for compound words following explicit hyphens */
+    } else {
+        /* For compound words following explicit hyphens. */
+        f = get_cur_font();
+    }
     for (g = pre; g != null; g = vlink(g)) {
         font(g) = f;
-        if (node_attr(t) != null) {
+        if (attr != null) {
             delete_attribute_ref(node_attr(g));
-            node_attr(g) = node_attr(t);
-            attr_list_ref(node_attr(t)) += 1;
+            node_attr(g) = attr;
+            attr_list_ref(attr) += 1;
         }
     }
     for (g = post; g != null; g = vlink(g)) {
         font(g) = f;
-        if (node_attr(t) != null) {
+        if (attr != null) {
             delete_attribute_ref(node_attr(g));
-            node_attr(g) = node_attr(t);
-            attr_list_ref(node_attr(t)) += 1;
+            node_attr(g) = attr;
+            attr_list_ref(attr) += 1;
         }
     }
-    for (g = replace; g != null; g = vlink(g)) {
-        if (node_attr(t) != null) {
+    if (attr != null) {
+        for (g = replace; g != null; g = vlink(g)) {
             delete_attribute_ref(node_attr(g));
-            node_attr(g) = node_attr(t);
-            attr_list_ref(node_attr(t)) += 1;
+            node_attr(g) = attr;
+            attr_list_ref(attr) += 1;
         }
+        delete_attribute_ref(node_attr(d));
+        node_attr(d) = attr;
+        attr_list_ref(attr) += 1;
     }
-    if (node_attr(t) != null) {
-        delete_attribute_ref(node_attr(vlink(t)));
-        node_attr(vlink(t)) = node_attr(t);
-        attr_list_ref(node_attr(t)) += 1;
-    }
-    t = vlink(t);
-    set_disc_field(pre_break(t), pre);
-    set_disc_field(post_break(t), post);
-    set_disc_field(no_break(t), replace);
-    return t;
+    set_disc_field(pre_break(d), pre);
+    set_disc_field(post_break(d), post);
+    set_disc_field(no_break(d), replace);
+    return d;
 }
 
 halfword insert_syllable_discretionary(halfword t, lang_variables * lan)
@@ -413,43 +424,38 @@
 }
 
 @ @c
-halfword compound_word_break(halfword t, int clang)
+static halfword insert_character(halfword t, int c)
 {
+    halfword p;
+    p = new_node(glyph_node, 0);
+    set_to_character(p);
+    character(p) = c;
+    if (t != null) {
+        couple_nodes(t, p);
+    }
+    return p;
+}
+
+static halfword compound_word_break(halfword t, int clang)
+{
     halfword disc = null;
     halfword pre = null;
     halfword pos = null;
     halfword pre_exhyphen_char = get_pre_exhyphen_char(clang);
     halfword post_exhyphen_char = get_post_exhyphen_char(clang);
-    if (pre_exhyphen_char > 0)
+    if (pre_exhyphen_char > 0) {
         pre = insert_character(null,pre_exhyphen_char);
+    } else {
+        pre = insert_character(null,ex_hyphen_char_par);
+    }
     if (post_exhyphen_char > 0)
         pos = insert_character(null,post_exhyphen_char);
-    disc = insert_discretionary(t,pre,pos,null,ex_hyphen_penalty_par);
+    disc = insert_discretionary(t,pre,pos,t,ex_hyphen_penalty_par);
     subtype(disc) = automatic_disc;
     set_automatic_disc_penalty(disc);
     return disc;
 }
 
-halfword insert_complex_discretionary(halfword t, lang_variables * lan,
-                                      halfword pre, halfword pos,
-                                      halfword replace)
-{
-    (void) lan;
-    return insert_discretionary(t,pre,pos,replace,hyphen_penalty_par);
-}
-
-halfword insert_character(halfword t, int c)
-{
-    halfword p;
-    p = new_node(glyph_node, 0);
-    set_to_character(p);
-    character(p) = c;
-    if (t != null) {
-        couple_nodes(t, p);
-    }
-    return p;
-}
-
 @ @c
 void set_disc_field(halfword f, halfword t)
 {
@@ -713,6 +719,20 @@
 
 */
 
+/*
+    We only accept an explicit hyphen when there is a preceding glyph and we skip a sequence of
+    explicit hyphens as that normally indicates a -- or --- ligature in which case we can in a
+    worse case usage get bad node lists later on due to messed up ligature building as these
+    dashes are ligatures in base fonts. This is a side effect of the separating the hyphenation,
+    ligaturing and kerning steps. A test is cmr with ------.
+
+    A font handler can collapse successive hyphens but it's not nice to put the burden there. A
+    somewhat messy border case is ---- but in LuaTeX we don't treat -- and --- special. Also,
+    traditional TeX will break a line at -foo but this can be disabled by setting the automatic
+    mode to 1.
+
+*/
+
 static halfword find_next_wordstart(halfword r, halfword first_language, halfword strict_bound)
 {
     register int l;
@@ -757,21 +777,23 @@
             if (is_simple_character(r)) {
                 chr = character(r) ;
                 if (chr == ex_hyphen_char_par) {
-                    /*
-                        We only accept an explicit hyphen when there is a preceding glyph and
-                        we skip a sequence of explicit hyphens as that normally indicates a
-                        -- or --- ligature in which case we can in a worse case usage get bad
-                        node lists later on due to messed up ligature building as these dashes
-                        are ligatures in base fonts. This is a side effect of the separating the
-                        hyphenation, ligaturing and kerning steps. A test is cmr with ------.
-                    */
                     t = vlink(r) ;
-                    if ((start_ok == 0) && (t!=null) && (type(t) == glyph_node) && (character(t) != ex_hyphen_char_par)) {
-                        compound_word_break(r, char_lang(r));
-                        start_ok = 1 ;
+                    if ((automatic_hyphen_mode_par == 0) && (t != null) && (type(t) == glyph_node) && (character(t) != ex_hyphen_char_par)) {
+                        /* we have no word yet and the next character is a non hyphen */
+                        r = compound_word_break(r, char_lang(r));
                     } else {
-                        start_ok = 0;
+                        /* we jump over the sequence of hyphens */
+                        while ((t != null) && (type(t) == glyph_node) && (character(t) == ex_hyphen_char_par)) {
+                            r = t ;
+                            t = vlink(r) ;
+                        }
+                        if (t == null) {
+                            /* we reached the end of the list so we have no word start */
+                            return null;
+                        }
                     }
+                    /* we need a restart */
+                    start_ok = 0;
                 } else if (start_ok && (char_lang(r)>=first_language) && ((l = get_hj_code(char_lang(r),chr)) > 0)) {
                     if (char_uchyph(r) || l == chr || l <= 32) {
                         return r;
@@ -778,6 +800,8 @@
                     } else {
                         start_ok = 0;
                     }
+                } else {
+                    /* go on */
                 }
             }
             break;
@@ -839,18 +863,23 @@
     halfword strict_bound = hyphenation_bounds_par;
     halfword s, r = head, wordstart = null, save_tail1 = null, left = null, right = null;
 
-    /* this first movement assures two things:
-     \item{a)} that we won't waste lots of time on something that has been
-      handled already (in that case, none of the glyphs match |simple_character|).
-     \item{b)} that the first word can be hyphenated. if the movement was
-     not explicit, then the indentation at the start of a paragraph
-     list would make |find_next_wordstart()| look too far ahead.
-     */
+    /*
+        This first movement assures two things:
 
+        \item{a)} that we won't waste lots of time on something that has been handled already
+        (in that case, none of the glyphs match |simple_character|).
+
+        \item{b)} that the first word can be hyphenated. if the movement was not explicit,
+        then the indentation at the start of a paragraph list would make |find_next_wordstart()|
+        look too far ahead.
+    */
+
     while (r != null && (type(r) != glyph_node || !is_simple_character(r))) {
         r = vlink(r);
     }
-    /* this will make |r| a glyph node with subtype character */
+    /*
+        This will make |r| a glyph node with subtype character.
+    */
     r = find_next_wordstart(r,first_language,strict_bound);
     if (r == null)
         return;
@@ -860,7 +889,7 @@
     s = new_penalty(0,word_penalty);
     couple_nodes(tail, s);
 
-    while (r != null) {         /* could be while(1), but let's be paranoid */
+    while (r != null) { /* could be while(1), but let's be paranoid */
         int clang, lhmin, rhmin, hmin;
         halfword hyf_font;
         halfword end_word = r;
@@ -867,8 +896,10 @@
         wordstart = r;
         assert(is_simple_character(wordstart));
         hyf_font = font(wordstart);
-        if (hyphen_char(hyf_font) < 0)  /* for backward compat */
+        if (hyphen_char(hyf_font) < 0) {
+            /* For backward compatibility: */
             hyf_font = 0;
+        }
         clang = char_lang(wordstart);
         lhmin = char_lhmin(wordstart);
         rhmin = char_rhmin(wordstart);
@@ -889,6 +920,7 @@
               ) {
             if (character(r) == ex_hyphen_char_par) {
                 explicit_hyphen = true;
+                break;
             }
             wordlen++;
             if (lchar <= 32) {
@@ -911,12 +943,27 @@
                 lchar = character(r) ;
             }
             hy = uni2string(hy, (unsigned) lchar);
-            /* this should not be needed  any more */
-            /*if (vlink(r)!=null) alink(vlink(r))=r; */
             end_word = r;
             r = vlink(r);
         }
-        if (     valid_wordend(r,strict_bound)
+        if (explicit_hyphen == true) {
+            /* we are not at the start, so we only need to look ahead */
+            halfword t = vlink(r) ;
+            if ((automatic_hyphen_mode_par == 0 || automatic_hyphen_mode_par == 1) && (t != null) && ((type(t) == glyph_node) && (character(t) != ex_hyphen_char_par))) {
+                /* we have a word already but the next character may not be a hyphen too */
+                r = compound_word_break(r, char_lang(r));
+            } else {
+                /* we jump over the sequence of hyphens */
+                while ((t != null) && (type(t) == glyph_node) && (character(t) == ex_hyphen_char_par)) {
+                    r = t ;
+                    t = vlink(r) ;
+                }
+                if (t == null) {
+                    /* we reached the end of the list and will quit the loop later */
+                    r = null;
+                }
+            }
+        } else if (     valid_wordend(r,strict_bound)
               && clang >= first_language
               && wordlen >= lhmin + rhmin
               && (hmin <= 0 || wordlen >= hmin)
@@ -924,35 +971,10 @@
               && (lang = tex_languages[clang]) != NULL
            ) {
             *hy = 0;
-            if (    lang->exceptions != 0
-                 && (replacement = hyphenation_exception(lang->exceptions, utf8word)) != NULL
-               ) {
-#ifdef VERBOSE
-                formatted_warning("hyphenation","replacing %s (c=%d) by %s", utf8word, clang, replacement);
-#endif
+            if (lang->exceptions != 0 && (replacement = hyphenation_exception(lang->exceptions, utf8word)) != NULL) {
+                /* handle the exception and go on to the next word */
                 do_exception(wordstart, r, replacement);
                 free(replacement);
-            } else if (explicit_hyphen == true) {
-                /*
-                    insert an explicit discretionary after each of the last in a
-                    set of explicit hyphens
-                */
-                halfword rr = r;
-#ifdef VERBOSE
-                formatted_warning("hyphenation","explicit hyphen(s) found in %s (c=%d)", utf8word, clang);
-#endif
-                while (rr != wordstart) {
-                if (is_simple_character(rr)) {
-                        if (character(rr) == ex_hyphen_char_par) {
-                            compound_word_break(rr, clang);
-                            while (character(alink(rr)) == ex_hyphen_char_par)
-                                rr = alink(rr);
-                            if (rr == wordstart)
-                                break;
-                        }
-                    }
-                    rr = alink(rr);
-                }
             } else if (lang->patterns != NULL) {
                 left = wordstart;
                 for (i = lhmin; i > 1; i--) {
@@ -960,10 +982,7 @@
                     while (!is_simple_character(left)) {
                         left = vlink(left);
                     }
-                    /*
-                    if (!left)
-                        break ;
-                    */
+                    /* if (!left) break; */
                     /* what is left overruns right .. a bit messy */
                 }
                 right = r;
@@ -972,20 +991,10 @@
                     while (!is_simple_character(right)) {
                         right = alink(right);
                     }
-                    /*
-                    if (!right)
-                        break ;
-                    */
+                    /* if (!right) break; */
                     /* what is right overruns left .. a bit messy */
                 }
-                /* maybe an extra check ... */
-                /* |if (left && right) {| */
-#ifdef VERBOSE
-                    formatted_warning("hyphenation","hyphenate %s (c=%d,l=%d,r=%d) from %c to %c",
-                        utf8word, clang, lhmin, rhmin, character(left), character(right));
-#endif
-                    (void) hnj_hyphen_hyphenate(lang->patterns, wordstart, end_word, wordlen, left, right, &langdata);
-                /* |}| */
+                (void) hnj_hyphen_hyphenate(lang->patterns, wordstart, end_word, wordlen, left, right, &langdata);
             }
         }
         explicit_hyphen = false;
@@ -1026,7 +1035,7 @@
     }
 }
 
-@ dumping and undumping languages
+@ Dumping and undumping languages.
 
 @c
 #define dump_string(a)                \
@@ -1139,20 +1148,19 @@
     flush_list(def_ref);
 }
 
-@ Similarly, when \TeX\ has scanned `\.{\\patterns}', it calls on a
-procedure named |new_patterns|.
+@ Similarly, when \TeX\ has scanned `\.{\\patterns}', it calls on a procedure named
+|new_patterns|.
 
 @c
 void new_patterns(void)
-{                               /* initializes the hyphenation pattern data */
+{
     (void) scan_toks(false, true);
     load_tex_patterns(language_par, def_ref);
     flush_list(def_ref);
 }
 
-@ `\.{\\prehyphenchar}', sets the |pre_break| character, and
-`\.{\\posthyphenchar}' the |post_break| character. Their respective defaults are
-ascii hyphen ("-") and zero (nul).
+@ `\.{\\prehyphenchar}', sets the |pre_break| character, and `\.{\\posthyphenchar}' the
+|post_break| character. Their respective defaults are ascii hyphen ("-") and zero (nul).
 
 @c
 void new_pre_hyphen_char(void)
@@ -1169,9 +1177,8 @@
     set_post_hyphen_char(language_par, cur_val);
 }
 
-@ `\.{\\preexhyphenchar}', sets the |pre_break| character, and
-`\.{\\postexhyphenchar}' the |post_break| character. Their defaults are both zero
-(nul).
+@ `\.{\\preexhyphenchar}', sets the |pre_break| character, and `\.{\\postexhyphenchar}' the
+|post_break| character. Their defaults are both zero (nul).
 
 @c
 void new_pre_exhyphen_char(void)

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lauxlib_bridge.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lauxlib_bridge.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lauxlib_bridge.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -36,6 +36,5 @@
 #endif
 
 #define luaL_newlibtable(L,l)   lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
-#define luaL_newlib(L,l)        (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
 
 #endif

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -54,7 +54,7 @@
     "pre_output_filter",
     "buildpage_filter",
     "hpack_filter", "vpack_filter",
-    "char_exists",
+    "glyph_not_found",
     "hyphenate",
     "ligaturing",
     "kerning",
@@ -75,6 +75,7 @@
     "call_edit",
     "build_page_insert",
     "glyph_stream_provider",
+    "finish_synctex_callback",
     NULL
 };
 

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lepdflib.cc
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lepdflib.cc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lepdflib.cc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -21,8 +21,10 @@
 
 #include "image/epdf.h"
 
+// Patches for the new poppler 0.59 from 
+// https://www.mail-archive.com/arch-commits@archlinux.org/msg357548.html
+// with some modifications to comply the poppler API.
 
-
 // define DEBUG
 
 //**********************************************************************
@@ -253,6 +255,12 @@
    lua_settable(L,-3)
 
 
+#define OBJECT_TYPE(name)                   \
+   lua_pushstring(L, #name);                \
+   lua_pushinteger(L, (int)name);           \
+   lua_settable(L,-3)
+
+
 #define STRUCTELEMENT_TYPE_ENTRY(name)      \
    lua_pushstring(L, #name);                \
    lua_pushinteger(L, StructElement::name); \
@@ -306,6 +314,28 @@
    return 1;
 }
 
+static int l_Object_Type(lua_State * L) {
+   lua_createtable(L,0,16);/*nr of ObjType values*/ ;
+   OBJECT_TYPE(objBool);
+   OBJECT_TYPE(objInt);
+   OBJECT_TYPE(objReal);
+   OBJECT_TYPE(objString);
+   OBJECT_TYPE(objName);
+   OBJECT_TYPE(objNull);
+   OBJECT_TYPE(objArray);
+   OBJECT_TYPE(objDict);
+   OBJECT_TYPE(objStream);
+   OBJECT_TYPE(objRef);
+   OBJECT_TYPE(objCmd);
+   OBJECT_TYPE(objError);
+   OBJECT_TYPE(objEOF);
+   OBJECT_TYPE(objNone);
+   OBJECT_TYPE(objInt64);
+   OBJECT_TYPE(objDead);
+   return 1;
+}
+
+
 static int l_StructElement_Type(lua_State * L) {
    lua_createtable (L, 0, 50);
    STRUCTELEMENT_TYPE_ENTRY(Document);
@@ -398,14 +428,136 @@
 static int l_new_Object(lua_State * L)
 {
     udstruct *uout;
+    int n = lua_gettop(L); // number of arguments
     uout = new_Object_userdata(L);
-    uout->d = new Object();     // automatic init to type "none"
-    uout->atype = ALLOC_LEPDF;
-    uout->pc = 0;
-    uout->pd = NULL;            // not connected to any PDFDoc
+    switch(n) {
+    case 0:
+      uout->d = new Object();     // automatic init to type "none"
+      uout->atype = ALLOC_LEPDF;
+      uout->pc = 0;
+      uout->pd = NULL;            // not connected to any PDFDoc
+      break;
+    case 1:
+      if (lua_isboolean (L,1)) {
+	uout->d = new Object(lua_toboolean(L, 1)? gTrue : gFalse);
+	uout->atype = ALLOC_LEPDF;
+	uout->pc = 0;
+	uout->pd = NULL;            
+      } else if (lua_isnumber (L,1)) {
+	double d = lua_tonumber(L,1);
+	// Missed :Object(long long int64gA)
+	if (d==((int)d)) {
+	  uout->d = new Object((int)d);
+	} else {
+	  uout->d = new Object(d);
+	}
+	uout->atype = ALLOC_LEPDF;
+	uout->pc = 0;
+	uout->pd = NULL;            
+      } else if (lua_isstring (L,1)){
+	GooString *gs;
+	const char *s;
+	size_t len;
+	s = luaL_checklstring(L, 2, &len);
+	gs = new GooString(s, len);
+	uout->d = new Object(gs);
+	uout->atype = ALLOC_LEPDF;
+	uout->pc = 0;
+	uout->pd = NULL;            
+      } else if (luaL_testudata(L,1,M_Array)){
+	udstruct *u;
+	Array *a;
+	u = (udstruct *) luaL_checkudata(L, 1, M_Array);
+	a = (Array *)u->d;
+	uout->d = new Object(a);
+	uout->atype = ALLOC_LEPDF;
+	uout->pc = 0;
+	uout->pd = NULL;            
+      } else if (luaL_testudata(L,1,M_Dict)){
+	udstruct *u;
+	Dict *d;
+	u = (udstruct *) luaL_checkudata(L, 1, M_Dict);
+	d = (Dict *)u->d;
+	uout->d = new Object(d);
+	uout->atype = ALLOC_LEPDF;
+	uout->pc = 0;
+	uout->pd = NULL;            
+      } else if (luaL_testudata(L,1,M_Stream)){
+	udstruct *u;
+	Stream *s;
+	u = (udstruct *) luaL_checkudata(L, 1, M_Stream);
+	s = (Stream *)u->d;
+	*((Object *) uout->d) = Object(s);
+      } else
+	luaL_error(L, "Invalid/unsupported value for Object constructor");
+      break;
+    case 2:
+      if (lua_isnumber (L,1) && lua_isnumber (L,2)) {
+	double numA = lua_tonumber(L,1);
+	double genA = lua_tonumber(L,2);
+	if ( ((numA)==(int)(numA)) && ((genA)==(int)(genA)) ){
+	  uout->d = new Object((int)(numA), (int)(genA));
+	  uout->atype = ALLOC_LEPDF;
+	  uout->pc = 0;
+	  uout->pd = NULL;            
+	}
+      } else if (lua_isnumber (L,1) && (lua_isstring(L,2)|| lua_isnoneornil(L,2))) {
+	double d_typeA = lua_tonumber(L,1);
+	int typeA = (int)(d_typeA);
+	if (d_typeA==typeA){
+	  switch((int)(typeA)) {
+	  case     objBool:
+	  case     objInt:
+	  case     objReal:
+	  case     objString:
+	  case     objName:
+	  case     objNull:
+	  case     objArray:
+	  case     objDict:
+	  case     objStream:
+	  case     objRef:
+	  case     objCmd:
+	  case     objError:
+	  case     objEOF:
+	  case     objNone:
+	  case     objInt64:
+	  case     objDead:
+	    if (lua_isstring(L,2))
+	      uout->d = new Object((ObjType)(typeA), luaL_checkstring(L, 2));
+	    else
+	      uout->d = new Object((ObjType)(typeA));
+	    uout->atype = ALLOC_LEPDF;
+	    uout->pc = 0;
+	    uout->pd = NULL;            
+
+	    break;
+	  default:
+	    luaL_error(L, "Invalid values for Object constructor");
+	    break;
+	  }//switch((int)(d))
+	} else //  (d_typeA)!=(typeA) 
+	  luaL_error(L, "Invalid/unsupported values for Object constructor");	   
+      } // if (lua_isnumber (L,1) && (lua_isstring(L,2)|| lua_isnoneornil(L,2))) 
+      break;
+    default:
+      luaL_error(L, "Invalid specification for Object constructor");	   
+    }
+    lua_settop(L,1);
     return 1;
 }
 
+// static int l_new_Object(lua_State * L)
+// {
+//     udstruct *uout;
+//     uout = new_Object_userdata(L);
+//     uout->d = new Object();     // automatic init to type "none"
+//     uout->atype = ALLOC_LEPDF;
+//     uout->pc = 0;
+//     uout->pd = NULL;            // not connected to any PDFDoc
+//     return 1;
+// }
+
+
 // PDFRectangle see Page.h
 
 static int l_new_PDFRectangle(lua_State * L)
@@ -429,6 +581,7 @@
     {"AttributeOwner_Type",l_AttributeOwner_Type},
     {"Dict", l_new_Dict},
     {"Object", l_new_Object},
+    {"Object_Type", l_Object_Type},
     {"PDFRectangle", l_new_PDFRectangle},
     {NULL, NULL}                // sentinel
 };
@@ -538,7 +691,7 @@
         pdfdoc_changed_error(L);                               \
     uout = new_Object_userdata(L);                             \
     uout->d = new Object();                                    \
-    ((in *) uin->d)->function((Object *) uout->d);             \
+    *((Object *)uout->d) = ((in *) uin->d)->function();                  \
     uout->atype = ALLOC_LEPDF;                                 \
     uout->pc = uin->pc;                                        \
     uout->pd = uin->pd;                                        \
@@ -665,31 +818,28 @@
 
 //**********************************************************************
 // Array
+// Now private
+// static int m_Array_incRef(lua_State * L)
+// {
+//     udstruct *uin;
+//     uin = (udstruct *) luaL_checkudata(L, 1, M_Array);
+//     if (uin->pd != NULL && uin->pd->pc != uin->pc)
+//         pdfdoc_changed_error(L);
+//     lua_pushinteger(L, 1);
+//     return 1;
+// }
+// Now private
+// static int m_Array_decRef(lua_State * L)
+// {
+//     int i;
+//     udstruct *uin;
+//     uin = (udstruct *) luaL_checkudata(L, 1, M_Array);
+//     if (uin->pd != NULL && uin->pd->pc != uin->pc)
+//         pdfdoc_changed_error(L);
+//     lua_pushinteger(L, 1);
+//     return 1;
+// }
 
-static int m_Array_incRef(lua_State * L)
-{
-    int i;
-    udstruct *uin;
-    uin = (udstruct *) luaL_checkudata(L, 1, M_Array);
-    if (uin->pd != NULL && uin->pd->pc != uin->pc)
-        pdfdoc_changed_error(L);
-    i = ((Array *) uin->d)->incRef();
-    lua_pushinteger(L, i);
-    return 1;
-}
-
-static int m_Array_decRef(lua_State * L)
-{
-    int i;
-    udstruct *uin;
-    uin = (udstruct *) luaL_checkudata(L, 1, M_Array);
-    if (uin->pd != NULL && uin->pd->pc != uin->pc)
-        pdfdoc_changed_error(L);
-    i = ((Array *) uin->d)->decRef();
-    lua_pushinteger(L, i);
-    return 1;
-}
-
 m_poppler_get_INT(Array, getLength);
 
 static int m_Array_add(lua_State * L)
@@ -702,7 +852,7 @@
     if ((uin->pd != NULL && uin->pd->pc != uin->pc)
         || (uobj->pd != NULL && uobj->pd->pc != uobj->pc))
         pdfdoc_changed_error(L);
-    ((Array *) uin->d)->add(((Object *) uobj->d));
+    ((Array *) uin->d)->add(std::move(*((Object *) uobj->d)));
     return 0;
 }
 
@@ -718,7 +868,7 @@
     if (i > 0 && i <= len) {
         uout = new_Object_userdata(L);
         uout->d = new Object();
-        ((Array *) uin->d)->get(i - 1, (Object *) uout->d);
+        *((Object *) uout->d) = ((Array *) uin->d)->get(i - 1);
         uout->atype = ALLOC_LEPDF;
         uout->pc = uin->pc;
         uout->pd = uin->pd;
@@ -739,7 +889,7 @@
     if (i > 0 && i <= len) {
         uout = new_Object_userdata(L);
         uout->d = new Object();
-        ((Array *) uin->d)->getNF(i - 1, (Object *) uout->d);
+        *((Object *) uout->d) = ((Array *) uin->d)->getNF(i - 1);
         uout->atype = ALLOC_LEPDF;
         uout->pc = uin->pc;
         uout->pd = uin->pd;
@@ -773,8 +923,8 @@
 m_poppler__tostring(Array);
 
 static const struct luaL_Reg Array_m[] = {
-    {"incRef", m_Array_incRef},
-    {"decRef", m_Array_decRef},
+    // {"incRef", m_Array_incRef},// Now private
+    // {"decRef", m_Array_decRef},// Now private
     {"getLength", m_Array_getLength},
     {"add", m_Array_add},
     {"get", m_Array_get},
@@ -950,31 +1100,27 @@
 
 //**********************************************************************
 // Dict
+// Now private
+// static int m_Dict_incRef(lua_State * L)
+// {
+//     udstruct *uin;
+//     uin = (udstruct *) luaL_checkudata(L, 1, M_Dict);
+//     if (uin->pd != NULL && uin->pd->pc != uin->pc)
+//         pdfdoc_changed_error(L);
+//     lua_pushinteger(L, 1);
+//     return 1;
+// }
+// Now private
+// static int m_Dict_decRef(lua_State * L)
+// {
+//     udstruct *uin;
+//     uin = (udstruct *) luaL_checkudata(L, 1, M_Dict);
+//     if (uin->pd != NULL && uin->pd->pc != uin->pc)
+//         pdfdoc_changed_error(L);
+//     lua_pushinteger(L, 1);
+//     return 1;
+// }
 
-static int m_Dict_incRef(lua_State * L)
-{
-    int i;
-    udstruct *uin;
-    uin = (udstruct *) luaL_checkudata(L, 1, M_Dict);
-    if (uin->pd != NULL && uin->pd->pc != uin->pc)
-        pdfdoc_changed_error(L);
-    i = ((Dict *) uin->d)->incRef();
-    lua_pushinteger(L, i);
-    return 1;
-}
-
-static int m_Dict_decRef(lua_State * L)
-{
-    int i;
-    udstruct *uin;
-    uin = (udstruct *) luaL_checkudata(L, 1, M_Dict);
-    if (uin->pd != NULL && uin->pd->pc != uin->pc)
-        pdfdoc_changed_error(L);
-    i = ((Dict *) uin->d)->decRef();
-    lua_pushinteger(L, i);
-    return 1;
-}
-
 m_poppler_get_INT(Dict, getLength);
 
 static int m_Dict_add(lua_State * L)
@@ -986,7 +1132,7 @@
         pdfdoc_changed_error(L);
     s = copyString(luaL_checkstring(L, 2));
     uobj = (udstruct *) luaL_checkudata(L, 3, M_Object);
-    ((Dict *) uin->d)->add(s, ((Object *) uobj->d));
+    ((Dict *) uin->d)->add(s, std::move(*((Object *) uobj->d)));
     return 0;
 }
 
@@ -999,7 +1145,7 @@
         pdfdoc_changed_error(L);
     s = luaL_checkstring(L, 2);
     uobj = (udstruct *) luaL_checkudata(L, 3, M_Object);
-    ((Dict *) uin->d)->set(s, ((Object *) uobj->d));
+    ((Dict *) uin->d)->set(s, std::move(*((Object *) uobj->d)));
     return 0;
 }
 
@@ -1027,7 +1173,7 @@
     s = luaL_checkstring(L, 2);
     uout = new_Object_userdata(L);
     uout->d = new Object();
-    ((Dict *) uin->d)->lookup(s, (Object *) uout->d);
+    *((Object *) uout->d) = ((Dict *) uin->d)->lookup(s);
     uout->atype = ALLOC_LEPDF;
     uout->pc = uin->pc;
     uout->pd = uin->pd;
@@ -1044,7 +1190,7 @@
     s = luaL_checkstring(L, 2);
     uout = new_Object_userdata(L);
     uout->d = new Object();
-    ((Dict *) uin->d)->lookupNF(s, (Object *) uout->d);
+    *((Object *) uout->d) = ((Dict *) uin->d)->lookupNF(s);
     uout->atype = ALLOC_LEPDF;
     uout->pc = uin->pc;
     uout->pd = uin->pd;
@@ -1096,7 +1242,7 @@
     if (i > 0 && i <= len) {
         uout = new_Object_userdata(L);
         uout->d = new Object();
-        ((Dict *) uin->d)->getVal(i - 1, (Object *) uout->d);
+        *((Object *) uout->d) = ((Dict *) uin->d)->getVal(i - 1);
         uout->atype = ALLOC_LEPDF;
         uout->pc = uin->pc;
         uout->pd = uin->pd;
@@ -1117,7 +1263,7 @@
     if (i > 0 && i <= len) {
         uout = new_Object_userdata(L);
         uout->d = new Object();
-        ((Dict *) uin->d)->getValNF(i - 1, (Object *) uout->d);
+        *((Object *) uout->d) = ((Dict *) uin->d)->getValNF(i - 1);
         uout->atype = ALLOC_LEPDF;
         uout->pc = uin->pc;
         uout->pd = uin->pd;
@@ -1131,8 +1277,8 @@
 m_poppler__tostring(Dict);
 
 static const struct luaL_Reg Dict_m[] = {
-    {"incRef", m_Dict_incRef},
-    {"decRef", m_Dict_decRef},
+    // {"incRef", m_Dict_incRef},// Now private
+    // {"decRef", m_Dict_decRef},// Now private
     {"getLength", m_Dict_getLength},
     {"add", m_Dict_add},
     {"set", m_Dict_set},
@@ -1381,9 +1527,9 @@
         pdfdoc_changed_error(L);
     luaL_checktype(L, 2, LUA_TBOOLEAN);
     if (lua_toboolean(L, 2) != 0)
-        ((Object *) uin->d)->initBool(gTrue);
+        *((Object *) uin->d) = Object(gTrue);
     else
-        ((Object *) uin->d)->initBool(gFalse);
+        *((Object *) uin->d) = Object(gFalse);
     return 0;
 }
 
@@ -1395,7 +1541,7 @@
     if (uin->pd != NULL && uin->pd->pc != uin->pc)
         pdfdoc_changed_error(L);
     i = luaL_checkint(L, 2);
-    ((Object *) uin->d)->initInt(i);
+    *((Object *) uin->d) = Object(i);
     return 0;
 }
 
@@ -1407,7 +1553,7 @@
     if (uin->pd != NULL && uin->pd->pc != uin->pc)
         pdfdoc_changed_error(L);
     d = luaL_checknumber(L, 2);
-    ((Object *) uin->d)->initReal(d);
+    *((Object *) uin->d) = Object(d);
     return 0;
 }
 
@@ -1422,7 +1568,7 @@
         pdfdoc_changed_error(L);
     s = luaL_checklstring(L, 2, &len);
     gs = new GooString(s, len);
-    ((Object *) uin->d)->initString(gs);
+    *((Object *) uin->d) = Object(gs);
     return 0;
 }
 
@@ -1434,7 +1580,7 @@
     if (uin->pd != NULL && uin->pd->pc != uin->pc)
         pdfdoc_changed_error(L);
     s = luaL_checkstring(L, 2);
-    ((Object *) uin->d)->initName(s);
+    *((Object *) uin->d) = Object(objName, s);
     return 0;
 }
 
@@ -1444,7 +1590,7 @@
     uin = (udstruct *) luaL_checkudata(L, 1, M_Object);
     if (uin->pd != NULL && uin->pd->pc != uin->pc)
         pdfdoc_changed_error(L);
-    ((Object *) uin->d)->initNull();
+    *((Object *) uin->d) = Object(objNull);
     return 0;
 }
 
@@ -1451,6 +1597,7 @@
 static int m_Object_initArray(lua_State * L)
 {
     udstruct *uin, *uxref;
+    Array *a;
     uin = (udstruct *) luaL_checkudata(L, 1, M_Object);
     uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef);
     if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd)
@@ -1458,7 +1605,8 @@
     if ((uin->pd != NULL && uin->pd->pc != uin->pc)
         || (uxref->pd != NULL && uxref->pd->pc != uxref->pc))
         pdfdoc_changed_error(L);
-    ((Object *) uin->d)->initArray((XRef *) uxref->d);
+    a = new Array((XRef *) uxref->d);
+    *((Object *) uin->d) = Object(a);
     return 0;
 }
 
@@ -1469,6 +1617,7 @@
 static int m_Object_initDict(lua_State * L)
 {
     udstruct *uin, *uxref;
+    Dict *d;
     uin = (udstruct *) luaL_checkudata(L, 1, M_Object);
     uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef);
     if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd)
@@ -1476,7 +1625,8 @@
     if ((uin->pd != NULL && uin->pd->pc != uin->pc)
         || (uxref->pd != NULL && uxref->pd->pc != uxref->pc))
         pdfdoc_changed_error(L);
-    ((Object *) uin->d)->initDict((XRef *) uxref->d);
+    d = new Dict((XRef *) uxref->d);
+    *((Object *) uin->d) = Object(d);
     return 0;
 }
 
@@ -1490,7 +1640,7 @@
     if ((uin->pd != NULL && uin->pd->pc != uin->pc)
         || (ustream->pd != NULL && ustream->pd->pc != ustream->pc))
         pdfdoc_changed_error(L);
-    ((Object *) uin->d)->initStream((Stream *) ustream->d);
+    *((Object *) uin->d) = Object((Stream *) ustream->d);
     return 0;
 }
 
@@ -1503,7 +1653,7 @@
         pdfdoc_changed_error(L);
     num = luaL_checkint(L, 2);
     gen = luaL_checkint(L, 3);
-    ((Object *) uin->d)->initRef(num, gen);
+    *((Object *) uin->d) = Object(num, gen);
     return 0;
 }
 
@@ -1515,7 +1665,7 @@
     if (uin->pd != NULL && uin->pd->pc != uin->pc)
         pdfdoc_changed_error(L);
     s = luaL_checkstring(L, 2);
-    ((Object *) uin->d)->initCmd(CHARP_CAST s);
+    *((Object *) uin->d) = Object(objCmd, CHARP_CAST s);
     return 0;
 }
 
@@ -1525,7 +1675,7 @@
     uin = (udstruct *) luaL_checkudata(L, 1, M_Object);
     if (uin->pd != NULL && uin->pd->pc != uin->pc)
         pdfdoc_changed_error(L);
-    ((Object *) uin->d)->initError();
+    *((Object *) uin->d) = Object(objError);
     return 0;
 }
 
@@ -1535,7 +1685,7 @@
     uin = (udstruct *) luaL_checkudata(L, 1, M_Object);
     if (uin->pd != NULL && uin->pd->pc != uin->pc)
         pdfdoc_changed_error(L);
-    ((Object *) uin->d)->initEOF();
+    *((Object *) uin->d) = Object(objEOF);
     return 0;
 }
 
@@ -1551,7 +1701,7 @@
         pdfdoc_changed_error(L);
     uout = new_Object_userdata(L);
     uout->d = new Object();
-    ((Object *) uin->d)->fetch((XRef *) uxref->d, (Object *) uout->d);
+    *((Object *) uout->d) = ((Object *) uin->d)->fetch((XRef *) uxref->d);
     uout->atype = ALLOC_LEPDF;
     uout->pc = uin->pc;
     uout->pd = uin->pd;
@@ -1816,7 +1966,7 @@
         pdfdoc_changed_error(L);
     if (!((Object *) uin->d)->isArray())
         luaL_error(L, "Object is not an Array");
-    ((Object *) uin->d)->arrayAdd((Object *) uobj->d);
+    ((Object *) uin->d)->arrayAdd(std::move(*((Object *) uobj->d)));
     return 0;
 }
 
@@ -1833,7 +1983,7 @@
         if (i > 0 && i <= len) {
             uout = new_Object_userdata(L);
             uout->d = new Object();
-            ((Object *) uin->d)->arrayGet(i - 1, (Object *) uout->d);
+            *((Object *) uout->d) = ((Object *) uin->d)->arrayGet(i - 1);
             uout->atype = ALLOC_LEPDF;
             uout->pc = uin->pc;
             uout->pd = uin->pd;
@@ -1857,7 +2007,7 @@
         if (i > 0 && i <= len) {
             uout = new_Object_userdata(L);
             uout->d = new Object();
-            ((Object *) uin->d)->arrayGetNF(i - 1, (Object *) uout->d);
+            *((Object *) uout->d) = ((Object *) uin->d)->arrayGetNF(i - 1);
             uout->atype = ALLOC_LEPDF;
             uout->pc = uin->pc;
             uout->pd = uin->pd;
@@ -1897,7 +2047,7 @@
         pdfdoc_changed_error(L);
     if (!((Object *) uin->d)->isDict())
         luaL_error(L, "Object is not a Dict");
-    ((Object *) uin->d)->dictAdd(copyString(s), (Object *) uobj->d);
+    ((Object *) uin->d)->dictAdd(copyString(s), std::move(*((Object *) uobj->d)));
     return 0;
 }
 
@@ -1915,7 +2065,7 @@
         pdfdoc_changed_error(L);
     if (!((Object *) uin->d)->isDict())
         luaL_error(L, "Object is not a Dict");
-    ((Object *) uin->d)->dictSet(s, (Object *) uobj->d);
+    ((Object *) uin->d)->dictSet(s, std::move(*((Object *) uobj->d)));
     return 0;
 }
 
@@ -1930,7 +2080,7 @@
     if (((Object *) uin->d)->isDict()) {
         uout = new_Object_userdata(L);
         uout->d = new Object();
-        ((Object *) uin->d)->dictLookup(s, (Object *) uout->d);
+        *((Object *) uout->d) = ((Object *) uin->d)->dictLookup(s);
         uout->atype = ALLOC_LEPDF;
         uout->pc = uin->pc;
         uout->pd = uin->pd;
@@ -1950,7 +2100,7 @@
     if (((Object *) uin->d)->isDict()) {
         uout = new_Object_userdata(L);
         uout->d = new Object();
-        ((Object *) uin->d)->dictLookupNF(s, (Object *) uout->d);
+        *((Object *) uout->d) = ((Object *) uin->d)->dictLookupNF(s);
         uout->atype = ALLOC_LEPDF;
         uout->pc = uin->pc;
         uout->pd = uin->pd;
@@ -1991,7 +2141,7 @@
         if (i > 0 && i <= len) {
             uout = new_Object_userdata(L);
             uout->d = new Object();
-            ((Object *) uin->d)->dictGetVal(i - 1, (Object *) uout->d);
+	    *((Object *) uout->d) = ((Object *) uin->d)->dictGetVal(i - 1);
             uout->atype = ALLOC_LEPDF;
             uout->pc = uin->pc;
             uout->pd = uin->pd;
@@ -2015,7 +2165,7 @@
         if (i > 0 && i <= len) {
             uout = new_Object_userdata(L);
             uout->d = new Object();
-            ((Object *) uin->d)->dictGetValNF(i - 1, (Object *) uout->d);
+            *((Object *) uout->d) = ((Object *) uin->d)->dictGetValNF(i - 1);
             uout->atype = ALLOC_LEPDF;
             uout->pc = uin->pc;
             uout->pd = uin->pd;
@@ -2243,7 +2393,7 @@
 m_poppler_get_poppler(Page, Dict, getPieceInfo);
 m_poppler_get_poppler(Page, Dict, getSeparationInfo);
 m_poppler_get_poppler(Page, Dict, getResourceDict);
-m_poppler_get_OBJECT(Page, getAnnots);
+m_poppler_get_OBJECT(Page, getAnnotsObject);
 
 m_poppler_get_OBJECT(Page, getContents);
 
@@ -2270,7 +2420,7 @@
     {"getPieceInfo", m_Page_getPieceInfo},
     {"getSeparationInfo", m_Page_getSeparationInfo},
     {"getResourceDict", m_Page_getResourceDict},
-    {"getAnnots", m_Page_getAnnots},
+    {"getAnnotsObject", m_Page_getAnnotsObject},
     {"getContents", m_Page_getContents},
     {"__tostring", m_Page__tostring},
     {NULL, NULL}                // sentinel
@@ -2520,7 +2670,7 @@
     if (((PdfDocument *) uin->d)->doc->getXRef()->isOk()) {
         uout = new_Object_userdata(L);
         uout->d = new Object();
-        ((PdfDocument *) uin->d)->doc->getDocInfo((Object *) uout->d);
+        *((Object *) uout->d) = ((PdfDocument *) uin->d)->doc->getDocInfo();
         uout->atype = ALLOC_LEPDF;
         uout->pc = uin->pc;
         uout->pd = uin->pd;
@@ -2538,7 +2688,7 @@
     if (((PdfDocument *) uin->d)->doc->getXRef()->isOk()) {
         uout = new_Object_userdata(L);
         uout->d = new Object();
-        ((PdfDocument *) uin->d)->doc->getDocInfoNF((Object *) uout->d);
+        *((Object *) uout->d) = ((PdfDocument *) uin->d)->doc->getDocInfoNF();
         uout->atype = ALLOC_LEPDF;
         uout->pc = uin->pc;
         uout->pd = uin->pd;
@@ -2841,7 +2991,7 @@
     uout = new_Object_userdata(L);
     uout->d = new Object();
     origin = (Object *) (((Attribute *) uin->d)->getValue());
-    origin->copy ( ((Object *)uout->d) );
+    *((Object *) uout->d) = origin->copy();
     uout->atype = ALLOC_LEPDF;
     uout->pc = uin->pc;
     uout->pd = uin->pd;
@@ -3320,7 +3470,8 @@
     parent = root->findParentElement(i-1);
     if (parent != NULL) {
        uout = new_StructElement_userdata(L);
-       uout->d = new StructElement( *parent );
+       // see https://isocpp.org/wiki/faq/const-correctness#aliasing-and-const
+       uout->d = (StructElement *) parent;
        uout->atype = ALLOC_LEPDF;
        uout->pc = uin->pc;
        uout->pd = uin->pd;
@@ -3331,7 +3482,6 @@
 
 
 static const struct luaL_Reg StructTreeRoot_m[] = {
-  {"findParentElement", m_StructTreeRoot_findParentElement},
   {"getDoc",m_StructTreeRoot_getDoc},
   {"getRoleMap",m_StructTreeRoot_getRoleMap},
   {"getClassMap",m_StructTreeRoot_getClassMap},
@@ -3370,7 +3520,7 @@
     gen = luaL_checkint(L, 3);
     uout = new_Object_userdata(L);
     uout->d = new Object();
-    ((XRef *) uin->d)->fetch(num, gen, (Object *) uout->d);
+    *((Object *) uout->d) = ((XRef *) uin->d)->fetch(num, gen);
     uout->atype = ALLOC_LEPDF;
     uout->pc = uin->pc;
     uout->pd = uin->pd;

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lfontlib.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lfontlib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lfontlib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -155,15 +155,15 @@
 
 static int setfont(lua_State * L)
 {
-    int i = luaL_checkinteger(L, -2);
+    int t = lua_gettop(L);
+    int i = luaL_checkinteger(L,1);
     if (i) {
-        luaL_checktype(L, -1, LUA_TTABLE);
+        luaL_checktype(L, t, LUA_TTABLE);
         if (is_valid_font(i)) {
-            if (!(font_touched(i) || font_used(i))) {
+            if (! (font_touched(i) || font_used(i))) {
                 font_from_lua(L, i);
             } else {
-                luaL_error(L,
-                           "that font has been accessed already, changing it is forbidden");
+                luaL_error(L, "that font has been accessed already, changing it is forbidden");
             }
         } else {
             luaL_error(L, "that integer id is not a valid font");
@@ -172,10 +172,56 @@
     return 0;
 }
 
+static int addcharacters(lua_State * L)
+{
+    int t = lua_gettop(L);
+    int i = luaL_checkinteger(L,1);
+    if (i) {
+        luaL_checktype(L, t, LUA_TTABLE);
+        if (is_valid_font(i)) {
+            characters_from_lua(L, i);
+        } else {
+            luaL_error(L, "that integer id is not a valid font");
+        }
+    }
+    return 0;
+}
 
+static int setexpansion(lua_State * L)
+{
+    int f = luaL_checkinteger(L,1);
+    if (f) {
+        if (is_valid_font(f)) {
+            int fstretch = luaL_checkinteger(L,2);
+            int fshrink = luaL_checkinteger(L,3);
+            int fstep = luaL_checkinteger(L,4);
+            set_expand_params(f, fstretch, fshrink, fstep);
+        } else {
+            luaL_error(L, "that integer id is not a valid font");
+        }
+    }
+    return 0;
+}
+
+/* font.define(id,table) */
+/* font.define(table) */
+
 static int deffont(lua_State * L)
 {
-    int i = get_fontid();
+    int i = 0;
+    int t = lua_gettop(L);
+    if (t == 2) {
+        i = lua_tointeger(L,1);
+        if ((i <= 0) || ! is_valid_font(i)) {
+            lua_pop(L, 1);          /* pop the broken table */
+            luaL_error(L, "font creation failed, invalid id passed");
+        }
+    } else if (t == 1) {
+        i = get_fontid();
+    } else {
+        luaL_error(L, "font creation failed, no table passed");
+        return 0;
+    }
     luaL_checktype(L, -1, LUA_TTABLE);
     if (font_from_lua(L, i)) {
         lua_pushinteger(L, i);
@@ -183,21 +229,25 @@
     } else {
         lua_pop(L, 1);          /* pop the broken table */
         delete_font(i);
-        luaL_error(L, "font creation failed");
+        luaL_error(L, "font creation failed, error in table");
     }
     return 0;                   /* not reached */
 }
 
 /* this returns the expected (!) next fontid. */
+/* first arg true will keep the id */
+
 static int nextfontid(lua_State * L)
 {
+    int b = ((lua_gettop(L) == 1) && lua_toboolean(L,1));
     int i = get_fontid();
     lua_pushinteger(L, i);
-    delete_font(i);
+    if (b == 0) {
+        delete_font(i);
+    }
     return 1;
 }
 
-
 static int getfont(lua_State * L)
 {
     int i = luaL_checkinteger(L, -1);
@@ -207,7 +257,6 @@
     return 1;
 }
 
-
 static int getfontid(lua_State * L)
 {
     if (lua_type(L, 1) == LUA_TSTRING) {
@@ -228,7 +277,6 @@
     return 1;
 }
 
-
 static const struct luaL_Reg fontlib[] = {
     {"read_tfm", font_read_tfm},
     {"read_vf", font_read_vf},
@@ -237,6 +285,8 @@
     {"each", tex_each_font},
     {"getfont", getfont},
     {"setfont", setfont},
+    {"addcharacters", addcharacters},
+    {"setexpansion", setexpansion},
     {"define", deffont},
     {"nextid", nextfontid},
     {"id", getfontid},

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/liolibext.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/liolibext.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/liolibext.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -29,11 +29,9 @@
 #endif
 #include "lualib.h"
 
-
-
 #ifdef LuajitTeX
 /* luajit has its own way for io, which is a mix of    */
-/* lua 5.1 and lua 5.2 . We use the stock luajit.      */    
+/* lua 5.1 and lua 5.2 . We use the stock luajit.      */
 #else
 /*
 ** {======================================================
@@ -61,7 +59,6 @@
 
 /* }====================================================== */
 
-
 #if defined(LUA_USE_POSIX)
 
 #define l_fseek(f,o,w)          fseeko(f,o,w)
@@ -92,9 +89,6 @@
 
 #endif/* #ifdef LuajitTeX */
 
-
-
-
 static FILE *tofile (lua_State *L) {
 #ifdef LuajitTeX
     FILE **f = luaL_checkudata(L,1,LUA_FILEHANDLE);
@@ -110,6 +104,8 @@
 #endif
 }
 
+#define uchar(c) ((unsigned char)(c))
+
 /*
     HH: A few helpers to avoid reading numbers as strings. For now we put them in their
     own namespace. We also have a few helpers that can make io functions tex friendly.
@@ -125,6 +121,19 @@
     return 1;
 }
 
+static int readcardinal1_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p]);
+        lua_pushinteger(L, a);
+    }
+    return 1;
+}
+
 static int readcardinal2(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -137,6 +146,20 @@
     return 1;
 }
 
+static int readcardinal2_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+1 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p]);
+        lua_pushinteger(L, 0x100 * a + b);
+    }
+    return 1;
+}
+
 static int readcardinal3(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -150,6 +173,21 @@
     return 1;
 }
 
+static int readcardinal3_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+2 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p++]);
+        int c = uchar(s[p]);
+        lua_pushinteger(L, 0x10000 * a + 0x100 * b + c);
+    }
+    return 1;
+}
+
 static int readcardinal4(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -164,6 +202,22 @@
     return 1;
 }
 
+static int readcardinal4_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+3 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p++]);
+        int c = uchar(s[p++]);
+        int d = uchar(s[p]);
+        lua_pushinteger(L,0x1000000 * a + 0x10000 * b + 0x100 * c + d);
+    }
+    return 1;
+}
+
 static int readinteger1(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -176,6 +230,22 @@
     return 1;
 }
 
+static int readinteger1_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p]);
+        if (a >= 0x80)
+            lua_pushinteger(L, a - 0x100);
+        else
+            lua_pushinteger(L, a);
+    }
+    return 1;
+}
+
 static int readinteger2(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -189,6 +259,23 @@
     return 1;
 }
 
+static int readinteger2_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+1 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p]);
+        if (a >= 0x80)
+            lua_pushinteger(L, 0x100 * a + b - 0x10000);
+        else
+            lua_pushinteger(L, 0x100 * a + b);
+    }
+    return 1;
+}
+
 static int readinteger3(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -203,6 +290,24 @@
     return 1;
 }
 
+static int readinteger3_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+2 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p++]);
+        int c = uchar(s[p]);
+        if (a >= 0x80)
+            lua_pushinteger(L, 0x10000 * a + 0x100 * b + c - 0x1000000);
+        else
+            lua_pushinteger(L, 0x10000 * a + 0x100 * b + c);
+    }
+    return 1;
+}
+
 static int readinteger4(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -218,6 +323,25 @@
     return 1;
 }
 
+static int readinteger4_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+3 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p++]);
+        int c = uchar(s[p++]);
+        int d = uchar(s[p]);
+        if (a >= 0x80)
+            lua_pushinteger(L, 0x1000000 * a + 0x10000 * b + 0x100 * c + d - 0x100000000);
+        else
+            lua_pushinteger(L, 0x1000000 * a + 0x10000 * b + 0x100 * c + d);
+    }
+    return 1;
+}
+
 static int readfixed2(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -225,12 +349,29 @@
     if (b == EOF)
         lua_pushnil(L);
     else if (a >= 0x80)
-        lua_pushinteger(L, a + b/0xFFFF - 0x100);
+        lua_pushinteger(L, (a - 0x100) + b/0x100);
     else
-        lua_pushinteger(L, a + b/0xFFFF);
+        lua_pushinteger(L, (a        ) + b/0x100);
     return 1;
 }
 
+static int readfixed2_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+3 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p]);
+        if (a >= 0x80)
+            lua_pushinteger(L, (a - 0x100) + b/0x100);
+        else
+            lua_pushinteger(L, (a        ) + b/0x100);
+    }
+    return 1;
+}
+
 static int readfixed4(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -240,9 +381,9 @@
     if (d == EOF)
         lua_pushnil(L);
     else if (a >= 0x80)
-        lua_pushnumber(L, (0x1000000 * a + 0x10000 * b + 0x100 * c + d - 0x100000000)/65536.0);
+        lua_pushnumber(L, (0x100 * a + b - 0x10000) + (0x100 * c + d)/0x10000);
     else
-        lua_pushnumber(L, (0x1000000 * a + 0x10000 * b + 0x100 * c + d)/65536.0);
+        lua_pushnumber(L, (0x100 * a + b          ) + (0x100 * c + d)/0x10000);
     /* from ff */
     /* int n = 0x1000000 * a + 0x10000 * b + 0x100 * c + d; */
     /* lua_pushnumber(L,(real) (n>>16) + ((n&0xffff)/65536.0)); */
@@ -249,6 +390,25 @@
     return 1;
 }
 
+static int readfixed4_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+3 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p++]);
+        int c = uchar(s[p++]);
+        int d = uchar(s[p]);
+        if (a >= 0x80)
+            lua_pushnumber(L, (0x100 * a + b - 0x10000) + (0x100 * c + d)/0x10000);
+        else
+            lua_pushnumber(L, (0x100 * a + b          ) + (0x100 * c + d)/0x10000);
+    }
+    return 1;
+}
+
 static int read2dot14(lua_State *L) {
     FILE *f = tofile(L);
     int a = getc(f);
@@ -263,6 +423,21 @@
     return 1;
 }
 
+static int read2dot14_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    if (p < 0 || p+1 >= l) {
+        lua_pushnil(L);
+    } else {
+        int a = uchar(s[p++]);
+        int b = uchar(s[p]);
+        int n = 0x100 * a + b;
+        lua_pushnumber(L,(real) ((n<<16)>>(16+14)) + ((n&0x3fff)/16384.0));
+    }
+    return 1;
+}
+
 static int getposition(lua_State *L) {
     FILE *f = tofile(L);
     long p = ftell(f);
@@ -317,6 +492,28 @@
     return 1;
 }
 
+static int readbytetable_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    int n = lua_tointeger(L,3);
+    if (p < 0 || p >= l) {
+        lua_pushnil(L);
+    } else {
+        int i ;
+        if (p + n >= l) {
+            n = l - p ;
+        }
+        lua_createtable(L, n, 0);
+        for (i=1;i<=n;i++) {
+            int a = uchar(s[p++]);
+            lua_pushinteger(L, a);
+            lua_rawseti(L,-2,i);
+        }
+    }
+    return 1;
+}
+
 static int readbytes(lua_State *L) {
     FILE *f = tofile(L);
     int n = lua_tointeger(L,2);
@@ -332,6 +529,27 @@
     return n;
 }
 
+static int readbytes_s(lua_State *L) {
+    size_t l;
+    const char *s = luaL_checklstring(L, 1, &l);
+    size_t p = luaL_checkinteger(L, 2) - 1;
+    int n = lua_tointeger(L,3);
+    if (p < 0 || p >= l) {
+        return 0;
+    } else {
+        int i ;
+        if (p + n >= l) {
+            n = l - p ;
+        }
+        lua_createtable(L, n, 0);
+        for (i=1;i<=n;i++) {
+            int a = uchar(s[p++]);
+            lua_pushinteger(L, a);
+        }
+        return n;
+    }
+}
+
 static int recordfilename(lua_State *L)
 {
     const char *fname = luaL_checkstring(L, 1);
@@ -374,11 +592,17 @@
                 lua_pushboolean(L,0);
                 lua_pushliteral(L, "specific command execution disabled");
                 break;
+            case 1:
+                /* doesn't happen */
+                lua_pushboolean(L,1);
+                lua_pushstring(L,filename);
+                break;
             case 2:
                 lua_pushboolean(L,1);
                 lua_pushstring(L,safecmd);
                 break;
             default:
+                /* -1 */
                 lua_pushboolean(L,0);
                 lua_pushliteral(L, "bad command line quoting");
                 break;
@@ -444,7 +668,35 @@
     {NULL, NULL}
 };
 
+static const luaL_Reg siolib[] = {
+    { "readcardinal1",   readcardinal1_s },
+    { "readcardinal2",   readcardinal2_s },
+    { "readcardinal3",   readcardinal3_s },
+    { "readcardinal4",   readcardinal4_s },
+    { "readinteger1",    readinteger1_s },
+    { "readinteger2",    readinteger2_s },
+    { "readinteger3",    readinteger3_s },
+    { "readinteger4",    readinteger4_s },
+    { "readfixed2",      readfixed2_s },
+    { "readfixed4",      readfixed4_s },
+    { "read2dot14",      read2dot14_s },
+    { "readbytes",       readbytes_s },
+    { "readbytetable",   readbytetable_s },
+    /* done */
+    {NULL, NULL}
+};
+
+/*
+    The sio helpers are experimental and might be handy at some point. Speed-wise
+    there is no gain over file access because with ssd and caching we basically
+    operate in memory too. We keep them as complement to the file ones. I did
+    consider using an userdata object for the position etc but some simple tests
+    demonstrated that there is no real gain and the current ones permits to wrap
+    up whatever interface one likes.
+*/
+
 int luaopen_fio(lua_State *L) {
     luaL_register(L, "fio", fiolib);
+    luaL_register(L, "sio", siolib);
     return 1;
 }

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/llualib.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/llualib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/llualib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -286,8 +286,7 @@
 
 static int get_luaname(lua_State * L)
 {
-    int k;
-    k = (int) luaL_checkinteger(L, 2);
+    int k = (int) luaL_checkinteger(L, 2);
     if (k > 65535 || k < 0) {
         /* error */
         lua_pushnil(L);
@@ -306,6 +305,13 @@
     return 1;
 }
 
+static int new_table(lua_State * L) /* hh */
+{
+    int i = (int) luaL_checkinteger(L, 1);
+    int h = (int) luaL_checkinteger(L, 2);
+    lua_createtable(L,i,h);
+    return 1;
+}
 
 static const struct luaL_Reg lualib[] = {
     /* *INDENT-OFF* */
@@ -313,6 +319,7 @@
     {"setluaname",  set_luaname},
     {"getbytecode", get_bytecode},
     {"setbytecode", set_bytecode},
+    {"newtable",    new_table},
     {"get_functions_table",lua_functions_get_table},
     /* *INDENT-ON* */
     {NULL, NULL}                /* sentinel */

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lnodelib.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lnodelib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lnodelib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -268,6 +268,19 @@
     return i;
 }
 
+/* enable fixer ... more fixers can be added in the future */
+
+static int lua_nodelib_fix_node_lists(lua_State * L)
+{
+    if (lua_type(L, -1) == LUA_TBOOLEAN) {
+        fix_node_lists = lua_toboolean(L,-1);
+    } else if (lua_type(L, -1) == LUA_TNUMBER) {
+        fix_node_lists = lua_tointeger(L,-1);
+    }
+    return 0;
+}
+
+
 /* two simple helpers to speed up and simplify lua code (replaced by getnext and getprev) */
 
 static int lua_nodelib_next(lua_State * L)
@@ -438,6 +451,8 @@
             lua_pushinteger(L, font(n));
         } else if ((t == math_char_node) || (t == math_text_char_node)) {
             lua_pushinteger(L, fam_fnt(math_fam(n), 0));
+        } else if (t == delim_node) {
+            lua_pushinteger(L, fam_fnt(small_fam(n), 0));
         } else {
             lua_pushnil(L);
         }
@@ -473,6 +488,8 @@
                 lua_pushinteger(L, font(*n));
             } else if ((t == math_char_node) || (t == math_text_char_node)) {
                 lua_pushinteger(L, fam_fnt(math_fam(*n), 0));
+            } else if (t == delim_node) {
+                lua_pushinteger(L, fam_fnt(small_fam(*n), 0));
             } else {
                 lua_pushnil(L);
             }
@@ -492,6 +509,9 @@
             lua_pushinteger(L, character(n));
         } else if ((t == math_char_node) || (t == math_text_char_node)) {
             lua_pushinteger(L, math_character(n));
+        } else if (t == delim_node) {
+             /* used in wide fonts */
+            lua_pushinteger(L, small_char(n));
         } else {
             lua_pushnil(L);
         }
@@ -501,6 +521,24 @@
     return 1;
 }
 
+static int lua_nodelib_direct_getfam(lua_State * L)
+{
+    halfword n = lua_tointeger(L, 1);
+    if (n) {
+        halfword t = type(n);
+        if ((t == math_char_node) || (t == math_text_char_node)) {
+            lua_pushinteger(L, math_fam(n));
+        } else if (t == delim_node) {
+            lua_pushinteger(L, small_fam(n));
+        } else {
+            lua_pushnil(L);
+        }
+    } else {
+        lua_pushnil(L);
+    }
+    return 1;
+}
+
 static int lua_nodelib_direct_setchar(lua_State * L)
 {
     halfword n = lua_tointeger(L, 1);
@@ -510,11 +548,27 @@
             character(n) = (halfword) lua_tointeger(L, 2);
         } else if ((t == math_char_node) || (t == math_text_char_node)) {
             math_character(n) = (halfword) lua_tointeger(L, 2);
+        } else if (t == delim_node) {
+            /* used in wide fonts */
+            small_char(n) = (halfword) lua_tointeger(L, 2);
         }
     }
     return 0;
 }
 
+static int lua_nodelib_direct_setfam(lua_State * L)
+{
+    halfword n = lua_tointeger(L, 1);
+    if ((n) && (lua_type(L, 2) == LUA_TNUMBER)) {
+        halfword t = type(n);
+        if ((t == math_char_node) || (t == math_text_char_node)) {
+            math_fam(n) = (halfword) lua_tointeger(L, 2);
+        } else if (t == delim_node) {
+            small_fam(n) = (halfword) lua_tointeger(L, 2);
+        }
+    }
+    return 0;
+}
 
     /* node.getchar */
 
@@ -521,12 +575,20 @@
     static int lua_nodelib_getchar(lua_State * L)
     {
         halfword *n = lua_touserdata(L, 1);
-        if ( (n == NULL) || (! lua_getmetatable(L,1)) ) {
+        if ((n == NULL) || (! lua_getmetatable(L,1))) {
             lua_pushnil(L);
-        } else if (type(*n) == glyph_node) {
-            lua_pushinteger(L, character(*n));
-        } else if ((type(*n) == math_char_node) || (type(*n) == math_text_char_node)) {
-            lua_pushinteger(L, math_character(*n));
+        } else {
+            halfword t = type(*n);
+            if (t == glyph_node) {
+                lua_pushinteger(L, character(*n));
+            } else if ((t == math_char_node) || (t == math_text_char_node)) {
+                lua_pushinteger(L, math_character(*n));
+            } else if (t == delim_node) {
+                /* used in wide fonts */
+                lua_pushinteger(L, small_char(*n));
+            } else {
+                lua_pushnil(L);
+            }
         }
         return 1;
     }
@@ -673,7 +735,7 @@
     if (n) {
         halfword t = type(n);
         if (t == simple_noad || t == accent_noad || t == radical_noad) {
-            lua_pushinteger(L, nucleus(n));
+            nodelib_pushdirect_or_nil(nucleus(n));
             return 1;
         }
     }
@@ -703,7 +765,7 @@
     if (n) {
         halfword t = type(n);
         if (t == simple_noad || t == accent_noad || t == radical_noad) {
-            lua_pushinteger(L, subscr(n));
+            nodelib_pushdirect_or_nil(subscr(n));
             return 1;
         }
     }
@@ -733,7 +795,7 @@
     if (n) {
         halfword t = type(n);
         if (t == simple_noad || t == accent_noad || t == radical_noad) {
-            lua_pushinteger(L, supscr(n));
+            nodelib_pushdirect_or_nil(supscr(n));
             return 1;
         }
     }
@@ -785,7 +847,7 @@
         halfword t = type(n);
         if (t == kern_node || t == margin_kern_node) {
             if (lua_type(L, 2) == LUA_TNUMBER) {
-                width(n) = (halfword) lua_tointeger(L, 2);
+                width(n) = (halfword) lua_roundnumber(L, 2);
             } else {
                 width(n) = 0;
             }
@@ -794,7 +856,7 @@
             }
         } else if (t == math_node) {
             if (lua_type(L, 2) == LUA_TNUMBER) {
-                surround(n) = (halfword) lua_tointeger(L, 2);
+                surround(n) = (halfword) lua_roundnumber(L, 2);
             } else {
                 surround(n) = 0;
             }
@@ -867,10 +929,10 @@
     halfword n = lua_tointeger(L, 1);
     if ((n) && (type(n) == glyph_node)) {
         if ((lua_type(L, 2) == LUA_TNUMBER)) {
-            x_displace(n) = (halfword) lua_tointeger(L, 2);
+            x_displace(n) = (halfword) lua_roundnumber(L, 2);
         }
         if ((lua_type(L, 3) == LUA_TNUMBER)) {
-            y_displace(n) = (halfword) lua_tointeger(L, 3);
+            y_displace(n) = (halfword) lua_roundnumber(L, 3);
         }
     }
     return 0;
@@ -1071,6 +1133,8 @@
             nodelib_pushdirect_or_nil_alink(list_ptr(n));
         } else if ((t == sub_box_node) || (t == sub_mlist_node)) {
             nodelib_pushdirect_or_nil_alink(math_list(n));
+        } else if (t == ins_node) {
+            nodelib_pushdirect_or_nil_alink(ins_ptr(n));
         } else if (t == adjust_node) {
             nodelib_pushdirect_or_nil_alink(adjust_ptr(n));
         } else {
@@ -1097,6 +1161,12 @@
             } else {
                 math_list(n) = null;
             }
+        } else if (t == ins_node) {
+            if (lua_type(L,2) == LUA_TNUMBER) {
+                ins_ptr(n) = (halfword) lua_tointeger(L, 2);
+            } else {
+                ins_ptr(n) = null;
+            }
         } else if (t == adjust_node) {
             if (lua_type(L,2) == LUA_TNUMBER) {
                 adjust_ptr(n) = (halfword) lua_tointeger(L, 2);
@@ -1120,6 +1190,10 @@
             fast_metatable_or_nil_alink(list_ptr(*n));
         } else if ((type(*n) == sub_box_node) || (type(*n) == sub_mlist_node)) {
             fast_metatable_or_nil_alink(math_list(*n));
+        } else if (type(*n) == ins_node) {
+            fast_metatable_or_nil_alink(ins_ptr(*n));
+        } else if (type(*n) == adjust_node) {
+            fast_metatable_or_nil_alink(adjust_ptr(*n));
         } else {
             lua_pushnil(L);
         }
@@ -2999,7 +3073,7 @@
         if (t == hlist_node || t == vlist_node || t == rule_node || t == glue_node || t == glue_spec_node || t == math_node ||
                 t == kern_node || t == margin_kern_node ||  t == ins_node || t == unset_node) {
             if (lua_type(L, 2) == LUA_TNUMBER) {
-                width(n) = lua_tointeger(L,2);
+                width(n) = lua_roundnumber(L,2);
             } else {
                 width(n) = 0;
             }
@@ -3035,7 +3109,7 @@
         halfword t = type(n);
         if (t == hlist_node || t == vlist_node || t == rule_node || t == unset_node) {
             if (lua_type(L, 2) == LUA_TNUMBER) {
-                height(n) = lua_tointeger(L,2);
+                height(n) = lua_roundnumber(L,2);
             } else {
                 height(n) = 0;
             }
@@ -3071,7 +3145,7 @@
         halfword t = type(n);
         if (t == hlist_node || t == vlist_node || t == rule_node || t == unset_node) {
             if (lua_type(L, 2) == LUA_TNUMBER) {
-                depth(n) = lua_tointeger(L,2);
+                depth(n) = lua_roundnumber(L,2);
             } else {
                 depth(n) = 0;
             }
@@ -3104,7 +3178,7 @@
         halfword t = type(n);
         if (t == hlist_node || t == vlist_node) {
             if (lua_type(L, 2) == LUA_TNUMBER) {
-                shift_amount(n) = lua_tointeger(L,2);
+                shift_amount(n) = lua_roundnumber(L,2);
             } else {
                 shift_amount(n) = 0;
             }
@@ -3129,6 +3203,11 @@
             lua_pushinteger(L,stretch_order(n));
             lua_pushinteger(L,shrink_order(n));
             return 5;
+        } else if (t == hlist_node || t == vlist_node) {
+            lua_pushnumber(L, (double) glue_set(n)); /* float */
+            lua_pushinteger(L,glue_order(n));
+            lua_pushinteger(L,glue_sign(n));
+            return 3;
         }
     }
     return 0;
@@ -3146,6 +3225,11 @@
             shrink(n)        = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_roundnumber(L,4) : 0;
             stretch_order(n) = ((top > 4 && lua_type(L, 5) == LUA_TNUMBER)) ? lua_tointeger(L,5) : 0;
             shrink_order(n)  = ((top > 5 && lua_type(L, 6) == LUA_TNUMBER)) ? lua_tointeger(L,6) : 0;
+        } else if (t == hlist_node || t == vlist_node) {
+            glue_set(n)   = ((top > 1 && lua_type(L, 2) == LUA_TNUMBER)) ? (glue_ratio) lua_tonumber(L,2) : 0;
+            glue_order(n) = ((top > 2 && lua_type(L, 3) == LUA_TNUMBER)) ? lua_tointeger(L,3) : 0;
+            glue_sign(n)  = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_tointeger(L,4) : 0;
+            return 3;
         }
     }
     return 0;
@@ -3159,9 +3243,12 @@
         if (t == glue_node || t == glue_spec_node || t == math_node || t == ins_node) {
             lua_pushboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0));
             return 1;
+        } else if (t == hlist_node || t == vlist_node) {
+            lua_pushboolean(L,(glue_set(n) == 0 && glue_order(n) == 0 && glue_sign(n) == 0));
+            return 1;
         }
     }
-    return luaL_error(L, "glue (spec) expected");
+    return 0;
 }
 
 /* node.getglue */
@@ -3173,7 +3260,7 @@
     halfword n = *check_isnode(L, 1);
     if (n) {
         halfword t = type(n);
-        if (t == glue_node || t == glue_spec_node || t == math_node || t== ins_node) {
+        if (t == glue_node || t == glue_spec_node || t == math_node || t == ins_node) {
             lua_pushinteger(L,width(n));
             lua_pushinteger(L,stretch(n));
             lua_pushinteger(L,shrink(n));
@@ -3180,9 +3267,14 @@
             lua_pushinteger(L,stretch_order(n));
             lua_pushinteger(L,shrink_order(n));
             return 5;
+        } else if (t == hlist_node || t == vlist_node) {
+            lua_pushnumber(L, (double) glue_set(n)); /* float */
+            lua_pushinteger(L,glue_order(n));
+            lua_pushinteger(L,glue_sign(n));
+            return 3;
         }
     }
-    return luaL_error(L, "glue (spec) expected");
+    return luaL_error(L, "glue (spec) or list expected");
 }
 
 static int lua_nodelib_set_glue(lua_State * L)
@@ -3197,20 +3289,31 @@
             shrink(n)        = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_roundnumber(L,4) : 0;
             stretch_order(n) = ((top > 4 && lua_type(L, 5) == LUA_TNUMBER)) ? lua_tointeger(L,5) : 0;
             shrink_order(n)  = ((top > 5 && lua_type(L, 6) == LUA_TNUMBER)) ? lua_tointeger(L,6) : 0;
+        } else if (t == hlist_node || t == vlist_node) {
+            glue_set(n)   = ((top > 1 && lua_type(L, 2) == LUA_TNUMBER)) ? (glue_ratio) lua_tonumber(L,2) : 0;
+            glue_order(n) = ((top > 2 && lua_type(L, 3) == LUA_TNUMBER)) ? lua_tointeger(L,3) : 0;
+            glue_sign(n)  = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_tointeger(L,4) : 0;
+            return 3;
         }
-	return 0;
+        return 0;
     }
-    return luaL_error(L, "glue (spec) expected");
+    return luaL_error(L, "glue (spec) or list expected");
 }
 
 static int lua_nodelib_is_zero_glue(lua_State * L)
 {
     halfword n = *check_isnode(L, 1);
-    if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node || type(n) == math_node || type(n) == ins_node)) {
-        lua_pushboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0));
-        return 1;
+    if (n != null) {
+        halfword t = type(n);
+        if (t == glue_node || t == glue_spec_node || t == math_node || t == ins_node) {
+            lua_pushboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0));
+            return 1;
+        } else if (t == hlist_node || t == vlist_node) {
+            lua_pushboolean(L,(glue_set(n) == 0 && glue_order(n) == 0 && glue_sign(n) == 0));
+            return 1;
+        }
     }
-    return luaL_error(L, "glue (spec) expected");
+    return luaL_error(L, "glue (spec) or list expected");
 }
 
 /* iteration */
@@ -4051,6 +4154,8 @@
             fast_metatable_or_nil(subscr(n));
         } else if (lua_key_eq(s, sup)) {
             fast_metatable_or_nil(supscr(n));
+        } else if (lua_key_eq(s, options)) {
+            lua_pushinteger(L, noadoptions(n));
         } else {
             lua_pushnil(L);
         }
@@ -4788,6 +4893,8 @@
             nodelib_pushdirect_or_nil(subscr(n));
         } else if (lua_key_eq(s, sup)) {
             nodelib_pushdirect_or_nil(supscr(n));
+        } else if (lua_key_eq(s, options)) {
+            lua_pushinteger(L, noadoptions(n));
         } else {
             lua_pushnil(L);
         }
@@ -4835,7 +4942,7 @@
     } else if (t == math_node) {
         if (lua_key_eq(s, surround)) {
             lua_pushinteger(L, surround(n));
-		/* glue */
+        /* glue */
         } else if (lua_key_eq(s, width)) {
             lua_pushinteger(L, width(n));
         } else if (lua_key_eq(s, stretch)) {
@@ -5258,111 +5365,169 @@
 }
 
 /* node.protect_glyphs (returns also boolean because that signals callback) */
+/* node.unprotect_glyphs (returns also boolean because that signals callback) */
 
+#define protect_one_indeed(n) \
+    if (n != null) { \
+        int s = subtype(n); \
+        if (s <= 256) { \
+            subtype(n) = (quarterword) (s == 1 ? 256 : 256 + s); \
+        } \
+    }
+
+#define protect_all_indeed(n) \
+    h = n ; \
+    if (h != null) { \
+        while (h != null) { \
+            if (type(h) == glyph_node) { \
+                int s = subtype(h); \
+                if (s <= 256) { \
+                    subtype(h) = (quarterword) (s == 1 ? 256 : 256 + s); \
+                } \
+            } \
+            h = vlink(h); \
+        } \
+    }
+
+#define protect_node_indeed(n) \
+    if (type(n) == glyph_node) { \
+        protect_one_indeed(n); \
+    } else if (type(n) == disc_node) { \
+        protect_all_indeed(vlink(no_break(n))); \
+        protect_all_indeed(vlink(pre_break(n))); \
+        protect_all_indeed(vlink(post_break(n))); \
+    }
+
+#define unprotect_one_indeed(n) \
+    if (n != null) { \
+        int s = subtype(n); \
+        if (s > 256) { \
+            subtype(n) = (quarterword) (s - 256); \
+        } \
+    }
+
+#define unprotect_all_indeed(n) \
+    h = n ; \
+    if (h != null) { \
+        while (h != null) { \
+            if (type(h) == glyph_node) { \
+                int s = subtype(h); \
+                if (s <= 256) { \
+                    subtype(h) = (quarterword) (s - 256); \
+                } \
+            } \
+            h = vlink(h); \
+        } \
+    }
+
+#define unprotect_node_indeed(n) \
+    if (type(n) == glyph_node) { \
+        unprotect_one_indeed(n); \
+    } else if (type(n) == disc_node) { \
+        unprotect_all_indeed(vlink(no_break(n))); \
+        unprotect_all_indeed(vlink(pre_break(n))); \
+        unprotect_all_indeed(vlink(post_break(n))); \
+    }
+
+static int lua_nodelib_protect_glyph(lua_State * L)
+{
+    halfword n = *check_isnode(L, 1);
+    halfword h;
+    protect_node_indeed(n);
+    return 0;
+}
+
+static int lua_nodelib_unprotect_glyph(lua_State * L)
+{
+    halfword n = *check_isnode(L, 1);
+    halfword h;
+    unprotect_node_indeed(n);
+    return 0;
+}
+
 static int lua_nodelib_protect_glyphs(lua_State * L)
 {
-    int t = 0;
     halfword head = *check_isnode(L, 1);
+    halfword tail = null;
+    halfword h;
+    if (lua_gettop(L) > 1) {
+        tail = *check_isnode(L, 2);
+    }
     while (head != null) {
-        if (type(head) == glyph_node) {
-            int s = subtype(head);
-            if (s <= 256) {
-                t = 1;
-                subtype(head) = (quarterword) (s == 1 ? 256 : 256 + s);
-            }
+        protect_node_indeed(head);
+        if (head == tail) {
+            break;
         }
         head = vlink(head);
     }
-    lua_pushboolean(L, t);
-    lua_pushvalue(L, 1);
-    return 2;
+    return 0;
 }
 
-static int lua_nodelib_protect_glyph(lua_State * L)
+static int lua_nodelib_unprotect_glyphs(lua_State * L)
 {
-    halfword n = *check_isnode(L, 1);
-    if (type(n) == glyph_node) {
-        int s = subtype(n);
-        if (s <= 256) {
-            subtype(n) = (quarterword) (s == 1 ? 256 : 256 + s);
+    halfword head = *check_isnode(L, 1);
+    halfword tail = null;
+    halfword h;
+    if (lua_gettop(L) > 1) {
+        tail = *check_isnode(L, 2);
+    }
+    while (head != null) {
+        unprotect_node_indeed(head);
+        if (head == tail) {
+            break;
         }
+        head = vlink(head);
     }
     return 0;
 }
 
 /* node.direct.protect_glyphs */
+/* node.direct.unprotect_glyphs */
 
-static int lua_nodelib_direct_protect_glyphs(lua_State * L)
+static int lua_nodelib_direct_protect_glyph(lua_State * L)
 {
-    int t = 0;
-    halfword head = (halfword) lua_tointeger(L,1);
-    while (head != null) {
-        if (type(head) == glyph_node) {
-            int s = subtype(head);
-            if (s <= 256) {
-                t = 1;
-                subtype(head) = (quarterword) (s == 1 ? 256 : 256 + s);
-            }
-        }
-        head = vlink(head);
-    }
-    lua_pushboolean(L, t);
-    lua_pushvalue(L, 1);
-    return 2;
+    halfword n = (halfword) lua_tointeger(L,1);
+    halfword h;
+    protect_node_indeed(n);
+    return 0;
 }
 
-static int lua_nodelib_direct_protect_glyph(lua_State * L)
+static int lua_nodelib_direct_unprotect_glyph(lua_State * L)
 {
     halfword n = (halfword) lua_tointeger(L,1);
-    if ((n != null) && (type(n) == glyph_node)) {
-        int s = subtype(n);
-        if (s <= 256) {
-            subtype(n) = (quarterword) (s == 1 ? 256 : 256 + s);
-        }
-    }
+    halfword h;
+    unprotect_node_indeed(n);
     return 0;
 }
 
-/* node.unprotect_glyphs (returns also boolean because that signals callback) */
-
-static int lua_nodelib_unprotect_glyphs(lua_State * L)
+static int lua_nodelib_direct_protect_glyphs(lua_State * L)
 {
-    int t = 0;
-    halfword head = *(check_isnode(L, 1));
+    halfword head = (halfword) lua_tointeger(L,1);
+    halfword tail = (halfword) lua_tointeger(L,2);
+    halfword h;
     while (head != null) {
-        if (type(head) == glyph_node) {
-            int s = subtype(head);
-            if (s > 256) {
-                t = 1;
-                subtype(head) = (quarterword) (s - 256);
-            }
+        protect_node_indeed(head);
+        if (head == tail) {
+            break;
         }
         head = vlink(head);
     }
-    lua_pushboolean(L, t);
-    lua_pushvalue(L, 1);
-    return 2;
+    return 0;
 }
 
-/* node.direct.unprotect_glyphs */
-
 static int lua_nodelib_direct_unprotect_glyphs(lua_State * L)
 {
-    int t = 0;
     halfword head = (halfword) lua_tointeger(L,1);
+    halfword tail = (halfword) lua_tointeger(L,2);
+    halfword h;
     while (head != null) {
-        if (type(head) == glyph_node) {
-            int s = subtype(head);
-            if (s > 256) {
-                t = 1;
-                subtype(head) = (quarterword) (s - 256);
-            }
+        unprotect_node_indeed(head);
+        if (head == tail) {
+            break;
         }
         head = vlink(head);
     }
-    lua_pushboolean(L, t);
-    lua_pushvalue(L, 1);
-    return 2;
+    return 0;
 }
 
 /* node.first_glyph */
@@ -6100,6 +6265,8 @@
             subscr(n) = nodelib_getlist(L, 3);
         } else if (lua_key_eq(s, sup)) {
             supscr(n) = nodelib_getlist(L, 3);
+        } else if (lua_key_eq(s, options)) {
+            noadoptions(n) = (quarterword) lua_tointeger(L, 3);
         } else {
             return nodelib_cantset(L, n, s);
         }
@@ -6690,6 +6857,55 @@
     return 2;
 }
 
+/* uses_font */
+/* direct.uses_font */
+
+#define uses_font_disc(what,p,n) \
+p = vlink(what(n)); \
+while (p) { \
+    if ((type(p) == glyph_node) && (font(p) == f)) { \
+        lua_pushboolean(L,1); \
+        return 1; \
+    } \
+    p = vlink(p); \
+}
+
+
+static int lua_nodelib_direct_uses_font(lua_State * L)
+{
+    halfword n = lua_tointeger(L,1);
+    halfword f = lua_tointeger(L,2);
+    halfword p;
+    if (type(n) == glyph_node) {
+        lua_pushboolean(L,font(n) == f);
+    } else if (type(n) == disc_node) {
+        uses_font_disc(pre_break,p,n);
+        uses_font_disc(post_break,p,n);
+        uses_font_disc(no_break,p,n);
+    }
+    /* todo: other node types */
+    lua_pushboolean(L,0);
+    return 1;
+}
+
+static int lua_nodelib_uses_font(lua_State * L)
+{
+    halfword n = *check_isnode(L, 1);
+    halfword f = lua_tointeger(L,2);
+    halfword p;
+    if (type(n) == glyph_node) {
+        lua_pushboolean(L,font(n) == f);
+    } else if (type(n) == disc_node) {
+        uses_font_disc(pre_break,p,n);
+        uses_font_disc(post_break,p,n);
+        uses_font_disc(no_break,p,n);
+    }
+    /* todo: other node types */
+    lua_pushboolean(L,0);
+    return 1;
+}
+
+
 /* direct.setfield */
 
 static int lua_nodelib_direct_setfield(lua_State * L)
@@ -6905,6 +7121,8 @@
             subscr(n) = nodelib_popdirect(3);
         } else if (lua_key_eq(s, sup)) {
             supscr(n) = nodelib_popdirect(3);
+        } else if (lua_key_eq(s, options)) {
+            noadoptions(n) = (quarterword) lua_tointeger(L, 3);
         } else {
             return nodelib_cantset(L, n, s);
         }
@@ -6939,7 +7157,7 @@
             height(n) = (halfword) lua_roundnumber(L, 3);
         } else if ((lua_key_eq(s, list)) || (lua_key_eq(s, head))) {
             ins_ptr(n) = nodelib_popdirect(3);
-		/* glue */
+        /* glue */
         } else if (lua_key_eq(s, width)) {
             width(n) = (halfword) lua_roundnumber(L, 3);
         } else if (lua_key_eq(s, stretch)) {
@@ -6958,7 +7176,7 @@
             subtype(n) = (quarterword) lua_tointeger(L, 3);
         } else if (lua_key_eq(s, surround)) {
             surround(n) = (halfword) lua_roundnumber(L, 3);
-		/* glue */
+        /* glue */
         } else if (lua_key_eq(s, width)) {
             width(n) = (halfword) lua_roundnumber(L, 3);
         } else if (lua_key_eq(s, stretch)) {
@@ -7481,20 +7699,20 @@
     if ((glue == NULL) || (type(*glue) != glue_node)) {
         lua_pushnil(L) ;
     } else {
-        int w = width(*glue) ;
+        double w = width(*glue) ;
         parent = lua_touserdata(L, 2);
         if ((parent != NULL) && ((type(*parent) == hlist_node) || (type(*parent) == vlist_node))) {
-            if ((int)glue_sign(*parent) == 1) {
+            if ((int) glue_sign(*parent) == 1) {
                 if (stretch_order(*glue) == glue_order(*parent)) {
-                    w += stretch(*glue) * glue_set(*parent);
+                    w += stretch(*glue) * (double) glue_set(*parent);
                 }
             } else if (glue_sign(*parent) == 2) {
                 if (shrink_order(*glue) == glue_order(*parent)) {
-                    w -= shrink(*glue) * glue_set(*parent);
+                    w -= shrink(*glue) * (double) glue_set(*parent);
                 }
             }
         }
-        lua_pushinteger(L,w);
+        lua_pushinteger(L,round(w));
     }
     return 1;
 }
@@ -7505,20 +7723,20 @@
     if ((glue == null) || (type(glue) != glue_node)) {
         lua_pushnil(L) ;
     } else {
-        int w = width(glue) ;
+        double w = (double) width(glue) ;
         halfword parent = lua_tointeger(L, 2);
         if ((parent != null) && ((type(parent) == hlist_node) || (type(parent) == vlist_node))) {
             if ((int)glue_sign(parent) == 1) {
                 if (stretch_order(glue) == glue_order(parent)) {
-                    w += stretch(glue) * glue_set(parent);
+                    w += stretch(glue) * (double) glue_set(parent);
                 }
             } else if (glue_sign(parent) == 2) {
                 if (shrink_order(glue) == glue_order(parent)) {
-                    w -= shrink(glue) * glue_set(parent);
+                    w -= shrink(glue) * (double) glue_set(parent);
                 }
             }
         }
-        lua_pushinteger(L,w);
+        lua_pushnumber(L,round(w));
     }
     return 1;
 }
@@ -7563,6 +7781,46 @@
     return 0;
 }
 
+static int lua_nodelib_direct_flatten_discretionaries(lua_State * L)
+{
+    halfword head = lua_tointeger(L, 1);
+    halfword current = head;
+    halfword next;
+    halfword d, n, h, t;
+    int c = 0;
+    while (current != null) {
+        next = vlink(current);
+        if (type(current) == disc_node) {
+            ++c;
+            d = current;
+            n = no_break(d);
+            h = vlink(n);
+            t = tlink(n);
+            if (h != null) {
+                try_couple_nodes(t,next);
+                if (current == head) {
+                    head = h;
+                } else {
+                    try_couple_nodes(alink(current),h);
+                }
+                vlink(n) = null ;
+              //tlink(n) = null;
+            } else {
+                if (current == head) {
+                    head = next;
+                } else {
+                    try_couple_nodes(alink(current),next);
+                }
+            }
+            flush_node(d);
+        }
+        current = next;
+    }
+    nodelib_pushdirect_or_nil(head);
+    lua_pushinteger(L,c);
+    return 2;
+}
+
 static int lua_nodelib_check_discretionaries(lua_State * L) {
     halfword c = *check_isnode(L, 1);
     halfword p ;
@@ -7588,6 +7846,129 @@
     return 0;
 }
 
+static int lua_nodelib_flatten_discretionaries(lua_State * L)
+{
+    halfword head = *check_isnode(L, 1);
+    halfword current = head;
+    halfword next;
+    halfword d, n, h, t;
+    halfword *a;
+    int c = 0;
+    while (current != null) {
+        next = vlink(current);
+        if (type(current) == disc_node) {
+            ++c;
+            d = current;
+            n = no_break(d);
+            h = vlink(n);
+            t = tlink(n);
+            if (h != null) {
+                try_couple_nodes(t,next);
+                if (current == head) {
+                    head = h;
+                } else {
+                    try_couple_nodes(alink(current),h);
+                }
+                vlink(n) = null ;
+              //tlink(n) = null;
+            } else {
+                if (current == head) {
+                    head = next;
+                } else {
+                    try_couple_nodes(alink(current),next);
+                }
+            }
+            flush_node(d);
+        }
+        current = next;
+    }
+    fast_metatable_or_nil(head);
+    lua_pushinteger(L,c);
+    return 2;
+}
+
+/* synctex but not */
+
+static int lua_nodelib_direct_set_synctex_fields(lua_State * L)
+{
+    halfword n = lua_tointeger(L, 1);
+    halfword tag = lua_tointeger(L, 2);
+    halfword line = lua_tointeger(L, 3);
+    if (n != null) {
+        switch (type(n)) {
+            case glyph_node:
+                if (tag)  synctex_tag_glyph(n)  = tag;
+                if (line) synctex_line_glyph(n) = line;
+                break;
+            case glue_node:
+                if (tag)  synctex_tag_glue(n)  = tag;
+                if (line) synctex_line_glue(n) = line;
+                break;
+            case kern_node:
+                if (tag)  synctex_tag_kern(n)  = tag;
+                if (line) synctex_line_kern(n) = line;
+                break;
+            case hlist_node:
+            case vlist_node:
+            case unset_node:
+                if (tag)  synctex_tag_box(n)  = tag;
+                if (line) synctex_line_box(n) = line;
+                break;
+            case rule_node:
+                if (tag)  synctex_tag_rule(n)  = tag;
+                if (line) synctex_line_rule(n) = line;
+                break;
+            case math_node:
+                if (tag)  synctex_tag_math(n)  = tag;
+                if (line) synctex_line_math(n) = line;
+                break;
+        }
+    }
+    return 0;
+}
+
+static int lua_nodelib_direct_get_synctex_fields(lua_State * L)
+{
+    halfword n = lua_tointeger(L, 1);
+    if (n != null) {
+        switch (type(n)) {
+            case glyph_node:
+                lua_pushinteger(L,synctex_tag_glyph(n));
+                lua_pushinteger(L,synctex_line_glyph(n));
+                break;
+            case glue_node:
+                lua_pushinteger(L,synctex_tag_glue(n));
+                lua_pushinteger(L,synctex_line_glue(n));
+                break;
+            case kern_node:
+                lua_pushinteger(L,synctex_tag_kern(n));
+                lua_pushinteger(L,synctex_line_kern(n));
+                break;
+            case hlist_node:
+            case vlist_node:
+            case unset_node:
+                lua_pushinteger(L,synctex_tag_box(n));
+                lua_pushinteger(L,synctex_line_box(n));
+                break;
+            case rule_node:
+                lua_pushinteger(L,synctex_tag_rule(n));
+                lua_pushinteger(L,synctex_line_rule(n));
+                break;
+            case math_node:
+                lua_pushinteger(L,synctex_tag_math(n));
+                lua_pushinteger(L,synctex_line_math(n));
+                break;
+            default:
+                return 0;
+                break;
+        }
+        return 2;
+    }
+    return 0;
+}
+
+/* done */
+
 static const struct luaL_Reg nodelib_p[] = {
     {"__index",    lua_nodelib_get_property_t},
     {"__newindex", lua_nodelib_set_property_t},
@@ -7641,6 +8022,7 @@
     {"getshift", lua_nodelib_direct_getshift},
     {"getfield", lua_nodelib_direct_getfield},
     {"getfont", lua_nodelib_direct_getfont},
+    {"getfam", lua_nodelib_direct_getfam},
     {"getid", lua_nodelib_direct_getid},
     {"getnext", lua_nodelib_direct_getnext},
     {"getprev", lua_nodelib_direct_getprev},
@@ -7659,6 +8041,7 @@
     {"has_field", lua_nodelib_direct_has_field},
     {"is_char", lua_nodelib_direct_is_char},
     {"is_glyph", lua_nodelib_direct_is_glyph},
+    {"uses_font", lua_nodelib_direct_uses_font},
     {"hpack", lua_nodelib_direct_hpack},
  /* {"id", lua_nodelib_id}, */ /* no node argument */
     {"insert_after", lua_nodelib_direct_insert_after},
@@ -7681,6 +8064,7 @@
     {"setfield", lua_nodelib_direct_setfield},
     {"setchar", lua_nodelib_direct_setchar},
     {"setfont", lua_nodelib_direct_setfont},
+    {"setfam", lua_nodelib_direct_setfam},
     {"setcomponents", lua_nodelib_direct_setcomponents},
     {"setlang", lua_nodelib_direct_setlang},
     {"setkern", lua_nodelib_direct_setkern},
@@ -7716,6 +8100,7 @@
  /* {"type", lua_nodelib_type}, */ /* no node argument */
  /* {"types", lua_nodelib_types}, */ /* no node argument */
     {"unprotect_glyphs", lua_nodelib_direct_unprotect_glyphs},
+    {"unprotect_glyph", lua_nodelib_direct_unprotect_glyph},
     {"unset_attribute", lua_nodelib_direct_unset_attribute},
     {"setglue",lua_nodelib_direct_set_glue},
     {"getglue",lua_nodelib_direct_get_glue},
@@ -7732,7 +8117,11 @@
     {"effective_glue", lua_nodelib_direct_effective_glue},
     {"check_discretionary", lua_nodelib_direct_check_discretionary},
     {"check_discretionaries", lua_nodelib_direct_check_discretionaries},
+    {"flatten_discretionaries",lua_nodelib_direct_flatten_discretionaries},
     /* done */
+    {"set_synctex_fields", lua_nodelib_direct_set_synctex_fields},
+    {"get_synctex_fields", lua_nodelib_direct_get_synctex_fields},
+    /* done */
     {NULL, NULL} /* sentinel */
 };
 
@@ -7775,6 +8164,7 @@
     {"has_field", lua_nodelib_has_field},
     {"is_char", lua_nodelib_is_char},
     {"is_glyph", lua_nodelib_is_glyph},
+    {"uses_font", lua_nodelib_uses_font},
     {"hpack", lua_nodelib_hpack},
     {"id", lua_nodelib_id},
     {"insert_after", lua_nodelib_insert_after},
@@ -7804,6 +8194,7 @@
     {"type", lua_nodelib_type},
     {"types", lua_nodelib_types},
     {"unprotect_glyphs", lua_nodelib_unprotect_glyphs},
+    {"unprotect_glyph", lua_nodelib_unprotect_glyph},
     {"unset_attribute", lua_nodelib_unset_attribute},
     {"setglue",lua_nodelib_set_glue},
     {"getglue",lua_nodelib_get_glue},
@@ -7823,7 +8214,12 @@
     {"effective_glue", lua_nodelib_effective_glue},
     {"check_discretionary", lua_nodelib_check_discretionary},
     {"check_discretionaries", lua_nodelib_check_discretionaries},
+    {"flatten_discretionaries",lua_nodelib_flatten_discretionaries},
     /* done */
+ /* {"set_synctex_fields", lua_nodelib_set_synctex_fields}, */
+ /* {"get_synctex_fields", lua_nodelib_get_synctex_fields}, */
+    /* done */
+    {"fix_node_lists", lua_nodelib_fix_node_lists},
     {NULL, NULL} /* sentinel */
 };
 

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lpdflib.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lpdflib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lpdflib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -949,6 +949,25 @@
     return 1 ;
 }
 
+static int getpdfmajorversion(lua_State * L)
+{
+ /* lua_pushinteger(L,static_pdf->major_version); */
+    lua_pushinteger(L,pdf_major_version);
+    return 1 ;
+}
+
+static int setpdfmajorversion(lua_State * L)
+{
+    if (lua_type(L, 1) == LUA_TNUMBER) {
+        int c = (int) lua_tointeger(L, 1);
+        if ((c >= 1) && (c <= 2)) {
+            static_pdf->major_version = c;
+            set_pdf_major_version(c);
+        }
+    }
+    return 0 ;
+}
+
 static int getpdfminorversion(lua_State * L)
 {
  /* lua_pushinteger(L,static_pdf->minor_version); */
@@ -1199,6 +1218,8 @@
     { "xformname", getpdfxformname },
     { "getversion", getpdfversion },
     { "getcreationdate", getpdfcreationdate },
+    { "getmajorversion", getpdfmajorversion },
+    { "setmajorversion", setpdfmajorversion },
     { "getminorversion", getpdfminorversion },
     { "setminorversion", setpdfminorversion },
     { "newcolorstack", newpdfcolorstack },

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lpdfscannerlib.cc
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lpdfscannerlib.cc	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lpdfscannerlib.cc	2018-01-09 23:43:20 UTC (rev 46269)
@@ -944,7 +944,7 @@
     luaL_openlib(L, 0, scannerlib_meta, 0);
     lua_pushvalue(L, -1);
     lua_setfield(L, -2, "__index");
-    luaL_openlib(L, NULL, scannerlib_m, 0);
+    luaL_register(L, NULL, scannerlib_m);
     luaL_register(L, "pdfscanner", scannerlib);
     return 1;
 }

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lstatslib.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lstatslib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lstatslib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -20,6 +20,7 @@
 
 #include "ptexlib.h"
 #include "lua/luatex-api.h"
+#include "luatex_svnversion.h"
 
 typedef struct statistic {
     const char *name;
@@ -260,7 +261,12 @@
     }
 }
 
+static lua_Number get_development_id(void)
+{
+    return (lua_Number) luatex_svn_revision ;
+}
 
+
 /* temp, for backward compat */
 static int init_pool_ptr = 0;
 
@@ -293,6 +299,7 @@
     {"banner", 'S', (void *) &getbanner},
     {"luatex_version", 'G', &get_luatexversion},
     {"luatex_revision", 'S', (void *) &luatexrevision},
+    {"development_id", 'N', &get_development_id},
     {"luatex_hashtype", 'S', (void *) &get_luatexhashtype},
     {"luatex_hashchars", 'N',  &get_luatexhashchars},
     {"luatex_engine", 'S', (void *) &getenginename},
@@ -471,9 +478,15 @@
     return 0;
 }
 
+static int setexitcode(lua_State * L) {
+    defaultexitcode = luaL_checkinteger(L,1);
+    return 0;
+}
+
 static const struct luaL_Reg statslib[] = {
     {"list", statslist},
     {"resetmessages", resetmessages},
+    {"setexitcode", setexitcode},
     {NULL, NULL}                /* sentinel */
 };
 

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/lstrlibext.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/lstrlibext.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/lstrlibext.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -359,6 +359,133 @@
     return 1;
 }
 
+/*
+    We provide a few helpers that we derived from the lua utf8 module
+    and slunicode. That way we're sort of covering a decent mix.
+
+*/
+
+#define MAXUNICODE	0x10FFFF
+
+/*
+    This is a combination of slunicode and utf8 converters but without mode
+    and a bit faster on the average than the utf8 one.
+*/
+
+static void utf8_enco (luaL_Buffer *b, unsigned c)
+{
+    if (c > MAXUNICODE) {
+        /* we silently ignore the bad character */
+        return;
+    }
+	if (0x80 > c) {
+		luaL_addchar(b, c);
+		return;
+	}
+	if (0x800 > c)
+		luaL_addchar(b, 0xC0|(c>>6));
+	else {
+		if (0x10000 > c)
+			luaL_addchar(b, 0xE0|(c>>12));
+		else {
+			luaL_addchar(b, 0xF0|(c>>18));
+			luaL_addchar(b, 0x80|(0x3F&(c>>12)));
+		}
+		luaL_addchar(b, 0x80|(0x3F&(c>>6)));
+	}
+	luaL_addchar(b, 0x80|(0x3F&c));
+}
+
+static int str_character (lua_State *L) {
+    int n = lua_gettop(L);  /* number of arguments */
+    int i;
+    luaL_Buffer b;
+    luaL_buffinit(L,&b);
+    for (i = 1; i <= n; i++) {
+        utf8_enco (&b, (unsigned) lua_tointeger(L, i));
+    }
+    luaL_pushresult(&b);
+    return 1;
+}
+
+/*
+    The utf8 codepoint function takes two arguments, being positions in the
+    string, while slunicode byte takes two arguments representing the number of
+    utf characters. The variant below always returns all codepoints.
+
+*/
+
+static int str_utfvalue (lua_State *L) {
+    size_t ls;
+    int ind = 0;
+    int num = 0;
+    const char *s = lua_tolstring(L, 1, &ls);
+    while (ind<(int)ls) {
+        unsigned char i = (unsigned)*(s+ind);
+        if (i<0x80) {
+            lua_pushinteger(L, i);
+            num += 1;
+            ind += 1;
+        } else if (i>=0xF0) {
+            if ((ind+3)<(int)ls && ((unsigned)*(s+ind+1))>=0x80 && ((unsigned)*(s+ind+2))>=0x80 && ((unsigned)*(s+ind+3))>=0x80) {
+                unsigned char j = ((unsigned)*(s+ind+1))-128;
+                unsigned char k = ((unsigned)*(s+ind+2))-128;
+                unsigned char l = ((unsigned)*(s+ind+3))-128;
+                lua_pushinteger(L, (((((i-0xF0)*64) + j)*64) + k)*64 + l);
+                num += 1;
+            }
+            ind += 4;
+        } else if (i>=0xE0) {
+            if ((ind+2)<(int)ls && ((unsigned)*(s+ind+1))>=0x80 && ((unsigned)*(s+ind+2))>=0x80) {
+                unsigned char j = ((unsigned)*(s+ind+1))-128;
+                unsigned char k = ((unsigned)*(s+ind+2))-128;
+                lua_pushinteger(L, (((i-0xE0)*64) + j)*64 + k);
+                num += 1;
+            }
+            ind += 3;
+        } else if (i>=0xC0) {
+            if ((ind+1)<(int)ls && ((unsigned)*(s+ind+1))>=0x80) {
+                unsigned char j = ((unsigned)*(s+ind+1))-128;
+                lua_pushinteger(L, ((i-0xC0)*64) + j);
+                num += 1;
+            }
+            ind += 2;
+        } else {
+            ind += 1;
+        }
+    }
+    return num;
+}
+
+/* This is a simplified version of utf8.len but without range. */
+
+static int str_utflength (lua_State *L) {
+    size_t ls;
+    int ind = 0;
+    int num = 0;
+    const char *s = lua_tolstring(L, 1, &ls);
+    while (ind<(int)ls) {
+        unsigned char i = (unsigned)*(s+ind);
+        if (i<0x80) {
+            ind += 1;
+        } else if (i>=0xF0) {
+            ind += 4;
+        } else if (i>=0xE0) {
+            ind += 3;
+        } else if (i>=0xC0) {
+            ind += 2;
+        } else {
+            /* bad news, stupid recovery */
+            ind += 1;
+        }
+        num += 1;
+    }
+    lua_pushinteger(L, num);
+    return 1;
+}
+
+/* end of convenience inclusion */
+
 static const luaL_Reg strlibext[] = {
   {"utfvalues", str_utfvalues},
   {"utfcharacters", str_utfcharacters},
@@ -368,6 +495,9 @@
   {"bytepairs", str_bytepairs},
   {"bytetable", str_bytetable},
   {"explode", str_split},
+  {"utfcharacter", str_character},
+  {"utfvalue", str_utfvalue},
+  {"utflength", str_utflength},
 #ifdef LuajitTeX
   /* luajit has dump built in */
 #else

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/ltexlib.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/ltexlib.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/ltexlib.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -789,7 +789,7 @@
 
 static int gettex(lua_State * L);
 
-#define get_item_index_plus(L, where, base, what, value, is_assign, get_register, glue) { \
+#define get_item_index_plus(L, where, base, what, value, is_assign, get_register, texget) { \
     size_t len;                                                                       \
     const char *str;                                                                  \
     int key, cs;                                                                      \
@@ -804,7 +804,7 @@
                 if (key >= 0 && key <= 65535) {                                       \
                     value = get_register(key);                                        \
                 } else if (is_assign(eq_type(cs))) {                                  \
-                    gettex(L); /* lazy */                                             \
+                    texget = gettex(L); /* lazy */                                    \
                 } else {                                                              \
                     luaL_error(L, "incorrect %s name", what);                         \
                 }                                                                     \
@@ -849,7 +849,11 @@
 static int getdimen(lua_State * L)
 {
     int value = 0;
-    get_item_index_plus(L, lua_gettop(L), scaled_base, "dimen", value, is_dim_assign, get_tex_dimen_register, false);
+    int texget = 0;
+    get_item_index_plus(L, lua_gettop(L), scaled_base, "dimen", value, is_dim_assign, get_tex_dimen_register, texget);
+    if (texget > 0) {
+        return texget;
+    }
     lua_pushinteger(L, value);
     return 1;
 }
@@ -877,7 +881,11 @@
 static int getskip(lua_State * L)
 {
     int value = 0;
-    get_item_index_plus(L, lua_gettop(L), skip_base, "skip", value, is_glue_assign, get_tex_skip_register, true);
+    int texget = 0;
+    get_item_index_plus(L, lua_gettop(L), skip_base, "skip", value, is_glue_assign, get_tex_skip_register, texget);
+    if (texget > 0) {
+        return texget;
+    }
     if (value == null) {
         lua_nodelib_push_fast(L, copy_node(zero_glue));
     } else {
@@ -910,22 +918,47 @@
 static int getglue(lua_State * L)
 {
     int value = 0;
+    int texget = 0;
     int top = lua_gettop(L);
-    get_item_index_plus(L, top, skip_base, "skip", value, is_glue_assign, get_tex_skip_register, true);
-    if (value == null) {
-        lua_pushinteger(L,0);
-        lua_pushinteger(L,0);
-        lua_pushinteger(L,0);
-        lua_pushinteger(L,0);
-        lua_pushinteger(L,0);
+    int dim = -1;
+    if (top > 1 && lua_type(L,top) == LUA_TBOOLEAN) {
+        dim = lua_toboolean(L,top);
+        top = top - 1;
     } else {
-        lua_pushinteger(L,width(value));
-        lua_pushinteger(L,stretch(value));
-        lua_pushinteger(L,shrink(value));
-        lua_pushinteger(L,stretch_order(value));
-        lua_pushinteger(L,shrink_order(value));
+        lua_pushboolean(L,1);
+        dim = 1 ;
+        /* no top adaption. somewhat messy, but the gettex fallback checks itself */
     }
-    return 5;
+    /* checks itself for the boolean */
+    get_item_index_plus(L, top, skip_base, "glue", value, is_glue_assign, get_tex_skip_register, texget);
+    if (texget > 0) {
+        return texget;
+    }
+    if (dim == 0) {
+        /* false */
+        if (value == null) {
+            lua_pushinteger(L,0);
+        } else {
+            lua_pushinteger(L,width(value));
+        }
+        return 1;
+   } else {
+        /* true and nil */
+        if (value == null) {
+            lua_pushinteger(L,0);
+            lua_pushinteger(L,0);
+            lua_pushinteger(L,0);
+            lua_pushinteger(L,0);
+            lua_pushinteger(L,0);
+        } else {
+            lua_pushinteger(L,width(value));
+            lua_pushinteger(L,stretch(value));
+            lua_pushinteger(L,shrink(value));
+            lua_pushinteger(L,stretch_order(value));
+            lua_pushinteger(L,shrink_order(value));
+        }
+        return 5;
+    }
 }
 
 static int ismuskip(lua_State * L)
@@ -947,7 +980,11 @@
 static int getmuskip(lua_State * L)
 {
     int value = 0;
-    get_item_index_plus(L, lua_gettop(L), mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, true);
+    int texget = 0;
+    get_item_index_plus(L, lua_gettop(L), mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, texget);
+    if (texget > 0) {
+        return texget;
+    }
     lua_nodelib_push_fast(L, copy_node(value));
     return 1;
 }
@@ -976,16 +1013,45 @@
 static int getmuglue(lua_State * L)
 {
     int value = 0;
-    get_item_index_plus(L, lua_gettop(L), mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, true);
-    if (value == null) {
-        lua_pushnil(L);
+    int texget = 0;
+    int top = lua_gettop(L);
+    int dim = -1;
+    if (top > 1 && lua_type(L,top) == LUA_TBOOLEAN) {
+        dim = lua_toboolean(L,top);
+        top = top - 1;
+    } else {
+        lua_pushboolean(L,1);
+        dim = 1 ;
+        /* no top adaption. somewhat messy, but the gettex fallback checks itself */
+    }
+    /* checks itself for the boolean */
+    get_item_index_plus(L, top, mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, texget);
+    if (texget > 0) {
+        return texget;
+    }
+    if (dim == 0) {
+        /* false */
+        if (value == null) {
+            lua_pushinteger(L,0);
+        } else {
+            lua_pushinteger(L,width(value));
+        }
         return 1;
-    } else {
-        lua_pushinteger(L,width(value));
-        lua_pushinteger(L,stretch(value));
-        lua_pushinteger(L,shrink(value));
-        lua_pushinteger(L,stretch_order(value));
-        lua_pushinteger(L,shrink_order(value));
+   } else {
+        /* true and nil */
+        if (value == null) {
+            lua_pushinteger(L,0);
+            lua_pushinteger(L,0);
+            lua_pushinteger(L,0);
+            lua_pushinteger(L,0);
+            lua_pushinteger(L,0);
+        } else {
+            lua_pushinteger(L,width(value));
+            lua_pushinteger(L,stretch(value));
+            lua_pushinteger(L,shrink(value));
+            lua_pushinteger(L,stretch_order(value));
+            lua_pushinteger(L,shrink_order(value));
+        }
         return 5;
     }
 }
@@ -1015,7 +1081,11 @@
 static int getcount(lua_State * L)
 {
     int value = 0;
-    get_item_index_plus(L, lua_gettop(L), count_base, "count", value, is_int_assign, get_tex_count_register, false);
+    int texget = 0;
+    get_item_index_plus(L, lua_gettop(L), count_base, "count", value, is_int_assign, get_tex_count_register, texget);
+    if (texget > 0) {
+        return texget;
+    }
     lua_pushinteger(L, value);
     return 1;
 }
@@ -1047,7 +1117,11 @@
 static int getattribute(lua_State * L)
 {
     int value = 0;
-    get_item_index_plus(L, lua_gettop(L), attribute_base, "attribute", value, is_attr_assign, get_tex_attribute_register, false);
+    int texget = 0;
+    get_item_index_plus(L, lua_gettop(L), attribute_base, "attribute", value, is_attr_assign, get_tex_attribute_register, texget);
+    if (texget > 0) {
+        return texget;
+    }
     lua_pushinteger(L, value);
     return 1;
 }
@@ -2278,7 +2352,7 @@
 static void init_nest_lib(lua_State * L)
 {
     luaL_newmetatable(L, NEST_METATABLE);
-    luaL_register(L, NULL, nest_m);
+    luaL_openlib(L, NULL, nest_m, 0);
     lua_pop(L, 1);
 }
 
@@ -2656,7 +2730,7 @@
 #define get_dimen_par(A,B)  do {          \
     lua_key_rawgeti(A);                   \
     if (lua_type(L, -1) == LUA_TNUMBER) { \
-        A = (int) lua_tointeger(L, -1);   \
+        A = (int) lua_roundnumber(L, -1); \
     } else {                              \
         A = (B);                          \
     }                                     \
@@ -2937,11 +3011,12 @@
     /* Initialize synctex primitive */
     synctexinitcommand();
     /* tex is ready to go, now */
+    /*
     unhide_lua_table(Luas, "tex", tex_table_id);
     unhide_lua_table(Luas, "pdf", pdf_table_id);
     unhide_lua_table(Luas, "token", token_table_id);
     unhide_lua_table(Luas, "node", node_table_id);
-
+    */
     lua_pushboolean(L, 1);      /* true */
     return 1;
 }
@@ -3040,6 +3115,7 @@
     int attributes = null;
     int resources = null;
     int type = 0;
+    int margin = pdf_xform_margin;
     boolean immediate = false;
     /* box attributes resources */
     halfword boxnumber = lua_tointeger(L,1);
@@ -3057,6 +3133,9 @@
     if (lua_type(L,5) == LUA_TNUMBER) {
         type = lua_tointeger(L, 5);
     }
+    if (lua_type(L,6) == LUA_TNUMBER) {
+        margin = lua_tointeger(L, 6);
+    }
     /* more or less same as scanner variant */
     boxdata = box(boxnumber);
     if (boxdata == null)
@@ -3073,6 +3152,7 @@
     set_obj_xform_height(static_pdf, index, height(boxdata));
     set_obj_xform_depth(static_pdf, index, depth(boxdata));
     set_obj_xform_type(static_pdf, index, type);
+    set_obj_xform_margin(static_pdf, index, margin);
     box(boxnumber) = null;
     last_saved_box_index = index;
     lua_pushinteger(L, index);
@@ -3137,6 +3217,7 @@
         lua_pushnil(L);
         lua_pushnil(L);
         lua_pushnil(L);
+        lua_pushnil(L);
     } else {
         index = lua_tointeger(L,1);
         check_obj_type(static_pdf, obj_type_xform, index);
@@ -3143,8 +3224,9 @@
         lua_pushinteger(L, (int) obj_xform_width(static_pdf, index));
         lua_pushinteger(L, (int) obj_xform_height(static_pdf, index));
         lua_pushinteger(L, (int) obj_xform_depth(static_pdf, index));
+        lua_pushinteger(L, (int) obj_xform_margin(static_pdf, index));
     }
-    return 3;
+    return 4;
 }
 
 static int tex_build_page(lua_State * L)
@@ -3153,6 +3235,69 @@
     return 0;
 }
 
+/* synctex */
+
+static int lua_set_synctex_mode(lua_State * L)
+{
+    halfword mode = lua_tointeger(L, 1);
+    synctex_set_mode(mode);
+    return 0;
+}
+static int lua_get_synctex_mode(lua_State * L)
+{
+    lua_pushinteger(L,synctex_get_mode());
+    return 1;
+}
+
+static int lua_set_synctex_tag(lua_State * L)
+{
+    halfword tag = lua_tointeger(L, 1);
+    synctex_set_tag(tag);
+    return 0;
+}
+
+static int lua_get_synctex_tag(lua_State * L)
+{
+    lua_pushinteger(L,synctex_get_tag());
+    return 1;
+}
+
+static int lua_force_synctex_tag(lua_State * L)
+{
+    halfword tag = lua_tointeger(L, 1);
+    synctex_force_tag(tag);
+    return 0;
+}
+
+static int lua_force_synctex_line(lua_State * L)
+{
+    halfword line = lua_tointeger(L, 1);
+    synctex_force_line(line);
+    return 0;
+}
+
+static int lua_set_synctex_line(lua_State * L)
+{
+    halfword line = lua_tointeger(L, 1);
+    synctex_set_line(line);
+    return 0;
+}
+
+static int lua_get_synctex_line(lua_State * L)
+{
+    lua_pushinteger(L,synctex_get_line());
+    return 1;
+}
+
+static int lua_set_synctex_no_files(lua_State * L)
+{
+    halfword flag = lua_tointeger(L, 1);
+    synctex_set_no_files(flag);
+    return 0;
+}
+
+/* till here */
+
 void init_tex_table(lua_State * L)
 {
     lua_createtable(L, 0, 3);
@@ -3252,6 +3397,16 @@
     { "getboxresourcedimensions", tex_get_box_resource_dimensions },
     /* just for testing: it will probably stay but maybe with options */
     { "triggerbuildpage", tex_build_page },
+    /* not the best place but better than in node */
+    { "set_synctex_mode", lua_set_synctex_mode },
+    { "get_synctex_mode", lua_get_synctex_mode },
+    { "set_synctex_tag", lua_set_synctex_tag },
+    { "get_synctex_tag", lua_get_synctex_tag },
+    { "set_synctex_no_files", lua_set_synctex_no_files },
+    { "force_synctex_tag", lua_force_synctex_tag },
+    { "force_synctex_line", lua_force_synctex_line },
+    { "set_synctex_line", lua_set_synctex_line },
+    { "get_synctex_line", lua_get_synctex_line },
     /* sentinel */
     { NULL, NULL }
 };
@@ -3258,7 +3413,7 @@
 
 int luaopen_tex(lua_State * L)
 {
-    luaL_register(L, "tex", texlib);
+    luaL_openlib(L, "tex", texlib, 0);
     /* *INDENT-OFF* */
     make_table(L, "attribute", "tex.attribute", "getattribute", "setattribute");
     make_table(L, "skip",      "tex.skip",      "getskip",      "setskip");

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/luainit.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/luainit.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/luainit.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -446,7 +446,7 @@
                  "kpathsea  : Karl Berry, Olaf Weber and others\n"
                  "lua       : Roberto Ierusalimschy, Waldemar Celes and Luiz Henrique de Figueiredo\n"
                  "metapost  : John Hobby, Taco Hoekwater and friends\n"
-                 "poppler   : Derek Noonburg, Kristian H\\ogsberg (partial)\n"
+                 "poppler   : Derek Noonburg, Kristian Hogsberg (partial)\n"
                  "fontforge : George Williams (partial)\n"
                  "luajit    : Mike Pall (used in LuajitTeX)\n");
             /* *INDENT-ON* */
@@ -767,10 +767,12 @@
 @ helper variables for the safe keeping of table ids
 
 @c
+/*
 int tex_table_id;
 int pdf_table_id;
 int token_table_id;
 int node_table_id;
+*/
 
 @ @c
 int l_pack_type_index       [PACK_TYPE_SIZE] ;
@@ -941,8 +943,8 @@
         /* If setlocale fails here, then the state   */
         /* could be compromised, and we exit.        */
         env_locale = setlocale (LC_ALL, "");
-	if (!env_locale) {
-	  fprintf(stderr,"Unable to read environment locale:exit now.\n");
+	if (!env_locale && !lua_only) {
+	  fprintf(stderr,"Unable to read environment locale: exit now.\n");
 	  exit(1);
 	}
         tmp = setlocale (LC_CTYPE, NULL);
@@ -962,7 +964,7 @@
 	/* we can't ensure a 'sane' locale for lua.   */
 	env_locale = setlocale (LC_ALL, old_locale);
 	if (!env_locale) {
-	  fprintf(stderr,"Unable to restore original locale:exit now.\n");
+	  fprintf(stderr,"Unable to restore original locale %s: exit now.\n",old_locale);
 	  exit(1);
 	}
         xfree(old_locale);
@@ -1011,28 +1013,47 @@
     /* now run the file */
     if (startup_filename != NULL) {
         char *v1;
-        /* hide the 'tex' and 'pdf' table */
-        tex_table_id = hide_lua_table(Luas, "tex");
-        token_table_id = hide_lua_table(Luas, "token");
-        node_table_id = hide_lua_table(Luas, "node");
-        pdf_table_id = hide_lua_table(Luas, "pdf");
-
+        int tex_table_id = hide_lua_table(Luas, "tex");
+        int token_table_id = hide_lua_table(Luas, "token");
+        int node_table_id = hide_lua_table(Luas, "node");
+        int pdf_table_id = hide_lua_table(Luas, "pdf");
+        if (lua_only) {
+            /* hide the 'tex' and 'pdf' table */
+            if (load_luatex_core_lua(Luas)) {
+                fprintf(stderr, "Error in execution of luatex-core.lua .\n");
+            }
+            if (luaL_loadfile(Luas, startup_filename)) {
+                fprintf(stdout, "%s\n", lua_tostring(Luas, -1));
+                exit(1);
+            }
+            init_tex_table(Luas); /* needed ? */
+            if (lua_pcall(Luas, 0, 0, 0)) {
+                fprintf(stdout, "%s\n", lua_tostring(Luas, -1));
+                lua_traceback(Luas);
+             /* lua_close(Luas); */
+                exit(1);
+            } else {
+                if (given_file)
+                    free(given_file);
+             /* lua_close(Luas); */
+                exit(0);
+            }
+        }
+        /* a normal tex run */
+        init_tex_table(Luas);
+        unhide_lua_table(Luas, "tex", tex_table_id);
+        unhide_lua_table(Luas, "pdf", pdf_table_id);
+        unhide_lua_table(Luas, "token", token_table_id);
+        unhide_lua_table(Luas, "node", node_table_id);
         if (luaL_loadfile(Luas, startup_filename)) {
             fprintf(stdout, "%s\n", lua_tostring(Luas, -1));
             exit(1);
         }
-        /* */
-        init_tex_table(Luas);
-        if (lua_only) {
-          if (load_luatex_core_lua(Luas))
-            fprintf(stderr, "Error in execution of luatex-core.lua .\n");
-        }
         if (lua_pcall(Luas, 0, 0, 0)) {
             fprintf(stdout, "%s\n", lua_tostring(Luas, -1));
-        lua_traceback(Luas);
+            lua_traceback(Luas);
             exit(1);
         }
-        /* no filename? quit now! */
         if (!input_name) {
             get_lua_string("texconfig", "jobname", &input_name);
         }
@@ -1039,19 +1060,6 @@
         if (!dump_name) {
             get_lua_string("texconfig", "formatname", &dump_name);
         }
-        if (lua_only) {
-            if (given_file)
-                free(given_file);
-            /* this is not strictly needed but it pleases valgrind */
-            lua_close(Luas);
-            exit(0);
-        }
-        /* unhide the 'tex' and 'pdf' table */
-        unhide_lua_table(Luas, "tex", tex_table_id);
-        unhide_lua_table(Luas, "pdf", pdf_table_id);
-        unhide_lua_table(Luas, "token", token_table_id);
-        unhide_lua_table(Luas, "node", node_table_id);
-
         /* |kpse_init| */
         kpse_init = -1;
         get_lua_boolean("texconfig", "kpse_init", &kpse_init);

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/luanode.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/luanode.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/luanode.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -96,21 +96,18 @@
     start_node = vlink(head_node);
     if (start_node != null) {
         /* maybe just always slide (harmless and fast) */
-        last_node = vlink(start_node);
         if (fix_node_lists) {
-            while (last_node != null) {
-                alink(last_node) = start_node;
-                start_node = last_node;
-                last_node = vlink(start_node);
-            }
+            /* slides and returns last node */
+            *tail_node = fix_node_list(start_node);
         } else {
+            last_node = vlink(start_node);
             while (last_node != null) {
                 start_node = last_node;
                 last_node = vlink(start_node);
             }
+            /* we're at the end now */
+            *tail_node = start_node;
         }
-        /* we're at the end now */
-        *tail_node = start_node;
     } else {
         /* we're already at the end */
         *tail_node = head_node;

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/luastuff.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/luastuff.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/luastuff.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -619,36 +619,8 @@
     luajit compatibility layer for luatex lua5.2
 */
 #ifdef LuajitTeX
-LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) {
-    void *p = lua_touserdata(L, ud);
-    if (p != NULL) {  /* value is a userdata? */
-        if (lua_getmetatable(L, ud)) {  /* does it have a metatable? */
-            luaL_getmetatable(L, tname);  /* get correct metatable */
-        if (!lua_rawequal(L, -1, -2))  /* not the same? */
-            p = NULL;  /* value is a userdata with wrong metatable */
-        lua_pop(L, 2);  /* remove both metatables */
-        return p;
-        }
-    }
-    return NULL;  /* value is not a userdata with a metatable */
-}
 
 @ @c
-/* It's not ok. See lua-users.org/wiki/CompatibilityWithLuaFive for another solution */
-LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
-    /*luaL_checkversion(L);*/
-    luaL_checkstack(L, nup, "too many upvalues");
-    for (; l->name != NULL; l++) {  /* fill the table with given functions */
-        int i;
-        for (i = 0; i < nup; i++)  /* copy upvalues to the top */
-            lua_pushvalue(L, -nup);
-        lua_pushcclosure(L, l->func, nup);  /* closure with those upvalues */
-        lua_setfield(L, -(nup + 2), l->name);
-    }
-    lua_pop(L, nup);  /* remove upvalues */
-}
-
-@ @c
 LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) {
     lua_State *L = B->L;
     if (sz > LUAL_BUFFERSIZE )

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/luatex-api.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/luatex-api.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/luatex-api.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -130,6 +130,7 @@
 extern int luaopen_vf(lua_State * L);
 extern int font_to_lua(lua_State * L, int f);
 extern int font_from_lua(lua_State * L, int f); /* return is boolean */
+extern int characters_from_lua(lua_State * L, int f); /* return is boolean */
 
 extern int luaopen_token(lua_State * L);
 extern void tokenlist_to_lua(lua_State * L, int p);
@@ -224,10 +225,13 @@
 
 extern void init_tex_table(lua_State * L);
 
+/*
 extern int tex_table_id;
 extern int pdf_table_id;
 extern int token_table_id;
 extern int node_table_id;
+*/
+
 extern int main_initialize(void);
 
 extern int do_run_callback(int special, const char *values, va_list vl);
@@ -503,7 +507,6 @@
 make_lua_key(art);\
 make_lua_key(attr);\
 make_lua_key(attributes);\
-make_lua_key(auto_expand);\
 make_lua_key(bbox);\
 make_lua_key(before_display);\
 make_lua_key(best_ins_ptr);\
@@ -715,6 +718,7 @@
 make_lua_key(parameters);\
 make_lua_key(pardir);\
 make_lua_key(parshape);\
+make_lua_key(pdf);\
 make_lua_key(pdf_data);\
 make_lua_key(pdf_destination);\
 make_lua_key(pdf_literal);\
@@ -875,7 +879,6 @@
 init_lua_key(art);\
 init_lua_key(attr);\
 init_lua_key(attributes);\
-init_lua_key(auto_expand);\
 init_lua_key(bbox);\
 init_lua_key(before_display);\
 init_lua_key(best_ins_ptr);\
@@ -1220,6 +1223,7 @@
 init_lua_key_alias(pRTT,"+RTT");\
 init_lua_key_alias(pTLT,"+TLT");\
 init_lua_key_alias(pTRT,"+TRT");\
+init_lua_key_alias(pdf,"pdf");\
 init_lua_key_alias(pdf_data,"pdf.data");\
 init_lua_key_alias(term_and_log,"term and log")
 
@@ -1294,7 +1298,6 @@
 use_lua_key(art);
 use_lua_key(attr);
 use_lua_key(attributes);
-use_lua_key(auto_expand);
 use_lua_key(bbox);
 use_lua_key(before_display);
 use_lua_key(best_ins_ptr);
@@ -1506,6 +1509,7 @@
 use_lua_key(parameters);
 use_lua_key(pardir);
 use_lua_key(parshape);
+use_lua_key(pdf);
 use_lua_key(pdf_data);
 use_lua_key(pdf_destination);
 use_lua_key(pdf_literal);

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/luatex-core.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/luatex-core.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/luatex-core.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -24,7 +24,7 @@
     0x54, 0x65, 0x58, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20,
     0x54, 0x65, 0x61, 0x6d, 0x27, 0x2c, 0x0a, 0x2d, 0x2d, 0x20, 0x7d, 0x0a, 0x0a, 0x4c, 0x55, 0x41,
     0x54, 0x45, 0x58, 0x43, 0x4f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d,
-    0x20, 0x31, 0x2e, 0x30, 0x30, 0x32, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20,
+    0x20, 0x31, 0x2e, 0x30, 0x30, 0x33, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20,
     0x66, 0x69, 0x6c, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x73,
     0x6f, 0x6d, 0x65, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
     0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x20,
@@ -45,214 +45,260 @@
     0x65, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20,
     0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x72, 0x65,
     0x71, 0x75, 0x69, 0x72, 0x65, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6e, 0x64,
-    0x2c, 0x20, 0x67, 0x73, 0x75, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e,
-    0x66, 0x69, 0x6e, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75,
-    0x62, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69,
-    0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f,
-    0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61,
-    0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73,
-    0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64,
-    0x6c, 0x69, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x69,
-    0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
-    0x20, 0x66, 0x69, 0x6f, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73,
-    0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b,
-    0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
-    0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e,
-    0x61, 0x6d, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x63, 0x6f, 0x72,
-    0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
-    0x20, 0x6d, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61,
-    0x62, 0x6c, 0x65, 0x28, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x6c,
-    0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x2e, 0x6c, 0x69,
-    0x6e, 0x65, 0x73, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, 0x66, 0x65, 0x72, 0x6f,
-    0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20,
-    0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x74,
-    0x69, 0x6f, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65,
-    0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20,
-    0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x5f, 0x65, 0x73, 0x63,
-    0x61, 0x70, 0x65, 0x20, 0x2d, 0x2d, 0x20, 0x30, 0x20, 0x28, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c,
-    0x65, 0x64, 0x29, 0x20, 0x31, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x29,
-    0x20, 0x32, 0x20, 0x28, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x29, 0x0a,
-    0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74,
-    0x75, 0x73, 0x2e, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20,
-    0x2d, 0x2d, 0x20, 0x30, 0x20, 0x31, 0x0a, 0x0a, 0x69, 0x6f, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64,
-    0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x2d, 0x2d, 0x20,
-    0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64,
-    0x0a, 0x2d, 0x2d, 0x20, 0x28, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72,
-    0x20, 0x74, 0x6c, 0x31, 0x37, 0x20, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x29, 0x20, 0x69,
-    0x6f, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x70, 0x6f,
-    0x70, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72,
-    0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x0a, 0x69, 0x6f, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64,
-    0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x20,
-    0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x0a,
-    0x6d, 0x74, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x5f, 0x6c,
-    0x69, 0x6e, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x72,
-    0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66,
-    0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69,
-    0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29,
-    0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x6f, 0x77, 0x20,
-    0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, 0x77,
-    0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20,
-    0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f,
-    0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20,
+    0x2c, 0x20, 0x67, 0x73, 0x75, 0x62, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d,
+    0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x2c, 0x20, 0x73, 0x74,
+    0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+    0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,
+    0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x6c, 0x6f,
+    0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70,
+    0x65, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65,
+    0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69,
+    0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66,
+    0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e,
+    0x65, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x63, 0x68, 0x65, 0x63,
+    0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x69,
+    0x6f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,
+    0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f,
+    0x72, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x69,
+    0x6f, 0x2e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65,
+    0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x67, 0x65,
+    0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x69, 0x6f, 0x2e, 0x73, 0x74,
+    0x64, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x5f, 0x6c,
+    0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x3d, 0x20, 0x6d, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
+    0x20, 0x73, 0x61, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, 0x61,
+    0x66, 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
+    0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, 0x68,
+    0x65, 0x6c, 0x6c, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x2d, 0x20, 0x30, 0x20,
+    0x28, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x29, 0x20, 0x31, 0x20, 0x28, 0x61, 0x6e,
+    0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x32, 0x20, 0x28, 0x72, 0x65, 0x73, 0x74, 0x72,
+    0x69, 0x63, 0x74, 0x65, 0x64, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x70, 0x73,
+    0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x75,
+    0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x30, 0x20, 0x31, 0x0a, 0x0a, 0x6c,
+    0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x6c, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x69, 0x6f,
+    0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x6c, 0x0a, 0x0a, 0x69, 0x6f, 0x2e, 0x73, 0x61,
+    0x76, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20,
+    0x2d, 0x2d, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e,
+    0x6c, 0x79, 0x0a, 0x6d, 0x74, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65,
+    0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d,
+    0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79,
+    0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61,
+    0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65,
+    0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68,
+    0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68,
+    0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e,
+    0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20,
+    0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77,
+    0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28,
+    0x68, 0x6f, 0x77, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27,
+    0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x68, 0x6f, 0x77, 0x2c, 0x27, 0x77,
+    0x27, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x69,
+    0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x77, 0x27, 0x29,
+    0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65,
+    0x63, 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d,
+    0x65, 0x2c, 0x27, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65,
+    0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+    0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63,
+    0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74,
+    0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f,
+    0x6e, 0x6c, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20,
+    0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x75, 0x62, 0x28, 0x68, 0x6f, 0x77, 0x2c,
+    0x27, 0x5b, 0x5e, 0x72, 0x62, 0x5d, 0x27, 0x2c, 0x27, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27,
+    0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f,
+    0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64,
+    0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x72,
+    0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+    0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63,
+    0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74,
+    0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65,
+    0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,
+    0x6f, 0x6b, 0x61, 0x79, 0x2c, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x69,
+    0x6f, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,
+    0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f,
+    0x6b, 0x61, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68,
+    0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
+    0x6e, 0x20, 0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x6f, 0x75, 0x6e, 0x64,
+    0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e,
+    0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+    0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65,
+    0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
+    0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69,
+    0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x20,
+    0x6f, 0x72, 0x20, 0x27, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e,
+    0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66,
+    0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x29, 0x0a, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65,
+    0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
+    0x72, 0x6e, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20,
+    0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
+    0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78,
+    0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x29, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,
+    0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
+    0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e,
+    0x65, 0x28, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64,
+    0x0a, 0x0a, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61,
+    0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x6d, 0x74, 0x2e,
+    0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69,
+    0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x57,
+    0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d,
+    0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64,
+    0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
+    0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x20, 0x54,
+    0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x61,
+    0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x54, 0x65, 0x58, 0x74, 0x2e, 0x0a, 0x0a,
+    0x69, 0x66, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x31,
+    0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70,
+    0x65, 0x6e, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f,
+    0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65,
+    0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x70, 0x6f,
+    0x70, 0x65, 0x6e, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x73, 0x61, 0x66,
+    0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68,
+    0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75,
+    0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75,
+    0x6d, 0x6d, 0x79, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65,
+    0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+    0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74,
+    0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x6c,
+    0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x61, 0x66, 0x65, 0x72, 0x20, 0x6f,
+    0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,
+    0x69, 0x6f, 0x6e, 0x20, 0x25, 0x71, 0x20, 0x69, 0x73, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x0a, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x2c, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x6c, 0x69,
+    0x6d, 0x69, 0x74, 0x65, 0x64, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62,
+    0x6c, 0x65, 0x64, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20,
+    0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
     0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x68, 0x6f, 0x77,
-    0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x61, 0x6e,
-    0x64, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x68, 0x6f, 0x77, 0x2c, 0x27, 0x77, 0x27, 0x29, 0x20,
-    0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e,
-    0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x77, 0x27, 0x29, 0x0a, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72,
-    0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27,
-    0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
-    0x72, 0x6e, 0x20, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,
-    0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f,
-    0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79,
-    0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
-    0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20,
-    0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f,
-    0x77, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x75, 0x62, 0x28, 0x68, 0x6f, 0x77, 0x2c, 0x27, 0x5b, 0x5e,
-    0x72, 0x62, 0x5d, 0x27, 0x2c, 0x27, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x69, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x74, 0x68,
-    0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68,
-    0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20,
-    0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70,
-    0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20,
-    0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c,
-    0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x72, 0x27, 0x29, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
-    0x72, 0x6e, 0x20, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,
-    0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f,
-    0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x2e, 0x2e,
-    0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x61,
-    0x79, 0x2c, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x63,
-    0x68, 0x65, 0x63, 0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x6e,
-    0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x61, 0x79,
-    0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69,
-    0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x2e, 0x2e,
-    0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a,
-    0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c,
-    0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x6e,
-    0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
-    0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6f,
-    0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x20, 0x6f, 0x72, 0x20,
-    0x27, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
-    0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
-    0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6f, 0x5f,
-    0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65,
-    0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
-    0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65,
-    0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75,
-    0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f,
-    0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20,
-    0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-    0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
-    0x6e, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66,
-    0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69,
-    0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78,
-    0x5f, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x6d, 0x74, 0x2e, 0x6c, 0x69, 0x6e,
-    0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x72,
-    0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x57, 0x65, 0x20, 0x61,
-    0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74,
-    0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20,
-    0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65,
-    0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73,
-    0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20,
-    0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x54, 0x65, 0x58, 0x74, 0x2e, 0x0a, 0x0a, 0x69, 0x66, 0x20,
-    0x6b, 0x70, 0x73, 0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68,
-    0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x20,
-    0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65,
-    0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d,
-    0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e,
-    0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x73, 0x61, 0x66, 0x65, 0x72, 0x6f,
-    0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,
-    0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20,
-    0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x70, 0x61,
-    0x77, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f,
-    0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x20, 0x3d,
-    0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x6d, 0x70,
-    0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
-    0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+    0x75, 0x72, 0x6e, 0x20, 0x66, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
+    0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x28,
+    0x73, 0x74, 0x72, 0x2c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c,
+    0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20,
+    0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20,
+    0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3d, 0x20,
+    0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73,
+    0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f,
+    0x73, 0x2e, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74,
+    0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x73, 0x70, 0x61,
+    0x77, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63,
+    0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d,
+    0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x22, 0x29, 0x0a, 0x20, 0x20,
+    0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x20, 0x3d, 0x20, 0x69,
+    0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e,
+    0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e,
+    0x74, 0x65, 0x6d, 0x70, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c,
+    0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x64,
+    0x69, 0x72, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70,
+    0x65, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75,
+    0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x29, 0x0a,
     0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x3d,
-    0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6e,
-    0x61, 0x6d, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f,
-    0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a,
-    0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x74, 0x6d, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x20,
-    0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x75, 0x74,
-    0x70, 0x75, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
-    0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c,
-    0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x20, 0x20,
-    0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x74, 0x6f,
-    0x75, 0x63, 0x68, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c,
-    0x66, 0x73, 0x2e, 0x72, 0x6d, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d,
-    0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x61, 0x76,
-    0x65, 0x64, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65,
-    0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e,
-    0x6c, 0x79, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x73, 0x61, 0x66, 0x65,
-    0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x6f, 0x72, 0x20,
-    0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x31,
-    0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d,
-    0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x66, 0x66, 0x69, 0x27, 0x29, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20,
-    0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x66, 0x66, 0x69, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6b, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x67, 0x63,
-    0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20,
-    0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69,
-    0x6c, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x6f, 0x73, 0x2e, 0x5b, 0x65,
-    0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x7c, 0x6f, 0x73, 0x2e, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x7c,
-    0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x5d, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79,
-    0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65,
-    0x20, 0x61, 0x77, 0x61, 0x72, 0x65, 0x29, 0x0a, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6d, 0x64, 0x35,
-    0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
-    0x20, 0x73, 0x75, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75,
-    0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x73, 0x75, 0x62,
-    0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62,
-    0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61,
-    0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
-    0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65,
-    0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65,
-    0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d,
-    0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x68, 0x65, 0x78, 0x61, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73,
-    0x75, 0x62, 0x28, 0x73, 0x75, 0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20,
-    0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66,
-    0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x62, 0x79, 0x74,
-    0x65, 0x28, 0x63, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e,
-    0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20,
-    0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75,
-    0x6d, 0x48, 0x45, 0x58, 0x41, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x75,
-    0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,
-    0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
-    0x28, 0x22, 0x25, 0x30, 0x32, 0x58, 0x22, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, 0x29,
-    0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20,
-    0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x00
+    0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69,
+    0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69,
+    0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x29,
+    0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20,
+    0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28,
+    0x22, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20,
+    0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e,
+    0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x72,
+    0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e,
+    0x74, 0x6d, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c,
+    0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x74, 0x6d, 0x70, 0x66, 0x69,
+    0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x75, 0x74, 0x70,
+    0x75, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d,
+    0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x29, 0x0a,
+    0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x64, 0x69, 0x72, 0x20, 0x20,
+    0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22,
+    0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x64, 0x69, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
+    0x6c, 0x66, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73,
+    0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x6c,
+    0x6f, 0x63, 0x6b, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x74, 0x6f,
+    0x75, 0x63, 0x68, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75,
+    0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x29,
+    0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x6d, 0x64, 0x69, 0x72, 0x20, 0x20,
+    0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22,
+    0x6c, 0x66, 0x73, 0x2e, 0x72, 0x6d, 0x64, 0x69, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
+    0x6c, 0x66, 0x73, 0x2e, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73,
+    0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x6d,
+    0x6b, 0x64, 0x69, 0x72, 0x22, 0x29, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20,
+    0x73, 0x61, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31,
+    0x20, 0x6f, 0x72, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20,
+    0x7e, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
+    0x66, 0x69, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x66, 0x66,
+    0x69, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76,
+    0x20, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x66, 0x66, 0x69, 0x20, 0x64, 0x6f,
+    0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6b, 0x20, 0x7e, 0x3d,
+    0x20, 0x27, 0x67, 0x63, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20,
+    0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20,
+    0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x6f,
+    0x73, 0x2e, 0x5b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x7c, 0x6f, 0x73, 0x2e, 0x73, 0x70,
+    0x61, 0x77, 0x6e, 0x7c, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x5d, 0x20, 0x61, 0x6c, 0x72,
+    0x65, 0x61, 0x64, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73,
+    0x63, 0x61, 0x70, 0x65, 0x20, 0x61, 0x77, 0x61, 0x72, 0x65, 0x29, 0x0a, 0x0a, 0x0a, 0x69, 0x66,
+    0x20, 0x6d, 0x64, 0x35, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c,
+    0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x64,
+    0x35, 0x2e, 0x73, 0x75, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,
+    0x67, 0x73, 0x75, 0x62, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e,
+    0x67, 0x73, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66,
+    0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66,
+    0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,
+    0x62, 0x79, 0x74, 0x65, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e,
+    0x62, 0x79, 0x74, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
+    0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x68, 0x65, 0x78, 0x61, 0x28, 0x6b,
+    0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
+    0x20, 0x28, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x75, 0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22,
+    0x2e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
+    0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x78, 0x22,
+    0x2c, 0x62, 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,
+    0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64,
+    0x35, 0x2e, 0x73, 0x75, 0x6d, 0x48, 0x45, 0x58, 0x41, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, 0x75,
+    0x62, 0x28, 0x73, 0x75, 0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x66,
+    0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f,
+    0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x58, 0x22, 0x2c, 0x62, 0x79, 0x74, 0x65,
+    0x28, 0x63, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64,
+    0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a,
+    0x0a, 0x00
   };
   return luaL_dostring(L, (const char*) luatex_core_lua);
 }
\ No newline at end of file

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/luatex-core.lua
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/luatex-core.lua	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/luatex-core.lua	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,213 +1,229 @@
--- if not modules then modules = { } end modules ['luatex-core'] = {
---     version   = 1.001,
---     comment   = 'companion to luatex',
---     author    = 'Hans Hagen & Luigi Scarso',
---     copyright = 'LuaTeX Development Team',
--- }
-
-LUATEXCOREVERSION = 1.002
-
--- This file overloads some Lua functions. The readline variants provide the same
--- functionality as LuaTeX <= 1.04 and doing it this way permits us to keep the
--- original io libraries clean. Performance is probably even a bit better now.
-
-local type, next, getmetatable, require = type, next, getmetatable, require
-local find, gsub = string.find, string.gsub
-
-local io_open             = io.open
-local io_popen            = io.popen
-local io_lines            = io.lines
-
-local fio_readline        = fio.readline
-local fio_checkpermission = fio.checkpermission
-local fio_recordfilename  = fio.recordfilename
-
-local mt                  = getmetatable(io.stderr)
-local mt_lines            = mt.lines
-local saferoption         = status.safer_option
-local shellescape         = status.shell_escape -- 0 (disabled) 1 (anything) 2 (restricted)
-local kpseused            = status.kpse_used    -- 0 1
-
-io.saved_open             = io_open  -- can be protected
--- (deleted for tl17 rebuild) io.saved_popen            = io_popen -- can be protected
-io.saved_lines            = io_lines -- always readonly
-mt.saved_lines            = mt_lines -- always readonly
-
-local function luatex_io_open(name,how)
-    if not how then
-        how = 'r'
-    end
-    local f = io_open(name,how)
-    if f then
-        if type(how) == 'string' and find(how,'w') then
-            fio_recordfilename(name,'w')
-        else
-            fio_recordfilename(name,'r')
-        end
-    end
-    return f
-end
-
-local function luatex_io_open_readonly(name,how)
-    if how then
-        how = 'r'
-    else
-        how = gsub(how,'[^rb]','')
-        if how == '' then
-            how = 'r'
-        end
-    end
-    local f = io_open(name,how)
-    if f then
-        fio_recordfilename(name,'r')
-    end
-    return f
-end
-
-local function luatex_io_popen(name,...)
-    local okay, found = fio_checkpermission(name)
-    if okay and found then
-        return io_popen(found,...)
-    end
-end
-
-local function luatex_io_lines(name,how)
-    if name then
-        local f = io_open(name,how or 'r')
-        if f then
-            return function()
-                return fio_readline(f)
-            end
-        end
-    else
-        return io_lines()
-    end
-end
-
-local function luatex_io_readline(f)
-    return function()
-        return fio_readline(f)
-    end
-end
-
-io.lines = luatex_io_lines
-mt.lines = luatex_io_readline
-
--- We assume management to be provided by the replacement of kpse. This is the
--- case in ConTeXt.
-
-if kpseused == 1 then
-
-    io.open  = luatex_io_open
-    io.popen = luatex_io_popen
-
-end
-
-if saferoption == 1 then
-
-    os.execute = nil
-    os.spawn   = nil
-    os.exec    = nil
-    os.setenv  = nil
-    os.tempdir = nil
-
-    io.popen   = nil
-    io.open    = nil
-
-    os.rename  = nil
-    os.remove  = nil
-
-    io.tmpfile = nil
-    io.output  = nil
-
-    lfs.chdir  = nil
-    lfs.lock   = nil
-    lfs.touch  = nil
-    lfs.rmdir  = nil
-    lfs.mkdir  = nil
-
-    io.saved_open  = luatex_io_open_readonly
-
-end
-
-if saferoption == 1 or shellescape ~= 1 then
-
-    ffi = require('ffi')
-    for k, v in next, ffi do
-        if k ~= 'gc' then
-            ffi[k] = nil
-        end
-    end
-    ffi = nil
-
-end
-
--- os.[execute|os.spawn|os.exec] already are shellescape aware)
-
-
-if md5 then
-
-    local sum    = md5.sum
-    local gsub   = string.gsub
-    local format = string.format
-    local byte   = string.byte
-
-    function md5.sumhexa(k)
-        return (gsub(sum(k), ".", function(c)
-            return format("%02x",byte(c))
-        end))
-    end
-
-    function md5.sumHEXA(k)
-        return (gsub(sum(k), ".", function(c)
-            return format("%02X",byte(c))
-        end))
-    end
-
-end
-
-if utilities and utilities.merger and utilities.merger.compact then
-
-    local byte, format, gmatch = string.byte, string.format, string.gmatch
-    local concat = table.concat
-
-    local data = gsub(io.loaddata('luatex-core.lua'),'if%s+utilities.*','')
-    local t = { }
-    local r = { }
-    local n = 0
-    local d = gsub(data,'\r\n','\n')      -- be nice for unix
-    local s = utilities.merger.compact(d) -- no comments and less spaces
-
-    t[#t+1] = '/* generated from and by luatex-core.lua */'
-    t[#t+1] = ''
- -- t[#t+1] = format('/*\n\n%s\n\n*/',d)
- -- t[#t+1] = ''
-    t[#t+1] = '#include "lua.h"'
-    t[#t+1] = '#include "lauxlib.h"'
-    t[#t+1] = ''
-    t[#t+1] = 'int load_luatex_core_lua (lua_State * L);'
-    t[#t+1] = ''
-    t[#t+1] = 'int load_luatex_core_lua (lua_State * L)'
-    t[#t+1] = '{'
-    t[#t+1] = '  static unsigned char luatex_core_lua[] = {'
-    for c in gmatch(d,'.') do
-        if n == 16 then
-            n = 1
-            t[#t+1] = '    ' .. concat(r,', ') .. ','
-        else
-            n = n + 1
-        end
-        r[n] = format('0x%02x',byte(c))
-    end
-    n = n + 1
-    r[n] = '0x00'
-    t[#t+1] = '    ' .. concat(r,', ',1,n)
-    t[#t+1] = '  };'
- -- t[#t+1] = format('unsigned int luatex_core_lua_len = 0x%x;',#d+1)
-    t[#t+1] = '  return luaL_dostring(L, (const char*) luatex_core_lua);'
-    t[#t+1] = '}'
-
-    io.savedata('luatex-core.c',concat(t,'\n'))
-    io.savedata('luatex-core-stripped.lua',s)
-
-end
+-- if not modules then modules = { } end modules ['luatex-core'] = {
+--     version   = 1.001,
+--     comment   = 'companion to luatex',
+--     author    = 'Hans Hagen & Luigi Scarso',
+--     copyright = 'LuaTeX Development Team',
+-- }
+
+LUATEXCOREVERSION = 1.003
+
+-- This file overloads some Lua functions. The readline variants provide the same
+-- functionality as LuaTeX <= 1.04 and doing it this way permits us to keep the
+-- original io libraries clean. Performance is probably even a bit better now.
+
+local type, next, getmetatable, require = type, next, getmetatable, require
+local find, gsub, format = string.find, string.gsub, string.format
+
+local io_open             = io.open
+local io_popen            = io.popen
+local io_lines            = io.lines
+
+local fio_readline        = fio.readline
+local fio_checkpermission = fio.checkpermission
+local fio_recordfilename  = fio.recordfilename
+
+local mt                  = getmetatable(io.stderr)
+local mt_lines            = mt.lines
+local saferoption         = status.safer_option
+local shellescape         = status.shell_escape -- 0 (disabled) 1 (anything) 2 (restricted)
+local kpseused            = status.kpse_used    -- 0 1
+
+local write_nl            = texio.write_nl
+
+io.saved_lines            = io_lines -- always readonly
+mt.saved_lines            = mt_lines -- always readonly
+
+local function luatex_io_open(name,how)
+    if not how then
+        how = 'r'
+    end
+    local f = io_open(name,how)
+    if f then
+        if type(how) == 'string' and find(how,'w') then
+            fio_recordfilename(name,'w')
+        else
+            fio_recordfilename(name,'r')
+        end
+    end
+    return f
+end
+
+local function luatex_io_open_readonly(name,how)
+    if how then
+        how = 'r'
+    else
+        how = gsub(how,'[^rb]','')
+        if how == '' then
+            how = 'r'
+        end
+    end
+    local f = io_open(name,how)
+    if f then
+        fio_recordfilename(name,'r')
+    end
+    return f
+end
+
+local function luatex_io_popen(name,...)
+    local okay, found = fio_checkpermission(name)
+    if okay and found then
+        return io_popen(found,...)
+    end
+end
+
+local function luatex_io_lines(name,how)
+    if name then
+        local f = io_open(name,how or 'r')
+        if f then
+            return function()
+                return fio_readline(f)
+            end
+        end
+    else
+        return io_lines()
+    end
+end
+
+local function luatex_io_readline(f)
+    return function()
+        return fio_readline(f)
+    end
+end
+
+io.lines = luatex_io_lines
+mt.lines = luatex_io_readline
+
+-- We assume management to be provided by the replacement of kpse. This is the
+-- case in ConTeXt.
+
+if kpseused == 1 then
+
+    io.open  = luatex_io_open
+    io.popen = luatex_io_popen
+
+end
+
+if saferoption == 1 then
+
+    local function installdummy(str,f)
+        local reported = false
+        return function(...)
+            if not reported then
+                write_nl(format("safer option set, function %q is %s",
+                    str,f and "limited" or "disabled"))
+                reported = true
+            end
+            if f then
+                return f(...)
+            end
+        end
+    end
+
+    local function installlimit(str,f)
+        local reported = false
+    end
+
+    os.execute = installdummy("os.execute")
+    os.spawn   = installdummy("os.spawn")
+    os.exec    = installdummy("os.exec")
+    os.setenv  = installdummy("os.setenv")
+    os.tempdir = installdummy("os.tempdir")
+
+    io.popen   = installdummy("io.popen")
+    io.open    = installdummy("io.open",luatex_io_open_readonly)
+
+    os.rename  = installdummy("os.rename")
+    os.remove  = installdummy("os.remove")
+
+    io.tmpfile = installdummy("io.tmpfile")
+    io.output  = installdummy("io.output")
+
+    lfs.chdir  = installdummy("lfs.chdir")
+    lfs.lock   = installdummy("lfs.lock")
+    lfs.touch  = installdummy("lfs.touch")
+    lfs.rmdir  = installdummy("lfs.rmdir")
+    lfs.mkdir  = installdummy("lfs.mkdir")
+
+end
+
+if saferoption == 1 or shellescape ~= 1 then
+
+    ffi = require('ffi')
+    for k, v in next, ffi do
+        if k ~= 'gc' then
+            ffi[k] = nil
+        end
+    end
+    ffi = nil
+
+end
+
+-- os.[execute|os.spawn|os.exec] already are shellescape aware)
+
+
+if md5 then
+
+    local sum    = md5.sum
+    local gsub   = string.gsub
+    local format = string.format
+    local byte   = string.byte
+
+    function md5.sumhexa(k)
+        return (gsub(sum(k), ".", function(c)
+            return format("%02x",byte(c))
+        end))
+    end
+
+    function md5.sumHEXA(k)
+        return (gsub(sum(k), ".", function(c)
+            return format("%02X",byte(c))
+        end))
+    end
+
+end
+
+if utilities and utilities.merger and utilities.merger.compact then
+
+    local byte, format, gmatch = string.byte, string.format, string.gmatch
+    local concat = table.concat
+
+    local data = gsub(io.loaddata('luatex-core.lua'),'if%s+utilities.*','')
+    local t = { }
+    local r = { }
+    local n = 0
+    local d = gsub(data,'\r\n','\n')      -- be nice for unix
+    local s = utilities.merger.compact(d) -- no comments and less spaces
+
+    t[#t+1] = '/* generated from and by luatex-core.lua */'
+    t[#t+1] = ''
+ -- t[#t+1] = format('/*\n\n%s\n\n*/',d)
+ -- t[#t+1] = ''
+    t[#t+1] = '#include "lua.h"'
+    t[#t+1] = '#include "lauxlib.h"'
+    t[#t+1] = ''
+    t[#t+1] = 'int load_luatex_core_lua (lua_State * L);'
+    t[#t+1] = ''
+    t[#t+1] = 'int load_luatex_core_lua (lua_State * L)'
+    t[#t+1] = '{'
+    t[#t+1] = '  static unsigned char luatex_core_lua[] = {'
+    for c in gmatch(d,'.') do
+        if n == 16 then
+            n = 1
+            t[#t+1] = '    ' .. concat(r,', ') .. ','
+        else
+            n = n + 1
+        end
+        r[n] = format('0x%02x',byte(c))
+    end
+    n = n + 1
+    r[n] = '0x00'
+    t[#t+1] = '    ' .. concat(r,', ',1,n)
+    t[#t+1] = '  };'
+ -- t[#t+1] = format('unsigned int luatex_core_lua_len = 0x%x;',#d+1)
+    t[#t+1] = '  return luaL_dostring(L, (const char*) luatex_core_lua);'
+    t[#t+1] = '}'
+
+    io.savedata('luatex-core.c',concat(t,'\n'))
+    io.savedata('luatex-core-stripped.lua',s)
+
+end

Modified: trunk/Build/source/texk/web2c/luatexdir/lua/luatoken.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/lua/luatoken.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/lua/luatoken.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -96,6 +96,7 @@
     {"boundary", boundary_cmd, NULL},
     {"radical", radical_cmd, NULL},
     {"super_sub_script", super_sub_script_cmd, NULL},
+    {"no_super_sub_script", no_super_sub_script_cmd, NULL},
     {"math_shift_cs", math_shift_cs_cmd, NULL},
     {"end_cs_name", end_cs_name_cmd, NULL},
     {"char_ghost", char_ghost_cmd, NULL},

Modified: trunk/Build/source/texk/web2c/luatexdir/luaffi/ctype.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/luaffi/ctype.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/luaffi/ctype.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -245,6 +245,8 @@
 
     lua_pop(L, 1); /* mt */
     cd = (struct cdata*) lua_touserdata(L, idx);
+     
+    if (!cd) {lua_pushnil(L);return NULL;}  
     *ct = cd->type;
     lua_getuservalue(L, idx);
 

Modified: trunk/Build/source/texk/web2c/luatexdir/luaffi/ffi.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/luaffi/ffi.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/luaffi/ffi.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -387,7 +387,12 @@
         } else if (ct.type == INT64_TYPE) {
             *(int64_t*) to = *(int64_t*) p;
             return sizeof(int64_t);
-        }
+
+        } else if (ct.type == FUNCTION_PTR_TYPE) {
+	  *(cfunction *) to = *(cfunction *)p;
+	  return sizeof(cfunction);
+	}
+
         goto err;
 
     case LUA_TNIL:

Modified: trunk/Build/source/texk/web2c/luatexdir/luaffi/ffi.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/luaffi/ffi.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/luaffi/ffi.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -370,9 +370,9 @@
 #endif
 struct cdata {
     const struct ctype type
-#ifdef __GNUC__
-      __attribute__ ((aligned(16)))
-#endif
+/*#ifdef __GNUC__*/
+/*      __attribute__ ((aligned(16)))*/
+/*#endif*/
       ;
 };
 

Modified: trunk/Build/source/texk/web2c/luatexdir/luapeg/lpeg.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/luapeg/lpeg.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/luapeg/lpeg.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 #include "lpeg.h"
 
 /*
-** $Id: lpprint.c,v 1.9 2015/06/15 16:09:57 roberto Exp $
+** $Id: lpprint.c,v 1.10 2016/09/13 16:06:03 roberto Exp $
 ** Copyright 2007, Lua.org & PUC-Rio  (see 'lpeg.html' for license)
 */
 
@@ -39,13 +39,13 @@
 }
 
 
-static void printcapkind (int kind) {
+static const char *capkind (int kind) {
   const char *const modes[] = {
     "close", "position", "constant", "backref",
     "argument", "simple", "table", "function",
     "query", "string", "num", "substitution", "fold",
     "runtime", "group"};
-  printf("%s", modes[kind]);
+  return modes[kind];
 }
 
 
@@ -75,13 +75,12 @@
       break;
     }
     case IFullCapture: {
-      printcapkind(getkind(p));
-      printf(" (size = %d)  (idx = %d)", getoff(p), p->i.key);
+      printf("%s (size = %d)  (idx = %d)",
+             capkind(getkind(p)), getoff(p), p->i.key);
       break;
     }
     case IOpenCapture: {
-      printcapkind(getkind(p));
-      printf(" (idx = %d)", p->i.key);
+      printf("%s (idx = %d)", capkind(getkind(p)), p->i.key);
       break;
     }
     case ISet: {
@@ -126,8 +125,8 @@
 
 #if defined(LPEG_DEBUG)
 static void printcap (Capture *cap) {
-  printcapkind(cap->kind);
-  printf(" (idx: %d - size: %d) -> %p\n", cap->idx, cap->siz, cap->s);
+  printf("%s (idx: %d - size: %d) -> %p\n",
+         capkind(cap->kind), cap->idx, cap->siz, cap->s);
 }
 
 
@@ -179,7 +178,8 @@
       break;
     }
     case TOpenCall: case TCall: {
-      printf(" key: %d\n", tree->key);
+      assert(sib2(tree)->tag == TRule);
+      printf(" key: %d  (rule: %d)\n", tree->key, sib2(tree)->cap);
       break;
     }
     case TBehind: {
@@ -188,7 +188,7 @@
       break;
     }
     case TCapture: {
-      printf(" cap: %d  key: %d  n: %d\n", tree->cap, tree->key, tree->u.n);
+      printf(" kind: '%s'  key: %d\n", capkind(tree->cap), tree->key);
       printtree(sib1(tree), ident + 2);
       break;
     }
@@ -244,9 +244,8 @@
 /* }====================================================== */
 
 #endif
-
 /*
-** $Id: lpvm.c,v 1.6 2015/09/28 17:01:25 roberto Exp $
+** $Id: lpvm.c,v 1.9 2016/06/03 20:11:18 roberto Exp $
 ** Copyright 2007, Lua.org & PUC-Rio  (see 'lpeg.html' for license)
 */
 
@@ -292,14 +291,16 @@
 
 
 /*
-** Double the size of the array of captures
+** Make the size of the array of captures 'cap' twice as large as needed
+** (which is 'captop'). ('n' is the number of new elements.)
 */
-static Capture *doublecap (lua_State *L, Capture *cap, int captop, int ptop) {
+static Capture *doublecap (lua_State *L, Capture *cap, int captop,
+                                         int n, int ptop) {
   Capture *newc;
   if (captop >= INT_MAX/((int)sizeof(Capture) * 2))
     luaL_error(L, "too many captures");
   newc = (Capture *)lua_newuserdata(L, captop * 2 * sizeof(Capture));
-  memcpy(newc, cap, captop * sizeof(Capture));
+  memcpy(newc, cap, (captop - n) * sizeof(Capture));
   lua_replace(L, caplistidx(ptop));
   return newc;
 }
@@ -360,8 +361,8 @@
 */
 static void adddyncaptures (const char *s, Capture *base, int n, int fd) {
   int i;
-  /* Cgroup capture is already there */
-  assert(base[0].kind == Cgroup && base[0].siz == 0);
+  base[0].kind = Cgroup;  /* create group capture */
+  base[0].siz = 0;
   base[0].idx = 0;  /* make it an anonymous group */
   for (i = 1; i <= n; i++) {  /* add runtime captures */
     base[i].kind = Cruntime;
@@ -404,10 +405,11 @@
   lua_pushlightuserdata(L, stackbase);
   for (;;) {
 #if defined(DEBUG)
+      printf("-------------------------------------\n");
+      printcaplist(capture, capture + captop);
       printf("s: |%s| stck:%d, dyncaps:%d, caps:%d  ",
-             s, stack - getstackbase(L, ptop), ndyncap, captop);
+             s, (int)(stack - getstackbase(L, ptop)), ndyncap, captop);
       printinst(op, p);
-      printcaplist(capture, capture + captop);
 #endif
     assert(stackidx(ptop) + ndyncap == lua_gettop(L) && ndyncap <= captop);
     switch ((Opcode)p->i.code) {
@@ -531,6 +533,9 @@
           ndyncap -= removedyncap(L, capture, stack->caplevel, captop);
         captop = stack->caplevel;
         p = stack->p;
+#if defined(DEBUG)
+        printf("**FAIL**\n");
+#endif
         continue;
       }
       case ICloseRunTime: {
@@ -540,6 +545,7 @@
         cs.s = o; cs.L = L; cs.ocap = capture; cs.ptop = ptop;
         n = runtimecap(&cs, capture + captop, s, &rem);  /* call function */
         captop -= n;  /* remove nested captures */
+        ndyncap -= rem;  /* update number of dynamic captures */
         fr -= rem;  /* 'rem' items were popped from Lua stack */
         res = resdyncaptures(L, fr, s - o, e - o);  /* get result */
         if (res == -1)  /* fail? */
@@ -546,10 +552,12 @@
           goto fail;
         s = o + res;  /* else update current position */
         n = lua_gettop(L) - fr + 1;  /* number of new captures */
-        ndyncap += n - rem;  /* update number of dynamic captures */
+        ndyncap += n;  /* update number of dynamic captures */
         if (n > 0) {  /* any new capture? */
+          if (fr + n >= SHRT_MAX)
+            luaL_error(L, "too many results in match-time capture");
           if ((captop += n + 2) >= capsize) {
-            capture = doublecap(L, capture, captop, ptop);
+            capture = doublecap(L, capture, captop, n + 2, ptop);
             capsize = 2 * captop;
           }
           /* add new captures to 'capture' list */
@@ -586,7 +594,7 @@
         capture[captop].idx = p->i.key;
         capture[captop].kind = getkind(p);
         if (++captop >= capsize) {
-          capture = doublecap(L, capture, captop, ptop);
+          capture = doublecap(L, capture, captop, 0, ptop);
           capsize = 2 * captop;
         }
         p++;
@@ -601,7 +609,7 @@
 
 
 /*
-** $Id: lpcode.c,v 1.23 2015/06/12 18:36:47 roberto Exp $
+** $Id: lpcode.c,v 1.24 2016/09/15 17:46:13 roberto Exp $
 ** Copyright 2007, Lua.org & PUC-Rio  (see 'lpeg.html' for license)
 */
 
@@ -728,6 +736,27 @@
 
 
 /*
+** Visit a TCall node taking care to stop recursion. If node not yet
+** visited, return 'f(sib2(tree))', otherwise return 'def' (default
+** value)
+*/
+static int callrecursive (TTree *tree, int f (TTree *t), int def) {
+  int key = tree->key;
+  assert(tree->tag == TCall);
+  assert(sib2(tree)->tag == TRule);
+  if (key == 0)  /* node already visited? */
+    return def;  /* return default value */
+  else {  /* first visit */
+    int result;
+    tree->key = 0;  /* mark call as already visited */
+    result = f(sib2(tree));  /* go to called rule */
+    tree->key = key;  /* restore tree */
+    return result;
+  }
+}
+
+
+/*
 ** Check whether a pattern tree has captures
 */
 int hascaptures (TTree *tree) {
@@ -736,7 +765,9 @@
     case TCapture: case TRunTime:
       return 1;
     case TCall:
-      tree = sib2(tree); goto tailcall;  /* return hascaptures(sib2(tree)); */
+      return callrecursive(tree, hascaptures, 0);
+    case TRule:  /* do not follow siblings */
+      tree = sib1(tree); goto tailcall;
     case TOpenCall: assert(0);
     default: {
       switch (numsiblings[tree->tag]) {
@@ -743,7 +774,8 @@
         case 1:  /* return hascaptures(sib1(tree)); */
           tree = sib1(tree); goto tailcall;
         case 2:
-          if (hascaptures(sib1(tree))) return 1;
+          if (hascaptures(sib1(tree)))
+            return 1;
           /* else return hascaptures(sib2(tree)); */
           tree = sib2(tree); goto tailcall;
         default: assert(numsiblings[tree->tag] == 0); return 0;
@@ -810,9 +842,9 @@
 
 /*
 ** number of characters to match a pattern (or -1 if variable)
-** ('count' avoids infinite loops for grammars)
 */
-int fixedlenx (TTree *tree, int count, int len) {
+int fixedlen (TTree *tree) {
+  int len = 0;  /* to accumulate in tail calls */
  tailcall:
   switch (tree->tag) {
     case TChar: case TSet: case TAny:
@@ -822,26 +854,29 @@
     case TRep: case TRunTime: case TOpenCall:
       return -1;
     case TCapture: case TRule: case TGrammar:
-      /* return fixedlenx(sib1(tree), count); */
+      /* return fixedlen(sib1(tree)); */
       tree = sib1(tree); goto tailcall;
-    case TCall:
-      if (count++ >= MAXRULES)
-        return -1;  /* may be a loop */
-      /* else return fixedlenx(sib2(tree), count); */
-      tree = sib2(tree); goto tailcall;
+    case TCall: {
+      int n1 = callrecursive(tree, fixedlen, -1);
+      if (n1 < 0)
+        return -1;
+      else
+        return len + n1;
+    }
     case TSeq: {
-      len = fixedlenx(sib1(tree), count, len);
-      if (len < 0) return -1;
-      /* else return fixedlenx(sib2(tree), count, len); */
-      tree = sib2(tree); goto tailcall;
+      int n1 = fixedlen(sib1(tree));
+      if (n1 < 0)
+        return -1;
+      /* else return fixedlen(sib2(tree)) + len; */
+      len += n1; tree = sib2(tree); goto tailcall;
     }
     case TChoice: {
-      int n1, n2;
-      n1 = fixedlenx(sib1(tree), count, len);
-      if (n1 < 0) return -1;
-      n2 = fixedlenx(sib2(tree), count, len);
-      if (n1 == n2) return n1;
-      else return -1;
+      int n1 = fixedlen(sib1(tree));
+      int n2 = fixedlen(sib2(tree));
+      if (n1 != n2 || n1 < 0)
+        return -1;
+      else
+        return len + n1;
     }
     default: assert(0); return 0;
   };
@@ -1312,9 +1347,10 @@
 
 
 /*
-** Captures: if pattern has fixed (and not too big) length, use
-** a single IFullCapture instruction after the match; otherwise,
-** enclose the pattern with OpenCapture - CloseCapture.
+** Captures: if pattern has fixed (and not too big) length, and it
+** has no nested captures, use a single IFullCapture instruction
+** after the match; otherwise, enclose the pattern with OpenCapture -
+** CloseCapture.
 */
 static void codecapture (CompileState *compst, TTree *tree, int tt,
                          const Charset *fl) {
@@ -1586,8 +1622,6 @@
 
 /* }====================================================== */
 
-
-
 /*
 ** $Id: lpcap.c,v 1.6 2015/06/15 16:09:57 roberto Exp $
 ** Copyright 2007, Lua.org & PUC-Rio  (see 'lpeg.html' for license)
@@ -2126,7 +2160,7 @@
 
 
 /*
-** $Id: lptree.c,v 1.21 2015/09/28 17:01:25 roberto Exp $
+** $Id: lptree.c,v 1.22 2016/09/13 18:10:22 roberto Exp $
 ** Copyright 2013, Lua.org & PUC-Rio  (see 'lpeg.html' for license)
 */
 
@@ -2191,7 +2225,7 @@
   t->tag = TCall;
   t->u.ps = n - (t - g);  /* position relative to node */
   assert(sib2(t)->tag == TRule);
-  sib2(t)->key = t->key;
+  sib2(t)->key = t->key;  /* fix rule's key */
 }
 
 
@@ -3062,7 +3096,7 @@
     int rulesize;
     TTree *rn = gettree(L, ridx, &rulesize);
     nd->tag = TRule;
-    nd->key = 0;
+    nd->key = 0;  /* will be fixed when rule is used */
     nd->cap = i;  /* rule number */
     nd->u.ps = rulesize + 1;  /* point to next rule */
     memcpy(sib1(nd), rn, rulesize * sizeof(TTree));  /* copy rule */
@@ -3096,6 +3130,11 @@
 }
 
 
+/*
+** Give appropriate error message for 'verifyrule'. If a rule appears
+** twice in 'passed', there is path from it back to itself without
+** advancing the subject.
+*/
 static int verifyerror (lua_State *L, int *passed, int npassed) {
   int i, j;
   for (i = npassed - 1; i >= 0; i--) {  /* search for a repetition */
@@ -3117,6 +3156,8 @@
 ** is only relevant if the first is nullable.
 ** Parameter 'nb' works as an accumulator, to allow tail calls in
 ** choices. ('nb' true makes function returns true.)
+** Parameter 'passed' is a list of already visited rules, 'npassed'
+** counts the elements in 'passed'.
 ** Assume ktable at the top of the stack.
 */
 static int verifyrule (lua_State *L, TTree *tree, int *passed, int npassed,
@@ -3414,7 +3455,11 @@
   lua_pushnumber(L, MAXBACK);  /* initialize maximum backtracking */
   lua_setfield(L, LUA_REGISTRYINDEX, MAXSTACKIDX);
   luaL_setfuncs(L, metareg, 0);
+#if defined(LuajitTeX)
+  luaL_register(L,"lpeg",pattreg);
+#else
   luaL_newlib(L, pattreg);
+#endif
   lua_pushvalue(L, -1);
   lua_setfield(L, -3, "__index");
   return 1;
@@ -3421,4 +3466,3 @@
 }
 
 /* }====================================================== */
-

Modified: trunk/Build/source/texk/web2c/luatexdir/luapeg/lpeg.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/luapeg/lpeg.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/luapeg/lpeg.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,7 +1,7 @@
 /*
-** $Id: lptypes.h,v 1.14 2015/09/28 17:17:41 roberto Exp $
+** $Id: lptypes.h,v 1.16 2017/01/13 13:33:17 roberto Exp $
 ** LPeg - PEG pattern matching for Lua
-** Copyright 2007-2015, Lua.org & PUC-Rio  (see 'lpeg.html' for license)
+** Copyright 2007-2017, Lua.org & PUC-Rio  (see 'lpeg.html' for license)
 ** written by Roberto Ierusalimschy
 */
 
@@ -13,7 +13,7 @@
 #if !defined(lptypes_h)
 #define lptypes_h
 
-
+#define LPEG_DEBUG
 #if !defined(LPEG_DEBUG)
 #define NDEBUG
 #endif
@@ -29,7 +29,7 @@
 #include "lua.h"
 #include "lauxlib.h"
 
-#define VERSION         "1.0.0"
+#define VERSION         "1.0.1"
 
 
 #define PATTERN_T	"lpeg-pattern"
@@ -49,9 +49,10 @@
 #define lua_rawlen		lua_objlen
 
 #define luaL_setfuncs(L,f,n)	luaL_register(L,NULL,f)
+#if !defined(LuajitTeX)
 #define luaL_newlib(L,f)	luaL_register(L,"lpeg",f)
-
 #endif
+#endif
 
 
 #if !defined(lp_equal)
@@ -158,7 +159,7 @@
 #endif
 
 /*
-** $Id: lpcap.h,v 1.2 2015/02/27 17:13:17 roberto Exp $
+** $Id: lpcap.h,v 1.3 2016/09/13 17:45:58 roberto Exp $
 */
 
 #if !defined(lpcap_h)
@@ -165,13 +166,26 @@
 #define lpcap_h
 
 
-/*#include "lptypes.h"*/
+/* #include "lptypes.h" */
 
 
 /* kinds of captures */
 typedef enum CapKind {
-  Cclose, Cposition, Cconst, Cbackref, Carg, Csimple, Ctable, Cfunction,
-  Cquery, Cstring, Cnum, Csubst, Cfold, Cruntime, Cgroup
+  Cclose,  /* not used in trees */
+  Cposition,
+  Cconst,  /* ktable[key] is Lua constant */
+  Cbackref,  /* ktable[key] is "name" of group to get capture */
+  Carg,  /* 'key' is arg's number */
+  Csimple,  /* next node is pattern */
+  Ctable,  /* next node is pattern */
+  Cfunction,  /* ktable[key] is function; next node is pattern */
+  Cquery,  /* ktable[key] is table; next node is pattern */
+  Cstring,  /* ktable[key] is string; next node is pattern */
+  Cnum,  /* numbered capture; 'key' is number of value to return */
+  Csubst,  /* substitution capture; next node is pattern */
+  Cfold,  /* ktable[key] is function; next node is pattern */
+  Cruntime,  /* not used in trees (is uses another type for tree) */
+  Cgroup  /* ktable[key] is group's "name" */
 } CapKind;
 
 
@@ -201,7 +215,7 @@
 
 
 /*  
-** $Id: lptree.h,v 1.2 2013/03/24 13:51:12 roberto Exp $
+** $Id: lptree.h,v 1.3 2016/09/13 18:07:51 roberto Exp $
 */
 
 #if !defined(lptree_h)
@@ -208,7 +222,7 @@
 #define lptree_h
 
 
-/*#include "lptypes.h" */
+/* #include "lptypes.h"  */
 
 
 /*
@@ -215,31 +229,36 @@
 ** types of trees
 */
 typedef enum TTag {
-  TChar = 0, TSet, TAny,  /* standard PEG elements */
-  TTrue, TFalse,
-  TRep,
-  TSeq, TChoice,
-  TNot, TAnd,
-  TCall,
-  TOpenCall,
-  TRule,  /* sib1 is rule's pattern, sib2 is 'next' rule */
-  TGrammar,  /* sib1 is initial (and first) rule */
-  TBehind,  /* match behind */
-  TCapture,  /* regular capture */
-  TRunTime  /* run-time capture */
+  TChar = 0,  /* 'n' = char */
+  TSet,  /* the set is stored in next CHARSETSIZE bytes */
+  TAny,
+  TTrue,
+  TFalse,
+  TRep,  /* 'sib1'* */
+  TSeq,  /* 'sib1' 'sib2' */
+  TChoice,  /* 'sib1' / 'sib2' */
+  TNot,  /* !'sib1' */
+  TAnd,  /* &'sib1' */
+  TCall,  /* ktable[key] is rule's key; 'sib2' is rule being called */
+  TOpenCall,  /* ktable[key] is rule's key */
+  TRule,  /* ktable[key] is rule's key (but key == 0 for unused rules);
+             'sib1' is rule's pattern;
+             'sib2' is next rule; 'cap' is rule's sequential number */
+  TGrammar,  /* 'sib1' is initial (and first) rule */
+  TBehind,  /* 'sib1' is pattern, 'n' is how much to go back */
+  TCapture,  /* captures: 'cap' is kind of capture (enum 'CapKind');
+                ktable[key] is Lua value associated with capture;
+                'sib1' is capture body */
+  TRunTime  /* run-time capture: 'key' is Lua function;
+               'sib1' is capture body */
 } TTag;
 
-/* number of siblings for each tree */
-extern const byte numsiblings[];
 
-
 /*
 ** Tree trees
-** The first sibling of a tree (if there is one) is immediately after
-** the tree.  A reference to a second sibling (ps) is its position
-** relative to the position of the tree itself.  A key in ktable
-** uses the (unique) address of the original tree that created that
-** entry. NULL means no data.
+** The first child of a tree (if there is one) is immediately after
+** the tree.  A reference to a second child (ps) is its position
+** relative to the position of the tree itself.
 */
 typedef struct TTree {
   byte tag;
@@ -246,7 +265,7 @@
   byte cap;  /* kind of capture (if it is a capture) */
   unsigned short key;  /* key in ktable for Lua data (0 if no key) */
   union {
-    int ps;  /* occasional second sibling */
+    int ps;  /* occasional second child */
     int n;  /* occasional counter */
   } u;
 } TTree;
@@ -263,10 +282,10 @@
 } Pattern;
 
 
-/* number of siblings for each tree */
+/* number of children for each tree */
 extern const byte numsiblings[];
 
-/* access to siblings */
+/* access to children */
 #define sib1(t)         ((t) + 1)
 #define sib2(t)         ((t) + (t)->u.ps)
 
@@ -277,7 +296,6 @@
 
 #endif
 
-
 /*
 ** $Id: lpvm.h,v 1.3 2014/02/21 13:06:41 roberto Exp $
 */
@@ -285,7 +303,7 @@
 #if !defined(lpvm_h)
 #define lpvm_h
 
-/*#include "lpcap.h"*/
+/* #include "lpcap.h" */
 
 
 /* Virtual Machine's instructions */
@@ -336,10 +354,8 @@
 
 #endif
 
-
-
 /*
-** $Id: lpcode.h,v 1.7 2015/06/12 18:24:45 roberto Exp $
+** $Id: lpcode.h,v 1.8 2016/09/15 17:46:13 roberto Exp $
 */
 
 #if !defined(lpcode_h)
@@ -347,13 +363,13 @@
 
 /*#include "lua.h"*/
 
-/*#include "lptypes.h"*/
-/*#include "lptree.h"*/
-/*#include "lpvm.h"*/
+/* #include "lptypes.h" */
+/* #include "lptree.h" */
+/* #include "lpvm.h" */
 
 int tocharset (TTree *tree, Charset *cs);
 int checkaux (TTree *tree, int pred);
-int fixedlenx (TTree *tree, int count, int len);
+int fixedlen (TTree *tree);
 int hascaptures (TTree *tree);
 int lp_gc (lua_State *L);
 Instruction *compile (lua_State *L, Pattern *p);
@@ -375,13 +391,9 @@
 */
 #define nullable(t)	checkaux(t, PEnullable)
 
-#define fixedlen(t)     fixedlenx(t, 0, 0)
 
 
-
 #endif
-
-
 /*
 ** $Id: lpprint.h,v 1.2 2015/06/12 18:18:08 roberto Exp $
 */

Modified: trunk/Build/source/texk/web2c/luatexdir/luatex.c
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/luatex.c	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/luatex.c	2018-01-09 23:43:20 UTC (rev 46269)
@@ -12,6 +12,7 @@
 
 /* We |#define DLLPROC| in order to build LuaTeX and LuajitTeX as DLL
    for W32TeX.  */
+
 #if defined LuajitTeX
 #define DLLPROC dllluajittexmain
 #else
@@ -21,21 +22,21 @@
 #include "ptexlib.h"
 #include "luatex.h"
 #include "lua/luatex-api.h"
+
+#define TeX
+
 /*
-#include "luatex_svnversion.h"
+    The version number can be queried with \.{\\luatexversion} and the revision with
+    with \.{\\luatexrevision}. Traditionally the revision can be any character and
+    pdf\TeX\ occasionally used no digits. Here we still use a character but we will
+    stick to "0" upto "9" so users can expect a number represented as string.
 */
 
+int luatex_version = 106;
+int luatex_revision = '3';
+const char *luatex_version_string = "1.06.3";
+const char *engine_name = my_name;
 
-#define TeX
-
-/* for tl17 update, change luatex_date_info but nothing else,
-   as context depends on the numeric version number. */
-int luatex_version = 100;        /* \.{\\luatexversion}  */
-int luatex_revision = '4';      /* \.{\\luatexrevision}  */
-int luatex_date_info = 2017060901;     /* the compile date is now hardwired :YEAR MONTH DAY HOUR*/
-const char *luatex_version_string = "1.0.4";
-const char *engine_name = my_name;     /* the name of this engine */
-
 #include <kpathsea/c-ctype.h>
 #include <kpathsea/line.h>
 #include <kpathsea/readable.h>
@@ -583,6 +584,7 @@
     return EXIT_SUCCESS;
 }
 
+
 /*
     This is supposed to ``open the terminal for input'', but what we
     really do is copy command line arguments into TeX's or Metafont's

Modified: trunk/Build/source/texk/web2c/luatexdir/luatex_svnversion.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/luatex_svnversion.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/luatex_svnversion.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1 +1 @@
-#define luatex_svn_revision -1
+#define luatex_svn_revision 6501

Modified: trunk/Build/source/texk/web2c/luatexdir/luatexcallbackids.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/luatexcallbackids.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/luatexcallbackids.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -47,7 +47,7 @@
     pre_output_filter_callback,
     buildpage_filter_callback,
     hpack_filter_callback, vpack_filter_callback,
-    char_exists_callback,
+    glyph_not_found_callback,
     hyphenate_callback,
     ligaturing_callback,
     kerning_callback,
@@ -69,6 +69,7 @@
     call_edit_callback,
     build_page_insert_callback,
     glyph_stream_provider_callback,
+    finish_synctex_callback,
     total_callbacks
 } callback_callback_types;
 

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdffont.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdffont.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdffont.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -41,7 +41,8 @@
     int ex_glyph = ex_glyph(p)/1000;
     scaled_whd ci = get_charinfo_whd(f, c); /* the real width, height and depth of the character */
     if (!(char_exists(f,c))) {
-        char_warning(f,c);
+        lua_glyph_not_found_callback(f,c);
+        /* char_warning(f,c); */
         return ci;
     }
     ci.wd = ext_xn_over_d(ci.wd, 1000000 + ex_glyph(p), 1000000);

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdfgen.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdfgen.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdfgen.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -81,7 +81,7 @@
 extern void pdf_flush(PDF);
 extern void pdf_room(PDF, int);
 
-extern void fix_pdf_minorversion(PDF);
+extern void fix_pdf_version(PDF);
 
 /* output a byte to PDF buffer without checking of overflow */
 

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -190,6 +190,7 @@
     memset(pdf->obj_tab, 0, sizeof(obj_entry));
 
     pdf->minor_version = -1;
+    pdf->major_version = -1;
     pdf->decimal_digits = 4;
     pdf->gamma = 65536;
     pdf->image_gamma = 65536;
@@ -262,28 +263,36 @@
     }
 }
 
-@ This ensures that |pdfminorversion| is set only before any bytes have been
-written to the generated \.{PDF} file. Here also all variables for \.{PDF} output
-are initialized, the \.{PDF} file is opened by |ensure_pdf_open|, and the \.{PDF}
-header is written.
+@ This ensures that |pdfmajorversion| and |pdfminorversion| are set only before any
+bytes have been written to the generated \.{PDF} file. Here also all variables for
+\.{PDF} output are initialized, the \.{PDF} file is opened by |ensure_pdf_open|, and
+the \.{PDF} header is written.
 
 @c
-void fix_pdf_minorversion(PDF pdf)
+void fix_pdf_version(PDF pdf)
 {
-    if (pdf->minor_version < 0) {       /* unset */
+    if (pdf->major_version < 0) { /* unset */
+        if (pdf_major_version == 0) {
+            normal_warning("pdf backend","unset major version, using 1 instead");
+            pdf->major_version = 1;
+        } else if ((pdf_major_version < 0) || (pdf_major_version > 2)) {
+            formatted_warning("pdf backend","illegal major version %d, using 1 instead",pdf_major_version);
+            pdf->major_version = 1;
+        } else {
+            pdf->major_version = pdf_major_version;
+        }
+    } else if (pdf->major_version != pdf_major_version) {
+        normal_warning("pdf backend", "the major version cannot be changed after data is written to the PDF file");
+    }
+    if (pdf->minor_version < 0) { /* unset */
         if ((pdf_minor_version < 0) || (pdf_minor_version > 9)) {
-            const char *hlp[] = { "The pdfminorversion must be between 0 and 9.", "I changed this to 4.", NULL };
-            char msg[256];
-            (void) snprintf(msg, 255, "LuaTeX error (illegal pdfminorversion %d)", (int) pdf_minor_version);
-            tex_error(msg, hlp);
+            formatted_warning("pdf backend","illegal minor version %d, using 4 instead",pdf_minor_version);
             pdf->minor_version = 4;
         } else {
             pdf->minor_version = pdf_minor_version;
         }
-    } else {
-        /* Check that variables for \.{PDF} output are unchanged */
-        if (pdf->minor_version != pdf_minor_version)
-            normal_error("pdf backend", "minorversion cannot be changed after data is written to the PDF file");
+    } else if (pdf->minor_version != pdf_minor_version) {
+        normal_warning("pdf backend", "minorversion cannot be changed after data is written to the PDF file");
     }
 }
 
@@ -290,7 +299,7 @@
 static void fix_pdf_draftmode(PDF pdf)
 {
     if (pdf->draftmode != draft_mode_par)
-        normal_error("pdf backend", "draftmode cannot be changed after data is written to the PDF file");
+        normal_warning("pdf backend", "draftmode cannot be changed after data is written to the PDF file");
     if (pdf->draftmode != 0) {
         pdf->compress_level = 0;        /* re-fix it, might have been changed inbetween */
         pdf->objcompresslevel = 0;
@@ -1027,11 +1036,11 @@
 static void ensure_pdf_header_written(PDF pdf)
 {
     /* Initialize variables for \.{PDF} output */
-    fix_pdf_minorversion(pdf);
+    fix_pdf_version(pdf);
     init_pdf_outputparameters(pdf);
     fix_pdf_draftmode(pdf);
     /* Write \.{PDF} header */
-    pdf_printf(pdf, "%%PDF-1.%d\n", pdf->minor_version);
+    pdf_printf(pdf, "%%PDF-%d.%d\n", pdf->major_version, pdf->minor_version);
     /* The next blob will be removed 1.0. */
     pdf_out(pdf, '%');
     pdf_out(pdf, 'P' + 128);
@@ -1732,6 +1741,7 @@
             pdf_dict_add_int(pdf, "FormType", 1);
         }
         xform_attributes = pdf_xform_attr; /* lookup once */
+        form_margin = obj_xform_margin(pdf, pdf_cur_form); /* now stored in object */
         if (xform_attributes != null)
             pdf_print_toks(pdf, xform_attributes);
         if (obj_xform_attr(pdf, pdf_cur_form) != null) {
@@ -2062,19 +2072,21 @@
         pdf_end_dict(pdf);
     }
     /* Generate ProcSet */
-    pdf_add_name(pdf, "ProcSet");
-    pdf_begin_array(pdf);
-    if ((procset & PROCSET_PDF) != 0)
-        pdf_add_name(pdf, "PDF");
-    if ((procset & PROCSET_TEXT) != 0)
-        pdf_add_name(pdf, "Text");
-    if ((procset & PROCSET_IMAGE_B) != 0)
-        pdf_add_name(pdf, "ImageB");
-    if ((procset & PROCSET_IMAGE_C) != 0)
-        pdf_add_name(pdf, "ImageC");
-    if ((procset & PROCSET_IMAGE_I) != 0)
-        pdf_add_name(pdf, "ImageI");
-    pdf_end_array(pdf);
+    if (pdf->major_version == 1) {
+        pdf_add_name(pdf, "ProcSet");
+        pdf_begin_array(pdf);
+        if ((procset & PROCSET_PDF) != 0)
+            pdf_add_name(pdf, "PDF");
+        if ((procset & PROCSET_TEXT) != 0)
+            pdf_add_name(pdf, "Text");
+        if ((procset & PROCSET_IMAGE_B) != 0)
+            pdf_add_name(pdf, "ImageB");
+        if ((procset & PROCSET_IMAGE_C) != 0)
+            pdf_add_name(pdf, "ImageC");
+        if ((procset & PROCSET_IMAGE_I) != 0)
+            pdf_add_name(pdf, "ImageI");
+        pdf_end_array(pdf);
+    }
     pdf_end_dict(pdf);
     pdf_end_obj(pdf);
 }
@@ -2182,11 +2194,7 @@
     if ((pdf_suppress_optional_info & 128) == 0 && !producer_given) {
         pdf_add_name(pdf, "Producer");
         pdf_puts(pdf, " (LuaTeX-");
-        pdf_print_int(pdf, luatexversion / 100);
-        pdf_out(pdf, '.');
-        pdf_print_int(pdf, luatexversion % 100);
-        pdf_out(pdf, '.');
-        pdf_print(pdf, luatexrevision);
+        pdf_puts(pdf, luatex_version_string);
         pdf_out(pdf, ')');
     }
     if ((pdf_suppress_optional_info & 16) == 0 && !creator_given) {

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -197,8 +197,11 @@
     boolean move;
     pdfstructure *p = pdf->pstruct;
     scaledpos pos = pdf->posstruct->pos;
-    if (!char_exists(f, c))
-        return;
+    /* already done:
+        if (!char_exists(f, c)) {
+            return;
+        }
+    */
     if (font_writingmode(f) == vertical_writingmode) {
         if (p->wmode != WMODE_V) {
             p->wmode = WMODE_V;

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -103,7 +103,7 @@
     if (s >= STRING_OFFSET) {
         /* needed for |out_save| */
         j = 0;
-        /* the next is obsolete, in fact, specials are obsolete in pdf mode */
+        /* unfortunately we always go through this when we have vf specials (and also via temp strings) */
         if (literal_mode == scan_special) {
             if (!(str_in_cstr(s, "PDF:", 0) || str_in_cstr(s, "pdf:", 0))) {
                 if (warn && ((!(str_in_cstr(s, "SRC:", 0) || str_in_cstr(s, "src:", 0))) || (str_length(s) == 0)))
@@ -110,6 +110,7 @@
                     tprint_nl("Non-PDF special ignored!");
                 return;
             }
+            /*
             j = j + (pool_pointer) strlen("PDF:");
             if (str_in_cstr(s, "direct:", strlen("PDF:"))) {
                 j = j + (pool_pointer) strlen("direct:");
@@ -120,9 +121,29 @@
             } else if (str_in_cstr(s, "raw:", strlen("PDF:"))) {
                 j = j + (pool_pointer) strlen("raw:");
                 literal_mode = direct_raw;
+            } else if (str_in_cstr(s, "origin:", strlen("PDF:"))) {
+                j = j + (pool_pointer) strlen("origin:");
+                literal_mode = set_origin;
             } else {
                 literal_mode = set_origin;
             }
+            */
+            j = j + (pool_pointer) 4;                   /* strlen("PDF:") */
+            if (str_in_cstr(s, "direct:", 4)) {         /* strlen("PDF:") */
+                j = j + (pool_pointer) 7;               /* strlen("direct:") */
+                literal_mode = direct_always;
+            } else if (str_in_cstr(s, "page:", 4)) {    /* strlen("PDF:") */
+                j = j + (pool_pointer) 5;               /* strlen("page:") */
+                literal_mode = direct_page;
+            } else if (str_in_cstr(s, "raw:", 4)) {     /* strlen("PDF:") */
+                j = j + (pool_pointer) 4;               /* strlen("raw:") */
+                literal_mode = direct_raw;
+            } else if (str_in_cstr(s, "origin:", 4)) {  /* strlen("PDF:") */
+                j = j + (pool_pointer) 7;               /* strlen("origin:") */
+                literal_mode = set_origin;
+            } else {
+                literal_mode = set_origin;
+            }
         }
     }
     switch (literal_mode) {

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdftables.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdftables.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdftables.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -123,6 +123,7 @@
     c_pdf_image_resolution,
     c_pdf_pk_resolution,
     c_pdf_unique_resname,
+    c_pdf_major_version,
     c_pdf_minor_version,
     c_pdf_pagebox,
     c_pdf_inclusion_errorlevel,
@@ -170,6 +171,7 @@
 #  define pdf_image_resolution          get_tex_extension_count_register(c_pdf_image_resolution)
 #  define pdf_pk_resolution             get_tex_extension_count_register(c_pdf_pk_resolution)
 #  define pdf_unique_resname            get_tex_extension_count_register(c_pdf_unique_resname)
+#  define pdf_major_version             get_tex_extension_count_register(c_pdf_major_version)
 #  define pdf_minor_version             get_tex_extension_count_register(c_pdf_minor_version)
 #  define pdf_pagebox                   get_tex_extension_count_register(c_pdf_pagebox)
 #  define pdf_inclusion_errorlevel      get_tex_extension_count_register(c_pdf_inclusion_errorlevel)
@@ -200,6 +202,7 @@
 #  define pdf_pk_mode                   get_tex_extension_toks_register(t_pdf_pk_mode)
 #  define pdf_trailer_id                get_tex_extension_toks_register(t_pdf_trailer_id)
 
+#  define set_pdf_major_version(i)      set_tex_extension_count_register(c_pdf_major_version,i)
 #  define set_pdf_minor_version(i)      set_tex_extension_count_register(c_pdf_minor_version,i)
 #  define set_pdf_compress_level(i)     set_tex_extension_count_register(c_pdf_compress_level,i)
 #  define set_pdf_obj_compress_level(i) set_tex_extension_count_register(c_pdf_obj_compress_level,i)

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -293,6 +293,7 @@
     int gen_tounicode;
     int omit_cidset;
     int inclusion_copy_font;
+    int major_version;          /* fixed major part of the PDF version */
     int minor_version;          /* fixed minor part of the PDF version */
     int compress_level;         /* level for zlib object stream compression */
     int objcompresslevel;       /* fixed level for activating PDF object streams */

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdfxform.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdfxform.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdfxform.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -22,7 +22,7 @@
 #ifndef PDFXFORM_H
 #  define PDFXFORM_H
 
-#  define pdfmem_xform_size 9 /* size of memory in |pdf->mem| which |obj_data_ptr| holds */
+#  define pdfmem_xform_size 10 /* size of memory in |pdf->mem| which |obj_data_ptr| holds */
 
 #  define obj_xform_width(pdf,A)          pdf->mem[obj_data_ptr(pdf,A) + 0]
 #  define obj_xform_height(pdf,A)         pdf->mem[obj_data_ptr(pdf,A) + 1]
@@ -33,6 +33,7 @@
 #  define obj_xform_attr_str(pdf,A)       pdf->mem[obj_data_ptr(pdf,A) + 6]
 #  define obj_xform_resources_str(pdf,A)  pdf->mem[obj_data_ptr(pdf,A) + 7]
 #  define obj_xform_type(pdf,A)           pdf->mem[obj_data_ptr(pdf,A) + 8]
+#  define obj_xform_margin(pdf,A)         pdf->mem[obj_data_ptr(pdf,A) + 9]
 
 #  define set_pdf_xform_objnum(A,B)            pdf_xform_objnum(A)=B
 #  define set_obj_xform_width(pdf,A,B)         obj_xform_width(pdf,A)=B
@@ -44,6 +45,7 @@
 #  define set_obj_xform_attr_str(pdf,A,B)      obj_xform_attr_str(pdf,A)=B
 #  define set_obj_xform_resources_str(pdf,A,B) obj_xform_resources_str(pdf,A)=B
 #  define set_obj_xform_type(pdf,A,B)          obj_xform_type(pdf,A)=B
+#  define set_obj_xform_margin(pdf,A,B)        obj_xform_margin(pdf,A)=B
 
 extern int pdf_cur_form; /* the form being output */
 

Modified: trunk/Build/source/texk/web2c/luatexdir/pdf/pdfxform.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/pdf/pdfxform.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/pdf/pdfxform.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -89,6 +89,12 @@
     } else {
         set_obj_xform_resources(pdf, k, null);
     }
+    if (scan_keyword("margin")) {
+        scan_int();
+        set_obj_xform_margin(pdf, k, cur_val);
+    } else {
+        set_obj_xform_margin(pdf, k, pdf_xform_margin);
+    }
     set_obj_xform_resources_str(pdf, k, null);
     scan_int();
     p = box(cur_val);

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/commands.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/commands.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/commands.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -142,6 +142,7 @@
     boundary_cmd,                         /* insert boundry node with value ( \.{\\*boundary} ) */
     radical_cmd,                          /* square root and similar signs ( \.{\\radical} ) */
     super_sub_script_cmd,                 /* explicit super- or subscript */
+    no_super_sub_script_cmd,              /* explicit no super- or subscript */
     math_shift_cs_cmd,                    /* start- and endmath */
     end_cs_name_cmd,                      /* end control sequence ( \.{\\endcsname} ) */
     char_ghost_cmd,                       /* \.{\\leftghost}, \.{\\rightghost} character for kerning */
@@ -259,7 +260,6 @@
     format_name_code,           /* command code for \.{\\AlephVersion} */
     luatex_banner_code,         /* command code for \.{\\luatexbanner}: */
     luatex_revision_code,       /* command code for \.{\\luatexrevision} */
-    luatex_date_code,           /* command code for \.{\\luatexdate} */
     etex_code,                  /* command code for \.{\\eTeXVersion} */
     eTeX_revision_code,         /* command code for \.{\\eTeXrevision} */
     font_identifier_code,       /* command code for \.{tex.fontidentifier} (virtual) */

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/commands.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/commands.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/commands.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1,4 +1,4 @@
-% commands.w
+f% commands.w
 %
 % Copyright 2009-2010 Taco Hoekwater <taco@@luatex.org>
 %
@@ -52,6 +52,7 @@
     primitive_tex("thickmuskip", assign_mu_glue_cmd, glue_base + thick_mu_skip_code, glue_base + thin_mu_skip_code);
     primitive_luatex("mathsurroundskip", assign_glue_cmd, glue_base + math_skip_code, glue_base);
     primitive_luatex("mathsurroundmode", assign_int_cmd, int_base + math_skip_mode_code, int_base);
+    primitive_luatex("mathscriptboxmode", assign_int_cmd, int_base + math_script_box_mode_code, int_base);
     primitive_tex("output", assign_toks_cmd, output_routine_loc, local_base);
     primitive_tex("everypar", assign_toks_cmd, every_par_loc, local_base);
     primitive_tex("everymath", assign_toks_cmd, every_math_loc, local_base);
@@ -74,9 +75,13 @@
     primitive_tex("displaywidowpenalty", assign_int_cmd, int_base + display_widow_penalty_code, int_base);
     primitive_tex("brokenpenalty", assign_int_cmd, int_base + broken_penalty_code, int_base);
     primitive_tex("binoppenalty", assign_int_cmd, int_base + bin_op_penalty_code, int_base);
+    primitive_luatex("prerelpenalty", assign_int_cmd, int_base + pre_rel_penalty_code, int_base);
+    primitive_luatex("prebinoppenalty", assign_int_cmd, int_base + pre_bin_op_penalty_code, int_base);
     primitive_tex("relpenalty", assign_int_cmd, int_base + rel_penalty_code, int_base);
     primitive_tex("predisplaypenalty", assign_int_cmd, int_base + pre_display_penalty_code, int_base);
     primitive_tex("postdisplaypenalty", assign_int_cmd, int_base + post_display_penalty_code, int_base);
+    primitive_luatex("mathpenaltiesmode", assign_int_cmd, int_base + math_penalties_mode_code, int_base);
+    primitive_luatex("mathdelimitersmode", assign_int_cmd, int_base + math_delimiters_mode_code, int_base);
     primitive_tex("interlinepenalty", assign_int_cmd, int_base + inter_line_penalty_code, int_base);
     primitive_tex("doublehyphendemerits", assign_int_cmd, int_base + double_hyphen_demerits_code, int_base);
     primitive_tex("finalhyphendemerits", assign_int_cmd, int_base + final_hyphen_demerits_code, int_base);
@@ -160,6 +165,8 @@
     primitive_luatex("hyphenpenaltymode", assign_int_cmd, int_base + hyphen_penalty_mode_code, int_base);
     primitive_luatex("automatichyphenpenalty", assign_int_cmd, int_base + automatic_hyphen_penalty_code, int_base);
     primitive_luatex("explicithyphenpenalty", assign_int_cmd, int_base + explicit_hyphen_penalty_code, int_base);
+    primitive_luatex("automatichyphenmode", assign_int_cmd, int_base + automatic_hyphen_mode_code, int_base);
+    primitive_luatex("breakafterdirmode", assign_int_cmd, int_base + break_after_dir_mode_code, int_base);
 
     /* Many of \TeX's primitives need no |equiv|, since they are identifiable
        by their |eq_type| alone. These primitives are loaded into the hash table
@@ -317,7 +324,6 @@
     primitive_tex("fontname", convert_cmd, font_name_code, 0);
     primitive_luatex("fontid", convert_cmd, font_id_code, 0);
     primitive_luatex("luatexrevision", convert_cmd, luatex_revision_code, 0);
-    primitive_luatex("luatexdatestamp", convert_cmd, luatex_date_code, 0);
     primitive_luatex("luatexbanner", convert_cmd, luatex_banner_code, 0);
     primitive_luatex("leftmarginkern", convert_cmd, left_margin_kern_code, 0);
     primitive_luatex("rightmarginkern", convert_cmd, right_margin_kern_code, 0);
@@ -445,8 +451,10 @@
     primitive_tex("unhcopy", un_hbox_cmd, copy_code, 0);
     primitive_tex("unvbox", un_vbox_cmd, box_code, 0);
     primitive_tex("unvcopy", un_vbox_cmd, copy_code, 0);
-    primitive_tex("-", discretionary_cmd, explicit_disc, 0);
+    primitive_tex("-", discretionary_cmd, explicit_disc, 0); /* good old tex */
     primitive_tex("discretionary", discretionary_cmd, discretionary_disc, 0);
+    primitive_luatex("explicitdiscretionary", discretionary_cmd, explicit_disc, 0);
+    primitive_luatex("automaticdiscretionary", discretionary_cmd, automatic_disc, 0);
     primitive_luatex("localleftbox", assign_local_box_cmd, 0, 0);
     primitive_luatex("localrightbox", assign_local_box_cmd, 1, 0);
 
@@ -479,6 +487,8 @@
     primitive_luatex("crampedscriptscriptstyle", math_style_cmd, cramped_script_script_style, 0);
     primitive_luatex("Usuperscript", super_sub_script_cmd, sup_mark_cmd, sup_mark_cmd);
     primitive_luatex("Usubscript", super_sub_script_cmd, sub_mark_cmd, sup_mark_cmd);
+    primitive_luatex("Unosuperscript", no_super_sub_script_cmd, sup_mark_cmd, sup_mark_cmd);
+    primitive_luatex("Unosubscript", no_super_sub_script_cmd, sub_mark_cmd, sup_mark_cmd);
     primitive_tex("above", above_cmd, above_code, 0);
     primitive_tex("over", above_cmd, over_code, 0);
     primitive_tex("atop", above_cmd, atop_code, 0);
@@ -752,6 +762,7 @@
     primitive_etex("savinghyphcodes", assign_int_cmd, int_base + saving_hyph_codes_code, int_base);
     primitive_luatex("suppressfontnotfounderror", assign_int_cmd, int_base + suppress_fontnotfound_error_code, int_base);
     primitive_luatex("suppresslongerror", assign_int_cmd, int_base + suppress_long_error_code, int_base);
+    primitive_luatex("suppressprimitiveerror", assign_int_cmd, int_base + suppress_primitive_error_code, int_base);
     primitive_luatex("suppressmathparerror", assign_int_cmd, int_base + suppress_mathpar_error_code, int_base);
     primitive_luatex("suppressifcsnameerror", assign_int_cmd, int_base + suppress_ifcsname_error_code, int_base);
     primitive_luatex("suppressoutererror", assign_int_cmd, int_base + suppress_outer_error_code, int_base);

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/conditional.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/conditional.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/conditional.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -152,6 +152,7 @@
     halfword q;                 /*for traversing token lists in \.{\\ifx} tests */
     halfword n = get_avail();
     halfword p = n;             /*head of the list of characters */
+is_in_csname += 1;
     while (1) {
         get_x_token();
         if (cur_cs != 0)
@@ -165,6 +166,7 @@
                 get_x_token();
             } while (cur_cmd != end_cs_name_cmd);
             flush_list(n);
+is_in_csname -= 1;
             return b;
         } else {
             complain_missing_csname();
@@ -205,6 +207,7 @@
     b = (eq_type(cur_cs) != undefined_cs_cmd);
     flush_list(n);
     last_cs_name = cur_cs;
+is_in_csname -= 1;
     return b;
 }
 

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/dumpdata.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/dumpdata.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/dumpdata.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -23,7 +23,7 @@
 
 /* we start with 907: the sum of the values of the bytes of "don knuth" */
 
-#define FORMAT_ID (907+28)
+#define FORMAT_ID (907+37)
 #if ((FORMAT_ID>=0) && (FORMAT_ID<=256))
 #error Wrong value for FORMAT_ID.
 #endif

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/equivalents.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/equivalents.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/equivalents.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -291,9 +291,19 @@
 #  define hyphen_penalty_mode_code 100
 #  define automatic_hyphen_penalty_code 101
 #  define explicit_hyphen_penalty_code 102
+#  define automatic_hyphen_mode_code 103
+#  define break_after_dir_mode_code 104
 
-#  define math_option_code (explicit_hyphen_penalty_code+1)
+#  define pre_bin_op_penalty_code 105
+#  define pre_rel_penalty_code 106
+#  define math_penalties_mode_code 107
+#  define math_delimiters_mode_code 108
+#  define math_script_box_mode_code 109
 
+#  define suppress_primitive_error_code 110
+
+#  define math_option_code (suppress_primitive_error_code+1)
+
 #  define mathoption_int_base_code (math_option_code+1)                 /* one reserve */
 #  define mathoption_int_last_code (mathoption_int_base_code+8)
 
@@ -648,6 +658,11 @@
 #define delimiter_factor_par               int_par(delimiter_factor_code)
 #define bin_op_penalty_par                 int_par(bin_op_penalty_code)
 #define rel_penalty_par                    int_par(rel_penalty_code)
+#define pre_bin_op_penalty_par             int_par(pre_bin_op_penalty_code)
+#define pre_rel_penalty_par                int_par(pre_rel_penalty_code)
+#define math_penalties_mode_par            int_par(math_penalties_mode_code)
+#define math_delimiters_mode_par           int_par(math_delimiters_mode_code)
+#define math_script_box_mode_par           int_par(math_script_box_mode_code)
 #define null_delimiter_space_par           dimen_par(null_delimiter_space_code)
 #define disable_lig_par                    int_par(disable_lig_code)
 #define disable_kern_par                   int_par(disable_kern_code)
@@ -740,6 +755,7 @@
 #define suppress_mathpar_error_par         int_par(suppress_mathpar_error_code)
 #define suppress_fontnotfound_error_par    int_par(suppress_fontnotfound_error_code)
 #define suppress_ifcsname_error_par        int_par(suppress_ifcsname_error_code)
+#define suppress_primitive_error_par       int_par(suppress_primitive_error_code)
 #define error_context_lines_par            int_par(error_context_lines_code)
 
 #define math_old_par                       mathoption_int_par(c_mathoption_old_code)
@@ -773,6 +789,8 @@
 #define hyphen_penalty_mode_par            int_par(hyphen_penalty_mode_code)
 #define automatic_hyphen_penalty_par       int_par(automatic_hyphen_penalty_code)
 #define explicit_hyphen_penalty_par        int_par(explicit_hyphen_penalty_code)
+#define automatic_hyphen_mode_par          int_par(automatic_hyphen_mode_code)
+#define break_after_dir_mode_par           int_par(break_after_dir_mode_code)
 
 #define cur_lang_par                       int_par(cur_lang_code)
 #define cur_font_par                       equiv(cur_font_loc)

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/errors.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/errors.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/errors.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -37,6 +37,8 @@
 extern int interaction;         /* current level of interaction */
 extern int interactionoption;   /* set from command line */
 
+extern int defaultexitcode; /* the exit code can be overloaded */
+
 extern void initialize_errors(void);
 
 extern char *last_error;

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/errors.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/errors.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/errors.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -215,6 +215,8 @@
 exits the program. It is used when there is no recovery from a particular error.
 
 @c
+int defaultexitcode = 0; /* the exit code can be overloaded */
+
 __attribute__ ((noreturn))
 void do_final_end(void)
 {
@@ -224,7 +226,7 @@
     if ((history != spotless) && (history != warning_issued))
         uexit(1);
     else
-        uexit(0);
+        uexit(defaultexitcode);
 }
 
 __attribute__ ((noreturn))

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/expand.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/expand.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/expand.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -209,7 +209,7 @@
                         iloc = p;
                         istart = p;
                     }
-                } else {
+                } else if (suppress_primitive_error_par == 0) {
                     print_err("Missing primitive name");
                     help2
                         ("The control sequence marked <to be read again> does not",

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/linebreak.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/linebreak.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/linebreak.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -755,6 +755,14 @@
 only character nodes, kern nodes, and box or rule nodes.
 
 @c
+#define bad_node_in_disc_error(p) { \
+    if (type(p) == whatsit_node) { \
+        formatted_error("linebreak","invalid node with type %s and subtype %i found in discretionary",node_data[type(p)].name,subtype(p)); \
+    } else { \
+        formatted_error("linebreak","invalid node with type %s found in discretionary",node_data[type(p)].name); \
+    } \
+}
+
 static void add_to_widths(halfword s, int line_break_dir, int adjust_spacing, scaled * widths)
 {
     while (s != null) {
@@ -783,7 +791,8 @@
                 case disc_node:    /* TH temp */
                     break;
                 default:
-                    confusion("invalid node found in discretionary"); /* todo: report type */
+                    bad_node_in_disc_error(s);
+                    break;
             }
         }
         s = vlink(s);
@@ -825,7 +834,7 @@
                 case disc_node:    /* TH temp */
                     break;
                 default:
-                    confusion("invalid node found in discretionary"); /* todo: report type */
+                    bad_node_in_disc_error(s);
                     break;
             }
         }
@@ -1857,11 +1866,8 @@
                         to see whether or not a breakpoint is legal at |cur_p|,
                         as explained above.
 
-                        The |precedes_break| test also considers dir nodes and prohibits
-                        a break after an opening dir_node (positive dir). In |\textdir TRT x|
-                        the space after |TRT| is preserved and therefore the dir node
-                        is bound to the |x|. Being more clever makes no sense: users
-                        should code their input properly.
+                        We only break after certain nodes (see texnodes.h), a font related
+                        kern and a dir node when |\breakafterdirmode=1|.
                     */
                     if (auto_breaking) {
                         halfword prev_p = alink(cur_p);
@@ -1868,9 +1874,8 @@
                         if (prev_p != temp_head && (
                                 is_char_node(prev_p)
                              || precedes_break(prev_p)
-                             || ( (type(prev_p) == kern_node) && (
-                                        subtype(prev_p) == font_kern || subtype(prev_p) == accent_kern)
-                                )
+                             || precedes_kern(prev_p)
+                             || precedes_dir(prev_p)
                             )) {
                             ext_try_break(0, unhyphenated_node, line_break_dir, adjust_spacing,
                                           par_shape_ptr, adj_demerits,

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/mainbody.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/mainbody.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/mainbody.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -23,7 +23,6 @@
 
 extern int luatex_version;
 extern int luatex_revision;
-extern int luatex_date_info;
 extern const char *luatex_version_string;
 extern const char *engine_name;
 
@@ -218,7 +217,6 @@
 
 extern int get_luatexversion(void);
 extern str_number get_luatexrevision(void);
-extern int get_luatex_date_info(void);
 
 extern int ready_already;
 

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/mainbody.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/mainbody.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/mainbody.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -230,12 +230,6 @@
     return luatex_revision;
 }
 
-int get_luatex_date_info(void)
-{
-    return luatex_date_info;    /* todo, silly value */
-}
-
-
 @ This is it: the part of \TeX\ that executes all those procedures we have
 written.
 
@@ -524,7 +518,18 @@
     /* rubish, these pdf arguments, passed, needs to be fixed, e.g. with a dummy in dvi */
     wrapup_backend();
     /* Close {\sl Sync\TeX} file and write status */
-    synctexterminate(log_opened_global);       /* Let the {\sl Sync\TeX} controller close its files. */
+    synctexterminate(log_opened_global);
+    /*
+        The following is needed because synctex removes files and we want to keep them which
+        means renaming a temp file .. we can't bypass the terminate because it might do mem
+        cleanup.
+    */
+    if (synctex_get_mode() > 0) {
+        callback_id = callback_defined(finish_synctex_callback);
+        if (callback_id > 0) {
+            run_callback(callback_id, "->");
+        }
+    }
     free_text_codes();
     free_math_codes();
     if (log_opened_global) {

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/maincontrol.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/maincontrol.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/maincontrol.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -705,6 +705,7 @@
     non_math(sup_mark_cmd, insert_dollar_sign);
     non_math(sub_mark_cmd, insert_dollar_sign);
     non_math(super_sub_script_cmd, insert_dollar_sign);
+    non_math(no_super_sub_script_cmd, insert_dollar_sign);
     non_math(math_comp_cmd, insert_dollar_sign);
     non_math(delim_num_cmd, insert_dollar_sign);
     non_math(left_right_cmd, insert_dollar_sign);
@@ -825,6 +826,7 @@
     jump_table[mmode + sub_mark_cmd] = sub_sup;
     jump_table[mmode + sup_mark_cmd] = sub_sup;
     jump_table[mmode + super_sub_script_cmd] = sub_sup;
+    jump_table[mmode + no_super_sub_script_cmd] = no_sub_sup;
     jump_table[mmode + left_right_cmd] = math_left_right;
     jump_table[mmode + math_shift_cmd] = run_math_shift;
     jump_table[mmode + math_shift_cs_cmd] = run_math_shift;
@@ -1759,18 +1761,42 @@
     if (cur_chr == explicit_disc) {
         /* \- */
         c = get_pre_hyphen_char(cur_lang_par);
-        if (c != 0) {
+        if (c > 0) {
             vlink(pre_break(tail)) = new_char(equiv(cur_font_loc), c);
             alink(vlink(pre_break(tail))) = pre_break(tail);
             tlink(pre_break(tail)) = vlink(pre_break(tail));
         }
         c = get_post_hyphen_char(cur_lang_par);
-        if (c != 0) {
+        if (c > 0) {
             vlink(post_break(tail)) = new_char(equiv(cur_font_loc), c);
             alink(vlink(post_break(tail))) = post_break(tail);
             tlink(post_break(tail)) = vlink(post_break(tail));
         }
         set_explicit_disc_penalty(tail);
+    } else if (cur_chr == automatic_disc) {
+        /* - as done in hyphenator */
+        c = get_pre_exhyphen_char(cur_lang_par);
+        if (c <= 0) {
+            c = ex_hyphen_char_par;
+        }
+        if (c > 0) {
+            vlink(pre_break(tail)) = new_char(equiv(cur_font_loc), c);
+            alink(vlink(pre_break(tail))) = pre_break(tail);
+            tlink(pre_break(tail)) = vlink(pre_break(tail));
+        }
+        c = get_post_exhyphen_char(cur_lang_par);
+        if (c > 0) {
+            vlink(post_break(tail)) = new_char(equiv(cur_font_loc), c);
+            alink(vlink(post_break(tail))) = post_break(tail);
+            tlink(post_break(tail)) = vlink(post_break(tail));
+        }
+        c = ex_hyphen_char_par;
+        if (c > 0) {
+            vlink(no_break(tail)) = new_char(equiv(cur_font_loc), c);
+            alink(vlink(no_break(tail))) = no_break(tail);
+            tlink(no_break(tail)) = vlink(no_break(tail));
+        }
+        set_automatic_disc_penalty(tail);
     } else {
         /* \discretionary */
         if (scan_keyword("penalty")) {
@@ -3601,6 +3627,9 @@
         hang_after_par = 1;
         max_dead_cycles_par = 25;
         math_pre_display_gap_factor_par = 2000;
+        pre_bin_op_penalty_par = inf_penalty;
+        math_script_box_mode_par = 1;
+        pre_rel_penalty_par = inf_penalty;
         escape_char_par = '\\';
         end_line_char_par = carriage_return;
         set_del_code('.', 0, 0, 0, 0, level_one); /* this null delimiter is used in error recovery */
@@ -3632,7 +3661,9 @@
         set_eq_level(end_write, level_one);
         set_eq_type(end_write, outer_call_cmd);
         set_equiv(end_write, null);
-
+        /* bah */
+        set_pdf_major_version(1);
+        set_pdf_minor_version(0);
     }
     synctexoffset = int_base + synctex_code;
 

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/mlist.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/mlist.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/mlist.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1348,29 +1348,30 @@
     tex_error(s, hlp);
 }
 
-static pointer do_delimiter(pointer q, pointer d, int s, scaled v, boolean flat, int cur_style, boolean shift, boolean *stack, scaled *delta)
+static pointer do_delimiter(pointer q, pointer d, int s, scaled v, boolean flat, int cur_style, boolean shift, boolean *stack, scaled *delta, int *same)
 {
-    pointer b;                  /* the box that will be constructed */
-    internal_font_number f, g;  /* best-so-far and tentative font codes */
-    int c, i, x, y;             /* best-so-far and tentative character codes */
-    scaled u;                   /* height-plus-depth of a tentative character */
-    scaled w;                   /* largest height-plus-depth so far */
-    int z;                      /* runs through font family members */
-    boolean large_attempt;      /* are we trying the ``large'' variant? */
-    pointer att;                /* to save the current attribute list */
-    boolean do_parts;
+    pointer b;                     /* the box that will be constructed */
+    internal_font_number f, g;     /* best-so-far and tentative font codes */
+    int c, i, x, y;                /* best-so-far and tentative character codes */
+    scaled u;                      /* height-plus-depth of a tentative character */
+    scaled w = 0;                  /* largest height-plus-depth so far */
+    int z;                         /* runs through font family members */
+    boolean large_attempt = false; /* are we trying the ``large'' variant? */
+    pointer att = null;            /* to save the current attribute list */
+    int emas = 0 ;
+    boolean do_parts = false;
     extinfo *ext;
-    att = null;
     f = null_font;
     c = 0;
-    w = 0;
-    do_parts = false;
-    large_attempt = false;
     if (d == null)
         goto FOUND;
     z = small_fam(d);
     x = small_char(d);
     i = 0;
+    if (same != NULL) {
+        emas = *same ;
+        same = 0;
+    }
     while (true) {
         /*
             The search process is complicated slightly by the facts that some of the
@@ -1448,6 +1449,9 @@
             if (stack != NULL)
                 *stack = true ;
         } else {
+            if (same != NULL && x == c) {
+                *same = emas;
+            }
             b = char_box(f, c, att);
             if (!do_new_math(f)) {
                 /* italic gets added to width */
@@ -1475,10 +1479,12 @@
             *stack = false ;
     }
     if (!flat) {
-        /* vertical variant */
-        shift_amount(b) = half(height(b) - depth(b));
-        if (shift) {
-            shift_amount(b) -= math_axis_size(s);
+        if (emas == 0 || ! delimitermodenoshift) {
+            /* vertical variant */
+            shift_amount(b) = half(height(b) - depth(b));
+            if (shift) {
+                shift_amount(b) -= math_axis_size(s);
+            }
         }
     }
     delete_attribute_ref(att);
@@ -1605,7 +1611,7 @@
             f = f + unity;
         }
         width(p) = mu_mult(width(p));
-        subtype(p) = italic_kern;
+        subtype(p) = italic_kern; /* this is weird, it's not a italic but explicit_kern */
     }
 }
 
@@ -1666,21 +1672,21 @@
     pointer r;            /* temporary pointer */
     pointer mlist = null; /* beginning of mlist to be translated */
     switch (type(p)) {
-    case math_char_node:
-        mlist = new_noad();
-        r = math_clone(p);
-        nucleus(mlist) = r;
-        break;
-    case sub_box_node:
-        q = math_list(p);
-        goto FOUND;
-        break;
-    case sub_mlist_node:
-        mlist = math_list(p);
-        break;
-    default:
-        q = new_null_box();
-        goto FOUND;
+        case math_char_node:
+            mlist = new_noad();
+            r = math_clone(p);
+            nucleus(mlist) = r;
+            break;
+        case sub_box_node:
+            q = math_list(p);
+            goto FOUND;
+            break;
+        case sub_mlist_node:
+            mlist = math_list(p);
+            break;
+        default:
+            q = new_null_box();
+            goto FOUND;
     }
     mlist_to_hlist(mlist, false, s);
     q = vlink(temp_head); /* recursive call */
@@ -1857,7 +1863,7 @@
     pointer e, p;
     halfword w;
     boolean stack = false;
-    e = do_delimiter(q, left_delimiter(q), cur_size, radicalwidth(q), true, cur_style, true, &stack, NULL);
+    e = do_delimiter(q, left_delimiter(q), cur_size, radicalwidth(q), true, cur_style, true, &stack, NULL, NULL);
     w = width(e);
     if (!stack&& (radicalwidth(q) != 0) && (radicalwidth(q) != width(e))) {
         if (radicalmiddle(q)) {
@@ -1887,7 +1893,7 @@
     if (theta == undefined_math_parameter) {
         /* a real radical */
         theta = fraction_rule(cur_style);
-        y = do_delimiter(q, left_delimiter(q), cur_size, height(x) + depth(x) + clr + theta, false, cur_style, true, NULL, NULL);
+        y = do_delimiter(q, left_delimiter(q), cur_size, height(x) + depth(x) + clr + theta, false, cur_style, true, NULL, NULL, NULL);
         /*
             If |y| is a composite then set |theta| to the height of its top
             character, else set it to the height of |y|.
@@ -1907,7 +1913,7 @@
         }
     } else {
         /* not really a radical but we use its node, historical sharing (like in mathml) */
-        y = do_delimiter(q, left_delimiter(q), cur_size, height(x) + depth(x) + clr + theta, false, cur_style, true, NULL, NULL);
+        y = do_delimiter(q, left_delimiter(q), cur_size, height(x) + depth(x) + clr + theta, false, cur_style, true, NULL, NULL, NULL);
     }
     left_delimiter(q) = null;
     delta = (depth(y) + height(y) - theta) - (height(x) + depth(x) + clr);
@@ -2034,7 +2040,7 @@
     boolean stack;
     x = clean_box(nucleus(q), sub_style(cur_style), cur_style);
     check_widths(q,x);
-    y = do_delimiter(q, left_delimiter(q), cur_size, wd, true, cur_style, true, &stack, NULL);
+    y = do_delimiter(q, left_delimiter(q), cur_size, wd, true, cur_style, true, &stack, NULL, NULL);
     left_delimiter(q) = null;
     check_radical(q,stack,y,x);
     fixup_widths(q, x, y);
@@ -2061,7 +2067,7 @@
     boolean stack;
     y = clean_box(nucleus(q), sup_style(cur_style), cur_style);
     check_widths(q,y);
-    x = do_delimiter(q, left_delimiter(q), cur_size, wd, true, cur_style, true, &stack, NULL);
+    x = do_delimiter(q, left_delimiter(q), cur_size, wd, true, cur_style, true, &stack, NULL, NULL);
     left_delimiter(q) = null;
     check_radical(q,stack,x,y);
     fixup_widths(q, x, y);
@@ -2088,7 +2094,7 @@
     boolean stack;
     y = clean_box(nucleus(q), cur_style, cur_style);
     check_widths(q,y);
-    x = do_delimiter(q, left_delimiter(q), cur_size + (cur_size == script_script_size ? 0 : 1), wd, true, cur_style, true, &stack, NULL);
+    x = do_delimiter(q, left_delimiter(q), cur_size + (cur_size == script_script_size ? 0 : 1), wd, true, cur_style, true, &stack, NULL, NULL);
     left_delimiter(q) = null;
     check_radical(q,stack,x,y);
     fixup_widths(q, x, y);
@@ -2115,7 +2121,7 @@
     boolean stack;
     x = clean_box(nucleus(q), cur_style, cur_style);
     check_widths(q,x);
-    y = do_delimiter(q, left_delimiter(q), cur_size + (cur_size == script_script_size ? 0 : 1), wd, true, cur_style, true, &stack, NULL);
+    y = do_delimiter(q, left_delimiter(q), cur_size + (cur_size == script_script_size ? 0 : 1), wd, true, cur_style, true, &stack, NULL, NULL);
     left_delimiter(q) = null;
     check_radical(q,stack,y,x);
     fixup_widths(q, x, y);
@@ -2182,11 +2188,24 @@
             * use the positioning of the nucleus of that noad, recursing until
             * the inner most |accent_noad|. This way multiple stacked accents are
             * aligned to the inner most one.
+
+            the vlink test was added in version 1.06, so that we only consider a lone
+            noad:
+
+            $
+                \Umathaccent bottom 0 0 "023DF {   \Umathaccent fixed 0 0 "00302 { m } r } \quad
+                \Umathaccent bottom 0 0 "023DF { l \Umathaccent fixed 0 0 "00302 { m } r } \quad
+                \Umathaccent bottom 0 0 "023DF { l \Umathaccent fixed 0 0 "00302 { m }   } \quad
+                \Umathaccent bottom 0 0 "023DF {   \Umathaccent fixed 0 0 "00302 { m }   } \quad
+                \Umathaccent bottom 0 0 "023DF { l                                      r }
+            $
+
         */
         p = math_list(nucleus(q));
-        if (type(p) == accent_noad) {
+        if (type(p) == accent_noad && vlink(p) == null) {
             s_is_absolute = compute_accent_skew(p, flags, s);
         }
+    } else {
     }
 
     return s_is_absolute;
@@ -2423,7 +2442,7 @@
 
     if (middle_delimiter(q) != null) {
         delta = 0;
-        m = do_delimiter(q, middle_delimiter(q), cur_size, delta, false, cur_style, true, NULL, NULL);
+        m = do_delimiter(q, middle_delimiter(q), cur_size, delta, false, cur_style, true, NULL, NULL, NULL);
         middle_delimiter(q) = null;
     } else {
         m = null ;
@@ -2592,9 +2611,9 @@
     } else {
         delta = fraction_del_size_old(cur_style);
     }
-    l = do_delimiter(q, left_delimiter(q), cur_size, delta, false, cur_style, true, NULL, NULL);
+    l = do_delimiter(q, left_delimiter(q), cur_size, delta, false, cur_style, true, NULL, NULL, NULL);
     left_delimiter(q) = null;
-    r = do_delimiter(q, right_delimiter(q), cur_size, delta, false, cur_style, true, NULL, NULL);
+    r = do_delimiter(q, right_delimiter(q), cur_size, delta, false, cur_style, true, NULL, NULL, NULL);
     right_delimiter(q) = null;
     couple_nodes(l,v);
     couple_nodes(v,r);
@@ -2619,7 +2638,7 @@
 
 @c
 static void make_scripts(pointer q, pointer p, scaled it, int cur_style, scaled supshift, scaled subshift);
-static pointer check_nucleus_complexity(halfword q, scaled * delta, int cur_style);
+static pointer check_nucleus_complexity(halfword q, scaled * delta, int cur_style, int *same);
 
 static scaled make_op(pointer q, int cur_style)
 {
@@ -2644,7 +2663,7 @@
                 reset_attributes(y, node_attr(q));
                 small_fam(y) = math_fam(nucleus(q));
                 small_char(y) = math_character(nucleus(q));
-                x = do_delimiter(q, y, text_size, ok_size, false, cur_style, true, NULL, &delta);
+                x = do_delimiter(q, y, text_size, ok_size, false, cur_style, true, NULL, &delta, NULL);
                 if (delta != 0) {
                     if (do_new_math(cur_f)) {
                         /* we never added italic correction */
@@ -2705,7 +2724,7 @@
                     delta = half(delta) ;
                 }
             */
-            p = check_nucleus_complexity(q, &dummy, cur_style);
+            p = check_nucleus_complexity(q, &dummy, cur_style, NULL);
             if ((subscr(q) == null) && (supscr(q) == null)) {
                 assign_new_hlist(q, p);
             } else {
@@ -2752,7 +2771,7 @@
             delta = 0;
         } else {
             /* similar code then the caller (before CHECK_DIMENSIONS) */
-            p = check_nucleus_complexity(q, &delta, cur_style);
+            p = check_nucleus_complexity(q, &delta, cur_style, NULL);
             if ((subscr(q) == null) && (supscr(q) == null)) {
                 assign_new_hlist(q, p);
             } else {
@@ -2923,6 +2942,7 @@
             /* add italic correction */
             if (do_new_math(cur_f) && (char_italic(cur_f,math_character(nucleus(q))) != 0)) {
                 p = new_kern(char_italic(cur_f,math_character(nucleus(q))));
+                subtype(p) = italic_kern;
                 reset_attributes(p, node_attr(q));
                 couple_nodes(p,vlink(q));
                 couple_nodes(q,p);
@@ -3082,7 +3102,8 @@
 {
     scaled corr_height_top = 0, corr_height_bot = 0;
     scaled krn_l = 0, krn_r = 0, krn = 0;
-    if ((!do_new_math(l_f)) || (!do_new_math(r_f)) || (!char_exists(l_f, l_c)) || (!char_exists(r_f, r_c)))
+//    if ((!do_new_math(l_f)) || (!do_new_math(r_f)) || (!char_exists(l_f, l_c)) || (!char_exists(r_f, r_c)))
+    if ((!(do_new_math(l_f) || do_new_math(r_f))) || (!char_exists(l_f, l_c)) || (!char_exists(r_f, r_c)))
         return MATH_KERN_NOT_FOUND;
 
     if (cmd == sup_mark_cmd) {
@@ -3203,40 +3224,92 @@
 the new fonts so eventualy there will be an option to ignore such corrections.
 
 @ @c
-#define analyze_script(init,su_n,su_f,su_c) do {                                 \
-    su_n = init;                                                                 \
-    if (su_n != null) {                                                          \
-        if (type(su_n) == sub_mlist_node && math_list(su_n)) {                   \
-            su_n = math_list(su_n);                                              \
-            if (su_n != null) {                                                  \
-                while (su_n) {                                                   \
-                    if ((type(su_n) == kern_node) || (type(su_n) == glue_node)) {\
-                        su_n = vlink(su_n);                                      \
-                    } else if (type(su_n) == simple_noad) {                      \
-                        su_n = nucleus(su_n);                                    \
-                        if (type(su_n) != math_char_node) {                      \
-                            su_n = null;                                         \
-                        }                                                        \
-                        break;                                                   \
-                    } else {                                                     \
-                        su_n = null;                                             \
-                        break;                                                   \
-                    }                                                            \
-                }                                                                \
-            }                                                                    \
-        }                                                                        \
-        if ((su_n != null) && (type(su_n) == math_char_node)) {                  \
-            fetch(su_n);                                                         \
-            if (char_exists(cur_f, cur_c)) {                                     \
-                su_f = cur_f;                                                    \
-                su_c = cur_c;                                                    \
-            } else {                                                             \
-                su_n = null;                                                     \
-            }                                                                    \
-        }                                                                        \
-    }                                                                            \
-  } while (0)
+#define analyze_script(init,su_n,su_f,su_c) do { \
+    su_n = init; \
+    if (su_n != null) { \
+        if (math_script_box_mode_par > 0 && type(su_n) == sub_mlist_node) { \
+            su_n = math_list(su_n); \
+            while (su_n != null) { \
+                if ((type(su_n) == kern_node) || (type(su_n) == glue_node)) { \
+                    su_n = vlink(su_n); \
+                } else if (type(su_n) == simple_noad) { \
+                    su_n = nucleus(su_n); \
+                    if (type(su_n) == math_char_node) { \
+                        fetch(su_n); \
+                        if (char_exists(cur_f, cur_c)) { \
+                            su_f = cur_f; \
+                            su_c = cur_c; \
+                        } else { \
+                            su_n = null; \
+                        } \
+                    } else { \
+                        su_n = null; \
+                    } \
+                    break; \
+                } else { \
+                    su_n = null; \
+                    break; \
+                } \
+            } \
+        } else if (type(su_n) == sub_box_node) { \
+            su_n = math_list(su_n); \
+            if (su_n != null) { \
+                if (type(su_n) == hlist_node) { \
+                    su_n = list_ptr(su_n); \
+                } \
+                if (su_n != null) { \
+                    if (math_script_box_mode_par == 2) { \
+                        while (su_n != null) { \
+                            if ((type(su_n) == kern_node) || (type(su_n) == glue_node)) { \
+                                su_n = vlink(su_n); \
+                            } else if (type(su_n) == glyph_node) { \
+                                if (char_exists(font(su_n), character(su_n))) { \
+                                    su_f = font(su_n); \
+                                    su_c = character(su_n); \
+                                } else { \
+                                    su_n = null; \
+                                } \
+                                break ; \
+                            } else { \
+                                su_n = null; \
+                                break; \
+                            } \
+                        } \
+                    } else if (math_script_box_mode_par == 3) { \
+                        int boundary = -1; \
+                        while (su_n != null) { \
+                            if ((type(su_n) == boundary_node) && (subtype(su_n) == user_boundary)) { \
+                                boundary = boundary_value(su_n); \
+                                su_n = vlink(su_n); \
+                            } else if ((type(su_n) == kern_node) || (type(su_n) == glue_node)) { \
+                                su_n = vlink(su_n); \
+                            } else if ((boundary > -1) && (type(su_n) == glyph_node)) { \
+                                if (char_exists(font(su_n), character(su_n))) { \
+                                    su_f = font(su_n); \
+                                    su_c = character(su_n); \
+                                } else { \
+                                    su_n = null; \
+                                } \
+                                break ; \
+                            } else { \
+                                su_n = null; \
+                                break; \
+                            } \
+                        } \
+                    } \
+                } \
+            } else { \
+                su_n = null; \
+            } \
+        } else { \
+            su_n = null; \
+        } \
+    } \
+  } while (0) \
 
+#define x_su_style(n,cur_style,su_style) \
+    (noadoptionnosubscript(n) ? cur_style : su_style(cur_style))
+
 static void make_scripts(pointer q, pointer p, scaled it, int cur_style, scaled supshift, scaled subshift)
 {
     pointer x, y, z;                  /* temporary registers for box construction */
@@ -3265,6 +3338,7 @@
             if ((subscr(q) == null) && (delta1 != 0)) {
                 /* todo: selective */
                 x = new_kern(delta1); /* italic correction */
+                subtype(x) = italic_kern;
                 reset_attributes(x, node_attr(nucleus(q)));
                 couple_nodes(p,x);
                 delta1 = 0;
@@ -3296,7 +3370,8 @@
             when there is a subscript without a superscript, the top of the subscript
             should not exceed the baseline plus four-fifths of the x-height.
         */
-        x = clean_box(subscr(q), sub_style(cur_style), cur_style);
+    /*  x = clean_box(subscr(q), sub_style(cur_style), cur_style); */
+        x = clean_box(subscr(q), (noadoptionnosubscript(q) ? cur_style : sub_style(cur_style)), cur_style);
         width(x) = width(x) + space_after_script(cur_style);
         switch (math_scripts_mode_par) {
             case 1:
@@ -3346,7 +3421,8 @@
             the bottom of a superscript should never descend below the baseline plus
             one-fourth of the x-height.
         */
-        x = clean_box(supscr(q), sup_style(cur_style), cur_style);
+    /*  x = clean_box(supscr(q), sup_style(cur_style), cur_style); */
+        x = clean_box(supscr(q), (noadoptionnosupscript(q) ? cur_style : sup_style(cur_style)), cur_style);
         width(x) = width(x) + space_after_script(cur_style);
         switch (math_scripts_mode_par) {
             case 1:
@@ -3401,7 +3477,8 @@
                 both subscript and superscript move up so that the bottom of the superscript
                 is at least as high as the baseline plus four-fifths of the x-height
             */
-            y = clean_box(subscr(q), sub_style(cur_style), cur_style);
+        /*  y = clean_box(subscr(q) sub_style(cur_style), cur_style); */
+            y = clean_box(subscr(q), (noadoptionnosubscript(q) ? cur_style : sub_style(cur_style)), cur_style);
             width(y) = width(y) + space_after_script(cur_style);
             switch (math_scripts_mode_par) {
                 case 1:
@@ -3508,23 +3585,17 @@
 {
     scaled delta;
     pointer tmp, lst;
-    scaled hd_asked = 0;
     scaled ic = 0;
     boolean stack = false;
     boolean axis = false;
-    /*
-        scaled hd_done = 0;
-        boolean fitting = true;
-        boolean fence = false;
-        int chr = 0;
-        int cls = 0;
-    */
+    int same = subtype(q);
+
     setup_cur_size(style);
 
     if ((delimiterheight(q)!=0) || (delimiterdepth(q)!=0)) {
 
-        hd_asked = delimiterheight(q) + delimiterdepth(q);
-        tmp = do_delimiter(q, delimiter(q), cur_size, hd_asked, false, style, false, &stack, &ic);
+        delta = delimiterheight(q) + delimiterdepth(q);
+        tmp = do_delimiter(q, delimiter(q), cur_size, delta, false, style, false, &stack, &ic, &same);
         delimiteritalic(q) = ic;
 
         /* beware, a stacked delimiter has a shift but no corrected height/depth (yet) */
@@ -3533,19 +3604,6 @@
             shift_amount(tmp) = delimiterdepth(q);
         }
 
-        /*
-            hd_done = height(tmp) + depth(tmp);
-            fitting = stack || ((hd_done-hd_asked) == 0);
-
-            if (type(delimiter(q)) == delim_node && (small_char(delimiter(q)) != 0)) {
-                chr = small_char(delimiter(q));
-                cls = get_math_code(chr).class_value ;
-                fence = (cls == 4) || (cls == 5) ;
-            }
-
-            printf("delimiter stack %i fence %i fitting %i\n",stack,fence,fitting);
-        */
-
         if (delimiterexact(q)) {
             delimiterheight(q) = height(tmp) - shift_amount(tmp);
             delimiterdepth(q)  = depth(tmp)  + shift_amount(tmp);
@@ -3566,11 +3624,12 @@
     } else {
         axis = ! delimiternoaxis(q);
         delta = get_delimiter_height(max_d,max_h,axis);
-        tmp = do_delimiter(q, delimiter(q), cur_size, delta, false, style, axis, &stack, &ic);
+        tmp = do_delimiter(q, delimiter(q), cur_size, delta, false, style, axis, &stack, &ic, &same);
         delimiteritalic(q) = ic;
     }
     delimiter(q) = null;
     assign_new_hlist(q, tmp);
+    delimitersamesize(q) = same; /* new */
     if (delimiterclass(q) >= ord_noad_type) {
         if (delimiterclass(q) <= inner_noad_type) {
             return delimiterclass(q);
@@ -3577,8 +3636,6 @@
         } else {
             return ord_noad_type;
         }
-    } else if (subtype(q) == no_noad_side) {
-        return open_noad_type;
     } else if (subtype(q) == left_noad_side) {
         return open_noad_type;
     } else {
@@ -3797,58 +3854,67 @@
 }
 
 @ @c
-static pointer check_nucleus_complexity(halfword q, scaled * delta, int cur_style)
+static pointer check_nucleus_complexity(halfword q, scaled * delta, int cur_style, int *same)
 {
     pointer p = null;
+    pointer t = null;
+    if (same != NULL) {
+        *same = 0;
+    }
     switch (type(nucleus(q))) {
-    case math_char_node:
-    case math_text_char_node:
-        fetch(nucleus(q));
-        if (char_exists(cur_f, cur_c)) {
-            /* we could look at neighbours */
-            if (do_new_math(cur_f)) {
-                *delta = 0 ; /* cf spec only the last one */
-            } else {
-                *delta = char_italic(cur_f, cur_c);
-            }
-            p = new_glyph(cur_f, cur_c);
-            reset_attributes(p, node_attr(nucleus(q)));
-            if (do_new_math(cur_f)) {
-                if (! math_no_char_italic_par) {
-                    /* keep italic, but bad with two successive letters */
-                } else if (get_char_cat_code(cur_c) == 11) {
+        case math_char_node:
+        case math_text_char_node:
+            fetch(nucleus(q));
+            if (char_exists(cur_f, cur_c)) {
+                /* we could look at neighbours */
+                if (do_new_math(cur_f)) {
+                    *delta = 0 ; /* cf spec only the last one */
+                } else {
+                    *delta = char_italic(cur_f, cur_c);
+                }
+                p = new_glyph(cur_f, cur_c);
+                reset_attributes(p, node_attr(nucleus(q)));
+                if (do_new_math(cur_f)) {
+                    if (! math_no_char_italic_par) {
+                        /* keep italic, but bad with two successive letters */
+                    } else if (get_char_cat_code(cur_c) == 11) {
+                        /* no italic correction in mid-word of text font */
+                        *delta = 0;
+                    }
+                } else {
                     /* no italic correction in mid-word of text font */
-                    *delta = 0;
+                    if (((type(nucleus(q))) == math_text_char_node) && (space(cur_f) != 0)) {
+                        *delta = 0;
+                    }
                 }
-            } else {
-                /* no italic correction in mid-word of text font */
-                if (((type(nucleus(q))) == math_text_char_node) && (space(cur_f) != 0)) {
+                /* so we only add italic correction when we have no scripts */
+                if ((subscr(q) == null) && (supscr(q) == null) && (*delta != 0)) {
+                    pointer x = new_kern(*delta);
+                    subtype(x) = italic_kern;
+                    reset_attributes(x, node_attr(nucleus(q)));
+                    couple_nodes(p,x);
                     *delta = 0;
+                } else /* needs checking but looks ok */
+                if (do_new_math(cur_f)) {
+                    *delta = char_italic(cur_f, cur_c); /* must be more selective */
                 }
             }
-            /* so we only add italic correction when we have no scripts */
-            if ((subscr(q) == null) && (supscr(q) == null) && (*delta != 0)) {
-                pointer x = new_kern(*delta);
-                reset_attributes(x, node_attr(nucleus(q)));
-                couple_nodes(p,x);
-                *delta = 0;
-            }
-            if (do_new_math(cur_f)) {
-                *delta = char_italic(cur_f, cur_c); /* must be more selective */
-            }
-        }
-        break;
-    case sub_box_node:
-        p = math_list(nucleus(q));
-        break;
-    case sub_mlist_node:
-        mlist_to_hlist(math_list(nucleus(q)), false, cur_style);   /* recursive call */
-        setup_cur_size(cur_style);
-        p = hpack(vlink(temp_head), 0, additional, -1);
-        reset_attributes(p, node_attr(nucleus(q)));
-        break;
-    default:
-        confusion("mlist2");    /* this can't happen mlist2 */
+            break;
+        case sub_box_node:
+            p = math_list(nucleus(q));
+            break;
+        case sub_mlist_node:
+            t = math_list(nucleus(q));
+            mlist_to_hlist(t, false, cur_style);   /* recursive call */
+if (same != NULL && type(t) == fence_noad && delimitersamesize(t)) {
+    *same = delimitersamesize(t) ;
+}
+            setup_cur_size(cur_style);
+            p = hpack(vlink(temp_head), 0, additional, -1);
+            reset_attributes(p, node_attr(nucleus(q)));
+            break;
+        default:
+            confusion("mlist2");    /* this can't happen mlist2 */
     }
     return p;
 }
@@ -3867,9 +3933,12 @@
     int t;                                /* the effective |type| of noad |q| during the second pass */
     int t_subtype;                        /* the effective |subtype| of noad |q| during the second pass */
     pointer p = null;
+    pointer pp = null;
     pointer z = null;
     halfword nxt ;
+    int same = 0;
     int pen;                              /* a penalty to be inserted */
+    int prepen;                           /* a penalty to be inserted */
     scaled max_hl = 0;                    /* maximum height of the list translated so far */
     scaled max_d = 0;                     /* maximum depth of the list translated so far */
     scaled delta;                         /* italic correction offset for subscript and superscript */
@@ -3877,6 +3946,10 @@
     r_subtype = op_noad_type_normal;
     setup_cur_size(cur_style);
     cur_mu = x_over_n(get_math_quad_size(cur_size), 18);
+    if (math_penalties_mode_par) {
+        /* we could do this via the callback but it's nice to have it as primitive too */
+        penalties = 1;
+    }
     while (q != null) {
         /*
             we use the fact that no character nodes appear in an mlist, hence
@@ -3891,179 +3964,180 @@
         delta = 0;
         nxt = vlink(q);
         switch (type(q)) {
-        case simple_noad:
-            switch (subtype(q)) {
-            case bin_noad_type:
-                switch (r_type) {
-                case simple_noad:
-                    switch (r_subtype) {
-                    case bin_noad_type:
-                    case op_noad_type_normal:
-                    case op_noad_type_limits:
-                    case op_noad_type_no_limits:
-                    case rel_noad_type:
-                    case open_noad_type:
-                    case punct_noad_type:
-                        subtype(q) = ord_noad_type;
-                        goto RESWITCH;
+            case simple_noad:
+                switch (subtype(q)) {
+                case bin_noad_type:
+                    switch (r_type) {
+                    case simple_noad:
+                        switch (r_subtype) {
+                        case bin_noad_type:
+                        case op_noad_type_normal:
+                        case op_noad_type_limits:
+                        case op_noad_type_no_limits:
+                        case rel_noad_type:
+                        case open_noad_type:
+                        case punct_noad_type:
+                            subtype(q) = ord_noad_type;
+                            goto RESWITCH;
+                            break;
+                        }
                         break;
+                    case fence_noad:
+                        if (r_subtype == left_noad_side) {
+                            subtype(q) = ord_noad_type; /* so these can best be the same size */
+                            goto RESWITCH;
+                        }
+                        break;
                     }
                     break;
-                case fence_noad:
-                    if (r_subtype == left_noad_side) {
-                        subtype(q) = ord_noad_type; /* so these can best be the same size */
-                        goto RESWITCH;
+                case over_noad_type:
+                    make_over(q, cur_style, cur_size, math_rules_fam_par);
+                    break;
+                case under_noad_type:
+                    make_under(q, cur_style, cur_size, math_rules_fam_par);
+                    break;
+                case vcenter_noad_type:
+                    make_vcenter(q);
+                    break;
+                case rel_noad_type:
+                case close_noad_type:
+                case punct_noad_type:
+                    if (r_type == simple_noad && r_subtype == bin_noad_type) {
+                        type(r) = simple_noad; /* assumes the same size .. can't this go */
+                        subtype(r) = ord_noad_type;
                     }
                     break;
+                case op_noad_type_normal:
+                case op_noad_type_limits:
+                case op_noad_type_no_limits:
+                    delta = make_op(q, cur_style);
+                    if ((subtype(q) == op_noad_type_limits) || (subtype(q) == op_noad_type_no_limits))
+                        goto CHECK_DIMENSIONS;
+                    break;
+                case ord_noad_type:
+                    make_ord(q);
+                    break;
+                case open_noad_type:
+                case inner_noad_type:
+                    break;
                 }
                 break;
-            case over_noad_type:
-                make_over(q, cur_style, cur_size, math_rules_fam_par);
+            case fence_noad:
+                if (subtype(q) != left_noad_side) {
+                    if (r_type == simple_noad && r_subtype == bin_noad_type) {
+                        type(r) = simple_noad; /* assumes the same size  */
+                        subtype(r) = ord_noad_type;
+                    }
+                }
+                goto DONE_WITH_NOAD;
                 break;
-            case under_noad_type:
-                make_under(q, cur_style, cur_size, math_rules_fam_par);
+            case fraction_noad:
+                make_fraction(q, cur_style);
+                goto CHECK_DIMENSIONS;
                 break;
-            case vcenter_noad_type:
-                make_vcenter(q);
+            case radical_noad:
+                if (subtype(q) == 7)
+                    make_hextension(q, cur_style);
+                else if (subtype(q) == 6)
+                    make_delimiter_over(q, cur_style);
+                else if (subtype(q) == 5)
+                    make_delimiter_under(q, cur_style);
+                else if (subtype(q) == 4)
+                    make_over_delimiter(q, cur_style);
+                else if (subtype(q) == 3)
+                    make_under_delimiter(q, cur_style);
+                else
+                    make_radical(q, cur_style);
                 break;
-            case rel_noad_type:
-            case close_noad_type:
-            case punct_noad_type:
-                if (r_type == simple_noad && r_subtype == bin_noad_type) {
-                    type(r) = simple_noad; /* assumes the same size .. can't this go */
-                    subtype(r) = ord_noad_type;
-                }
+            case accent_noad:
+                make_math_accent(q, cur_style);
                 break;
-            case op_noad_type_normal:
-            case op_noad_type_limits:
-            case op_noad_type_no_limits:
-                delta = make_op(q, cur_style);
-                if ((subtype(q) == op_noad_type_limits) || (subtype(q) == op_noad_type_no_limits))
-                    goto CHECK_DIMENSIONS;
+            case style_node:
+                cur_style = subtype(q);
+                setup_cur_size(cur_style);
+                cur_mu = x_over_n(get_math_quad_style(cur_style), 18);
+                goto DONE_WITH_NODE;
                 break;
-            case ord_noad_type:
-                make_ord(q);
-                break;
-            case open_noad_type:
-            case inner_noad_type:
-                break;
-            }
-            break;
-        case fence_noad:
-            if (subtype(q) != left_noad_side)
-                if (r_type == simple_noad && r_subtype == bin_noad_type) {
-                    type(r) = simple_noad; /* assumes the same size  */
-                    subtype(r) = ord_noad_type;
+            case choice_node:
+                switch (cur_style / 2) {
+                case 0: /* |display_style=0| */
+                    choose_mlist(display_mlist);
+                    break;
+                case 1: /* |text_style=2| */
+                    choose_mlist(text_mlist);
+                    break;
+                case 2: /* |script_style=4| */
+                    choose_mlist(script_mlist);
+                    break;
+                case 3: /* |script_script_style=6| */
+                    choose_mlist(script_script_mlist);
+                    break;
                 }
-            goto DONE_WITH_NOAD;
-            break;
-        case fraction_noad:
-            make_fraction(q, cur_style);
-            goto CHECK_DIMENSIONS;
-            break;
-        case radical_noad:
-            if (subtype(q) == 7)
-                make_hextension(q, cur_style);
-            else if (subtype(q) == 6)
-                make_delimiter_over(q, cur_style);
-            else if (subtype(q) == 5)
-                make_delimiter_under(q, cur_style);
-            else if (subtype(q) == 4)
-                make_over_delimiter(q, cur_style);
-            else if (subtype(q) == 3)
-                make_under_delimiter(q, cur_style);
-            else
-                make_radical(q, cur_style);
-            break;
-        case accent_noad:
-          make_math_accent(q, cur_style);
-            break;
-        case style_node:
-            cur_style = subtype(q);
-            setup_cur_size(cur_style);
-            cur_mu = x_over_n(get_math_quad_style(cur_style), 18);
-            goto DONE_WITH_NODE;
-            break;
-        case choice_node:
-            switch (cur_style / 2) {
-            case 0: /* |display_style=0| */
-                choose_mlist(display_mlist);
+                flush_node_list(display_mlist(q));
+                flush_node_list(text_mlist(q));
+                flush_node_list(script_mlist(q));
+                flush_node_list(script_script_mlist(q));
+                type(q) = style_node;
+                subtype(q) = (quarterword) cur_style;
+                if (p != null) {
+                    z = vlink(q);
+                    couple_nodes(q,p);
+                    while (vlink(p) != null)
+                        p = vlink(p);
+                    try_couple_nodes(p,z);
+                }
+                goto DONE_WITH_NODE;
                 break;
-            case 1: /* |text_style=2| */
-                choose_mlist(text_mlist);
+            case ins_node:
+            case mark_node:
+            case adjust_node:
+            case boundary_node:
+            case whatsit_node:
+            case penalty_node:
+            case disc_node:
+                goto DONE_WITH_NODE;
                 break;
-            case 2: /* |script_style=4| */
-                choose_mlist(script_mlist);
+            case rule_node:
+                if (height(q) > max_hl)
+                    max_hl = height(q);
+                if (depth(q) > max_d)
+                    max_d = depth(q);
+                goto DONE_WITH_NODE;
                 break;
-            case 3: /* |script_script_style=6| */
-                choose_mlist(script_script_mlist);
-                break;
-            }
-            flush_node_list(display_mlist(q));
-            flush_node_list(text_mlist(q));
-            flush_node_list(script_mlist(q));
-            flush_node_list(script_script_mlist(q));
-            type(q) = style_node;
-            subtype(q) = (quarterword) cur_style;
-            if (p != null) {
-                z = vlink(q);
-                couple_nodes(q,p);
-                while (vlink(p) != null)
-                    p = vlink(p);
-                try_couple_nodes(p,z);
-            }
-            goto DONE_WITH_NODE;
-            break;
-        case ins_node:
-        case mark_node:
-        case adjust_node:
-        case boundary_node:
-        case whatsit_node:
-        case penalty_node:
-        case disc_node:
-            goto DONE_WITH_NODE;
-            break;
-        case rule_node:
-            if (height(q) > max_hl)
-                max_hl = height(q);
-            if (depth(q) > max_d)
-                max_d = depth(q);
-            goto DONE_WITH_NODE;
-            break;
-        case glue_node:
-            /*
-                conditional math glue (`\.{\\nonscript}') results in a |glue_node|
-                pointing to |zero_glue|, with |subtype(q)=cond_math_glue|; in such a case
-                the node following will be eliminated if it is a glue or kern node and if the
-                current size is different from |text_size|
+            case glue_node:
+                /*
+                    conditional math glue (`\.{\\nonscript}') results in a |glue_node|
+                    pointing to |zero_glue|, with |subtype(q)=cond_math_glue|; in such a case
+                    the node following will be eliminated if it is a glue or kern node and if the
+                    current size is different from |text_size|
 
-                unconditional math glue (`\.{\\muskip}') is converted to normal glue by
-                multiplying the dimensions by |cur_mu|
+                    unconditional math glue (`\.{\\muskip}') is converted to normal glue by
+                    multiplying the dimensions by |cur_mu|
 
-            */
-            if (subtype(q) == mu_glue) {
-                math_glue_to_glue(q, cur_mu);
-            } else if ((cur_size != text_size) && (subtype(q) == cond_math_glue)) {
-                p = vlink(q);
-         	if (p != null)
-                     if ((type(p) == glue_node) || (type(p) == kern_node)) {
-                       if (vlink(p) != null) {
-                            couple_nodes(q,vlink(p));
-                            vlink(p) = null;
-                        } else {
-                            vlink(q) = null;
+                */
+                if (subtype(q) == mu_glue) {
+                    math_glue_to_glue(q, cur_mu);
+                } else if ((cur_size != text_size) && (subtype(q) == cond_math_glue)) {
+                    p = vlink(q);
+                    if (p != null)
+                        if ((type(p) == glue_node) || (type(p) == kern_node)) {
+                            if (vlink(p) != null) {
+                                couple_nodes(q,vlink(p));
+                                vlink(p) = null;
+                            } else {
+                                vlink(q) = null;
+                            }
+                            flush_node_list(p);
                         }
-                        flush_node_list(p);
-                     }
-            }
-	    goto DONE_WITH_NODE;
-            break;
-        case kern_node:
-            math_kern(q, cur_mu);
-            goto DONE_WITH_NODE;
-            break;
-        default:
-            confusion("mlist1");
+                }
+                goto DONE_WITH_NODE;
+                break;
+            case kern_node:
+                math_kern(q, cur_mu);
+                goto DONE_WITH_NODE;
+                break;
+            default:
+                confusion("mlist1");
         }
         /*
             When we get to the following part of the program, we have ``fallen through''
@@ -4077,7 +4151,11 @@
             when both are present.
 
         */
-        p = check_nucleus_complexity(q, &delta, cur_style);
+same = 0 ;
+        p = check_nucleus_complexity(q, &delta, cur_style, &same);
+if (same) {
+    noadextra4(q) = same ;
+}
         if ((subscr(q) == null) && (supscr(q) == null)) {
             /*
                 Adding italic correction here is kind of fuzzy because some
@@ -4094,9 +4172,13 @@
                         case open_noad_type:
                         case close_noad_type:
                         case punct_noad_type:
-                        case inner_noad_type:
                             delta = 0;
                             break;
+                        case inner_noad_type:
+                            if (! delimitermodeitalics) {
+                                delta = 0;
+                            }
+                            break;
                         case op_noad_type_normal:
                         case op_noad_type_limits:
                         case op_noad_type_no_limits:
@@ -4110,6 +4192,7 @@
                 }
                 if (delta != 0) {
                     pointer d = new_kern(delta);
+                    subtype(d) = italic_kern;
                     reset_attributes(d, node_attr(q));
                     couple_nodes(p,d);
                 }
@@ -4178,6 +4261,7 @@
         t = simple_noad;
         t_subtype = ord_noad_type;
         pen = inf_penalty;
+        prepen = inf_penalty;
         switch (type(q)) {
         case simple_noad:
             t_subtype = subtype(q);
@@ -4184,9 +4268,11 @@
             switch (t_subtype) {
             case bin_noad_type:
                 pen = bin_op_penalty_par;
+                prepen = pre_bin_op_penalty_par;
                 break;
             case rel_noad_type:
                 pen = rel_penalty_par;
+                prepen = pre_rel_penalty_par;
                 break;
             case vcenter_noad_type:
             case over_noad_type:
@@ -4233,12 +4319,24 @@
         /* Append inter-element spacing based on |r_type| and |t| */
         if (r_type > 0) {
             /* not the first noad */
+            pp = p;
+if (delimitermodeordinal && t_subtype == inner_noad_type && noadextra4(q) == 1) {
+    z = math_spacing_glue(r_subtype, ord_noad_type, cur_style, cur_mu);
+} else {
             z = math_spacing_glue(r_subtype, t_subtype, cur_style, cur_mu);
+}
             if (z != null) {
                 reset_attributes(z, node_attr(p));
                 couple_nodes(p,z);
                 p = z;
             }
+            if (penalties && prepen < inf_penalty && type(pp) != penalty_node) {
+                /* no checking of prev node type */
+                z = new_penalty(prepen,noad_penalty);
+                reset_attributes(z, node_attr(p));
+                couple_nodes(p,z);
+                p = z;
+            }
         }
         /*
             Append any |new_hlist| entries for |q|, and any appropriate penalties

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/printing.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/printing.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/printing.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -838,25 +838,66 @@
 sort of ``complicated'' are indicated only by printing `\.{[]}'.
 
 @c
+
+/*
+So, 0, 1 as well as any large value will behave the same as before. The reason
+for this extension is that a \name not always makes sense.
+
+0   \foo xyz
+1   \foo (bar)
+2   <bar> xyz
+3   <bar @@ ..> xyz
+4   <id>
+5   <id: bar>
+6   <id: bar @@ ..> xyz
+
+*/
+
 void print_font_identifier(internal_font_number f)
 {
     str_number fonttext;
     fonttext = font_id_text(f);
-    if (fonttext > 0) {
-        print_esc(fonttext);
+    if (tracing_fonts_par >= 2 && tracing_fonts_par <= 6) {
+        /* < > is less likely to clash with text parenthesis */
+        tprint("<");
+        if (tracing_fonts_par >= 2 && tracing_fonts_par <= 3) {
+            print_font_name(f);
+            if (tracing_fonts_par >= 3 || font_size(f) != font_dsize(f)) {
+                tprint(" @@ ");
+                print_scaled(font_size(f));
+                tprint("pt");
+            }
+        } else if (tracing_fonts_par >= 4 && tracing_fonts_par <= 6) {
+            print_int(f);
+            if (tracing_fonts_par >= 5) {
+                tprint(": ");
+                print_font_name(f);
+                if (tracing_fonts_par >= 6 || font_size(f) != font_dsize(f)) {
+                    tprint(" @@ ");
+                    print_scaled(font_size(f));
+                    tprint("pt");
+                }
+            }
+        }
+        print_char('>');
     } else {
-        tprint_esc("FONT");
-        print_int(f);
-    }
-    if (tracing_fonts_par > 0) {
-        tprint(" (");
-        print_font_name(f);
-        if (font_size(f) != font_dsize(f)) {
-            tprint("@@");
-            print_scaled(font_size(f));
-            tprint("pt");
+        /* old method, inherited from pdftex  */
+        if (fonttext > 0) {
+            print_esc(fonttext);
+        } else {
+            tprint_esc("FONT");
+            print_int(f);
         }
-        print_char(')');
+        if (tracing_fonts_par > 0) {
+            tprint(" (");
+            print_font_name(f);
+            if (font_size(f) != font_dsize(f)) {
+                tprint("@@");
+                print_scaled(font_size(f));
+                tprint("pt");
+            }
+            print_char(')');
+        }
     }
 }
 

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/texfileio.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/texfileio.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/texfileio.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -150,9 +150,6 @@
         case find_enc_file_callback:
             ftemp = kpse_find_file(s, kpse_enc_format, 0);
             break;
-        case find_sfd_file_callback:
-            ftemp = kpse_find_file(s, kpse_sfd_format, 0);
-            break;
         case find_map_file_callback:
             ftemp = kpse_find_file(s, kpse_fontmap_format, 0);
             break;
@@ -967,13 +964,13 @@
     update_terminal();
     istate = new_line;
     /* Prepare new file {\sl Sync\TeX} information */
-    synctexstartinput();        /* Give control to the {\sl Sync\TeX} controller */
-
+    if (! synctex_get_no_files()) {
+        synctexstartinput();        /* Give control to the {\sl Sync\TeX} controller */
+    }
     /* Read the first line of the new file */
     /* Here we have to remember to tell the |lua_input_ln| routine not to
        start with a |get|. If the file is empty, it is considered to
        contain a single blank line. */
-
     line = 1;
     if (lua_input_ln(cur_file, 0, false)) {
         ;

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/texmath.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/texmath.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/texmath.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -70,6 +70,7 @@
 extern pointer new_style(small_number);
 extern void append_choices(void);
 extern void sub_sup(void);
+extern void no_sub_sup(void);
 extern void math_fraction(void);
 extern void math_left_right(void);
 extern void after_math(void);

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/texmath.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/texmath.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/texmath.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -1353,6 +1353,17 @@
 nothing is appended.
 
 @c
+#define math_class_to_type(target,source) \
+    switch (source) { \
+        case 0: target = ord_noad_type; break; \
+        case 1: target = op_noad_type_normal; break; \
+        case 2: target = bin_noad_type; break; \
+        case 3: target = rel_noad_type; break; \
+        case 4: target = open_noad_type; break; \
+        case 5: target = close_noad_type; break; \
+        case 6: target = punct_noad_type; break; \
+    }
+
 void set_math_char(mathcodeval mval)
 {
     pointer p;                  /* the new noad */
@@ -1375,17 +1386,7 @@
                 math_fam(nucleus(p)) = cur_fam_par;
             subtype(p) = ord_noad_type;
         } else {
-            switch (mval.class_value) {
-                  /* *INDENT-OFF* */
-                case 0: subtype(p) = ord_noad_type; break;
-                case 1: subtype(p) = op_noad_type_normal; break;
-                case 2: subtype(p) = bin_noad_type; break;
-                case 3: subtype(p) = rel_noad_type; break;
-                case 4: subtype(p) = open_noad_type; break;
-                case 5: subtype(p) = close_noad_type; break;
-                case 6: subtype(p) = punct_noad_type; break;
-                  /* *INDENT-ON* */
-            }
+            math_class_to_type(subtype(p),mval.class_value);
         }
         vlink(tail) = p;
         tail = p;
@@ -1727,7 +1728,7 @@
 action procedure called |sub_sup|.
 
 @c
-void sub_sup(void)
+static void do_sub_sup(int no)
 {
     pointer q;
     if (tail == head || (!scripts_allowed(tail))) {
@@ -1745,6 +1746,9 @@
             nucleus(tail) = q;
             tex_error("Double superscript", hlp);
         }
+        if (no) {
+            noadoptions(tail) = noadoptions(tail) | noad_option_no_super_script ;
+        }
         q = new_node(math_char_node, 0);
         supscr(tail) = q;
         (void) scan_math(supscr(tail), sup_style(m_style));
@@ -1758,6 +1762,9 @@
             nucleus(tail) = q;
             tex_error("Double subscript", hlp);
         }
+        if (no) {
+            noadoptions(tail) = noadoptions(tail) | noad_option_no_sub_script ;
+        }
         q = new_node(math_char_node, 0);
         subscr(tail) = q;
         (void) scan_math(subscr(tail), sub_style(m_style));
@@ -1764,6 +1771,17 @@
     }
 }
 
+void sub_sup(void)
+{
+    do_sub_sup(0);
+}
+
+void no_sub_sup(void)
+{
+    do_sub_sup(1);
+}
+
+
 @ An operation like `\.{\\over}' causes the current mlist to go into a
 state of suspended animation: |incompleat_noad| points to a |fraction_noad|
 that contains the mlist-so-far as its numerator, while the denominator
@@ -1991,7 +2009,7 @@
                 options = options | noad_option_exact ;
             } else if (scan_keyword("class")) {
                 scan_int();
-                type = cur_val ;
+                math_class_to_type(type,cur_val);
             } else {
                 break;
             }
@@ -2029,9 +2047,9 @@
         delimiteroptions(p) = options;
         delimiterclass(p) = type;
         delimiteritalic(p) = 0;
+        delimitersamesize(p) = 0;
 
         scan_delimiter(delimiter(p), no_mathcode);
-
         if (t == no_noad_side) {
             tail_append(new_noad());
             subtype(tail) = inner_noad_type;
@@ -2133,36 +2151,41 @@
 
 @c
 #define inject_display_skip_before(g) \
-    switch (display_skip_mode_par) { \
-        case 0 : /* normal tex */ \
-            tail_append(new_param_glue(g)); \
-            break;\
-        case 1 : /* always */ \
-            tail_append(new_param_glue(g)); \
-            break; \
-        case 2 : /* non-zero */ \
-            if (g != 0 && ! glue_is_zero(glue_par(g))) \
+    if (g > 0) { \
+        switch (display_skip_mode_par) { \
+            case 0 : /* normal tex | always */ \
+            case 1 : /* always */ \
                 tail_append(new_param_glue(g)); \
-            break; \
-        case 3: /* ignore */ \
-            break; \
+                break; \
+            case 2 : /* non-zero */ \
+                if (! glue_is_zero(glue_par(g))) \
+                    tail_append(new_param_glue(g)); \
+                break; \
+            case 3: /* ignore */ \
+                break; \
+            default: /* > 3 reserved for future use */ \
+                tail_append(new_param_glue(g)); \
+                break; \
+        } \
     }
 
 #define inject_display_skip_after(g) \
-    switch (display_skip_mode_par) { \
-        case 0 : /* normal tex */ \
-            if (g != 0 && glue_is_positive(glue_par(g))) \
+    if (g > 0) { \
+        switch (display_skip_mode_par) { \
+            case 0 : /* normal tex | always */ \
+            case 1 : /* always */ \
                 tail_append(new_param_glue(g)); \
-            break; \
-        case 1 : /* always */ \
-            tail_append(new_param_glue(g)); \
-            break; \
-        case 2 : /* non-zero */ \
-            if (g != 0 && ! glue_is_zero(glue_par(g))) \
+                break; \
+            case 2 : /* non-zero */ \
+                if (! glue_is_zero(glue_par(g))) \
+                    tail_append(new_param_glue(g)); \
+                break; \
+            case 3: /* ignore */ \
+                break; \
+            default: /* > 3 reserved for future use */ \
                 tail_append(new_param_glue(g)); \
-            break; \
-        case 3: /* ignore */ \
-            break; \
+                break; \
+        } \
     }
 
 static void finish_displayed_math(boolean l, pointer eqno_box, pointer p)

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/texnodes.h
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/texnodes.h	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/texnodes.h	2018-01-09 23:43:20 UTC (rev 46269)
@@ -23,19 +23,6 @@
 #ifndef __NODES_H__
 #  define __NODES_H__
 
-/* these are in texlang.c */
-
-#  define set_vlink(a,b)  vlink(a)=b
-#  define get_vlink(a)  vlink(a)
-#  define get_character(a)  character(a)
-
-extern halfword insert_discretionary(halfword t, halfword pre, halfword post, halfword replace, int penalty);
-extern halfword insert_syllable_discretionary(halfword t, lang_variables * lan);
-extern halfword insert_word_discretionary(halfword t, lang_variables * lan);
-extern halfword insert_complex_discretionary(halfword t, lang_variables * lan, halfword pre, halfword post, halfword replace);
-extern halfword insert_character(halfword t, int n);
-extern void set_disc_field(halfword f, halfword t);
-
 #  define varmemcast(a) (memory_word *)(a)
 
 extern memory_word *volatile varmem;
@@ -297,15 +284,17 @@
 #  define adjust_pre       subtype
 #  define adjust_ptr(a)    vlink(a+2)
 
-#  define glyph_node_size 6
-#  define character(a)    vinfo((a)+2)
-#  define font(a)         vlink((a)+2)
-#  define lang_data(a)    vinfo((a)+3)
-#  define lig_ptr(a)      vlink((a)+3)
-#  define x_displace(a)   vinfo((a)+4)
-#  define y_displace(a)   vlink((a)+4)
-#  define ex_glyph(a)     vinfo((a)+5)  /* expansion factor (hz) */
-#  define x_advance(a)    vlink((a)+5)
+#  define glyph_node_size       7
+#  define character(a)          vinfo((a)+2)
+#  define font(a)               vlink((a)+2)
+#  define lang_data(a)          vinfo((a)+3)
+#  define lig_ptr(a)            vlink((a)+3)
+#  define x_displace(a)         vinfo((a)+4)
+#  define y_displace(a)         vlink((a)+4)
+#  define ex_glyph(a)           vinfo((a)+5)  /* expansion factor (hz) */
+#  define x_advance(a)          vlink((a)+5)  /* obsolete, can become user field */
+#  define synctex_tag_glyph(a)  vinfo((a)+6)
+#  define synctex_line_glyph(a) vlink((a)+6)
 
 #  define is_char_node(a)  (a!=null && type(a)==glyph_node)
 
@@ -432,6 +421,8 @@
 */
 
 #  define precedes_break(a)  (type(a)<=last_preceding_break_node)
+#  define precedes_kern(a)   ((type(a) == kern_node) && (subtype(a) == font_kern || subtype(a) == accent_kern))
+#  define precedes_dir(a)    ((type(a) == dir_node) && (break_after_dir_mode_par == 1))
 #  define non_discardable(a) (type(a)<=last_non_discardable_node)
 
 #  define known_node_type(i) ( i >= 0 && i <= MAX_NODE_TYPE)
@@ -492,9 +483,9 @@
 #  define noadheight(a)  vlink((a)+5)
 #  define noaddepth(a)   vinfo((a)+5)
 #  define noadextra1(a)  vlink((a)+6) /* we need to match delimiter (saves copy) */
-#  define noadextra2(a)  vinfo((a)+6)
+#  define noadoptions(a) vinfo((a)+6)
 #  define noadextra3(a)  vlink((a)+7) /* see (!) below */
-#  define noadextra4(a)  vinfo((a)+7)
+#  define noadextra4(a)  vinfo((a)+7) /* used to store samesize */
 
 /* accent noads */
 
@@ -506,28 +497,31 @@
 
 /* left and right noads */
 
-#  define fence_noad_size     8            /* needs to match noad size */
-#  define delimiteritalic(a)  vlink((a)+4)
-/* define delimiterwidth(a)   vinfo((a)+4) */
-#  define delimiterheight(a)  vlink((a)+5)
-#  define delimiterdepth(a)   vinfo((a)+5)
-#  define delimiter(a)        vlink((a)+6) /* |delimiter| field in left and right noads */
-#  define delimiteroptions(a) vinfo((a)+6)
-#  define delimiterclass(a)   vlink((a)+7) /* (!) we could probably pack some more in 6 */
-#  define delimiterextra1(a)  vinfo((a)+7) /* not used */
+#  define fence_noad_size      8            /* needs to match noad size */
+#  define delimiteritalic(a)   vlink((a)+4)
+/* define delimiterwidth(a)    vinfo((a)+4) */
+#  define delimiterheight(a)   vlink((a)+5)
+#  define delimiterdepth(a)    vinfo((a)+5)
+#  define delimiter(a)         vlink((a)+6) /* |delimiter| field in left and right noads */
+#  define delimiteroptions(a)  vinfo((a)+6)
+#  define delimiterclass(a)    vlink((a)+7) /* (!) we could probably pack some more in 6 */
+#  define delimitersamesize(a) vinfo((a)+7) /* set by engine */
 
 /* when dimensions then axis else noaxis */
 
 typedef enum {
-    noad_option_set      =        0x08,
-    noad_option_unused_1 = 0x00 + 0x08,
-    noad_option_unused_2 = 0x01 + 0x08,
-    noad_option_axis     = 0x02 + 0x08,
-    noad_option_no_axis  = 0x04 + 0x08,
-    noad_option_exact    = 0x10 + 0x08,
-    noad_option_left     = 0x11 + 0x08,
-    noad_option_middle   = 0x12 + 0x08,
-    noad_option_right    = 0x14 + 0x08,
+    noad_option_set             =        0x08,
+    noad_option_unused_1        = 0x00 + 0x08,
+    noad_option_unused_2        = 0x01 + 0x08,
+    noad_option_axis            = 0x02 + 0x08,
+    noad_option_no_axis         = 0x04 + 0x08,
+    noad_option_exact           = 0x10 + 0x08,
+    noad_option_left            = 0x11 + 0x08,
+    noad_option_middle          = 0x12 + 0x08,
+    noad_option_right           = 0x14 + 0x08,
+    noad_option_no_sub_script   = 0x21 + 0x08,
+    noad_option_no_super_script = 0x22 + 0x08,
+    noad_option_no_script       = 0x23 + 0x08,
 } delimiter_options ;
 
 #  define delimiteroptionset(a) ((delimiteroptions(a) & noad_option_set    ) == noad_option_set    )
@@ -535,6 +529,23 @@
 #  define delimiternoaxis(a)    ((delimiteroptions(a) & noad_option_no_axis) == noad_option_no_axis)
 #  define delimiterexact(a)     ((delimiteroptions(a) & noad_option_exact  ) == noad_option_exact  )
 
+#  define noadoptionnosubscript(a) ( (type(a) == simple_noad) && ( \
+                                     ((delimiteroptions(a) & noad_option_no_sub_script  ) == noad_option_no_sub_script) || \
+                                     ((delimiteroptions(a) & noad_option_no_script      ) == noad_option_no_script    ) ))
+#  define noadoptionnosupscript(a) ( (type(a) == simple_noad) && ( \
+                                     ((delimiteroptions(a) & noad_option_no_super_script) == noad_option_no_super_script) || \
+                                     ((delimiteroptions(a) & noad_option_no_script      ) == noad_option_no_script      ) ))
+
+typedef enum {
+    noad_delimiter_mode_noshift = 0x01,
+    noad_delimiter_mode_italics = 0x02,
+    noad_delimiter_mode_ordinal = 0x04,
+} delimiter_modes ;
+
+#  define delimitermodenoshift ((math_delimiters_mode_par & noad_delimiter_mode_noshift) == noad_delimiter_mode_noshift)
+#  define delimitermodeitalics ((math_delimiters_mode_par & noad_delimiter_mode_italics) == noad_delimiter_mode_italics)
+#  define delimitermodeordinal ((math_delimiters_mode_par & noad_delimiter_mode_ordinal) == noad_delimiter_mode_ordinal)
+
 /* subtype of fence noads */
 
 #  define left_noad_side   1
@@ -928,7 +939,7 @@
 extern halfword copy_node_list(halfword);
 extern halfword copy_node(const halfword);
 extern void check_node(halfword);
-extern void fix_node_list(halfword);
+extern halfword fix_node_list(halfword);
 extern int fix_node_lists;
 extern char *sprint_node_mem_usage(void);
 extern halfword raw_glyph_node(void);
@@ -1013,5 +1024,16 @@
 
 extern halfword make_local_par_node(int mode);
 
+extern void synctex_set_mode(int mode);
+extern int synctex_get_mode(void);
+extern void synctex_set_tag(int tag);
+extern void synctex_set_line(int line);
+extern void synctex_force_tag(int tag);
+extern void synctex_force_line(int tag);
+extern int synctex_get_tag(void);
+extern void synctex_set_no_files(int flag);
+extern int synctex_get_no_files(void);
+extern int synctex_get_line(void);
+
 #endif
 

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/texnodes.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/texnodes.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/texnodes.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -656,11 +656,14 @@
 
 #define check_action_ref(a)    { dorangetest(p,a,var_mem_max); }
 #define check_attribute_ref(a) { dorangetest(p,a,var_mem_max); }
-#define check_token_ref(a) { \
+
+/* hm, we can just pass p then */
+
+#define check_token_ref(p) { \
     if (type(p) == whatsit_node) { \
-        formatted_error("nodes","fuzzy token cleanup in whatsit node with id %i and subtype %i",type(p),subtype(p)); \
+        formatted_error("nodes","fuzzy token cleanup in whatsit node with type %s and subtype %i",node_data[type(p)].name,subtype(p)); \
     } else { \
-        formatted_error("nodes","fuzzy token cleanup in node with id %i",type(p)); \
+        formatted_error("nodes","fuzzy token cleanup in node with type %s",node_data[type(p)].name); \
     } \
 }
 
@@ -828,6 +831,67 @@
 }
 
 @ @c
+static halfword synctex_anyway_mode = 0; /* 2 also glyphs */
+static halfword synctex_line_field  = 0;
+static halfword synctex_no_files    = 0;
+
+void synctex_set_mode(int m)
+{
+    synctex_anyway_mode = m;
+};
+
+int synctex_get_mode(void)
+{
+    return synctex_anyway_mode;
+};
+
+void synctex_set_no_files(int f)
+{
+    synctex_no_files = f;
+};
+
+int synctex_get_no_files(void)
+{
+    return (int) synctex_no_files ;
+};
+
+void synctex_set_tag(int t)
+{
+    cur_input.synctex_tag_field = t;
+};
+
+int synctex_get_tag(void)
+{
+    return (int) cur_input.synctex_tag_field;
+};
+
+
+int synctex_get_line(void)
+{
+    return (int) synctex_line_field;
+};
+
+static int forced_tag  = 0;
+static int forced_line = 0;
+
+void synctex_force_tag(int t)
+{
+    forced_tag = t;
+};
+
+void synctex_force_line(int t)
+{
+    forced_line = t;
+};
+
+void synctex_set_line(int l)
+{
+    synctex_line_field = l;
+};
+
+@ @c
+/* if_stack is called a lot so maybe optimize */
+
 halfword new_node(int i, int j)
 {
     int s = get_node_size(i, j);
@@ -892,14 +956,55 @@
         default:
             break;
     }
-    if (synctex_par) {
-        /* handle synctex extension */
+    if (synctex_anyway_mode) {
         switch (i) {
-            case math_node:
-                synctex_tag_math(n) = cur_input.synctex_tag_field;
-                synctex_line_math(n) = line;
+            /* 1 = all but glyphs  */
+            /* 2 = also glyphs     */
+            /* 3 = glyphs and glue */
+            /* 4 = only glyphs     */
+            case glyph_node:
+                if (synctex_anyway_mode > 1) {
+                    synctex_tag_glyph(n) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+                    synctex_line_glyph(n) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+                }
                 break;
             case glue_node:
+                if (synctex_anyway_mode < 4) {
+                    synctex_tag_glue(n) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+                    synctex_line_glue(n) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+                }
+                break;
+            case kern_node:
+                if (synctex_anyway_mode < 3) {
+                    synctex_tag_kern(n) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+                    synctex_line_kern(n) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+                }
+                break;
+            case hlist_node:
+            case vlist_node:
+            case unset_node: /* useless */
+                if (synctex_anyway_mode < 3) {
+                    synctex_tag_box(n) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+                    synctex_line_box(n) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+                }
+                break;
+            case rule_node:
+                if (synctex_anyway_mode < 3) {
+                    synctex_tag_rule(n) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+                    synctex_line_rule(n) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+                }
+                break;
+            case math_node: /* noads probably make more sense */
+                if (synctex_anyway_mode < 3) {
+                    synctex_tag_math(n) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+                    synctex_line_math(n) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+                }
+                break;
+        }
+    } else if (synctex_par) {
+        /* handle synctex extension */
+        switch (i) {
+            case glue_node:
                 synctex_tag_glue(n) = cur_input.synctex_tag_field;
                 synctex_line_glue(n) = line;
                 break;
@@ -919,6 +1024,10 @@
                 synctex_tag_rule(n) = cur_input.synctex_tag_field;
                 synctex_line_rule(n) = line;
                 break;
+            case math_node:
+                synctex_tag_math(n) = cur_input.synctex_tag_field;
+                synctex_line_math(n) = line;
+                break;
         }
     }
     /* take care of attributes */
@@ -935,6 +1044,10 @@
 {
     register halfword n = get_node(glyph_node_size);
     (void) memset((void *) (varmem + n + 1), 0, (sizeof(memory_word) * (glyph_node_size - 1)));
+    if (synctex_anyway_mode > 1) {
+        synctex_tag_glyph(n) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+        synctex_line_glyph(n) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+    }
     type(n) = glyph_node;
     subtype(n) = 0;
     return n;
@@ -944,6 +1057,10 @@
 {
     register halfword n = get_node(glyph_node_size);
     (void) memset((void *) (varmem + n + 1), 0, (sizeof(memory_word) * (glyph_node_size - 1)));
+    if (synctex_anyway_mode > 1) {
+        synctex_tag_glyph(n) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+        synctex_line_glyph(n) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+    }
     type(n) = glyph_node;
     subtype(n) = 0;
     build_attribute_list(n);
@@ -1102,7 +1219,16 @@
         }
     */
 
-    if (synctex_par) {
+    if (synctex_anyway_mode) {
+        /*
+        if (t == glyph_node) {
+            if (synctex_anyway_mode > 1) {
+                synctex_tag_glyph(r) = forced_tag ? forced_tag : cur_input.synctex_tag_field;
+                synctex_line_glyph(r) = forced_line ? forced_line : synctex_line_field ? synctex_line_field : line;
+            }
+        }
+        */
+    } else if (synctex_par) {
         /* handle synctex extension */
         switch (t) {
             case math_node:
@@ -1520,7 +1646,7 @@
     switch (subtype(p)) {
         /* frontend code */
         case special_node:
-            check_token_ref(write_tokens(p));
+            check_token_ref(p);
             break;
         case user_defined_node:
             switch (user_node_type(p)) {
@@ -1528,7 +1654,7 @@
                     check_attribute_ref(user_node_value(p));
                     break;
                 case 't':
-                    check_token_ref(user_node_value(p));
+                    check_token_ref(p);
                     break;
                 case 'n':
                     dorangetest(p, user_node_value(p), var_mem_max);
@@ -1558,39 +1684,39 @@
     switch (subtype(p)) {
         case pdf_literal_node:
             if (pdf_literal_type(p) == normal)
-                check_token_ref(pdf_literal_data(p));
+                check_token_ref(p);
             break;
         case pdf_colorstack_node:
             if (pdf_colorstack_cmd(p) <= colorstack_data)
-                check_token_ref(pdf_colorstack_data(p));
+                check_token_ref(p);
             break;
         case pdf_setmatrix_node:
-            check_token_ref(pdf_setmatrix_data(p));
+            check_token_ref(p);
             break;
         case late_lua_node:
             if (late_lua_name(p) > 0)
-                check_token_ref(late_lua_name(p));
+                check_token_ref(p);
             if (late_lua_type(p) == normal)
-                check_token_ref(late_lua_data(p));
+                check_token_ref(p);
             break;
         case pdf_annot_node:
-            check_token_ref(pdf_annot_data(p));
+            check_token_ref(p);
             break;
         case pdf_start_link_node:
             if (pdf_link_attr(p) != null)
-                check_token_ref(pdf_link_attr(p));
+                check_token_ref(p);
             check_action_ref(pdf_link_action(p));
             break;
         case pdf_dest_node:
             if (pdf_dest_named_id(p) > 0)
-                check_token_ref(pdf_dest_id(p));
+                check_token_ref(p);
             break;
         case pdf_thread_node:
         case pdf_start_thread_node:
             if (pdf_thread_named_id(p) > 0)
-                check_token_ref(pdf_thread_id(p));
+                check_token_ref(p);
             if (pdf_thread_attr(p) != null)
-                check_token_ref(pdf_thread_attr(p));
+                check_token_ref(p);
             break;
         case pdf_save_node:
         case pdf_restore_node:
@@ -1718,18 +1844,19 @@
 }
 
 @ @c
-void fix_node_list(halfword head)
+halfword fix_node_list(halfword head)
 {
-    halfword p, q;
+    halfword next, tail;
     if (head == null)
-        return;
-    p = head;
-    q = vlink(p);
-    while (q != null) {
-        alink(q) = p;
-        p = q;
-        q = vlink(p);
+        return null;
+    tail = head;
+    next = vlink(head);
+    while (next != null) {
+        alink(next) = tail;
+        tail = next;
+        next = vlink(tail);
     }
+    return tail;
 }
 
 @ @c

Modified: trunk/Build/source/texk/web2c/luatexdir/tex/textoken.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/tex/textoken.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/tex/textoken.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -2311,6 +2311,7 @@
     else if (scan_keyword("imageresolution"))      { do_variable_backend_int(c_pdf_image_resolution); }
     else if (scan_keyword("pkresolution"))         { do_variable_backend_int(c_pdf_pk_resolution); }
     else if (scan_keyword("uniqueresname"))        { do_variable_backend_int(c_pdf_unique_resname); }
+    else if (scan_keyword("majorversion"))         { do_variable_backend_int(c_pdf_major_version); }
     else if (scan_keyword("minorversion"))         { do_variable_backend_int(c_pdf_minor_version); }
     else if (scan_keyword("pagebox"))              { do_variable_backend_int(c_pdf_pagebox); }
     else if (scan_keyword("inclusionerrorlevel"))  { do_variable_backend_int(c_pdf_inclusion_errorlevel); }
@@ -2775,11 +2776,6 @@
             print(get_luatexrevision());
             pop_selector;
             break;
-        case luatex_date_code:
-            push_selector;
-            print_int(get_luatex_date_info());
-            pop_selector;
-            break;
         case etex_code:
             push_selector;
             tprint(eTeX_version_string);
@@ -3008,9 +3004,6 @@
         case luatex_revision_code:
             print(get_luatexrevision());
             break;
-        case luatex_date_code:
-            print_int(get_luatex_date_info());
-            break;
         case etex_code:
             tprint(eTeX_version_string);
             break;

Modified: trunk/Build/source/texk/web2c/luatexdir/utils/utils.w
===================================================================
--- trunk/Build/source/texk/web2c/luatexdir/utils/utils.w	2018-01-09 22:36:23 UTC (rev 46268)
+++ trunk/Build/source/texk/web2c/luatexdir/utils/utils.w	2018-01-09 23:43:20 UTC (rev 46269)
@@ -36,6 +36,7 @@
 #include "md5.h"
 
 #include "lua/luatex-api.h"     /* for luatex_banner */
+#include "luatex_svnversion.h"
 
 #include "png.h"
 #include "mplib.h"
@@ -250,16 +251,27 @@
 @ @c
 void initversionstring(char **versions)
 {
+#ifdef LuajitTeX
+#define LUA_VER_STRING  LUAJIT_VERSION
+#else
+#define LUA_VER_STRING  "lua version " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "." LUA_VERSION_RELEASE
+#endif
+#define STR(tok) STR2(tok)
+#define STR2(tok) #tok
     const_string fmt =
                     "Compiled with libpng %s; using %s\n"
+                    "Compiled with %s\n" /* Lua or LuaJIT */
+                    "Compiled with mplib version %s\n"
+                    "Compiled with poppler version %s\n"
                     "Compiled with zlib %s; using %s\n"
-                    "Compiled with poppler version %s\n"
-                    "Compiled with mplib version %s\n";
+                    "\nDevelopment id: %s\n";
     size_t len = strlen(fmt)
                     + strlen(PNG_LIBPNG_VER_STRING) + strlen(png_libpng_ver)
+                    + strlen(LUA_VER_STRING) 
+                    + strlen(mp_metapost_version())
+                    + strlen(POPPLER_VERSION)
                     + strlen(ZLIB_VERSION) + strlen(zlib_version)
-                    + strlen(POPPLER_VERSION)
-                    + strlen(mp_metapost_version())
+                    + strlen(STR(luatex_svn_revision))
                     + 1;
 
     /* len will be more than enough, because of the placeholder chars in fmt
@@ -266,8 +278,12 @@
        that get replaced by the arguments.  */
     *versions = xmalloc(len);
     sprintf(*versions, fmt,
-                    PNG_LIBPNG_VER_STRING, png_libpng_ver,
-                    ZLIB_VERSION, zlib_version, POPPLER_VERSION, mp_metapost_version());
+                    PNG_LIBPNG_VER_STRING, png_libpng_ver, LUA_VER_STRING,
+                    mp_metapost_version(),POPPLER_VERSION,
+                    ZLIB_VERSION, zlib_version,STR(luatex_svn_revision));
+#undef STR2
+#undef STR
+#undef LUA_VER_STRING
 }
 
 @ @c
@@ -358,9 +374,9 @@
 }
 
 
-@ MSVC doesn't have |rint|.
+@ Old MSVC doesn't have |rint|.
 @c
-#ifdef _MSC_VER
+#if defined(_MSC_VER) && _MSC_VER <= 1600
 
 #  include <math.h>
 double rint(double x)



More information about the tex-live-commits mailing list