summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2022-04-07 09:57:17 +0800
committerLi Jin <dragon-fly@qq.com>2022-04-07 09:57:17 +0800
commit599a89c2194110592bff2d91ecf9304be3e8ba4d (patch)
tree9d20316739643d32ceea7cfd125d49391fc3666c
parent105f3b04b83ac7d8c546e5e0c2a815a626e8cf0b (diff)
downloadyuescript-0.10.10.tar.gz
yuescript-0.10.10.tar.bz2
yuescript-0.10.10.zip
fix class initializing procedure again.v0.10.10
-rw-r--r--spec/outputs/class.lua32
-rwxr-xr-xsrc/yuescript/yue_compiler.cpp21
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
1087do 1087do
1088 local _class_0 1088 local _class_0
1089 local _base_0 = { } 1089 local _base_0 = { }
1090 local _list_0 = {
1091 B,
1092 C,
1093 D,
1094 {
1095 value = 123
1096 }
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 or _mixin_0) do
1101 if _base_0[_key_0] == nil then
1102 _base_0[_key_0] = _val_0
1103 end
1104 end
1105 end
1090 if _base_0.__index == nil then 1106 if _base_0.__index == nil then
1091 _base_0.__index = _base_0 1107 _base_0.__index = _base_0
1092 end 1108 end
@@ -1104,22 +1120,6 @@ do
1104 }) 1120 })
1105 _base_0.__class = _class_0 1121 _base_0.__class = _class_0
1106 A = _class_0 1122 A = _class_0
1107 local _list_0 = {
1108 B,
1109 C,
1110 D,
1111 {
1112 value = 123
1113 }
1114 }
1115 for _index_0 = 1, #_list_0 do
1116 local _mixin_0 = _list_0[_index_0]
1117 for _key_0, _val_0 in pairs(_mixin_0.__base or _mixin_0) do
1118 if _base_0[_key_0] == nil then
1119 _base_0[_key_0] = _val_0
1120 end
1121 end
1122 end
1123end 1123end
1124do 1124do
1125 local _class_0 1125 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:
5337 } else { 5337 } else {
5338 temp.back() += "{ }"s + nll(classDecl); 5338 temp.back() += "{ }"s + nll(classDecl);
5339 } 5339 }
5340 if (classDecl->mixes) {
5341 auto mixin = getUnusedName("_mixin_"sv);
5342 auto key = getUnusedName("_key_"sv);
5343 auto val = getUnusedName("_val_"sv);
5344 auto mixins = _parser.toString(classDecl->mixes);
5345 _buf << "for "sv << mixin << " in *{"sv << mixins << "}\n"sv;
5346 _buf << "\tfor "sv << key << ',' << val << " in pairs "sv << mixin << ".__base or "sv << mixin << '\n';
5347 _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << baseVar << '[' << key << "]==nil"sv;
5348 transformBlock(toAst<Block_t>(clearBuf(), x), temp, ExpUsage::Common);
5349 }
5340 transformAssignment(toAst<ExpListAssign_t>(baseVar + ".__index ?\?= "s + baseVar, classDecl), temp); 5350 transformAssignment(toAst<ExpListAssign_t>(baseVar + ".__index ?\?= "s + baseVar, classDecl), temp);
5341 str_list tmp; 5351 str_list tmp;
5342 if (usage == ExpUsage::Assignment) { 5352 if (usage == ExpUsage::Assignment) {
@@ -5399,17 +5409,6 @@ private:
5399 _buf << indent(1) << "end"sv << nll(classDecl); 5409 _buf << indent(1) << "end"sv << nll(classDecl);
5400 _buf << indent() << "})"sv << nll(classDecl); 5410 _buf << indent() << "})"sv << nll(classDecl);
5401 _buf << indent() << baseVar << ".__class = "sv << classVar << nll(classDecl); 5411 _buf << indent() << baseVar << ".__class = "sv << classVar << nll(classDecl);
5402 temp.push_back(clearBuf());
5403 if (classDecl->mixes) {
5404 auto mixin = getUnusedName("_mixin_"sv);
5405 auto key = getUnusedName("_key_"sv);
5406 auto val = getUnusedName("_val_"sv);
5407 auto mixins = _parser.toString(classDecl->mixes);
5408 _buf << "for "sv << mixin << " in *{"sv << mixins << "}\n"sv;
5409 _buf << "\tfor "sv << key << ',' << val << " in pairs "sv << mixin << ".__base or "sv << mixin << '\n';
5410 _buf << "\t\t"sv << baseVar << '[' << key << "]="sv << val << " if "sv << baseVar << '[' << key << "]==nil"sv;
5411 transformBlock(toAst<Block_t>(clearBuf(), x), temp, ExpUsage::Common);
5412 }
5413 if (!statements.empty()) { 5412 if (!statements.empty()) {
5414 _buf << indent() << "local self = "sv << classVar << ';' << nll(classDecl); 5413 _buf << indent() << "local self = "sv << classVar << ';' << nll(classDecl);
5415 } 5414 }