diff options
| author | Li Jin <dragon-fly@qq.com> | 2021-11-02 11:17:58 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2021-11-02 11:17:58 +0800 |
| commit | 827c3736f357e09168fc108e8e740c6425d37d9b (patch) | |
| tree | 259f977bf7f4ebe0e397fe5e1b74e7fbb1b75e8e /src | |
| parent | aed806476fe50899c0f01750175531ac41267b9d (diff) | |
| download | yuescript-827c3736f357e09168fc108e8e740c6425d37d9b.tar.gz yuescript-827c3736f357e09168fc108e8e740c6425d37d9b.tar.bz2 yuescript-827c3736f357e09168fc108e8e740c6425d37d9b.zip | |
fix a wrong code generating issue, update builtin Lua.
Diffstat (limited to '')
| -rw-r--r-- | src/3rdParty/lua/lapi.c | 12 | ||||
| -rw-r--r-- | src/3rdParty/lua/lauxlib.h | 8 | ||||
| -rw-r--r-- | src/3rdParty/lua/lbaselib.c | 3 | ||||
| -rw-r--r-- | src/3rdParty/lua/ldebug.c | 2 | ||||
| -rw-r--r-- | src/3rdParty/lua/ldo.c | 77 | ||||
| -rw-r--r-- | src/3rdParty/lua/ldo.h | 17 | ||||
| -rw-r--r-- | src/3rdParty/lua/llimits.h | 14 | ||||
| -rw-r--r-- | src/3rdParty/lua/lobject.h | 2 | ||||
| -rw-r--r-- | src/3rdParty/lua/lstrlib.c | 112 | ||||
| -rw-r--r-- | src/3rdParty/lua/ltable.c | 18 | ||||
| -rw-r--r-- | src/3rdParty/lua/ltablib.c | 3 | ||||
| -rw-r--r-- | src/3rdParty/lua/lua.c | 37 | ||||
| -rw-r--r-- | src/3rdParty/lua/lutf8lib.c | 11 | ||||
| -rw-r--r-- | src/3rdParty/lua/lvm.c | 36 | ||||
| -rwxr-xr-x | src/yuescript/yue_compiler.cpp | 3 |
15 files changed, 224 insertions, 131 deletions
diff --git a/src/3rdParty/lua/lapi.c b/src/3rdParty/lua/lapi.c index 3467891..071a06f 100644 --- a/src/3rdParty/lua/lapi.c +++ b/src/3rdParty/lua/lapi.c | |||
| @@ -86,10 +86,12 @@ static TValue *index2value (lua_State *L, int idx) { | |||
| 86 | } | 86 | } |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | |||
| 90 | |||
| 89 | /* | 91 | /* |
| 90 | ** Convert a valid actual index (not a pseudo-index) to its address. | 92 | ** Convert a valid actual index (not a pseudo-index) to its address. |
| 91 | */ | 93 | */ |
| 92 | static StkId index2stack (lua_State *L, int idx) { | 94 | l_sinline StkId index2stack (lua_State *L, int idx) { |
| 93 | CallInfo *ci = L->ci; | 95 | CallInfo *ci = L->ci; |
| 94 | if (idx > 0) { | 96 | if (idx > 0) { |
| 95 | StkId o = ci->func + idx; | 97 | StkId o = ci->func + idx; |
| @@ -226,7 +228,7 @@ LUA_API void lua_closeslot (lua_State *L, int idx) { | |||
| 226 | ** Note that we move(copy) only the value inside the stack. | 228 | ** Note that we move(copy) only the value inside the stack. |
| 227 | ** (We do not move additional fields that may exist.) | 229 | ** (We do not move additional fields that may exist.) |
| 228 | */ | 230 | */ |
| 229 | static void reverse (lua_State *L, StkId from, StkId to) { | 231 | l_sinline void reverse (lua_State *L, StkId from, StkId to) { |
| 230 | for (; from < to; from++, to--) { | 232 | for (; from < to; from++, to--) { |
| 231 | TValue temp; | 233 | TValue temp; |
| 232 | setobj(L, &temp, s2v(from)); | 234 | setobj(L, &temp, s2v(from)); |
| @@ -446,7 +448,7 @@ LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { | |||
| 446 | } | 448 | } |
| 447 | 449 | ||
| 448 | 450 | ||
| 449 | static void *touserdata (const TValue *o) { | 451 | l_sinline void *touserdata (const TValue *o) { |
| 450 | switch (ttype(o)) { | 452 | switch (ttype(o)) { |
| 451 | case LUA_TUSERDATA: return getudatamem(uvalue(o)); | 453 | case LUA_TUSERDATA: return getudatamem(uvalue(o)); |
| 452 | case LUA_TLIGHTUSERDATA: return pvalue(o); | 454 | case LUA_TLIGHTUSERDATA: return pvalue(o); |
| @@ -638,7 +640,7 @@ LUA_API int lua_pushthread (lua_State *L) { | |||
| 638 | */ | 640 | */ |
| 639 | 641 | ||
| 640 | 642 | ||
| 641 | static int auxgetstr (lua_State *L, const TValue *t, const char *k) { | 643 | l_sinline int auxgetstr (lua_State *L, const TValue *t, const char *k) { |
| 642 | const TValue *slot; | 644 | const TValue *slot; |
| 643 | TString *str = luaS_new(L, k); | 645 | TString *str = luaS_new(L, k); |
| 644 | if (luaV_fastget(L, t, str, slot, luaH_getstr)) { | 646 | if (luaV_fastget(L, t, str, slot, luaH_getstr)) { |
| @@ -713,7 +715,7 @@ LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { | |||
| 713 | } | 715 | } |
| 714 | 716 | ||
| 715 | 717 | ||
| 716 | static int finishrawget (lua_State *L, const TValue *val) { | 718 | l_sinline int finishrawget (lua_State *L, const TValue *val) { |
| 717 | if (isempty(val)) /* avoid copying empty items to the stack */ | 719 | if (isempty(val)) /* avoid copying empty items to the stack */ |
| 718 | setnilvalue(s2v(L->top)); | 720 | setnilvalue(s2v(L->top)); |
| 719 | else | 721 | else |
diff --git a/src/3rdParty/lua/lauxlib.h b/src/3rdParty/lua/lauxlib.h index 72f70e7..6f9695e 100644 --- a/src/3rdParty/lua/lauxlib.h +++ b/src/3rdParty/lua/lauxlib.h | |||
| @@ -154,6 +154,14 @@ LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, | |||
| 154 | #define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) | 154 | #define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) |
| 155 | 155 | ||
| 156 | 156 | ||
| 157 | /* | ||
| 158 | ** Perform arithmetic operations on lua_Integer values with wrap-around | ||
| 159 | ** semantics, as the Lua core does. | ||
| 160 | */ | ||
| 161 | #define luaL_intop(op,v1,v2) \ | ||
| 162 | ((lua_Integer)((lua_Unsigned)(v1) op (lua_Unsigned)(v2))) | ||
| 163 | |||
| 164 | |||
| 157 | /* push the value used to represent failure/error */ | 165 | /* push the value used to represent failure/error */ |
| 158 | #define luaL_pushfail(L) lua_pushnil(L) | 166 | #define luaL_pushfail(L) lua_pushnil(L) |
| 159 | 167 | ||
diff --git a/src/3rdParty/lua/lbaselib.c b/src/3rdParty/lua/lbaselib.c index fd6687e..912c4cc 100644 --- a/src/3rdParty/lua/lbaselib.c +++ b/src/3rdParty/lua/lbaselib.c | |||
| @@ -285,7 +285,8 @@ static int luaB_pairs (lua_State *L) { | |||
| 285 | ** Traversal function for 'ipairs' | 285 | ** Traversal function for 'ipairs' |
| 286 | */ | 286 | */ |
| 287 | static int ipairsaux (lua_State *L) { | 287 | static int ipairsaux (lua_State *L) { |
| 288 | lua_Integer i = luaL_checkinteger(L, 2) + 1; | 288 | lua_Integer i = luaL_checkinteger(L, 2); |
| 289 | i = luaL_intop(+, i, 1); | ||
| 289 | lua_pushinteger(L, i); | 290 | lua_pushinteger(L, i); |
| 290 | return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2; | 291 | return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2; |
| 291 | } | 292 | } |
diff --git a/src/3rdParty/lua/ldebug.c b/src/3rdParty/lua/ldebug.c index 433a875..dde4669 100644 --- a/src/3rdParty/lua/ldebug.c +++ b/src/3rdParty/lua/ldebug.c | |||
| @@ -64,7 +64,7 @@ static int getbaseline (const Proto *f, int pc, int *basepc) { | |||
| 64 | } | 64 | } |
| 65 | else { | 65 | else { |
| 66 | int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */ | 66 | int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */ |
| 67 | /* estimate must be a lower bond of the correct base */ | 67 | /* estimate must be a lower bound of the correct base */ |
| 68 | lua_assert(i < 0 || | 68 | lua_assert(i < 0 || |
| 69 | (i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc)); | 69 | (i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc)); |
| 70 | while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc) | 70 | while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc) |
diff --git a/src/3rdParty/lua/ldo.c b/src/3rdParty/lua/ldo.c index 93fcbb1..88b20f9 100644 --- a/src/3rdParty/lua/ldo.c +++ b/src/3rdParty/lua/ldo.c | |||
| @@ -387,15 +387,17 @@ static void rethook (lua_State *L, CallInfo *ci, int nres) { | |||
| 387 | ** stack, below original 'func', so that 'luaD_precall' can call it. Raise | 387 | ** stack, below original 'func', so that 'luaD_precall' can call it. Raise |
| 388 | ** an error if there is no '__call' metafield. | 388 | ** an error if there is no '__call' metafield. |
| 389 | */ | 389 | */ |
| 390 | void luaD_tryfuncTM (lua_State *L, StkId func) { | 390 | StkId luaD_tryfuncTM (lua_State *L, StkId func) { |
| 391 | const TValue *tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); | 391 | const TValue *tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); |
| 392 | StkId p; | 392 | StkId p; |
| 393 | checkstackGCp(L, 1, func); /* space for metamethod */ | ||
| 393 | if (l_unlikely(ttisnil(tm))) | 394 | if (l_unlikely(ttisnil(tm))) |
| 394 | luaG_callerror(L, s2v(func)); /* nothing to call */ | 395 | luaG_callerror(L, s2v(func)); /* nothing to call */ |
| 395 | for (p = L->top; p > func; p--) /* open space for metamethod */ | 396 | for (p = L->top; p > func; p--) /* open space for metamethod */ |
| 396 | setobjs2s(L, p, p-1); | 397 | setobjs2s(L, p, p-1); |
| 397 | L->top++; /* stack space pre-allocated by the caller */ | 398 | L->top++; /* stack space pre-allocated by the caller */ |
| 398 | setobj2s(L, func, tm); /* metamethod is the new function to be called */ | 399 | setobj2s(L, func, tm); /* metamethod is the new function to be called */ |
| 400 | return func; | ||
| 399 | } | 401 | } |
| 400 | 402 | ||
| 401 | 403 | ||
| @@ -405,7 +407,7 @@ void luaD_tryfuncTM (lua_State *L, StkId func) { | |||
| 405 | ** expressions, multiple results for tail calls/single parameters) | 407 | ** expressions, multiple results for tail calls/single parameters) |
| 406 | ** separated. | 408 | ** separated. |
| 407 | */ | 409 | */ |
| 408 | static void moveresults (lua_State *L, StkId res, int nres, int wanted) { | 410 | l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) { |
| 409 | StkId firstresult; | 411 | StkId firstresult; |
| 410 | int i; | 412 | int i; |
| 411 | switch (wanted) { /* handle typical cases separately */ | 413 | switch (wanted) { /* handle typical cases separately */ |
| @@ -474,33 +476,36 @@ void luaD_poscall (lua_State *L, CallInfo *ci, int nres) { | |||
| 474 | 476 | ||
| 475 | 477 | ||
| 476 | /* | 478 | /* |
| 477 | ** In a tail call, move function and parameters to previous call frame. | 479 | ** Prepare a function for a tail call, building its call info on top |
| 478 | ** (This is done only when no more errors can occur before entering the | 480 | ** of the current call info. 'narg1' is the number of arguments plus 1 |
| 479 | ** new function, to keep debug information always consistent.) | 481 | ** (so that it includes the function itself). |
| 480 | */ | 482 | */ |
| 481 | static void moveparams (lua_State *L, StkId prevf, StkId func) { | 483 | void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int narg1) { |
| 484 | Proto *p = clLvalue(s2v(func))->p; | ||
| 485 | int fsize = p->maxstacksize; /* frame size */ | ||
| 486 | int nfixparams = p->numparams; | ||
| 482 | int i; | 487 | int i; |
| 483 | for (i = 0; func + i < L->top; i++) /* move down function and arguments */ | 488 | for (i = 0; i < narg1; i++) /* move down function and arguments */ |
| 484 | setobjs2s(L, prevf + i, func + i); | 489 | setobjs2s(L, ci->func + i, func + i); |
| 485 | L->top = prevf + i; /* correct top */ | 490 | checkstackGC(L, fsize); |
| 486 | } | 491 | func = ci->func; /* moved-down function */ |
| 487 | 492 | for (; narg1 <= nfixparams; narg1++) | |
| 488 | 493 | setnilvalue(s2v(func + narg1)); /* complete missing arguments */ | |
| 489 | static CallInfo *prepCallInfo (lua_State *L, StkId func, int retdel, | 494 | ci->top = func + 1 + fsize; /* top for new function */ |
| 490 | int mask) { | 495 | lua_assert(ci->top <= L->stack_last); |
| 491 | CallInfo *ci; | 496 | ci->u.l.savedpc = p->code; /* starting point */ |
| 492 | if (isdelta(retdel)) { /* tail call? */ | 497 | ci->callstatus |= CIST_TAIL; |
| 493 | ci = L->ci; /* reuse stack frame */ | 498 | L->top = func + narg1; /* set top */ |
| 494 | ci->func -= retdel2delta(retdel); /* correct 'func' */ | 499 | } |
| 495 | ci->callstatus |= mask | CIST_TAIL; | 500 | |
| 496 | moveparams(L, ci->func, func); | 501 | |
| 497 | } | 502 | l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nret, |
| 498 | else { /* regular call */ | 503 | int mask, StkId top) { |
| 499 | ci = L->ci = next_ci(L); /* new frame */ | 504 | CallInfo *ci = L->ci = next_ci(L); /* new frame */ |
| 500 | ci->func = func; | 505 | ci->func = func; |
| 501 | ci->nresults = retdel; | 506 | ci->nresults = nret; |
| 502 | ci->callstatus = mask; | 507 | ci->callstatus = mask; |
| 503 | } | 508 | ci->top = top; |
| 504 | return ci; | 509 | return ci; |
| 505 | } | 510 | } |
| 506 | 511 | ||
| @@ -512,12 +517,8 @@ static CallInfo *prepCallInfo (lua_State *L, StkId func, int retdel, | |||
| 512 | ** to be executed, if it was a Lua function. Otherwise (a C function) | 517 | ** to be executed, if it was a Lua function. Otherwise (a C function) |
| 513 | ** returns NULL, with all the results on the stack, starting at the | 518 | ** returns NULL, with all the results on the stack, starting at the |
| 514 | ** original function position. | 519 | ** original function position. |
| 515 | ** For regular calls, 'delta1' is 0. For tail calls, 'delta1' is the | ||
| 516 | ** 'delta' (correction of base for vararg functions) plus 1, so that it | ||
| 517 | ** cannot be zero. Like 'moveparams', this correction can only be done | ||
| 518 | ** when no more errors can occur in the call. | ||
| 519 | */ | 520 | */ |
| 520 | CallInfo *luaD_precall (lua_State *L, StkId func, int retdel) { | 521 | CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { |
| 521 | lua_CFunction f; | 522 | lua_CFunction f; |
| 522 | retry: | 523 | retry: |
| 523 | switch (ttypetag(s2v(func))) { | 524 | switch (ttypetag(s2v(func))) { |
| @@ -530,8 +531,8 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int retdel) { | |||
| 530 | int n; /* number of returns */ | 531 | int n; /* number of returns */ |
| 531 | CallInfo *ci; | 532 | CallInfo *ci; |
| 532 | checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ | 533 | checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ |
| 533 | ci = prepCallInfo(L, func, retdel, CIST_C); | 534 | L->ci = ci = prepCallInfo(L, func, nresults, CIST_C, |
| 534 | ci->top = L->top + LUA_MINSTACK; | 535 | L->top + LUA_MINSTACK); |
| 535 | lua_assert(ci->top <= L->stack_last); | 536 | lua_assert(ci->top <= L->stack_last); |
| 536 | if (l_unlikely(L->hookmask & LUA_MASKCALL)) { | 537 | if (l_unlikely(L->hookmask & LUA_MASKCALL)) { |
| 537 | int narg = cast_int(L->top - func) - 1; | 538 | int narg = cast_int(L->top - func) - 1; |
| @@ -551,17 +552,15 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int retdel) { | |||
| 551 | int nfixparams = p->numparams; | 552 | int nfixparams = p->numparams; |
| 552 | int fsize = p->maxstacksize; /* frame size */ | 553 | int fsize = p->maxstacksize; /* frame size */ |
| 553 | checkstackGCp(L, fsize, func); | 554 | checkstackGCp(L, fsize, func); |
| 554 | ci = prepCallInfo(L, func, retdel, 0); | 555 | L->ci = ci = prepCallInfo(L, func, nresults, 0, func + 1 + fsize); |
| 555 | ci->u.l.savedpc = p->code; /* starting point */ | 556 | ci->u.l.savedpc = p->code; /* starting point */ |
| 556 | ci->top = func + 1 + fsize; | ||
| 557 | for (; narg < nfixparams; narg++) | 557 | for (; narg < nfixparams; narg++) |
| 558 | setnilvalue(s2v(L->top++)); /* complete missing arguments */ | 558 | setnilvalue(s2v(L->top++)); /* complete missing arguments */ |
| 559 | lua_assert(ci->top <= L->stack_last); | 559 | lua_assert(ci->top <= L->stack_last); |
| 560 | return ci; | 560 | return ci; |
| 561 | } | 561 | } |
| 562 | default: { /* not a function */ | 562 | default: { /* not a function */ |
| 563 | checkstackGCp(L, 1, func); /* space for metamethod */ | 563 | func = luaD_tryfuncTM(L, func); /* try to get '__call' metamethod */ |
| 564 | luaD_tryfuncTM(L, func); /* try to get '__call' metamethod */ | ||
| 565 | goto retry; /* try again with metamethod */ | 564 | goto retry; /* try again with metamethod */ |
| 566 | } | 565 | } |
| 567 | } | 566 | } |
| @@ -573,7 +572,7 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int retdel) { | |||
| 573 | ** number of recursive invocations in the C stack) or nyci (the same | 572 | ** number of recursive invocations in the C stack) or nyci (the same |
| 574 | ** plus increment number of non-yieldable calls). | 573 | ** plus increment number of non-yieldable calls). |
| 575 | */ | 574 | */ |
| 576 | static void ccall (lua_State *L, StkId func, int nResults, int inc) { | 575 | l_sinline void ccall (lua_State *L, StkId func, int nResults, int inc) { |
| 577 | CallInfo *ci; | 576 | CallInfo *ci; |
| 578 | L->nCcalls += inc; | 577 | L->nCcalls += inc; |
| 579 | if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) | 578 | if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) |
diff --git a/src/3rdParty/lua/ldo.h b/src/3rdParty/lua/ldo.h index 49fbb49..9fb772f 100644 --- a/src/3rdParty/lua/ldo.h +++ b/src/3rdParty/lua/ldo.h | |||
| @@ -49,18 +49,6 @@ | |||
| 49 | luaD_checkstackaux(L, (fsize), luaC_checkGC(L), (void)0) | 49 | luaD_checkstackaux(L, (fsize), luaC_checkGC(L), (void)0) |
| 50 | 50 | ||
| 51 | 51 | ||
| 52 | /* | ||
| 53 | ** 'luaD_precall' is used for regular calls, when it needs the | ||
| 54 | ** number of results, and in tail calls, when it needs the 'delta' | ||
| 55 | ** (correction of base for vararg functions). The argument 'retdel' | ||
| 56 | ** codes these two options. A number of results is represented by | ||
| 57 | ** itself, while a delta is represented by 'delta2retdel(delta)' | ||
| 58 | */ | ||
| 59 | #define delta2retdel(d) (-(d) + LUA_MULTRET - 1) | ||
| 60 | #define retdel2delta(d) (-(d) + LUA_MULTRET - 1) | ||
| 61 | #define isdelta(rd) ((rd) < LUA_MULTRET) | ||
| 62 | |||
| 63 | |||
| 64 | /* type of protected functions, to be ran by 'runprotected' */ | 52 | /* type of protected functions, to be ran by 'runprotected' */ |
| 65 | typedef void (*Pfunc) (lua_State *L, void *ud); | 53 | typedef void (*Pfunc) (lua_State *L, void *ud); |
| 66 | 54 | ||
| @@ -70,10 +58,11 @@ LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, | |||
| 70 | LUAI_FUNC void luaD_hook (lua_State *L, int event, int line, | 58 | LUAI_FUNC void luaD_hook (lua_State *L, int event, int line, |
| 71 | int fTransfer, int nTransfer); | 59 | int fTransfer, int nTransfer); |
| 72 | LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci); | 60 | LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci); |
| 73 | LUAI_FUNC CallInfo *luaD_precall (lua_State *L, StkId func, int retdel); | 61 | LUAI_FUNC void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int n); |
| 62 | LUAI_FUNC CallInfo *luaD_precall (lua_State *L, StkId func, int nResults); | ||
| 74 | LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); | 63 | LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); |
| 75 | LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); | 64 | LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); |
| 76 | LUAI_FUNC void luaD_tryfuncTM (lua_State *L, StkId func); | 65 | LUAI_FUNC StkId luaD_tryfuncTM (lua_State *L, StkId func); |
| 77 | LUAI_FUNC int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status); | 66 | LUAI_FUNC int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status); |
| 78 | LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, | 67 | LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, |
| 79 | ptrdiff_t oldtop, ptrdiff_t ef); | 68 | ptrdiff_t oldtop, ptrdiff_t ef); |
diff --git a/src/3rdParty/lua/llimits.h b/src/3rdParty/lua/llimits.h index 025f1c8..6c56ba5 100644 --- a/src/3rdParty/lua/llimits.h +++ b/src/3rdParty/lua/llimits.h | |||
| @@ -166,6 +166,20 @@ typedef LUAI_UACINT l_uacInt; | |||
| 166 | 166 | ||
| 167 | 167 | ||
| 168 | /* | 168 | /* |
| 169 | ** Inline functions | ||
| 170 | */ | ||
| 171 | #if !defined(LUA_USE_C89) | ||
| 172 | #define l_inline inline | ||
| 173 | #elif defined(__GNUC__) | ||
| 174 | #define l_inline __inline__ | ||
| 175 | #else | ||
| 176 | #define l_inline /* empty */ | ||
| 177 | #endif | ||
| 178 | |||
| 179 | #define l_sinline static l_inline | ||
| 180 | |||
| 181 | |||
| 182 | /* | ||
| 169 | ** type for virtual-machine instructions; | 183 | ** type for virtual-machine instructions; |
| 170 | ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) | 184 | ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) |
| 171 | */ | 185 | */ |
diff --git a/src/3rdParty/lua/lobject.h b/src/3rdParty/lua/lobject.h index a1b4554..0e05b3e 100644 --- a/src/3rdParty/lua/lobject.h +++ b/src/3rdParty/lua/lobject.h | |||
| @@ -68,7 +68,7 @@ typedef struct TValue { | |||
| 68 | 68 | ||
| 69 | 69 | ||
| 70 | #define val_(o) ((o)->value_) | 70 | #define val_(o) ((o)->value_) |
| 71 | #define valraw(o) (&val_(o)) | 71 | #define valraw(o) (val_(o)) |
| 72 | 72 | ||
| 73 | 73 | ||
| 74 | /* raw type tag of a TValue */ | 74 | /* raw type tag of a TValue */ |
diff --git a/src/3rdParty/lua/lstrlib.c b/src/3rdParty/lua/lstrlib.c index 74501f7..0b4fdbb 100644 --- a/src/3rdParty/lua/lstrlib.c +++ b/src/3rdParty/lua/lstrlib.c | |||
| @@ -1090,13 +1090,31 @@ static int lua_number2strx (lua_State *L, char *buff, int sz, | |||
| 1090 | 1090 | ||
| 1091 | 1091 | ||
| 1092 | /* valid flags in a format specification */ | 1092 | /* valid flags in a format specification */ |
| 1093 | #if !defined(L_FMTFLAGS) | 1093 | #if !defined(L_FMTFLAGSF) |
| 1094 | #define L_FMTFLAGS "-+ #0" | 1094 | |
| 1095 | /* valid flags for a, A, e, E, f, F, g, and G conversions */ | ||
| 1096 | #define L_FMTFLAGSF "-+#0 " | ||
| 1097 | |||
| 1098 | /* valid flags for o, x, and X conversions */ | ||
| 1099 | #define L_FMTFLAGSX "-#0" | ||
| 1100 | |||
| 1101 | /* valid flags for d and i conversions */ | ||
| 1102 | #define L_FMTFLAGSI "-+0 " | ||
| 1103 | |||
| 1104 | /* valid flags for u conversions */ | ||
| 1105 | #define L_FMTFLAGSU "-0" | ||
| 1106 | |||
| 1107 | /* valid flags for c, p, and s conversions */ | ||
| 1108 | #define L_FMTFLAGSC "-" | ||
| 1109 | |||
| 1095 | #endif | 1110 | #endif |
| 1096 | 1111 | ||
| 1097 | 1112 | ||
| 1098 | /* | 1113 | /* |
| 1099 | ** maximum size of each format specification (such as "%-099.99d") | 1114 | ** Maximum size of each format specification (such as "%-099.99d"): |
| 1115 | ** Initial '%', flags (up to 5), width (2), period, precision (2), | ||
| 1116 | ** length modifier (8), conversion specifier, and final '\0', plus some | ||
| 1117 | ** extra. | ||
| 1100 | */ | 1118 | */ |
| 1101 | #define MAX_FORMAT 32 | 1119 | #define MAX_FORMAT 32 |
| 1102 | 1120 | ||
| @@ -1189,25 +1207,53 @@ static void addliteral (lua_State *L, luaL_Buffer *b, int arg) { | |||
| 1189 | } | 1207 | } |
| 1190 | 1208 | ||
| 1191 | 1209 | ||
| 1192 | static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { | 1210 | static const char *get2digits (const char *s) { |
| 1193 | const char *p = strfrmt; | 1211 | if (isdigit(uchar(*s))) { |
| 1194 | while (*p != '\0' && strchr(L_FMTFLAGS, *p) != NULL) p++; /* skip flags */ | 1212 | s++; |
| 1195 | if ((size_t)(p - strfrmt) >= sizeof(L_FMTFLAGS)/sizeof(char)) | 1213 | if (isdigit(uchar(*s))) s++; /* (2 digits at most) */ |
| 1196 | luaL_error(L, "invalid format (repeated flags)"); | 1214 | } |
| 1197 | if (isdigit(uchar(*p))) p++; /* skip width */ | 1215 | return s; |
| 1198 | if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ | 1216 | } |
| 1199 | if (*p == '.') { | 1217 | |
| 1200 | p++; | 1218 | |
| 1201 | if (isdigit(uchar(*p))) p++; /* skip precision */ | 1219 | /* |
| 1202 | if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ | 1220 | ** Check whether a conversion specification is valid. When called, |
| 1221 | ** first character in 'form' must be '%' and last character must | ||
| 1222 | ** be a valid conversion specifier. 'flags' are the accepted flags; | ||
| 1223 | ** 'precision' signals whether to accept a precision. | ||
| 1224 | */ | ||
| 1225 | static void checkformat (lua_State *L, const char *form, const char *flags, | ||
| 1226 | int precision) { | ||
| 1227 | const char *spec = form + 1; /* skip '%' */ | ||
| 1228 | spec += strspn(spec, flags); /* skip flags */ | ||
| 1229 | if (*spec != '0') { /* a width cannot start with '0' */ | ||
| 1230 | spec = get2digits(spec); /* skip width */ | ||
| 1231 | if (*spec == '.' && precision) { | ||
| 1232 | spec++; | ||
| 1233 | spec = get2digits(spec); /* skip precision */ | ||
| 1234 | } | ||
| 1203 | } | 1235 | } |
| 1204 | if (isdigit(uchar(*p))) | 1236 | if (!isalpha(uchar(*spec))) /* did not go to the end? */ |
| 1205 | luaL_error(L, "invalid format (width or precision too long)"); | 1237 | luaL_error(L, "invalid conversion specification: '%s'", form); |
| 1238 | } | ||
| 1239 | |||
| 1240 | |||
| 1241 | /* | ||
| 1242 | ** Get a conversion specification and copy it to 'form'. | ||
| 1243 | ** Return the address of its last character. | ||
| 1244 | */ | ||
| 1245 | static const char *getformat (lua_State *L, const char *strfrmt, | ||
| 1246 | char *form) { | ||
| 1247 | /* spans flags, width, and precision ('0' is included as a flag) */ | ||
| 1248 | size_t len = strspn(strfrmt, L_FMTFLAGSF "123456789."); | ||
| 1249 | len++; /* adds following character (should be the specifier) */ | ||
| 1250 | /* still needs space for '%', '\0', plus a length modifier */ | ||
| 1251 | if (len >= MAX_FORMAT - 10) | ||
| 1252 | luaL_error(L, "invalid format (too long)"); | ||
| 1206 | *(form++) = '%'; | 1253 | *(form++) = '%'; |
| 1207 | memcpy(form, strfrmt, ((p - strfrmt) + 1) * sizeof(char)); | 1254 | memcpy(form, strfrmt, len * sizeof(char)); |
| 1208 | form += (p - strfrmt) + 1; | 1255 | *(form + len) = '\0'; |
| 1209 | *form = '\0'; | 1256 | return strfrmt + len - 1; |
| 1210 | return p; | ||
| 1211 | } | 1257 | } |
| 1212 | 1258 | ||
| 1213 | 1259 | ||
| @@ -1230,6 +1276,7 @@ static int str_format (lua_State *L) { | |||
| 1230 | size_t sfl; | 1276 | size_t sfl; |
| 1231 | const char *strfrmt = luaL_checklstring(L, arg, &sfl); | 1277 | const char *strfrmt = luaL_checklstring(L, arg, &sfl); |
| 1232 | const char *strfrmt_end = strfrmt+sfl; | 1278 | const char *strfrmt_end = strfrmt+sfl; |
| 1279 | const char *flags; | ||
| 1233 | luaL_Buffer b; | 1280 | luaL_Buffer b; |
| 1234 | luaL_buffinit(L, &b); | 1281 | luaL_buffinit(L, &b); |
| 1235 | while (strfrmt < strfrmt_end) { | 1282 | while (strfrmt < strfrmt_end) { |
| @@ -1239,25 +1286,35 @@ static int str_format (lua_State *L) { | |||
| 1239 | luaL_addchar(&b, *strfrmt++); /* %% */ | 1286 | luaL_addchar(&b, *strfrmt++); /* %% */ |
| 1240 | else { /* format item */ | 1287 | else { /* format item */ |
| 1241 | char form[MAX_FORMAT]; /* to store the format ('%...') */ | 1288 | char form[MAX_FORMAT]; /* to store the format ('%...') */ |
| 1242 | int maxitem = MAX_ITEM; | 1289 | int maxitem = MAX_ITEM; /* maximum length for the result */ |
| 1243 | char *buff = luaL_prepbuffsize(&b, maxitem); /* to put formatted item */ | 1290 | char *buff = luaL_prepbuffsize(&b, maxitem); /* to put result */ |
| 1244 | int nb = 0; /* number of bytes in added item */ | 1291 | int nb = 0; /* number of bytes in result */ |
| 1245 | if (++arg > top) | 1292 | if (++arg > top) |
| 1246 | return luaL_argerror(L, arg, "no value"); | 1293 | return luaL_argerror(L, arg, "no value"); |
| 1247 | strfrmt = scanformat(L, strfrmt, form); | 1294 | strfrmt = getformat(L, strfrmt, form); |
| 1248 | switch (*strfrmt++) { | 1295 | switch (*strfrmt++) { |
| 1249 | case 'c': { | 1296 | case 'c': { |
| 1297 | checkformat(L, form, L_FMTFLAGSC, 0); | ||
| 1250 | nb = l_sprintf(buff, maxitem, form, (int)luaL_checkinteger(L, arg)); | 1298 | nb = l_sprintf(buff, maxitem, form, (int)luaL_checkinteger(L, arg)); |
| 1251 | break; | 1299 | break; |
| 1252 | } | 1300 | } |
| 1253 | case 'd': case 'i': | 1301 | case 'd': case 'i': |
| 1254 | case 'o': case 'u': case 'x': case 'X': { | 1302 | flags = L_FMTFLAGSI; |
| 1303 | goto intcase; | ||
| 1304 | case 'u': | ||
| 1305 | flags = L_FMTFLAGSU; | ||
| 1306 | goto intcase; | ||
| 1307 | case 'o': case 'x': case 'X': | ||
| 1308 | flags = L_FMTFLAGSX; | ||
| 1309 | intcase: { | ||
| 1255 | lua_Integer n = luaL_checkinteger(L, arg); | 1310 | lua_Integer n = luaL_checkinteger(L, arg); |
| 1311 | checkformat(L, form, flags, 1); | ||
| 1256 | addlenmod(form, LUA_INTEGER_FRMLEN); | 1312 | addlenmod(form, LUA_INTEGER_FRMLEN); |
| 1257 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACINT)n); | 1313 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACINT)n); |
| 1258 | break; | 1314 | break; |
| 1259 | } | 1315 | } |
| 1260 | case 'a': case 'A': | 1316 | case 'a': case 'A': |
| 1317 | checkformat(L, form, L_FMTFLAGSF, 1); | ||
| 1261 | addlenmod(form, LUA_NUMBER_FRMLEN); | 1318 | addlenmod(form, LUA_NUMBER_FRMLEN); |
| 1262 | nb = lua_number2strx(L, buff, maxitem, form, | 1319 | nb = lua_number2strx(L, buff, maxitem, form, |
| 1263 | luaL_checknumber(L, arg)); | 1320 | luaL_checknumber(L, arg)); |
| @@ -1268,12 +1325,14 @@ static int str_format (lua_State *L) { | |||
| 1268 | /* FALLTHROUGH */ | 1325 | /* FALLTHROUGH */ |
| 1269 | case 'e': case 'E': case 'g': case 'G': { | 1326 | case 'e': case 'E': case 'g': case 'G': { |
| 1270 | lua_Number n = luaL_checknumber(L, arg); | 1327 | lua_Number n = luaL_checknumber(L, arg); |
| 1328 | checkformat(L, form, L_FMTFLAGSF, 1); | ||
| 1271 | addlenmod(form, LUA_NUMBER_FRMLEN); | 1329 | addlenmod(form, LUA_NUMBER_FRMLEN); |
| 1272 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); | 1330 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); |
| 1273 | break; | 1331 | break; |
| 1274 | } | 1332 | } |
| 1275 | case 'p': { | 1333 | case 'p': { |
| 1276 | const void *p = lua_topointer(L, arg); | 1334 | const void *p = lua_topointer(L, arg); |
| 1335 | checkformat(L, form, L_FMTFLAGSC, 0); | ||
| 1277 | if (p == NULL) { /* avoid calling 'printf' with argument NULL */ | 1336 | if (p == NULL) { /* avoid calling 'printf' with argument NULL */ |
| 1278 | p = "(null)"; /* result */ | 1337 | p = "(null)"; /* result */ |
| 1279 | form[strlen(form) - 1] = 's'; /* format it as a string */ | 1338 | form[strlen(form) - 1] = 's'; /* format it as a string */ |
| @@ -1294,7 +1353,8 @@ static int str_format (lua_State *L) { | |||
| 1294 | luaL_addvalue(&b); /* keep entire string */ | 1353 | luaL_addvalue(&b); /* keep entire string */ |
| 1295 | else { | 1354 | else { |
| 1296 | luaL_argcheck(L, l == strlen(s), arg, "string contains zeros"); | 1355 | luaL_argcheck(L, l == strlen(s), arg, "string contains zeros"); |
| 1297 | if (!strchr(form, '.') && l >= 100) { | 1356 | checkformat(L, form, L_FMTFLAGSC, 1); |
| 1357 | if (strchr(form, '.') == NULL && l >= 100) { | ||
| 1298 | /* no precision and string is too long to be formatted */ | 1358 | /* no precision and string is too long to be formatted */ |
| 1299 | luaL_addvalue(&b); /* keep entire string */ | 1359 | luaL_addvalue(&b); /* keep entire string */ |
| 1300 | } | 1360 | } |
diff --git a/src/3rdParty/lua/ltable.c b/src/3rdParty/lua/ltable.c index af87836..c82286d 100644 --- a/src/3rdParty/lua/ltable.c +++ b/src/3rdParty/lua/ltable.c | |||
| @@ -150,22 +150,22 @@ static int l_hashfloat (lua_Number n) { | |||
| 150 | ** and value in 'vkl') so that we can call it on keys inserted into | 150 | ** and value in 'vkl') so that we can call it on keys inserted into |
| 151 | ** nodes. | 151 | ** nodes. |
| 152 | */ | 152 | */ |
| 153 | static Node *mainposition (const Table *t, int ktt, const Value *kvl) { | 153 | static Node *mainposition (const Table *t, int ktt, const Value kvl) { |
| 154 | switch (withvariant(ktt)) { | 154 | switch (withvariant(ktt)) { |
| 155 | case LUA_VNUMINT: { | 155 | case LUA_VNUMINT: { |
| 156 | lua_Integer key = ivalueraw(*kvl); | 156 | lua_Integer key = ivalueraw(kvl); |
| 157 | return hashint(t, key); | 157 | return hashint(t, key); |
| 158 | } | 158 | } |
| 159 | case LUA_VNUMFLT: { | 159 | case LUA_VNUMFLT: { |
| 160 | lua_Number n = fltvalueraw(*kvl); | 160 | lua_Number n = fltvalueraw(kvl); |
| 161 | return hashmod(t, l_hashfloat(n)); | 161 | return hashmod(t, l_hashfloat(n)); |
| 162 | } | 162 | } |
| 163 | case LUA_VSHRSTR: { | 163 | case LUA_VSHRSTR: { |
| 164 | TString *ts = tsvalueraw(*kvl); | 164 | TString *ts = tsvalueraw(kvl); |
| 165 | return hashstr(t, ts); | 165 | return hashstr(t, ts); |
| 166 | } | 166 | } |
| 167 | case LUA_VLNGSTR: { | 167 | case LUA_VLNGSTR: { |
| 168 | TString *ts = tsvalueraw(*kvl); | 168 | TString *ts = tsvalueraw(kvl); |
| 169 | return hashpow2(t, luaS_hashlongstr(ts)); | 169 | return hashpow2(t, luaS_hashlongstr(ts)); |
| 170 | } | 170 | } |
| 171 | case LUA_VFALSE: | 171 | case LUA_VFALSE: |
| @@ -173,15 +173,15 @@ static Node *mainposition (const Table *t, int ktt, const Value *kvl) { | |||
| 173 | case LUA_VTRUE: | 173 | case LUA_VTRUE: |
| 174 | return hashboolean(t, 1); | 174 | return hashboolean(t, 1); |
| 175 | case LUA_VLIGHTUSERDATA: { | 175 | case LUA_VLIGHTUSERDATA: { |
| 176 | void *p = pvalueraw(*kvl); | 176 | void *p = pvalueraw(kvl); |
| 177 | return hashpointer(t, p); | 177 | return hashpointer(t, p); |
| 178 | } | 178 | } |
| 179 | case LUA_VLCF: { | 179 | case LUA_VLCF: { |
| 180 | lua_CFunction f = fvalueraw(*kvl); | 180 | lua_CFunction f = fvalueraw(kvl); |
| 181 | return hashpointer(t, f); | 181 | return hashpointer(t, f); |
| 182 | } | 182 | } |
| 183 | default: { | 183 | default: { |
| 184 | GCObject *o = gcvalueraw(*kvl); | 184 | GCObject *o = gcvalueraw(kvl); |
| 185 | return hashpointer(t, o); | 185 | return hashpointer(t, o); |
| 186 | } | 186 | } |
| 187 | } | 187 | } |
| @@ -691,7 +691,7 @@ void luaH_newkey (lua_State *L, Table *t, const TValue *key, TValue *value) { | |||
| 691 | return; | 691 | return; |
| 692 | } | 692 | } |
| 693 | lua_assert(!isdummy(t)); | 693 | lua_assert(!isdummy(t)); |
| 694 | othern = mainposition(t, keytt(mp), &keyval(mp)); | 694 | othern = mainposition(t, keytt(mp), keyval(mp)); |
| 695 | if (othern != mp) { /* is colliding node out of its main position? */ | 695 | if (othern != mp) { /* is colliding node out of its main position? */ |
| 696 | /* yes; move colliding node into free position */ | 696 | /* yes; move colliding node into free position */ |
| 697 | while (othern + gnext(othern) != mp) /* find previous */ | 697 | while (othern + gnext(othern) != mp) /* find previous */ |
diff --git a/src/3rdParty/lua/ltablib.c b/src/3rdParty/lua/ltablib.c index dbfe250..868d78f 100644 --- a/src/3rdParty/lua/ltablib.c +++ b/src/3rdParty/lua/ltablib.c | |||
| @@ -59,8 +59,9 @@ static void checktab (lua_State *L, int arg, int what) { | |||
| 59 | 59 | ||
| 60 | 60 | ||
| 61 | static int tinsert (lua_State *L) { | 61 | static int tinsert (lua_State *L) { |
| 62 | lua_Integer e = aux_getn(L, 1, TAB_RW) + 1; /* first empty element */ | ||
| 63 | lua_Integer pos; /* where to insert new element */ | 62 | lua_Integer pos; /* where to insert new element */ |
| 63 | lua_Integer e = aux_getn(L, 1, TAB_RW); | ||
| 64 | e = luaL_intop(+, e, 1); /* first empty element */ | ||
| 64 | switch (lua_gettop(L)) { | 65 | switch (lua_gettop(L)) { |
| 65 | case 2: { /* called with only 2 arguments */ | 66 | case 2: { /* called with only 2 arguments */ |
| 66 | pos = e; /* insert new element at the end */ | 67 | pos = e; /* insert new element at the end */ |
diff --git a/src/3rdParty/lua/lua.c b/src/3rdParty/lua/lua.c index 46b48db..0f19004 100644 --- a/src/3rdParty/lua/lua.c +++ b/src/3rdParty/lua/lua.c | |||
| @@ -89,14 +89,15 @@ static void print_usage (const char *badoption) { | |||
| 89 | lua_writestringerror( | 89 | lua_writestringerror( |
| 90 | "usage: %s [options] [script [args]]\n" | 90 | "usage: %s [options] [script [args]]\n" |
| 91 | "Available options are:\n" | 91 | "Available options are:\n" |
| 92 | " -e stat execute string 'stat'\n" | 92 | " -e stat execute string 'stat'\n" |
| 93 | " -i enter interactive mode after executing 'script'\n" | 93 | " -i enter interactive mode after executing 'script'\n" |
| 94 | " -l name require library 'name' into global 'name'\n" | 94 | " -l mod require library 'mod' into global 'mod'\n" |
| 95 | " -v show version information\n" | 95 | " -l g=mod require library 'mod' into global 'g'\n" |
| 96 | " -E ignore environment variables\n" | 96 | " -v show version information\n" |
| 97 | " -W turn warnings on\n" | 97 | " -E ignore environment variables\n" |
| 98 | " -- stop handling options\n" | 98 | " -W turn warnings on\n" |
| 99 | " - stop handling options and execute stdin\n" | 99 | " -- stop handling options\n" |
| 100 | " - stop handling options and execute stdin\n" | ||
| 100 | , | 101 | , |
| 101 | progname); | 102 | progname); |
| 102 | } | 103 | } |
| @@ -207,16 +208,22 @@ static int dostring (lua_State *L, const char *s, const char *name) { | |||
| 207 | 208 | ||
| 208 | 209 | ||
| 209 | /* | 210 | /* |
| 210 | ** Calls 'require(name)' and stores the result in a global variable | 211 | ** Receives 'globname[=modname]' and runs 'globname = require(modname)'. |
| 211 | ** with the given name. | ||
| 212 | */ | 212 | */ |
| 213 | static int dolibrary (lua_State *L, const char *name) { | 213 | static int dolibrary (lua_State *L, char *globname) { |
| 214 | int status; | 214 | int status; |
| 215 | char *modname = strchr(globname, '='); | ||
| 216 | if (modname == NULL) /* no explicit name? */ | ||
| 217 | modname = globname; /* module name is equal to global name */ | ||
| 218 | else { | ||
| 219 | *modname = '\0'; /* global name ends here */ | ||
| 220 | modname++; /* module name starts after the '=' */ | ||
| 221 | } | ||
| 215 | lua_getglobal(L, "require"); | 222 | lua_getglobal(L, "require"); |
| 216 | lua_pushstring(L, name); | 223 | lua_pushstring(L, modname); |
| 217 | status = docall(L, 1, 1); /* call 'require(name)' */ | 224 | status = docall(L, 1, 1); /* call 'require(modname)' */ |
| 218 | if (status == LUA_OK) | 225 | if (status == LUA_OK) |
| 219 | lua_setglobal(L, name); /* global[name] = require return */ | 226 | lua_setglobal(L, globname); /* globname = require(modname) */ |
| 220 | return report(L, status); | 227 | return report(L, status); |
| 221 | } | 228 | } |
| 222 | 229 | ||
| @@ -327,7 +334,7 @@ static int runargs (lua_State *L, char **argv, int n) { | |||
| 327 | switch (option) { | 334 | switch (option) { |
| 328 | case 'e': case 'l': { | 335 | case 'e': case 'l': { |
| 329 | int status; | 336 | int status; |
| 330 | const char *extra = argv[i] + 2; /* both options need an argument */ | 337 | char *extra = argv[i] + 2; /* both options need an argument */ |
| 331 | if (*extra == '\0') extra = argv[++i]; | 338 | if (*extra == '\0') extra = argv[++i]; |
| 332 | lua_assert(extra != NULL); | 339 | lua_assert(extra != NULL); |
| 333 | status = (option == 'e') | 340 | status = (option == 'e') |
diff --git a/src/3rdParty/lua/lutf8lib.c b/src/3rdParty/lua/lutf8lib.c index 901d985..e7bf098 100644 --- a/src/3rdParty/lua/lutf8lib.c +++ b/src/3rdParty/lua/lutf8lib.c | |||
| @@ -224,14 +224,11 @@ static int byteoffset (lua_State *L) { | |||
| 224 | static int iter_aux (lua_State *L, int strict) { | 224 | static int iter_aux (lua_State *L, int strict) { |
| 225 | size_t len; | 225 | size_t len; |
| 226 | const char *s = luaL_checklstring(L, 1, &len); | 226 | const char *s = luaL_checklstring(L, 1, &len); |
| 227 | lua_Integer n = lua_tointeger(L, 2) - 1; | 227 | lua_Unsigned n = (lua_Unsigned)lua_tointeger(L, 2); |
| 228 | if (n < 0) /* first iteration? */ | 228 | if (n < len) { |
| 229 | n = 0; /* start from here */ | 229 | while (iscont(s + n)) n++; /* skip continuation bytes */ |
| 230 | else if (n < (lua_Integer)len) { | ||
| 231 | n++; /* skip current byte */ | ||
| 232 | while (iscont(s + n)) n++; /* and its continuations */ | ||
| 233 | } | 230 | } |
| 234 | if (n >= (lua_Integer)len) | 231 | if (n >= len) /* (also handles original 'n' being negative) */ |
| 235 | return 0; /* no more codepoints */ | 232 | return 0; /* no more codepoints */ |
| 236 | else { | 233 | else { |
| 237 | utfint code; | 234 | utfint code; |
diff --git a/src/3rdParty/lua/lvm.c b/src/3rdParty/lua/lvm.c index c84a665..49ed3dd 100644 --- a/src/3rdParty/lua/lvm.c +++ b/src/3rdParty/lua/lvm.c | |||
| @@ -406,7 +406,7 @@ static int l_strcmp (const TString *ls, const TString *rs) { | |||
| 406 | ** from float to int.) | 406 | ** from float to int.) |
| 407 | ** When 'f' is NaN, comparisons must result in false. | 407 | ** When 'f' is NaN, comparisons must result in false. |
| 408 | */ | 408 | */ |
| 409 | static int LTintfloat (lua_Integer i, lua_Number f) { | 409 | l_sinline int LTintfloat (lua_Integer i, lua_Number f) { |
| 410 | if (l_intfitsf(i)) | 410 | if (l_intfitsf(i)) |
| 411 | return luai_numlt(cast_num(i), f); /* compare them as floats */ | 411 | return luai_numlt(cast_num(i), f); /* compare them as floats */ |
| 412 | else { /* i < f <=> i < ceil(f) */ | 412 | else { /* i < f <=> i < ceil(f) */ |
| @@ -423,7 +423,7 @@ static int LTintfloat (lua_Integer i, lua_Number f) { | |||
| 423 | ** Check whether integer 'i' is less than or equal to float 'f'. | 423 | ** Check whether integer 'i' is less than or equal to float 'f'. |
| 424 | ** See comments on previous function. | 424 | ** See comments on previous function. |
| 425 | */ | 425 | */ |
| 426 | static int LEintfloat (lua_Integer i, lua_Number f) { | 426 | l_sinline int LEintfloat (lua_Integer i, lua_Number f) { |
| 427 | if (l_intfitsf(i)) | 427 | if (l_intfitsf(i)) |
| 428 | return luai_numle(cast_num(i), f); /* compare them as floats */ | 428 | return luai_numle(cast_num(i), f); /* compare them as floats */ |
| 429 | else { /* i <= f <=> i <= floor(f) */ | 429 | else { /* i <= f <=> i <= floor(f) */ |
| @@ -440,7 +440,7 @@ static int LEintfloat (lua_Integer i, lua_Number f) { | |||
| 440 | ** Check whether float 'f' is less than integer 'i'. | 440 | ** Check whether float 'f' is less than integer 'i'. |
| 441 | ** See comments on previous function. | 441 | ** See comments on previous function. |
| 442 | */ | 442 | */ |
| 443 | static int LTfloatint (lua_Number f, lua_Integer i) { | 443 | l_sinline int LTfloatint (lua_Number f, lua_Integer i) { |
| 444 | if (l_intfitsf(i)) | 444 | if (l_intfitsf(i)) |
| 445 | return luai_numlt(f, cast_num(i)); /* compare them as floats */ | 445 | return luai_numlt(f, cast_num(i)); /* compare them as floats */ |
| 446 | else { /* f < i <=> floor(f) < i */ | 446 | else { /* f < i <=> floor(f) < i */ |
| @@ -457,7 +457,7 @@ static int LTfloatint (lua_Number f, lua_Integer i) { | |||
| 457 | ** Check whether float 'f' is less than or equal to integer 'i'. | 457 | ** Check whether float 'f' is less than or equal to integer 'i'. |
| 458 | ** See comments on previous function. | 458 | ** See comments on previous function. |
| 459 | */ | 459 | */ |
| 460 | static int LEfloatint (lua_Number f, lua_Integer i) { | 460 | l_sinline int LEfloatint (lua_Number f, lua_Integer i) { |
| 461 | if (l_intfitsf(i)) | 461 | if (l_intfitsf(i)) |
| 462 | return luai_numle(f, cast_num(i)); /* compare them as floats */ | 462 | return luai_numle(f, cast_num(i)); /* compare them as floats */ |
| 463 | else { /* f <= i <=> ceil(f) <= i */ | 463 | else { /* f <= i <=> ceil(f) <= i */ |
| @@ -473,7 +473,7 @@ static int LEfloatint (lua_Number f, lua_Integer i) { | |||
| 473 | /* | 473 | /* |
| 474 | ** Return 'l < r', for numbers. | 474 | ** Return 'l < r', for numbers. |
| 475 | */ | 475 | */ |
| 476 | static int LTnum (const TValue *l, const TValue *r) { | 476 | l_sinline int LTnum (const TValue *l, const TValue *r) { |
| 477 | lua_assert(ttisnumber(l) && ttisnumber(r)); | 477 | lua_assert(ttisnumber(l) && ttisnumber(r)); |
| 478 | if (ttisinteger(l)) { | 478 | if (ttisinteger(l)) { |
| 479 | lua_Integer li = ivalue(l); | 479 | lua_Integer li = ivalue(l); |
| @@ -495,7 +495,7 @@ static int LTnum (const TValue *l, const TValue *r) { | |||
| 495 | /* | 495 | /* |
| 496 | ** Return 'l <= r', for numbers. | 496 | ** Return 'l <= r', for numbers. |
| 497 | */ | 497 | */ |
| 498 | static int LEnum (const TValue *l, const TValue *r) { | 498 | l_sinline int LEnum (const TValue *l, const TValue *r) { |
| 499 | lua_assert(ttisnumber(l) && ttisnumber(r)); | 499 | lua_assert(ttisnumber(l) && ttisnumber(r)); |
| 500 | if (ttisinteger(l)) { | 500 | if (ttisinteger(l)) { |
| 501 | lua_Integer li = ivalue(l); | 501 | lua_Integer li = ivalue(l); |
| @@ -768,6 +768,7 @@ lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) { | |||
| 768 | */ | 768 | */ |
| 769 | #define luaV_shiftr(x,y) luaV_shiftl(x,intop(-, 0, y)) | 769 | #define luaV_shiftr(x,y) luaV_shiftl(x,intop(-, 0, y)) |
| 770 | 770 | ||
| 771 | |||
| 771 | lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { | 772 | lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { |
| 772 | if (y < 0) { /* shift right? */ | 773 | if (y < 0) { /* shift right? */ |
| 773 | if (y <= -NBITS) return 0; | 774 | if (y <= -NBITS) return 0; |
| @@ -1108,7 +1109,7 @@ void luaV_finishOp (lua_State *L) { | |||
| 1108 | #define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) | 1109 | #define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) |
| 1109 | 1110 | ||
| 1110 | /* | 1111 | /* |
| 1111 | ** Protect code that can only raise errors. (That is, it cannnot change | 1112 | ** Protect code that can only raise errors. (That is, it cannot change |
| 1112 | ** the stack or hooks.) | 1113 | ** the stack or hooks.) |
| 1113 | */ | 1114 | */ |
| 1114 | #define halfProtect(exp) (savestate(L,ci), (exp)) | 1115 | #define halfProtect(exp) (savestate(L,ci), (exp)) |
| @@ -1647,19 +1648,32 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
| 1647 | int delta = (nparams1) ? ci->u.l.nextraargs + nparams1 : 0; | 1648 | int delta = (nparams1) ? ci->u.l.nextraargs + nparams1 : 0; |
| 1648 | if (b != 0) | 1649 | if (b != 0) |
| 1649 | L->top = ra + b; | 1650 | L->top = ra + b; |
| 1650 | /* else previous instruction set top */ | 1651 | else /* previous instruction set top */ |
| 1652 | b = cast_int(L->top - ra); | ||
| 1651 | savepc(ci); /* several calls here can raise errors */ | 1653 | savepc(ci); /* several calls here can raise errors */ |
| 1652 | if (TESTARG_k(i)) { | 1654 | if (TESTARG_k(i)) { |
| 1653 | luaF_closeupval(L, base); /* close upvalues from current call */ | 1655 | luaF_closeupval(L, base); /* close upvalues from current call */ |
| 1654 | lua_assert(L->tbclist < base); /* no pending tbc variables */ | 1656 | lua_assert(L->tbclist < base); /* no pending tbc variables */ |
| 1655 | lua_assert(base == ci->func + 1); | 1657 | lua_assert(base == ci->func + 1); |
| 1656 | } | 1658 | } |
| 1657 | if (luaD_precall(L, ra, delta2retdel(delta))) /* Lua function? */ | 1659 | while (!ttisfunction(s2v(ra))) { /* not a function? */ |
| 1658 | goto startfunc; /* execute the callee */ | 1660 | ra = luaD_tryfuncTM(L, ra); /* try '__call' metamethod */ |
| 1659 | else { /* C function */ | 1661 | b++; /* there is now one extra argument */ |
| 1662 | } | ||
| 1663 | if (!ttisLclosure(s2v(ra))) { /* C function? */ | ||
| 1664 | luaD_precall(L, ra, LUA_MULTRET); /* call it */ | ||
| 1660 | updatetrap(ci); | 1665 | updatetrap(ci); |
| 1666 | updatestack(ci); /* stack may have been relocated */ | ||
| 1667 | ci->func -= delta; /* restore 'func' (if vararg) */ | ||
| 1668 | luaD_poscall(L, ci, cast_int(L->top - ra)); /* finish caller */ | ||
| 1669 | updatetrap(ci); /* 'luaD_poscall' can change hooks */ | ||
| 1661 | goto ret; /* caller returns after the tail call */ | 1670 | goto ret; /* caller returns after the tail call */ |
| 1662 | } | 1671 | } |
| 1672 | else { /* Lua function */ | ||
| 1673 | ci->func -= delta; /* restore 'func' (if vararg) */ | ||
| 1674 | luaD_pretailcall(L, ci, ra, b); /* prepare call frame */ | ||
| 1675 | goto startfunc; /* execute the callee */ | ||
| 1676 | } | ||
| 1663 | } | 1677 | } |
| 1664 | vmcase(OP_RETURN) { | 1678 | vmcase(OP_RETURN) { |
| 1665 | int n = GETARG_B(i) - 1; /* number of results */ | 1679 | int n = GETARG_B(i) - 1; /* number of results */ |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 415fcd3..e004821 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
| @@ -60,7 +60,7 @@ using namespace parserlib; | |||
| 60 | 60 | ||
| 61 | typedef std::list<std::string> str_list; | 61 | typedef std::list<std::string> str_list; |
| 62 | 62 | ||
| 63 | const std::string_view version = "0.8.4"sv; | 63 | const std::string_view version = "0.8.5"sv; |
| 64 | const std::string_view extension = "yue"sv; | 64 | const std::string_view extension = "yue"sv; |
| 65 | 65 | ||
| 66 | class YueCompilerImpl { | 66 | class YueCompilerImpl { |
| @@ -530,6 +530,7 @@ private: | |||
| 530 | } | 530 | } |
| 531 | if (!exp) return nullptr; | 531 | if (!exp) return nullptr; |
| 532 | BLOCK_START | 532 | BLOCK_START |
| 533 | BREAK_IF(exp->nilCoalesed); | ||
| 533 | BREAK_IF(!exp->opValues.empty()); | 534 | BREAK_IF(!exp->opValues.empty()); |
| 534 | BREAK_IF(exp->pipeExprs.size() != 1); | 535 | BREAK_IF(exp->pipeExprs.size() != 1); |
| 535 | auto unary = static_cast<unary_exp_t*>(exp->pipeExprs.back()); | 536 | auto unary = static_cast<unary_exp_t*>(exp->pipeExprs.back()); |
