From fe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Wed, 6 Apr 2022 17:54:23 +0800 Subject: doing the mixing after the class object initialized. --- src/yuescript/yue_compiler.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 3394f1f..3e9c048 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -5338,16 +5338,6 @@ private: temp.back() += "{ }"s + nll(classDecl); } transformAssignment(toAst(baseVar + ".__index ?\?= "s + baseVar, classDecl), temp); - 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\n"sv; - _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << key << "~=\"__class\""sv; - transformBlock(toAst(clearBuf(), x), temp, ExpUsage::Common); - } str_list tmp; if (usage == ExpUsage::Assignment) { auto assign = x->new_ptr(); @@ -5421,6 +5411,17 @@ private: if (!assignItem.empty()) { _buf << indent() << assignItem << " = "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\n"sv; + _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << baseVar << '[' << key << "]==nil"sv; + transformBlock(toAst(clearBuf(), x), temp, ExpUsage::Common); + } switch (usage) { case ExpUsage::Return: { _buf << indent() << "return "sv << classVar << nlr(classDecl); -- cgit v1.2.3-55-g6feb