From 2dc2aa85990c3e334765138e76e11b94d9ed73d1 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Fri, 14 Nov 2025 23:31:36 +0800 Subject: Fixed code generating. --- spec/outputs/codes_from_doc.lua | 26 ++++++++------------------ spec/outputs/codes_from_doc_zh.lua | 26 ++++++++------------------ spec/outputs/lists.lua | 13 ++++--------- src/yuescript/yue_compiler.cpp | 22 +++++++++++++++------- 4 files changed, 35 insertions(+), 52 deletions(-) diff --git a/spec/outputs/codes_from_doc.lua b/spec/outputs/codes_from_doc.lua index 00b3b8b..d6617a9 100644 --- a/spec/outputs/codes_from_doc.lua +++ b/spec/outputs/codes_from_doc.lua @@ -1109,17 +1109,12 @@ local data = { } local flat local _accum_0 = { } -local _len_0 = 1 for k, v in pairs(data) do - do - local _obj_0 = _accum_0[_len_0] - local _len_1 = #_obj_0 + 1 - for _index_0 = 1, #v do - local _elm_0 = v[_index_0] - _obj_0[_len_1], _len_1 = _elm_0, _len_1 + 1 - end + local _len_0 = #_accum_0 + 1 + for _index_0 = 1, #v do + local _elm_0 = v[_index_0] + _accum_0[_len_0], _len_0 = _elm_0, _len_0 + 1 end - _len_0 = _len_0 + 1 end flat = _accum_0 local x_coords = { @@ -3622,17 +3617,12 @@ local data = { } local flat local _accum_0 = { } -local _len_0 = 1 for k, v in pairs(data) do - do - local _obj_0 = _accum_0[_len_0] - local _len_1 = #_obj_0 + 1 - for _index_0 = 1, #v do - local _elm_0 = v[_index_0] - _obj_0[_len_1], _len_1 = _elm_0, _len_1 + 1 - end + local _len_0 = #_accum_0 + 1 + for _index_0 = 1, #v do + local _elm_0 = v[_index_0] + _accum_0[_len_0], _len_0 = _elm_0, _len_0 + 1 end - _len_0 = _len_0 + 1 end flat = _accum_0 local x_coords = { diff --git a/spec/outputs/codes_from_doc_zh.lua b/spec/outputs/codes_from_doc_zh.lua index c382bca..ec84112 100644 --- a/spec/outputs/codes_from_doc_zh.lua +++ b/spec/outputs/codes_from_doc_zh.lua @@ -1103,17 +1103,12 @@ local data = { } local flat local _accum_0 = { } -local _len_0 = 1 for k, v in pairs(data) do - do - local _obj_0 = _accum_0[_len_0] - local _len_1 = #_obj_0 + 1 - for _index_0 = 1, #v do - local _elm_0 = v[_index_0] - _obj_0[_len_1], _len_1 = _elm_0, _len_1 + 1 - end + local _len_0 = #_accum_0 + 1 + for _index_0 = 1, #v do + local _elm_0 = v[_index_0] + _accum_0[_len_0], _len_0 = _elm_0, _len_0 + 1 end - _len_0 = _len_0 + 1 end flat = _accum_0 local x_coords = { @@ -3610,17 +3605,12 @@ local data = { } local flat local _accum_0 = { } -local _len_0 = 1 for k, v in pairs(data) do - do - local _obj_0 = _accum_0[_len_0] - local _len_1 = #_obj_0 + 1 - for _index_0 = 1, #v do - local _elm_0 = v[_index_0] - _obj_0[_len_1], _len_1 = _elm_0, _len_1 + 1 - end + local _len_0 = #_accum_0 + 1 + for _index_0 = 1, #v do + local _elm_0 = v[_index_0] + _accum_0[_len_0], _len_0 = _elm_0, _len_0 + 1 end - _len_0 = _len_0 + 1 end flat = _accum_0 local x_coords = { diff --git a/spec/outputs/lists.lua b/spec/outputs/lists.lua index 6115700..75f04fa 100644 --- a/spec/outputs/lists.lua +++ b/spec/outputs/lists.lua @@ -892,17 +892,12 @@ do } local flat local _accum_0 = { } - local _len_0 = 1 for k, v in pairs(data) do - do - local _obj_0 = _accum_0[_len_0] - local _len_1 = #_obj_0 + 1 - for _index_0 = 1, #v do - local _elm_0 = v[_index_0] - _obj_0[_len_1], _len_1 = _elm_0, _len_1 + 1 - end + local _len_0 = #_accum_0 + 1 + for _index_0 = 1, #v do + local _elm_0 = v[_index_0] + _accum_0[_len_0], _len_0 = _elm_0, _len_0 + 1 end - _len_0 = _len_0 + 1 end flat = _accum_0 end diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 8c28e61..d6db3fc 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -8317,9 +8317,12 @@ private: auto compInner = static_cast(comp->items.back()); str_list temp; std::string accumVar = getUnusedName("_accum_"sv); - std::string lenVar = getUnusedName("_len_"sv); addToScope(accumVar); - addToScope(lenVar); + std::string lenVar; + if (!isSpread) { + lenVar = getUnusedName("_len_"sv); + addToScope(lenVar); + } for (auto item : compInner->items.objects()) { switch (item->get_id()) { case id(): @@ -8337,7 +8340,7 @@ private: } } { - auto assignLeft = toAst(accumVar + '[' + lenVar + (isSpread ? "][]"s : "]"s), x); + auto assignLeft = toAst(accumVar + '[' + (isSpread ? "]"s : lenVar + ']'), x); auto assign = x->new_ptr(); assign->values.push_back(value); auto assignment = x->new_ptr(); @@ -8351,10 +8354,15 @@ private: popScope(); } _buf << indent() << "local "sv << accumVar << " = { }"sv << nll(comp); - _buf << indent() << "local "sv << lenVar << " = 1"sv << nll(comp); - _buf << join(temp); - _buf << assignStr; - _buf << indent(int(temp.size())) << lenVar << " = "sv << lenVar << " + 1"sv << nll(comp); + if (isSpread) { + _buf << join(temp); + _buf << assignStr; + } else { + _buf << indent() << "local "sv << lenVar << " = 1"sv << nll(comp); + _buf << join(temp); + _buf << assignStr; + _buf << indent(int(temp.size())) << lenVar << " = "sv << lenVar << " + 1"sv << nll(comp); + } for (int ind = int(temp.size()) - 1; ind > -1; --ind) { _buf << indent(ind) << "end"sv << nll(comp); } -- cgit v1.2.3-55-g6feb