2022-04-24 16:59:22 +00:00
|
|
|
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
|
|
|
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
|
|
|
╚──────────────────────────────────────────────────────────────────────────────╝
|
|
|
|
│ │
|
|
|
|
│ Lua │
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
│ Copyright © 2004-2023 Lua.org, PUC-Rio. │
|
2022-04-24 16:59:22 +00:00
|
|
|
│ │
|
|
|
|
│ Permission is hereby granted, free of charge, to any person obtaining │
|
|
|
|
│ a copy of this software and associated documentation files (the │
|
|
|
|
│ "Software"), to deal in the Software without restriction, including │
|
|
|
|
│ without limitation the rights to use, copy, modify, merge, publish, │
|
|
|
|
│ distribute, sublicense, and/or sell copies of the Software, and to │
|
|
|
|
│ permit persons to whom the Software is furnished to do so, subject to │
|
|
|
|
│ the following conditions: │
|
|
|
|
│ │
|
|
|
|
│ The above copyright notice and this permission notice shall be │
|
|
|
|
│ included in all copies or substantial portions of the Software. │
|
|
|
|
│ │
|
|
|
|
│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │
|
|
|
|
│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │
|
|
|
|
│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │
|
|
|
|
│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │
|
|
|
|
│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │
|
|
|
|
│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │
|
|
|
|
│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
|
|
|
|
│ │
|
|
|
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
2021-03-02 13:51:10 +00:00
|
|
|
#define lua_c
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
|
2023-06-10 01:11:53 +00:00
|
|
|
#include "third_party/lua/lua.h"
|
2021-03-07 21:26:57 +00:00
|
|
|
#include "libc/calls/calls.h"
|
|
|
|
#include "libc/calls/struct/sigaction.h"
|
2021-08-19 13:07:37 +00:00
|
|
|
#include "libc/dce.h"
|
2022-04-23 01:55:28 +00:00
|
|
|
#include "libc/errno.h"
|
2021-08-19 13:07:37 +00:00
|
|
|
#include "libc/log/log.h"
|
2022-09-13 06:10:38 +00:00
|
|
|
#include "libc/mem/gc.h"
|
2023-06-10 01:11:53 +00:00
|
|
|
#include "libc/runtime/runtime.h"
|
2021-10-14 00:27:13 +00:00
|
|
|
#include "libc/runtime/stack.h"
|
2022-04-23 01:55:28 +00:00
|
|
|
#include "libc/sock/sock.h"
|
2022-08-06 10:51:50 +00:00
|
|
|
#include "libc/sock/struct/pollfd.h"
|
2022-04-17 03:29:08 +00:00
|
|
|
#include "libc/str/str.h"
|
2021-03-07 21:26:57 +00:00
|
|
|
#include "libc/sysv/consts/exit.h"
|
2022-04-23 01:55:28 +00:00
|
|
|
#include "libc/sysv/consts/poll.h"
|
2022-04-17 03:29:08 +00:00
|
|
|
#include "libc/sysv/consts/sa.h"
|
2021-08-18 21:21:30 +00:00
|
|
|
#include "libc/x/x.h"
|
2022-04-16 22:08:00 +00:00
|
|
|
#include "third_party/linenoise/linenoise.h"
|
2022-04-23 01:55:28 +00:00
|
|
|
#include "third_party/lua/cosmo.h"
|
2021-03-07 21:26:57 +00:00
|
|
|
#include "third_party/lua/lauxlib.h"
|
|
|
|
#include "third_party/lua/lprefix.h"
|
2022-04-17 03:29:08 +00:00
|
|
|
#include "third_party/lua/lrepl.h"
|
2021-03-07 21:26:57 +00:00
|
|
|
#include "third_party/lua/lualib.h"
|
2022-06-18 08:10:29 +00:00
|
|
|
#include "third_party/lua/lunix.h"
|
2024-06-23 17:08:48 +00:00
|
|
|
#include "libc/mem/leaks.h"
|
Release Cosmopolitan v3.3
This change upgrades to GCC 12.3 and GNU binutils 2.42. The GNU linker
appears to have changed things so that only a single de-duplicated str
table is present in the binary, and it gets placed wherever the linker
wants, regardless of what the linker script says. To cope with that we
need to stop using .ident to embed licenses. As such, this change does
significant work to revamp how third party licenses are defined in the
codebase, using `.section .notice,"aR",@progbits`.
This new GCC 12.3 toolchain has support for GNU indirect functions. It
lets us support __target_clones__ for the first time. This is used for
optimizing the performance of libc string functions such as strlen and
friends so far on x86, by ensuring AVX systems favor a second codepath
that uses VEX encoding. It shaves some latency off certain operations.
It's a useful feature to have for scientific computing for the reasons
explained by the test/libcxx/openmp_test.cc example which compiles for
fifteen different microarchitectures. Thanks to the upgrades, it's now
also possible to use newer instruction sets, such as AVX512FP16, VNNI.
Cosmo now uses the %gs register on x86 by default for TLS. Doing it is
helpful for any program that links `cosmo_dlopen()`. Such programs had
to recompile their binaries at startup to change the TLS instructions.
That's not great, since it means every page in the executable needs to
be faulted. The work of rewriting TLS-related x86 opcodes, is moved to
fixupobj.com instead. This is great news for MacOS x86 users, since we
previously needed to morph the binary every time for that platform but
now that's no longer necessary. The only platforms where we need fixup
of TLS x86 opcodes at runtime are now Windows, OpenBSD, and NetBSD. On
Windows we morph TLS to point deeper into the TIB, based on a TlsAlloc
assignment, and on OpenBSD/NetBSD we morph %gs back into %fs since the
kernels do not allow us to specify a value for the %gs register.
OpenBSD users are now required to use APE Loader to run Cosmo binaries
and assimilation is no longer possible. OpenBSD kernel needs to change
to allow programs to specify a value for the %gs register, or it needs
to stop marking executable pages loaded by the kernel as mimmutable().
This release fixes __constructor__, .ctor, .init_array, and lastly the
.preinit_array so they behave the exact same way as glibc.
We no longer use hex constants to define math.h symbols like M_PI.
2024-02-20 19:12:09 +00:00
|
|
|
__static_yoink("lua_notice");
|
2021-10-14 00:27:13 +00:00
|
|
|
|
2021-03-02 13:51:10 +00:00
|
|
|
#if !defined(LUA_PROGNAME)
|
|
|
|
#define LUA_PROGNAME "lua"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !defined(LUA_INIT_VAR)
|
|
|
|
#define LUA_INIT_VAR "LUA_INIT"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define LUA_INITVARVERSION LUA_INIT_VAR LUA_VERSUFFIX
|
|
|
|
|
|
|
|
|
2022-04-17 03:29:08 +00:00
|
|
|
static bool lua_stdin_is_tty(void) {
|
|
|
|
return isatty(0);
|
2021-03-02 13:51:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void print_usage (const char *badoption) {
|
2023-07-09 12:11:25 +00:00
|
|
|
lua_writestringerror("%s: ", lua_progname);
|
2021-03-02 13:51:10 +00:00
|
|
|
if (badoption[1] == 'e' || badoption[1] == 'l')
|
|
|
|
lua_writestringerror("'%s' needs argument\n", badoption);
|
|
|
|
else
|
|
|
|
lua_writestringerror("unrecognized option '%s'\n", badoption);
|
|
|
|
lua_writestringerror(
|
|
|
|
"usage: %s [options] [script [args]]\n"
|
|
|
|
"Available options are:\n"
|
|
|
|
" -e stat execute string 'stat'\n"
|
|
|
|
" -i enter interactive mode after executing 'script'\n"
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
" -l mod require library 'mod' into global 'mod'\n"
|
|
|
|
" -l g=mod require library 'mod' into global 'g'\n"
|
2021-03-02 13:51:10 +00:00
|
|
|
" -v show version information\n"
|
|
|
|
" -E ignore environment variables\n"
|
|
|
|
" -W turn warnings on\n"
|
|
|
|
" -- stop handling options\n"
|
|
|
|
" - stop handling options and execute stdin\n"
|
|
|
|
,
|
2023-07-09 12:11:25 +00:00
|
|
|
lua_progname);
|
2021-03-02 13:51:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void print_version (void) {
|
|
|
|
lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT));
|
|
|
|
lua_writeline();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Create the 'arg' table, which stores all arguments from the
|
|
|
|
** command line ('argv'). It should be aligned so that, at index 0,
|
|
|
|
** it has 'argv[script]', which is the script name. The arguments
|
|
|
|
** to the script (everything after 'script') go to positive indices;
|
|
|
|
** other arguments (before the script name) go to negative indices.
|
|
|
|
** If there is no script name, assume interpreter's name as base.
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
** (If there is no interpreter's name either, 'script' is -1, so
|
|
|
|
** table sizes are zero.)
|
2021-03-02 13:51:10 +00:00
|
|
|
*/
|
|
|
|
static void createargtable (lua_State *L, char **argv, int argc, int script) {
|
|
|
|
int i, narg;
|
|
|
|
narg = argc - (script + 1); /* number of positive indices */
|
|
|
|
lua_createtable(L, narg, script + 1);
|
|
|
|
for (i = 0; i < argc; i++) {
|
|
|
|
lua_pushstring(L, argv[i]);
|
|
|
|
lua_rawseti(L, -2, i - script);
|
|
|
|
}
|
|
|
|
lua_setglobal(L, "arg");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int dochunk (lua_State *L, int status) {
|
2022-04-17 03:29:08 +00:00
|
|
|
if (status == LUA_OK) status = lua_runchunk(L, 0, 0);
|
|
|
|
return lua_report(L, status);
|
2021-03-02 13:51:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int dofile (lua_State *L, const char *name) {
|
|
|
|
return dochunk(L, luaL_loadfile(L, name));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int dostring (lua_State *L, const char *s, const char *name) {
|
|
|
|
return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
** Receives 'globname[=modname]' and runs 'globname = require(modname)'.
|
2021-03-02 13:51:10 +00:00
|
|
|
*/
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
static int dolibrary (lua_State *L, char *globname) {
|
2021-03-02 13:51:10 +00:00
|
|
|
int status;
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
char *modname = strchr(globname, '=');
|
|
|
|
if (modname == NULL) /* no explicit name? */
|
|
|
|
modname = globname; /* module name is equal to global name */
|
|
|
|
else {
|
|
|
|
*modname = '\0'; /* global name ends here */
|
|
|
|
modname++; /* module name starts after the '=' */
|
|
|
|
}
|
2021-03-02 13:51:10 +00:00
|
|
|
lua_getglobal(L, "require");
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
lua_pushstring(L, modname);
|
|
|
|
status = lua_runchunk(L, 1, 1); /* call 'require(modname)' */
|
2021-03-02 13:51:10 +00:00
|
|
|
if (status == LUA_OK)
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
lua_setglobal(L, globname); /* globname = require(modname) */
|
2022-04-17 03:29:08 +00:00
|
|
|
return lua_report(L, status);
|
2021-03-02 13:51:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Push on the stack the contents of table 'arg' from 1 to #arg
|
|
|
|
*/
|
|
|
|
static int pushargs (lua_State *L) {
|
|
|
|
int i, n;
|
|
|
|
if (lua_getglobal(L, "arg") != LUA_TTABLE)
|
|
|
|
luaL_error(L, "'arg' is not a table");
|
|
|
|
n = (int)luaL_len(L, -1);
|
|
|
|
luaL_checkstack(L, n + 3, "too many arguments to script");
|
|
|
|
for (i = 1; i <= n; i++)
|
|
|
|
lua_rawgeti(L, -i, i);
|
|
|
|
lua_remove(L, -i); /* remove table from the stack */
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int handle_script (lua_State *L, char **argv) {
|
|
|
|
int status;
|
|
|
|
const char *fname = argv[0];
|
|
|
|
if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0)
|
|
|
|
fname = NULL; /* stdin */
|
|
|
|
status = luaL_loadfile(L, fname);
|
|
|
|
if (status == LUA_OK) {
|
|
|
|
int n = pushargs(L); /* push arguments to script */
|
2022-04-17 03:29:08 +00:00
|
|
|
status = lua_runchunk(L, n, LUA_MULTRET);
|
2021-03-02 13:51:10 +00:00
|
|
|
}
|
2022-04-17 03:29:08 +00:00
|
|
|
return lua_report(L, status);
|
2021-03-02 13:51:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* bits of various argument indicators in 'args' */
|
|
|
|
#define has_error 1 /* bad option */
|
|
|
|
#define has_i 2 /* -i */
|
|
|
|
#define has_v 4 /* -v */
|
|
|
|
#define has_e 8 /* -e */
|
|
|
|
#define has_E 16 /* -E */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Traverses all arguments from 'argv', returning a mask with those
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
** needed before running any Lua code or an error code if it finds any
|
|
|
|
** invalid argument. In case of error, 'first' is the index of the bad
|
|
|
|
** argument. Otherwise, 'first' is -1 if there is no program name,
|
|
|
|
** 0 if there is no script name, or the index of the script name.
|
2021-03-02 13:51:10 +00:00
|
|
|
*/
|
|
|
|
static int collectargs (char **argv, int *first) {
|
|
|
|
int args = 0;
|
|
|
|
int i;
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
if (argv[0] != NULL) { /* is there a program name? */
|
|
|
|
if (argv[0][0]) /* not empty? */
|
|
|
|
lua_progname = argv[0]; /* save it */
|
|
|
|
}
|
|
|
|
else { /* no program name */
|
|
|
|
*first = -1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
for (i = 1; argv[i] != NULL; i++) { /* handle arguments */
|
2021-03-02 13:51:10 +00:00
|
|
|
*first = i;
|
|
|
|
if (argv[i][0] != '-') /* not an option? */
|
|
|
|
return args; /* stop handling options */
|
|
|
|
switch (argv[i][1]) { /* else check option */
|
|
|
|
case '-': /* '--' */
|
|
|
|
if (argv[i][2] != '\0') /* extra characters after '--'? */
|
|
|
|
return has_error; /* invalid option */
|
|
|
|
*first = i + 1;
|
|
|
|
return args;
|
|
|
|
case '\0': /* '-' */
|
|
|
|
return args; /* script "name" is '-' */
|
|
|
|
case 'E':
|
|
|
|
if (argv[i][2] != '\0') /* extra characters? */
|
|
|
|
return has_error; /* invalid option */
|
|
|
|
args |= has_E;
|
|
|
|
break;
|
|
|
|
case 'W':
|
|
|
|
if (argv[i][2] != '\0') /* extra characters? */
|
|
|
|
return has_error; /* invalid option */
|
|
|
|
break;
|
|
|
|
case 'i':
|
|
|
|
args |= has_i; /* (-i implies -v) *//* FALLTHROUGH */
|
|
|
|
case 'v':
|
|
|
|
if (argv[i][2] != '\0') /* extra characters? */
|
|
|
|
return has_error; /* invalid option */
|
|
|
|
args |= has_v;
|
|
|
|
break;
|
|
|
|
case 'e':
|
|
|
|
args |= has_e; /* FALLTHROUGH */
|
|
|
|
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 has_error; /* no next argument or it is another option */
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default: /* invalid option */
|
|
|
|
return has_error;
|
|
|
|
}
|
|
|
|
}
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
*first = 0; /* no script name */
|
2021-03-02 13:51:10 +00:00
|
|
|
return args;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Processes options 'e' and 'l', which involve running Lua code, and
|
|
|
|
** 'W', which also affects the state.
|
|
|
|
** Returns 0 if some code raises an error.
|
|
|
|
*/
|
|
|
|
static int runargs (lua_State *L, char **argv, int n) {
|
|
|
|
int i;
|
|
|
|
for (i = 1; i < n; i++) {
|
|
|
|
int option = argv[i][1];
|
|
|
|
lua_assert(argv[i][0] == '-'); /* already checked */
|
|
|
|
switch (option) {
|
|
|
|
case 'e': case 'l': {
|
|
|
|
int status;
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
char *extra = argv[i] + 2; /* both options need an argument */
|
2021-03-02 13:51:10 +00:00
|
|
|
if (*extra == '\0') extra = argv[++i];
|
|
|
|
lua_assert(extra != NULL);
|
|
|
|
status = (option == 'e')
|
|
|
|
? dostring(L, extra, "=(command line)")
|
|
|
|
: dolibrary(L, extra);
|
|
|
|
if (status != LUA_OK) return 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case 'W':
|
|
|
|
lua_warning(L, "@on", 0); /* warnings on */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int handle_luainit (lua_State *L) {
|
|
|
|
const char *name = "=" LUA_INITVARVERSION;
|
|
|
|
const char *init = getenv(name + 1);
|
|
|
|
if (init == NULL) {
|
|
|
|
name = "=" LUA_INIT_VAR;
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and
|
|
|
|
** print any results.
|
|
|
|
*/
|
|
|
|
static void doREPL (lua_State *L) {
|
|
|
|
int status;
|
2023-07-09 12:11:25 +00:00
|
|
|
const char *oldprogname = lua_progname;
|
|
|
|
lua_progname = NULL; /* no 'progname' on errors in interactive mode */
|
|
|
|
lua_initrepl(L);
|
2022-04-23 01:55:28 +00:00
|
|
|
for (;;) {
|
2022-05-23 17:15:53 +00:00
|
|
|
if (lua_repl_isterminal)
|
|
|
|
linenoiseEnableRawMode(0);
|
2022-04-23 01:55:28 +00:00
|
|
|
TryAgain:
|
|
|
|
status = lua_loadline(L);
|
|
|
|
if (status == -2 && errno == EAGAIN) {
|
|
|
|
errno = 0;
|
|
|
|
poll(&(struct pollfd){0, POLLIN}, 1, -1);
|
|
|
|
goto TryAgain;
|
|
|
|
}
|
2022-05-23 17:15:53 +00:00
|
|
|
if (lua_repl_isterminal)
|
|
|
|
linenoiseDisableRawMode();
|
2022-04-23 01:55:28 +00:00
|
|
|
if (status == -1) {
|
|
|
|
break;
|
|
|
|
} else if (status == -2) {
|
|
|
|
lua_pushfstring(L, "read error: %s", strerror(errno));
|
|
|
|
lua_report(L, status);
|
|
|
|
lua_freerepl();
|
2023-07-09 12:11:25 +00:00
|
|
|
lua_progname = oldprogname;
|
2022-04-23 01:55:28 +00:00
|
|
|
return;
|
|
|
|
}
|
2021-03-02 13:51:10 +00:00
|
|
|
if (status == LUA_OK)
|
2022-04-17 03:29:08 +00:00
|
|
|
status = lua_runchunk(L, 0, LUA_MULTRET);
|
|
|
|
if (status == LUA_OK) {
|
|
|
|
lua_l_print(L);
|
|
|
|
} else {
|
|
|
|
lua_report(L, status);
|
|
|
|
}
|
2021-03-02 13:51:10 +00:00
|
|
|
}
|
2022-04-23 01:55:28 +00:00
|
|
|
lua_freerepl();
|
2021-03-02 13:51:10 +00:00
|
|
|
lua_settop(L, 0); /* clear stack */
|
2023-07-09 12:11:25 +00:00
|
|
|
lua_progname = oldprogname;
|
2021-03-02 13:51:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* }================================================================== */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Main body of stand-alone interpreter (to be called in protected mode).
|
|
|
|
** Reads the options and handles them all.
|
|
|
|
*/
|
|
|
|
static int pmain (lua_State *L) {
|
|
|
|
int argc = (int)lua_tointeger(L, 1);
|
|
|
|
char **argv = (char **)lua_touserdata(L, 2);
|
|
|
|
int script;
|
|
|
|
int args = collectargs(argv, &script);
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
int optlim = (script > 0) ? script : argc; /* first argv not an option */
|
2021-03-02 13:51:10 +00:00
|
|
|
luaL_checkversion(L); /* check that interpreter has correct version */
|
|
|
|
if (args == has_error) { /* bad arg? */
|
|
|
|
print_usage(argv[script]); /* 'script' has index of bad arg. */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (args & has_v) /* option '-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");
|
|
|
|
}
|
|
|
|
luaL_openlibs(L); /* open standard libraries */
|
2022-06-18 08:10:29 +00:00
|
|
|
luaL_requiref(L, "unix", LuaUnix, 1);
|
|
|
|
lua_pop(L, 1);
|
2021-03-02 13:51:10 +00:00
|
|
|
createargtable(L, argv, argc, script); /* create table 'arg' */
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
lua_gc(L, LUA_GCRESTART); /* start GC... */
|
|
|
|
lua_gc(L, LUA_GCGEN, 0, 0); /* ...in generational mode */
|
2021-03-02 13:51:10 +00:00
|
|
|
if (!(args & has_E)) { /* no option '-E'? */
|
|
|
|
if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */
|
|
|
|
return 0; /* error running LUA_INIT */
|
|
|
|
}
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
if (!runargs(L, argv, optlim)) /* execute arguments -e and -l */
|
2021-03-02 13:51:10 +00:00
|
|
|
return 0; /* something failed */
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
if (script > 0) { /* execute main script (if there is one) */
|
|
|
|
if (handle_script(L, argv + script) != LUA_OK)
|
|
|
|
return 0; /* interrupt in case of error */
|
|
|
|
}
|
2021-03-02 13:51:10 +00:00
|
|
|
if (args & has_i) /* -i option? */
|
|
|
|
doREPL(L); /* do read-eval-print loop */
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
else if (script < 1 && !(args & (has_e | has_v))) { /* no active option? */
|
2021-03-02 13:51:10 +00:00
|
|
|
if (lua_stdin_is_tty()) { /* running in interactive mode? */
|
|
|
|
print_version();
|
|
|
|
doREPL(L); /* do read-eval-print loop */
|
|
|
|
}
|
|
|
|
else dofile(L, NULL); /* executes stdin as a file */
|
|
|
|
}
|
|
|
|
lua_pushboolean(L, 1); /* signal no errors */
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main (int argc, char **argv) {
|
2021-08-18 21:21:30 +00:00
|
|
|
lua_State *L;
|
2022-05-12 18:01:58 +00:00
|
|
|
int status, result;
|
|
|
|
LoadZipArgs(&argc, &argv);
|
2022-04-23 01:55:28 +00:00
|
|
|
if (IsModeDbg()) {
|
2022-04-17 03:29:08 +00:00
|
|
|
ShowCrashReports();
|
|
|
|
}
|
2021-08-18 21:21:30 +00:00
|
|
|
L = luaL_newstate(); /* create state */
|
2021-03-02 13:51:10 +00:00
|
|
|
if (L == NULL) {
|
2022-04-17 03:29:08 +00:00
|
|
|
lua_l_message(argv[0], "cannot create state: not enough memory");
|
2021-03-02 13:51:10 +00:00
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
lua_gc(L, LUA_GCSTOP); /* stop GC while building state */
|
2021-03-02 13:51:10 +00:00
|
|
|
lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */
|
|
|
|
lua_pushinteger(L, argc); /* 1st argument */
|
|
|
|
lua_pushlightuserdata(L, argv); /* 2nd argument */
|
|
|
|
status = lua_pcall(L, 2, 1, 0); /* do the call */
|
|
|
|
result = lua_toboolean(L, -1); /* get result */
|
2022-04-17 03:29:08 +00:00
|
|
|
lua_report(L, status);
|
2021-03-02 13:51:10 +00:00
|
|
|
lua_close(L);
|
2022-04-17 03:29:08 +00:00
|
|
|
if (IsModeDbg()) {
|
|
|
|
CheckForMemoryLeaks();
|
|
|
|
}
|
2021-03-02 13:51:10 +00:00
|
|
|
return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
|
|
}
|