aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2015-03-11 16:53:07 -0400
committermitchell <70453897+667e-11@users.noreply.github.com>2015-03-11 16:53:07 -0400
commit85450b9983ec16b27981572c258298e6fbf2f59d (patch)
tree3a9557314cad78bde44d9d2030110339b73669f4 /src
parent920c230f140c38ec072da27e522053aed2a9af75 (diff)
downloadtextadept-85450b9983ec16b27981572c258298e6fbf2f59d.tar.gz
textadept-85450b9983ec16b27981572c258298e6fbf2f59d.zip
Updated to Lua 5.3, LPeg 0.12.2, and lfs 1.6.3.
LuaJIT uses Lua 5.3's new utf8 library. Restored documentation for Lua 5.1 symbols and added deprecation notes.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile21
-rw-r--r--src/lua.patch554
-rw-r--r--src/lua.sym164
-rw-r--r--src/lutf8libjit.patch14
-rw-r--r--src/textadept.c62
5 files changed, 174 insertions, 641 deletions
diff --git a/src/Makefile b/src/Makefile
index 2438789e..651fa9a5 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -98,8 +98,9 @@ endif
# Scintilla.
-sci_flags = -pedantic $(plat_flag) -DSCI_LEXER -DNDEBUG -DG_THREADS_IMPL_NONE \
- -Iscintilla/include -Iscintilla/src -Iscintilla/lexlib -Wall
+sci_flags = -std=c++0x -pedantic $(plat_flag) -DSCI_LEXER -DNDEBUG \
+ -DG_THREADS_IMPL_NONE -Iscintilla/include -Iscintilla/src \
+ -Iscintilla/lexlib -Wall
sci_objs = AutoComplete.o CallTip.o CaseConvert.o CaseFolder.o Catalogue.o \
CellBuffer.o CharClassify.o ContractionState.o Decoration.o \
@@ -125,10 +126,10 @@ lua_objs = lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o \
linit.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o \
lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o \
lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \
- lmathlib.o loadlib.o loslib.o ltablib.o lstrlib.o
+ lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o
lua_lib_objs = lpcap.o lpcode.o lpprint.o lptree.o lpvm.o lfs.o
luajit_lib_objs = lpcapjit.o lpcodejit.o lpprintjit.o lptreejit.o lpvmjit.o \
- lfsjit.o
+ lfsjit.o lutf8libjit.o
lua_spawn_objs = lspawn.o lspawnjit.o lspawn-curses.o lspawnjit-curses.o
gtdialog_objs = gtdialog.o gtdialog-curses.o
termkey_unix_objs = driver-ti.o driver-csi.o
@@ -211,6 +212,9 @@ $(gtdialog_objs): gtdialog_flags = $(plat_flag) -DNOHELP -DLIBRARY
gtdialog.o: gtdialog_flags += $(GTK_CFLAGS)
gtdialog-curses.o: gtdialog_flags += -Icdk $(CURSES_CFLAGS)
$(termkey_win32_objs): termkey_flags += $(CURSES_CFLAGS)
+# Lua 5.3 compatibility with LuaJIT.
+lbitlib.o linit.o: LUA_CFLAGS += -DLUA_COMPAT_BITLIB -DLUA_COMPAT_APIINTCASTS
+lutf8libjit.o: LUA_CFLAGS += -Ilua/src
# Executables.
@@ -378,9 +382,9 @@ endif
scintilla_tgz = scintilla354.tgz
scinterm_zip = 068d4a448eb3.zip
scintillua_zip = scintillua_3.5.4-1.zip
-lua_tgz = lua-5.2.3.tar.gz
-lpeg_tgz = lpeg-0.12.tar.gz
-lfs_zip = v1_6_2.zip
+lua_tgz = lua-5.3.0.tar.gz
+lpeg_tgz = lpeg-0.12.2.tar.gz
+lfs_zip = v1_6_3.zip
lspawn_zip = lspawn_1.1.zip
luajit_tgz = LuaJIT-2.0.3.tar.gz
libluajit_tgz = libluajit_2.0.3.x86_64.tgz
@@ -421,6 +425,9 @@ lua/src/lib/lfs: | $(lfs_zip)
mkdir -p $@ && unzip -d $@ $| && mv $@/*/src/*.c $@/*/src/*.h $(dir $@)
lua/src/lib/lspawn: | $(lspawn_zip)
mkdir -p $@ && unzip -d $@ $| && mv $@/*/*.c $(dir $@)
+lua/src/lib/lutf8lib.c: lutf8libjit.patch
+ cp lua/src/$(notdir $@) $@
+ patch -d $(dir $@) -N -p1 < $<
$(luajit_tgz): ; wget http://luajit.org/download/$@
luajit: luajit.patch | $(luajit_tgz)
mkdir $@ && tar xzf $| -C $@ && mv $@/*/* $@
diff --git a/src/lua.patch b/src/lua.patch
index f9744e15..d49288b0 100644
--- a/src/lua.patch
+++ b/src/lua.patch
@@ -1,548 +1,50 @@
-diff -r 56f218b3289e src/loadlib.c
---- a/src/loadlib.c Sun Dec 15 21:08:47 2013 -0500
-+++ b/src/loadlib.c Sun Dec 15 21:11:23 2013 -0500
-@@ -35,11 +35,11 @@
+diff -r 8a23edc91533 src/loadlib.c
+--- a/src/loadlib.c Mon Jan 12 18:57:53 2015 -0500
++++ b/src/loadlib.c Mon Jan 12 23:50:08 2015 -0500
+@@ -28,11 +28,11 @@
** variables that Lua check to set its paths.
*/
- #if !defined(LUA_PATH)
--#define LUA_PATH "LUA_PATH"
-+#define LUA_PATH "TA_LUA_PATH"
+ #if !defined(LUA_PATH_VAR)
+-#define LUA_PATH_VAR "LUA_PATH"
++#define LUA_PATH_VAR "TA_LUA_PATH"
#endif
- #if !defined(LUA_CPATH)
--#define LUA_CPATH "LUA_CPATH"
-+#define LUA_CPATH "TA_LUA_CPATH"
+ #if !defined(LUA_CPATH_VAR)
+-#define LUA_CPATH_VAR "LUA_CPATH"
++#define LUA_CPATH_VAR "TA_LUA_CPATH"
#endif
#define LUA_PATHSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
-diff -r 56f218b3289e src/lua.c
---- a/src/lua.c Sun Dec 15 21:08:47 2013 -0500
-+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
-@@ -1,497 +0,0 @@
--/*
--** $Id: lua.c,v 1.206.1.1 2013/04/12 18:48:47 roberto Exp $
--** Lua stand-alone interpreter
--** See Copyright Notice in lua.h
--*/
--
--
--#include <signal.h>
--#include <stdio.h>
--#include <stdlib.h>
--#include <string.h>
--
--#define lua_c
--
--#include "lua.h"
--
--#include "lauxlib.h"
--#include "lualib.h"
--
--
--#if !defined(LUA_PROMPT)
--#define LUA_PROMPT "> "
--#define LUA_PROMPT2 ">> "
--#endif
--
--#if !defined(LUA_PROGNAME)
--#define LUA_PROGNAME "lua"
--#endif
--
--#if !defined(LUA_MAXINPUT)
--#define LUA_MAXINPUT 512
--#endif
--
--#if !defined(LUA_INIT)
--#define LUA_INIT "LUA_INIT"
--#endif
--
--#define LUA_INITVERSION \
-- LUA_INIT "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
--
--
--/*
--** lua_stdin_is_tty detects whether the standard input is a 'tty' (that
--** is, whether we're running lua interactively).
--*/
--#if defined(LUA_USE_ISATTY)
--#include <unistd.h>
--#define lua_stdin_is_tty() isatty(0)
--#elif defined(LUA_WIN)
--#include <io.h>
--#include <stdio.h>
--#define lua_stdin_is_tty() _isatty(_fileno(stdin))
--#else
--#define lua_stdin_is_tty() 1 /* assume stdin is a tty */
--#endif
--
--
--/*
--** lua_readline defines how to show a prompt and then read a line from
--** the standard input.
--** lua_saveline defines how to "save" a read line in a "history".
--** lua_freeline defines how to free a line read by lua_readline.
--*/
--#if defined(LUA_USE_READLINE)
--
--#include <stdio.h>
--#include <readline/readline.h>
--#include <readline/history.h>
--#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL)
--#define lua_saveline(L,idx) \
-- if (lua_rawlen(L,idx) > 0) /* non-empty line? */ \
-- add_history(lua_tostring(L, idx)); /* add it to history */
--#define lua_freeline(L,b) ((void)L, free(b))
--
--#elif !defined(lua_readline)
--
--#define lua_readline(L,b,p) \
-- ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \
-- fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */
--#define lua_saveline(L,idx) { (void)L; (void)idx; }
--#define lua_freeline(L,b) { (void)L; (void)b; }
--
--#endif
--
--
--
--
--static lua_State *globalL = NULL;
--
--static const char *progname = LUA_PROGNAME;
--
--
--
--static void lstop (lua_State *L, lua_Debug *ar) {
-- (void)ar; /* unused arg. */
-- lua_sethook(L, NULL, 0, 0);
-- luaL_error(L, "interrupted!");
--}
--
--
--static void laction (int i) {
-- signal(i, SIG_DFL); /* if another SIGINT happens before lstop,
-- terminate process (default action) */
-- lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);
--}
--
--
--static void print_usage (const char *badoption) {
-- luai_writestringerror("%s: ", progname);
-- if (badoption[1] == 'e' || badoption[1] == 'l')
-- luai_writestringerror("'%s' needs argument\n", badoption);
-- else
-- luai_writestringerror("unrecognized option '%s'\n", badoption);
-- luai_writestringerror(
-- "usage: %s [options] [script [args]]\n"
-- "Available options are:\n"
-- " -e stat execute string " LUA_QL("stat") "\n"
-- " -i enter interactive mode after executing " LUA_QL("script") "\n"
-- " -l name require library " LUA_QL("name") "\n"
-- " -v show version information\n"
-- " -E ignore environment variables\n"
-- " -- stop handling options\n"
-- " - stop handling options and execute stdin\n"
-- ,
-- progname);
--}
--
--
--static void l_message (const char *pname, const char *msg) {
-- if (pname) luai_writestringerror("%s: ", pname);
-- luai_writestringerror("%s\n", msg);
--}
--
--
--static int report (lua_State *L, int status) {
-- if (status != LUA_OK && !lua_isnil(L, -1)) {
-- const char *msg = lua_tostring(L, -1);
-- if (msg == NULL) msg = "(error object is not a string)";
-- l_message(progname, msg);
-- lua_pop(L, 1);
-- /* force a complete garbage collection in case of errors */
-- lua_gc(L, LUA_GCCOLLECT, 0);
-- }
-- return status;
--}
--
--
--/* the next function is called unprotected, so it must avoid errors */
--static void finalreport (lua_State *L, int status) {
-- if (status != LUA_OK) {
-- const char *msg = (lua_type(L, -1) == LUA_TSTRING) ? lua_tostring(L, -1)
-- : NULL;
-- if (msg == NULL) msg = "(error object is not a string)";
-- l_message(progname, msg);
-- lua_pop(L, 1);
-- }
--}
--
--
--static int traceback (lua_State *L) {
-- const char *msg = lua_tostring(L, 1);
-- if (msg)
-- luaL_traceback(L, L, msg, 1);
-- else if (!lua_isnoneornil(L, 1)) { /* is there an error object? */
-- if (!luaL_callmeta(L, 1, "__tostring")) /* try its 'tostring' metamethod */
-- lua_pushliteral(L, "(no error message)");
-- }
-- return 1;
--}
--
--
--static int docall (lua_State *L, int narg, int nres) {
-- int status;
-- int base = lua_gettop(L) - narg; /* function index */
-- lua_pushcfunction(L, traceback); /* push traceback function */
-- lua_insert(L, base); /* put it under chunk and args */
-- globalL = L; /* to be available to 'laction' */
-- signal(SIGINT, laction);
-- status = lua_pcall(L, narg, nres, base);
-- signal(SIGINT, SIG_DFL);
-- lua_remove(L, base); /* remove traceback function */
-- return status;
--}
--
--
--static void print_version (void) {
-- luai_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT));
-- luai_writeline();
--}
--
--
--static int getargs (lua_State *L, char **argv, int n) {
-- 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);
-- for (i=0; i < argc; i++) {
-- lua_pushstring(L, argv[i]);
-- lua_rawseti(L, -2, i - n);
-- }
-- return narg;
--}
--
--
--static int dofile (lua_State *L, const char *name) {
-- int status = luaL_loadfile(L, name);
-- if (status == LUA_OK) status = docall(L, 0, 0);
-- return report(L, status);
--}
--
--
--static int dostring (lua_State *L, const char *s, const char *name) {
-- int status = luaL_loadbuffer(L, s, strlen(s), name);
-- if (status == LUA_OK) status = docall(L, 0, 0);
-- return report(L, status);
--}
--
--
--static int dolibrary (lua_State *L, const char *name) {
-- int status;
-- lua_getglobal(L, "require");
-- lua_pushstring(L, name);
-- status = docall(L, 1, 1); /* call 'require(name)' */
-- if (status == LUA_OK)
-- lua_setglobal(L, name); /* global[name] = require return */
-- return report(L, status);
--}
--
--
--static const char *get_prompt (lua_State *L, int firstline) {
-- const char *p;
-- lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2");
-- p = lua_tostring(L, -1);
-- if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);
-- return p;
--}
--
--/* mark in error messages for incomplete statements */
--#define EOFMARK "<eof>"
--#define marklen (sizeof(EOFMARK)/sizeof(char) - 1)
--
--static int incomplete (lua_State *L, int status) {
-- if (status == LUA_ERRSYNTAX) {
-- size_t lmsg;
-- const char *msg = lua_tolstring(L, -1, &lmsg);
-- if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) {
-- lua_pop(L, 1);
-- return 1;
-- }
-- }
-- return 0; /* else... */
--}
--
--
--static int pushline (lua_State *L, int firstline) {
-- char buffer[LUA_MAXINPUT];
-- char *b = buffer;
-- size_t l;
-- const char *prmt = get_prompt(L, firstline);
-- int readstatus = lua_readline(L, b, prmt);
-- lua_pop(L, 1); /* remove result from 'get_prompt' */
-- if (readstatus == 0)
-- return 0; /* no input */
-- l = strlen(b);
-- if (l > 0 && b[l-1] == '\n') /* line ends with newline? */
-- b[l-1] = '\0'; /* remove it */
-- if (firstline && b[0] == '=') /* first line starts with `=' ? */
-- lua_pushfstring(L, "return %s", b+1); /* change it to `return' */
-- else
-- lua_pushstring(L, b);
-- lua_freeline(L, b);
-- return 1;
--}
--
--
--static int loadline (lua_State *L) {
-- int status;
-- lua_settop(L, 0);
-- if (!pushline(L, 1))
-- return -1; /* no input */
-- for (;;) { /* repeat until gets a complete line */
-- size_t l;
-- const char *line = lua_tolstring(L, 1, &l);
-- status = luaL_loadbuffer(L, line, l, "=stdin");
-- if (!incomplete(L, status)) break; /* cannot try to add lines? */
-- if (!pushline(L, 0)) /* no more input? */
-- return -1;
-- lua_pushliteral(L, "\n"); /* add a new line... */
-- lua_insert(L, -2); /* ...between the two lines */
-- lua_concat(L, 3); /* join them */
-- }
-- lua_saveline(L, 1);
-- lua_remove(L, 1); /* remove line */
-- return status;
--}
--
--
--static void dotty (lua_State *L) {
-- int status;
-- const char *oldprogname = progname;
-- progname = NULL;
-- while ((status = loadline(L)) != -1) {
-- if (status == LUA_OK) status = docall(L, 0, LUA_MULTRET);
-- report(L, status);
-- if (status == LUA_OK && lua_gettop(L) > 0) { /* any result to print? */
-- luaL_checkstack(L, LUA_MINSTACK, "too many results to print");
-- lua_getglobal(L, "print");
-- lua_insert(L, 1);
-- if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != LUA_OK)
-- l_message(progname, lua_pushfstring(L,
-- "error calling " LUA_QL("print") " (%s)",
-- lua_tostring(L, -1)));
-- }
-- }
-- lua_settop(L, 0); /* clear stack */
-- luai_writeline();
-- progname = oldprogname;
--}
--
--
--static int handle_script (lua_State *L, char **argv, int n) {
-- 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)
-- fname = NULL; /* stdin */
-- status = luaL_loadfile(L, fname);
-- lua_insert(L, -(narg+1));
-- if (status == LUA_OK)
-- status = docall(L, narg, LUA_MULTRET);
-- else
-- lua_pop(L, narg);
-- return report(L, status);
--}
--
--
--/* check that argument has no extra characters at the end */
--#define noextrachars(x) {if ((x)[2] != '\0') return -1;}
--
--
--/* indices of various argument indicators in array args */
--#define has_i 0 /* -i */
--#define has_v 1 /* -v */
--#define has_e 2 /* -e */
--#define has_E 3 /* -E */
--
--#define num_has 4 /* number of 'has_*' */
--
--
--static int collectargs (char **argv, int *args) {
-- int i;
-- for (i = 1; argv[i] != NULL; i++) {
-- if (argv[i][0] != '-') /* not an option? */
-- return i;
-- switch (argv[i][1]) { /* option */
-- case '-':
-- noextrachars(argv[i]);
-- return (argv[i+1] != NULL ? i+1 : 0);
-- case '\0':
-- return i;
-- case 'E':
-- args[has_E] = 1;
-- break;
-- case 'i':
-- noextrachars(argv[i]);
-- args[has_i] = 1; /* go through */
-- case 'v':
-- noextrachars(argv[i]);
-- args[has_v] = 1;
-- break;
-- case 'e':
-- args[has_e] = 1; /* go through */
-- case 'l': /* both options need an argument */
-- if (argv[i][2] == '\0') { /* no concatenated argument? */
-- i++; /* try next 'argv' */
-- if (argv[i] == NULL || argv[i][0] == '-')
-- return -(i - 1); /* no next argument or it is another option */
-- }
-- break;
-- default: /* invalid option; return its index... */
-- return -i; /* ...as a negative value */
-- }
-- }
-- return 0;
--}
--
--
--static int runargs (lua_State *L, char **argv, int n) {
-- int i;
-- for (i = 1; i < n; i++) {
-- lua_assert(argv[i][0] == '-');
-- switch (argv[i][1]) { /* option */
-- case 'e': {
-- const char *chunk = argv[i] + 2;
-- if (*chunk == '\0') chunk = argv[++i];
-- lua_assert(chunk != NULL);
-- if (dostring(L, chunk, "=(command line)") != LUA_OK)
-- return 0;
-- break;
-- }
-- case 'l': {
-- const char *filename = argv[i] + 2;
-- if (*filename == '\0') filename = argv[++i];
-- lua_assert(filename != NULL);
-- if (dolibrary(L, filename) != LUA_OK)
-- return 0; /* stop if file fails */
-- break;
-- }
-- default: break;
-- }
-- }
-- return 1;
--}
--
--
--static int handle_luainit (lua_State *L) {
-- const char *name = "=" LUA_INITVERSION;
-- const char *init = getenv(name + 1);
-- if (init == NULL) {
-- name = "=" LUA_INIT;
-- init = getenv(name + 1); /* try alternative name */
-- }
-- if (init == NULL) return LUA_OK;
-- else if (init[0] == '@')
-- return dofile(L, init+1);
-- else
-- return dostring(L, init, name);
--}
--
--
--static int pmain (lua_State *L) {
-- int argc = (int)lua_tointeger(L, 1);
-- char **argv = (char **)lua_touserdata(L, 2);
-- int script;
-- int args[num_has];
-- args[has_i] = args[has_v] = args[has_e] = args[has_E] = 0;
-- if (argv[0] && argv[0][0]) progname = argv[0];
-- script = collectargs(argv, args);
-- if (script < 0) { /* invalid arg? */
-- print_usage(argv[-script]);
-- return 0;
-- }
-- if (args[has_v]) print_version();
-- if (args[has_E]) { /* option '-E'? */
-- lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */
-- lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
-- }
-- /* open standard libraries */
-- luaL_checkversion(L);
-- lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */
-- luaL_openlibs(L); /* open libraries */
-- lua_gc(L, LUA_GCRESTART, 0);
-- if (!args[has_E] && handle_luainit(L) != LUA_OK)
-- return 0; /* error running LUA_INIT */
-- /* execute arguments -e and -l */
-- if (!runargs(L, argv, (script > 0) ? script : argc)) return 0;
-- /* execute main script (if there is one) */
-- if (script && handle_script(L, argv, script) != LUA_OK) return 0;
-- if (args[has_i]) /* -i option? */
-- dotty(L);
-- else if (script == 0 && !args[has_e] && !args[has_v]) { /* no arguments? */
-- if (lua_stdin_is_tty()) {
-- print_version();
-- dotty(L);
-- }
-- else dofile(L, NULL); /* executes stdin as a file */
-- }
-- lua_pushboolean(L, 1); /* signal no errors */
-- return 1;
--}
--
--
--int main (int argc, char **argv) {
-- int status, result;
-- lua_State *L = luaL_newstate(); /* create state */
-- if (L == NULL) {
-- l_message(argv[0], "cannot create state: not enough memory");
-- return EXIT_FAILURE;
-- }
-- /* call 'pmain' in protected mode */
-- lua_pushcfunction(L, &pmain);
-- lua_pushinteger(L, argc); /* 1st argument */
-- lua_pushlightuserdata(L, argv); /* 2nd argument */
-- status = lua_pcall(L, 2, 1, 0);
-- result = lua_toboolean(L, -1); /* get result */
-- finalreport(L, status);
-- lua_close(L);
-- return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
--}
--
-diff -r 56f218b3289e src/luaconf.h
---- a/src/luaconf.h Sun Dec 15 21:08:47 2013 -0500
-+++ b/src/luaconf.h Sun Dec 15 21:11:23 2013 -0500
-@@ -93,21 +93,21 @@
- #define LUA_CDIR "!\\"
+diff -r 8a23edc91533 src/luaconf.h
+--- a/src/luaconf.h Mon Jan 12 18:57:53 2015 -0500
++++ b/src/luaconf.h Mon Jan 12 23:50:08 2015 -0500
+@@ -166,24 +166,22 @@
#define LUA_PATH_DEFAULT \
LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \
-- LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" ".\\?.lua"
-+ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua"
+ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \
+- LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \
+- ".\\?.lua;" ".\\?\\init.lua"
++ LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;"
#define LUA_CPATH_DEFAULT \
-- LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll;" ".\\?.dll"
-+ LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
+ LUA_CDIR"?.dll;" \
+ LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \
+- LUA_CDIR"loadall.dll;" ".\\?.dll"
++ LUA_CDIR"loadall.dll;"
#else /* }{ */
- #define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "/"
-#define LUA_ROOT "/usr/local/"
+#define LUA_ROOT "/usr/"
- #define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR
- #define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR
+ #define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/"
+ #define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/"
#define LUA_PATH_DEFAULT \
LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \
-- LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" "./?.lua"
-+ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua"
+- LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \
+- "./?.lua;" "./?/init.lua"
++ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;"
#define LUA_CPATH_DEFAULT \
- LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so"
-+ LUA_CDIR"?.so;" LUA_CDIR"loadall.so"
++ LUA_CDIR"?.so;" LUA_CDIR"loadall.so;"
#endif /* } */
diff --git a/src/lua.sym b/src/lua.sym
index d2a73e4f..3927da21 100644
--- a/src/lua.sym
+++ b/src/lua.sym
@@ -1,77 +1,24 @@
-# This file has Lua 5.2 symbols and Lua 5.1 symbols (for LuaJIT).
-luaL_addlstring
-luaL_addstring
-luaL_addvalue
-luaL_argerror
-luaL_buffinit
-luaL_buffinitsize
-luaL_callmeta
-luaL_checkany
-luaL_checkinteger
-luaL_checklstring
-luaL_checknumber
-luaL_checkoption
-luaL_checkstack
-luaL_checktype
-luaL_checkudata
-luaL_checkunsigned
-luaL_checkversion
-luaL_error
-luaL_execresult
-luaL_fileresult
-luaL_findtable
-luaL_getmetafield
-luaL_getsubtable
-luaL_gsub
-luaL_len
-luaL_loadbuffer
-luaL_loadfile
-luaL_loadstring
-luaL_newlibtable
-luaL_newmetatable
-luaL_newstate
-luaL_openlibs
-luaL_optinteger
-luaL_optlstring
-luaL_optnumber
-luaL_optunsigned
-luaL_prepbuffer
-luaL_prepbuffsize
-luaL_pushresult
-luaL_pushresultsize
-luaL_ref
-luaL_register
-luaL_typerror
-luaL_requiref
-luaL_setfuncs
-luaL_setmetatable
-luaL_testudata
-luaL_tostring
-luaL_traceback
-luaL_unref
-luaL_where
+# Lua 5.3 symbols to retain. (LUA_API, LUALIB_API, LUAMOD_API)
lua_absindex
lua_arith
lua_atpanic
-lua_call
lua_callk
lua_checkstack
lua_close
+lua_compare
lua_concat
-lua_cpcall
lua_copy
lua_createtable
lua_dump
-lua_equal
lua_error
lua_gc
lua_getallocf
-lua_getctx
-lua_getfenv
lua_getfield
+lua_getglobal
lua_gethook
lua_gethookcount
lua_gethookmask
+lua_geti
lua_getinfo
lua_getlocal
lua_getmetatable
@@ -80,21 +27,18 @@ lua_gettable
lua_gettop
lua_getupvalue
lua_getuservalue
-lua_ident
-lua_insert
lua_iscfunction
+lua_isinteger
lua_isnumber
lua_isstring
lua_isuserdata
+lua_isyieldable
lua_len
-lua_lessthan
lua_load
lua_newstate
lua_newthread
lua_newuserdata
lua_next
-lua_objlen
-lua_pcall
lua_pcallk
lua_pushboolean
lua_pushcclosure
@@ -111,17 +55,18 @@ lua_pushvfstring
lua_rawequal
lua_rawget
lua_rawgeti
+lua_rawgetp
lua_rawlen
lua_rawset
lua_rawseti
-lua_remove
-lua_replace
+lua_rawsetp
lua_resume
+lua_rotate
lua_setallocf
-lua_setfenv
lua_setfield
+lua_setglobal
lua_sethook
-lua_setlevel
+lua_seti
lua_setlocal
lua_setmetatable
lua_settable
@@ -129,28 +74,70 @@ lua_settop
lua_setupvalue
lua_setuservalue
lua_status
+lua_stringtonumber
lua_toboolean
lua_tocfunction
-lua_tointeger
lua_tointegerx
lua_tolstring
-lua_tonumber
lua_tonumberx
lua_topointer
lua_tothread
-lua_tounsigned
-lua_tounsignedx
lua_touserdata
-lua_upvalueid
-lua_upvaluejoin
lua_type
lua_typename
+lua_upvalueid
+lua_upvaluejoin
lua_version
lua_xmove
-lua_yield
lua_yieldk
+luaL_addlstring
+luaL_addstring
+luaL_addvalue
+luaL_argerror
+luaL_buffinit
+luaL_buffinitsize
+luaL_callmeta
+luaL_checkany
+luaL_checkinteger
+luaL_checklstring
+luaL_checknumber
+luaL_checkoption
+luaL_checkstack
+luaL_checktype
+luaL_checkudata
+luaL_checkversion_
+luaL_error
+luaL_execresult
+luaL_fileresult
+luaL_getmetafield
+luaL_getsubtable
+luaL_gsub
+luaL_len
+luaL_loadbufferx
+luaL_loadfilex
+luaL_loadstring
+luaL_newmetatable
+luaL_newstate
+luaL_openlib
+luaL_openlibs
+luaL_optinteger
+luaL_optlstring
+luaL_optnumber
+luaL_prepbuffsize
+luaL_pushmodule
+luaL_pushresult
+luaL_pushresultsize
+luaL_ref
+luaL_requiref
+luaL_setfuncs
+luaL_setmetatable
+luaL_testudata
+luaL_tolstring
+luaL_traceback
+luaL_unref
+luaL_where
luaopen_base
-luaopen_bitlib
+luaopen_bit32
luaopen_coroutine
luaopen_debug
luaopen_io
@@ -159,5 +146,30 @@ luaopen_os
luaopen_package
luaopen_string
luaopen_table
-luaopen_lfs
-luaopen_lpeg
+luaopen_utf8
+# LuaJIT symbols to retain that are not listed above.
+lua_call
+lua_cpcall
+lua_equal
+lua_getfenv
+lua_insert
+lua_lessthan
+lua_loadx
+lua_objlen
+lua_pcall
+lua_remove
+lua_replace
+lua_setfenv
+lua_setlevel
+lua_tointeger
+lua_tonumber
+lua_yield
+luaL_findtable
+luaL_loadbuffer
+luaL_loadfile
+luaL_prepbuffer
+luaL_register
+luaL_typerror
+luaopen_bit
+luaopen_ffi
+luaopen_jit
diff --git a/src/lutf8libjit.patch b/src/lutf8libjit.patch
new file mode 100644
index 00000000..72a09840
--- /dev/null
+++ b/src/lutf8libjit.patch
@@ -0,0 +1,14 @@
+--- lutf8lib.c 2015-01-12 18:46:22.334838510 -0500
++++ lib/lutf8lib.c 2015-01-12 22:42:54.527406794 -0500
+@@ -246,8 +246,9 @@
+ };
+
+
+-LUAMOD_API int luaopen_utf8 (lua_State *L) {
+- luaL_newlib(L, funcs);
++int luaopen_utf8 (lua_State *L) {
++ lua_newtable(L), luaL_register(L, NULL, funcs);
++ lua_pushvalue(L, -1), lua_setglobal(L, "utf8");
+ lua_pushliteral(L, UTF8PATT);
+ lua_setfield(L, -2, "charpattern");
+ return 1;
diff --git a/src/textadept.c b/src/textadept.c
index 164c53dc..6476becd 100644
--- a/src/textadept.c
+++ b/src/textadept.c
@@ -86,13 +86,21 @@ typedef GtkWidget Scintilla;
} \
lua_setmetatable(l, (n > 0) ? n : n - 1); \
}
-// Translate Lua 5.2 API to LuaJIT API (Lua 5.1) for compatibility.
+// Translate Lua 5.3 API to LuaJIT API (Lua 5.1) for compatibility.
#if LUA_VERSION_NUM == 501
#define LUA_OK 0
#define lua_rawlen lua_objlen
#define LUA_OPEQ 0
+#undef lua_getglobal
+#define lua_getglobal(l, n) \
+ (lua_getfield(l, LUA_GLOBALSINDEX, (n)), lua_type(l, -1))
+#define lua_getfield(l, t, k) (lua_getfield(l, t, k), lua_type(l, -1))
+#define lua_rawgeti(l, i, n) (lua_rawgeti(l, i, n), lua_type(l, -1))
+#define lua_gettable(l, i) (lua_gettable(l, i), lua_type(l, -1))
+#define luaL_openlibs(l) luaL_openlibs(l), luaopen_utf8(l)
#define lL_openlib(l, n) \
(lua_pushcfunction(l, luaopen_##n), lua_pushstring(l, #n), lua_call(l, 1, 0))
+LUALIB_API int luaopen_utf8(lua_State *);
#else
#define lL_openlib(l, n) (luaL_requiref(l, #n, luaopen_##n, 1), lua_pop(l, 1))
#endif
@@ -230,11 +238,8 @@ LUALIB_API int lspawn_pushfds(lua_State *), lspawn_readfds(lua_State *);
*/
static int lL_event(lua_State *L, const char *name, ...) {
int ret = FALSE;
- lua_getglobal(L, "events");
- if (lua_istable(L, -1)) {
- lua_getfield(L, -1, "emit");
- lua_remove(L, -2); // events table
- if (lua_isfunction(L, -1)) {
+ if (lua_getglobal(L, "events") == LUA_TTABLE) {
+ if (lua_getfield(L, -1, "emit") == LUA_TFUNCTION) {
lua_pushstring(L, name);
int n = 1, type;
va_list ap;
@@ -258,8 +263,8 @@ static int lL_event(lua_State *L, const char *name, ...) {
ret = lua_toboolean(L, -1);
else
lL_event(L, "error", LUA_TSTRING, lua_tostring(L, -1), -1);
- lua_pop(L, 1); // result
- } else lua_pop(L, 1); // non-function
+ lua_pop(L, 2); // result, events
+ } else lua_pop(L, 2); // non-function, events
} else lua_pop(L, 1); // non-table
return ret;
}
@@ -759,18 +764,15 @@ static void l_pushmenu(lua_State *L, int index, GCallback callback,
GtkWidget *menu = gtk_menu_new(), *menu_item = NULL, *submenu_root = NULL;
const char *label;
lua_pushvalue(L, index); // copy to stack top so relative indices can be used
- lua_getfield(L, -1, "title");
- if (!lua_isnil(L, -1) || submenu) { // title required for submenu
+ if (lua_getfield(L, -1, "title") != LUA_TNIL || submenu) { // submenu title
label = !lua_isnil(L, -1) ? lua_tostring(L, -1) : "notitle";
submenu_root = gtk_menu_item_new_with_mnemonic(label);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenu_root), menu);
}
lua_pop(L, 1); // title
for (size_t i = 1; i <= lua_rawlen(L, -1); i++) {
- lua_rawgeti(L, -1, i);
- if (lua_istable(L, -1)) {
- lua_getfield(L, -1, "title");
- int is_submenu = !lua_isnil(L, -1);
+ if (lua_rawgeti(L, -1, i) == LUA_TTABLE) {
+ int is_submenu = lua_getfield(L, -1, "title") != LUA_TNIL;
lua_pop(L, 1); // title
if (is_submenu) {
l_pushmenu(L, -1, callback, TRUE);
@@ -887,8 +889,8 @@ static int lui__newindex(lua_State *L) {
luaL_argcheck(L, lua_istable(L, 3), 3, "table of menus expected");
GtkWidget *new_menubar = gtk_menu_bar_new(); // TODO: this leaks on error
for (size_t i = 1; i <= lua_rawlen(L, 3); i++) {
- lua_rawgeti(L, 3, i);
- luaL_argcheck(L, lua_isuserdata(L, -1), 3, "table of menus expected");
+ luaL_argcheck(L, lua_rawgeti(L, 3, i) == LUA_TLIGHTUSERDATA, 3,
+ "table of menus expected");
GtkWidget *menu_item = (GtkWidget *)lua_touserdata(L, -1);
gtk_menu_shell_append(GTK_MENU_SHELL(new_menubar), menu_item);
lua_pop(L, 1); // value
@@ -959,8 +961,8 @@ static sptr_t l_globaldoccompare(lua_State *L, int index) {
lua_pop(L, 2); // metatable, metatable
if (doc != SS(focused_view, SCI_GETDOCPOINTER, 0, 0)) {
lua_getfield(L, LUA_REGISTRYINDEX, "ta_buffers");
- l_pushdoc(L, doc), lua_gettable(L, -2);
- luaL_argcheck(L, !lua_isnil(L, -1), index, "this Buffer does not exist");
+ luaL_argcheck(L, (l_pushdoc(L, doc), lua_gettable(L, -2) != LUA_TNIL),
+ index, "this Buffer does not exist");
lua_pop(L, 2); // buffer, ta_buffers
if (doc == SS(command_entry, SCI_GETDOCPOINTER, 0, 0)) return -1;
return (SS(dummy_view, SCI_SETDOCPOINTER, 0, doc), doc);
@@ -1094,7 +1096,7 @@ static int lbuffer_text_range(lua_State *L) {
Scintilla *view = focused_view;
int result = l_globaldoccompare(L, 1);
if (result != 0) view = (result > 0) ? dummy_view : command_entry;
- long min = luaL_checklong(L, 2), max = luaL_checklong(L, 3);
+ long min = luaL_checkinteger(L, 2), max = luaL_checkinteger(L, 3);
luaL_argcheck(L, min <= max, 3, "start > end");
struct Sci_TextRange tr = {{min, max}, malloc(max - min + 1)};
SS(view, SCI_GETTEXTRANGE, 0, (sptr_t)&tr);
@@ -1149,7 +1151,7 @@ static int l_callscintilla(lua_State *L, Scintilla *view, int msg, int wtype,
// appropriately. See the LPeg lexer API for more information.
if (msg == SCI_PRIVATELEXERCALL) {
ltype = SSTRINGRET;
- int c = luaL_checklong(L, arg);
+ int c = luaL_checkinteger(L, arg);
if (c == SCI_GETDIRECTFUNCTION || c == SCI_SETDOCPOINTER ||
c == SCI_CHANGELEXERSTATE)
ltype = SINT;
@@ -1212,8 +1214,8 @@ static int lbuf_property(lua_State *L) {
// If the key is a Scintilla function, return a callable closure.
if (is_buffer && !newindex) {
lua_getfield(L, LUA_REGISTRYINDEX, "ta_functions");
- lua_pushvalue(L, 2), lua_gettable(L, -2);
- if (lua_istable(L, -1)) return (lua_pushcclosure(L, lbuf_closure, 1), 1);
+ if (lua_pushvalue(L, 2), lua_gettable(L, -2) == LUA_TTABLE)
+ return (lua_pushcclosure(L, lbuf_closure, 1), 1);
lua_pop(L, 2); // non-table, ta_functions
}
@@ -1223,9 +1225,8 @@ static int lbuf_property(lua_State *L) {
lua_getfield(L, LUA_REGISTRYINDEX, "ta_properties");
// If the table is a buffer, the key is given; otherwise the table is an
// indexible property.
- is_buffer ? lua_pushvalue(L, 2) : lua_getfield(L, 1, "property");
- lua_gettable(L, -2);
- if (lua_istable(L, -1)) {
+ is_buffer ? lua_pushvalue(L, 2) : (void)lua_getfield(L, 1, "property");
+ if (lua_gettable(L, -2) == LUA_TTABLE) {
Scintilla *view = focused_view;
// Interface table is of the form {get_id, set_id, rtype, wtype}.
if (!is_buffer) lua_getfield(L, 1, "buffer");
@@ -1271,7 +1272,7 @@ static int lbuf_property(lua_State *L) {
} else if (strcmp(lua_tostring(L, 2), "height") == 0 &&
l_todoc(L, 1) == SS(command_entry, SCI_GETDOCPOINTER, 0, 0)) {
// Return or set the command entry's pixel height.
- int height = luaL_optint(L, 3, 0);
+ int height = luaL_optinteger(L, 3, 0);
int min_height = SS(command_entry, SCI_TEXTHEIGHT, 0, 0);
if (height < min_height) height = min_height;
#if GTK
@@ -1292,8 +1293,7 @@ static int lbuf_property(lua_State *L) {
} else if (!newindex) {
// If the key is a Scintilla constant, return its value.
lua_getfield(L, LUA_REGISTRYINDEX, "ta_constants");
- lua_pushvalue(L, 2), lua_gettable(L, -2);
- if (lua_isnumber(L, -1)) return 1;
+ if (lua_pushvalue(L, 2), lua_gettable(L, -2) == LUA_TNUMBER) return 1;
lua_pop(L, 2); // non-number, ta_constants
}
@@ -1846,10 +1846,8 @@ static void t_tabchange(GtkNotebook*_, GtkWidget*__, int page_num, void*___) {
* @param field The ui table field that contains the context menu.
*/
static void lL_showcontextmenu(lua_State *L, void *event, char *field) {
- lua_getglobal(L, "ui");
- if (lua_istable(L, -1)) {
- lua_getfield(L, -1, field);
- if (lua_isuserdata(L, -1)) {
+ if (lua_getglobal(L, "ui") == LUA_TTABLE) {
+ if (lua_getfield(L, -1, field) == LUA_TLIGHTUSERDATA) {
GtkWidget *menu = (GtkWidget *)lua_touserdata(L, -1);
gtk_widget_show_all(menu);
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,