mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
0dbf01bf1d
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.
44 lines
1.9 KiB
PHP
44 lines
1.9 KiB
PHP
#undef vmdispatch
|
|
#undef vmcase
|
|
#undef vmbreak
|
|
|
|
#define vmdispatch(x) goto *disptab[x];
|
|
|
|
#define vmcase(l) L_##l:
|
|
|
|
#define vmbreak \
|
|
vmfetch(); \
|
|
vmdispatch(GET_OPCODE(i));
|
|
|
|
static const void *const disptab[NUM_OPCODES] = {
|
|
|
|
#if 0
|
|
** you can update the following list with this command:
|
|
**
|
|
** sed -n '/^OP_/\!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h
|
|
**
|
|
#endif
|
|
|
|
&&L_OP_MOVE, &&L_OP_LOADI, &&L_OP_LOADF, &&L_OP_LOADK,
|
|
&&L_OP_LOADKX, &&L_OP_LOADFALSE, &&L_OP_LFALSESKIP, &&L_OP_LOADTRUE,
|
|
&&L_OP_LOADNIL, &&L_OP_GETUPVAL, &&L_OP_SETUPVAL, &&L_OP_GETTABUP,
|
|
&&L_OP_GETTABLE, &&L_OP_GETI, &&L_OP_GETFIELD, &&L_OP_SETTABUP,
|
|
&&L_OP_SETTABLE, &&L_OP_SETI, &&L_OP_SETFIELD, &&L_OP_NEWTABLE,
|
|
&&L_OP_SELF, &&L_OP_ADDI, &&L_OP_ADDK, &&L_OP_SUBK,
|
|
&&L_OP_MULK, &&L_OP_MODK, &&L_OP_POWK, &&L_OP_DIVK,
|
|
&&L_OP_IDIVK, &&L_OP_BANDK, &&L_OP_BORK, &&L_OP_BXORK,
|
|
&&L_OP_SHRI, &&L_OP_SHLI, &&L_OP_ADD, &&L_OP_SUB,
|
|
&&L_OP_MUL, &&L_OP_MOD, &&L_OP_POW, &&L_OP_DIV,
|
|
&&L_OP_IDIV, &&L_OP_BAND, &&L_OP_BOR, &&L_OP_BXOR,
|
|
&&L_OP_SHL, &&L_OP_SHR, &&L_OP_MMBIN, &&L_OP_MMBINI,
|
|
&&L_OP_MMBINK, &&L_OP_UNM, &&L_OP_BNOT, &&L_OP_NOT,
|
|
&&L_OP_LEN, &&L_OP_CONCAT, &&L_OP_CLOSE, &&L_OP_TBC,
|
|
&&L_OP_JMP, &&L_OP_EQ, &&L_OP_LT, &&L_OP_LE,
|
|
&&L_OP_EQK, &&L_OP_EQI, &&L_OP_LTI, &&L_OP_LEI,
|
|
&&L_OP_GTI, &&L_OP_GEI, &&L_OP_TEST, &&L_OP_TESTSET,
|
|
&&L_OP_CALL, &&L_OP_TAILCALL, &&L_OP_RETURN, &&L_OP_RETURN0,
|
|
&&L_OP_RETURN1, &&L_OP_FORLOOP, &&L_OP_FORPREP, &&L_OP_TFORPREP,
|
|
&&L_OP_TFORCALL, &&L_OP_TFORLOOP, &&L_OP_SETLIST, &&L_OP_CLOSURE,
|
|
&&L_OP_VARARG, &&L_OP_VARARGPREP, &&L_OP_EXTRAARG
|
|
|
|
};
|