private static void CgTableConstructorExp(FuncInfo fi, TableConstructorExp node, int a) { var nArr = node.KeyExps?.Count(exp => exp is null) ?? 0; var nExps = node.KeyExps?.Count ?? 0; var multRet = nExps > 0 && IsVarargOrFuncCall(node.ValExps[nExps - 1]); fi.EmitNewTable(a, nArr, nExps - nArr); var arrIdx = 0; for (var i = 0; i < nExps; i++) { var keyExp = node.KeyExps[i]; var valExp = node.ValExps[i]; if (keyExp == null) { arrIdx++; var tmp = fi.AllocReg(); if (i == nExps - 1 && multRet) { CgExp(fi, valExp, tmp, -1); } else { CgExp(fi, valExp, tmp, 1); } if (arrIdx % 50 == 0 || arrIdx == nArr) { var n = arrIdx % 50; if (n == 0) { n = 50; } fi.FreeRegs(n); var c = (arrIdx - 1) / 50 + 1; if (i == nExps - 1 && multRet) { fi.EmitSetList(a, 0, c); } else { fi.EmitSetList(a, n, c); } } continue; } var b = fi.AllocReg(); CgExp(fi, keyExp, b, 1); var d = fi.AllocReg(); CgExp(fi, valExp, d, 1); fi.FreeRegs(2); fi.EmitSetTable(a, b, d); } }