aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2022-04-06 17:54:23 +0800
committerLi Jin <dragon-fly@qq.com>2022-04-06 17:54:23 +0800
commitfe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8 (patch)
treeee57ba1d65531101e273cfe41d4a32ae87964724
parent49f44f799b39dcc4ffe69502638108398732f8df (diff)
downloadyuescript-fe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8.tar.gz
yuescript-fe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8.tar.bz2
yuescript-fe6ce26a58f23311cda3e82b3dfd3a55b9b16bc8.zip
doing the mixing after the class object initialized.
-rw-r--r--spec/outputs/class.lua26
-rwxr-xr-xsrc/yuescript/yue_compiler.cpp21
2 files changed, 24 insertions, 23 deletions
diff --git a/spec/outputs/class.lua b/spec/outputs/class.lua
index 8db5a8a..bb14ad8 100644
--- a/spec/outputs/class.lua
+++ b/spec/outputs/class.lua
@@ -1090,19 +1090,6 @@ do
1090 if _base_0.__index == nil then 1090 if _base_0.__index == nil then
1091 _base_0.__index = _base_0 1091 _base_0.__index = _base_0
1092 end 1092 end
1093 local _list_0 = {
1094 B,
1095 C,
1096 D
1097 }
1098 for _index_0 = 1, #_list_0 do
1099 local _mixin_0 = _list_0[_index_0]
1100 for _key_0, _val_0 in pairs(_mixin_0.__base) do
1101 if _key_0 ~= "__class" then
1102 _base_0[_key_0] = _val_0
1103 end
1104 end
1105 end
1106 _class_0 = setmetatable({ 1093 _class_0 = setmetatable({
1107 __init = function() end, 1094 __init = function() end,
1108 __base = _base_0, 1095 __base = _base_0,
@@ -1117,6 +1104,19 @@ do
1117 }) 1104 })
1118 _base_0.__class = _class_0 1105 _base_0.__class = _class_0
1119 A = _class_0 1106 A = _class_0
1107 local _list_0 = {
1108 B,
1109 C,
1110 D
1111 }
1112 for _index_0 = 1, #_list_0 do
1113 local _mixin_0 = _list_0[_index_0]
1114 for _key_0, _val_0 in pairs(_mixin_0.__base) do
1115 if _base_0[_key_0] == nil then
1116 _base_0[_key_0] = _val_0
1117 end
1118 end
1119 end
1120end 1120end
1121do 1121do
1122 local _class_0 1122 local _class_0
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:
5338 temp.back() += "{ }"s + nll(classDecl); 5338 temp.back() += "{ }"s + nll(classDecl);
5339 } 5339 }
5340 transformAssignment(toAst<ExpListAssign_t>(baseVar + ".__index ?\?= "s + baseVar, classDecl), temp); 5340 transformAssignment(toAst<ExpListAssign_t>(baseVar + ".__index ?\?= "s + baseVar, classDecl), temp);
5341 if (classDecl->mixes) {
5342 auto mixin = getUnusedName("_mixin_"sv);
5343 auto key = getUnusedName("_key_"sv);
5344 auto val = getUnusedName("_val_"sv);
5345 auto mixins = _parser.toString(classDecl->mixes);
5346 _buf << "for "sv << mixin << " in *{"sv << mixins << "}\n"sv;
5347 _buf << "\tfor "sv << key << ',' << val << " in pairs "sv << mixin << ".__base\n"sv;
5348 _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << key << "~=\"__class\""sv;
5349 transformBlock(toAst<Block_t>(clearBuf(), x), temp, ExpUsage::Common);
5350 }
5351 str_list tmp; 5341 str_list tmp;
5352 if (usage == ExpUsage::Assignment) { 5342 if (usage == ExpUsage::Assignment) {
5353 auto assign = x->new_ptr<Assign_t>(); 5343 auto assign = x->new_ptr<Assign_t>();
@@ -5421,6 +5411,17 @@ private:
5421 if (!assignItem.empty()) { 5411 if (!assignItem.empty()) {
5422 _buf << indent() << assignItem << " = "sv << classVar << nll(classDecl); 5412 _buf << indent() << assignItem << " = "sv << classVar << nll(classDecl);
5423 } 5413 }
5414 temp.push_back(clearBuf());
5415 if (classDecl->mixes) {
5416 auto mixin = getUnusedName("_mixin_"sv);
5417 auto key = getUnusedName("_key_"sv);
5418 auto val = getUnusedName("_val_"sv);
5419 auto mixins = _parser.toString(classDecl->mixes);
5420 _buf << "for "sv << mixin << " in *{"sv << mixins << "}\n"sv;
5421 _buf << "\tfor "sv << key << ',' << val << " in pairs "sv << mixin << ".__base\n"sv;
5422 _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << baseVar << '[' << key << "]==nil"sv;
5423 transformBlock(toAst<Block_t>(clearBuf(), x), temp, ExpUsage::Common);
5424 }
5424 switch (usage) { 5425 switch (usage) {
5425 case ExpUsage::Return: { 5426 case ExpUsage::Return: {
5426 _buf << indent() << "return "sv << classVar << nlr(classDecl); 5427 _buf << indent() << "return "sv << classVar << nlr(classDecl);