From 599a89c2194110592bff2d91ecf9304be3e8ba4d Mon Sep 17 00:00:00 2001 From: Li Jin Date: Thu, 7 Apr 2022 09:57:17 +0800 Subject: fix class initializing procedure again. --- spec/outputs/class.lua | 32 ++++++++++++++++---------------- src/yuescript/yue_compiler.cpp | 21 ++++++++++----------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/spec/outputs/class.lua b/spec/outputs/class.lua index 696e74c..3ec92d1 100644 --- a/spec/outputs/class.lua +++ b/spec/outputs/class.lua @@ -1087,6 +1087,22 @@ end do local _class_0 local _base_0 = { } + local _list_0 = { + B, + C, + D, + { + value = 123 + } + } + for _index_0 = 1, #_list_0 do + local _mixin_0 = _list_0[_index_0] + for _key_0, _val_0 in pairs(_mixin_0.__base or _mixin_0) do + if _base_0[_key_0] == nil then + _base_0[_key_0] = _val_0 + end + end + end if _base_0.__index == nil then _base_0.__index = _base_0 end @@ -1104,22 +1120,6 @@ do }) _base_0.__class = _class_0 A = _class_0 - local _list_0 = { - B, - C, - D, - { - value = 123 - } - } - for _index_0 = 1, #_list_0 do - local _mixin_0 = _list_0[_index_0] - for _key_0, _val_0 in pairs(_mixin_0.__base or _mixin_0) do - if _base_0[_key_0] == nil then - _base_0[_key_0] = _val_0 - end - end - end end do local _class_0 diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 5afeaba..936809f 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -5337,6 +5337,16 @@ private: } else { temp.back() += "{ }"s + nll(classDecl); } + if (classDecl->mixes) { + auto mixin = getUnusedName("_mixin_"sv); + auto key = getUnusedName("_key_"sv); + auto val = getUnusedName("_val_"sv); + auto mixins = _parser.toString(classDecl->mixes); + _buf << "for "sv << mixin << " in *{"sv << mixins << "}\n"sv; + _buf << "\tfor "sv << key << ',' << val << " in pairs "sv << mixin << ".__base or "sv << mixin << '\n'; + _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << baseVar << '[' << key << "]==nil"sv; + transformBlock(toAst(clearBuf(), x), temp, ExpUsage::Common); + } transformAssignment(toAst(baseVar + ".__index ?\?= "s + baseVar, classDecl), temp); str_list tmp; if (usage == ExpUsage::Assignment) { @@ -5399,17 +5409,6 @@ private: _buf << indent(1) << "end"sv << nll(classDecl); _buf << indent() << "})"sv << nll(classDecl); _buf << indent() << baseVar << ".__class = "sv << classVar << nll(classDecl); - temp.push_back(clearBuf()); - if (classDecl->mixes) { - auto mixin = getUnusedName("_mixin_"sv); - auto key = getUnusedName("_key_"sv); - auto val = getUnusedName("_val_"sv); - auto mixins = _parser.toString(classDecl->mixes); - _buf << "for "sv << mixin << " in *{"sv << mixins << "}\n"sv; - _buf << "\tfor "sv << key << ',' << val << " in pairs "sv << mixin << ".__base or "sv << mixin << '\n'; - _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << baseVar << '[' << key << "]==nil"sv; - transformBlock(toAst(clearBuf(), x), temp, ExpUsage::Common); - } if (!statements.empty()) { _buf << indent() << "local self = "sv << classVar << ';' << nll(classDecl); } -- cgit v1.2.3-55-g6feb