MCPcopy Create free account
hub / github.com/EmmyLua/EmmyLuaDebugger / luaV_concat

Function luaV_concat

third-party/lua-5.4.6/src/lvm.c:646–687  ·  view source on GitHub ↗

** Main operation for concatenation: concat 'total' values in the stack, ** from 'L->top.p - total' up to 'L->top.p - 1'. */

Source from the content-addressed store, hash-verified

644** from 'L->top.p - total' up to 'L->top.p - 1'.
645*/
646void luaV_concat (lua_State *L, int total) {
647 if (total == 1)
648 return; /* "all" values already concatenated */
649 do {
650 StkId top = L->top.p;
651 int n = 2; /* number of elements handled in this pass (at least 2) */
652 if (!(ttisstring(s2v(top - 2)) || cvt2str(s2v(top - 2))) ||
653 !tostring(L, s2v(top - 1)))
654 luaT_tryconcatTM(L); /* may invalidate 'top' */
655 else if (isemptystr(s2v(top - 1))) /* second operand is empty? */
656 cast_void(tostring(L, s2v(top - 2))); /* result is first operand */
657 else if (isemptystr(s2v(top - 2))) { /* first operand is empty string? */
658 setobjs2s(L, top - 2, top - 1); /* result is second op. */
659 }
660 else {
661 /* at least two non-empty string values; get as many as possible */
662 size_t tl = tsslen(tsvalue(s2v(top - 1)));
663 TString *ts;
664 /* collect total length and number of strings */
665 for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) {
666 size_t l = tsslen(tsvalue(s2v(top - n - 1)));
667 if (l_unlikely(l >= MAX_SIZE - sizeof(TString) - tl)) {
668 L->top.p = top - total; /* pop strings to avoid wasting stack */
669 luaG_runerror(L, "string length overflow");
670 }
671 tl += l;
672 }
673 if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */
674 char buff[LUAI_MAXSHORTLEN];
675 copy2buff(top, n, buff); /* copy strings to buffer */
676 ts = luaS_newlstr(L, buff, tl);
677 }
678 else { /* long string; copy strings directly to final result */
679 ts = luaS_createlngstrobj(L, tl);
680 copy2buff(top, n, getlngstr(ts));
681 }
682 setsvalue2s(L, top - n, ts); /* create result */
683 }
684 total -= n - 1; /* got 'n' strings to create one new */
685 L->top.p -= n - 1; /* popped 'n' strings and pushed one */
686 } while (total > 1); /* repeat until only 1 result left */
687}
688
689
690/*

Callers 4

luaV_finishOpFunction · 0.70
luaV_executeFunction · 0.70
pushstrFunction · 0.70
lua_concatFunction · 0.70

Calls 5

luaT_tryconcatTMFunction · 0.70
luaG_runerrorFunction · 0.70
copy2buffFunction · 0.70
luaS_newlstrFunction · 0.70
luaS_createlngstrobjFunction · 0.70

Tested by

no test coverage detected