diff options
author | Li Jin <dragon-fly@qq.com> | 2022-04-07 09:57:17 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2022-04-07 09:57:17 +0800 |
commit | 599a89c2194110592bff2d91ecf9304be3e8ba4d (patch) | |
tree | 9d20316739643d32ceea7cfd125d49391fc3666c | |
parent | 105f3b04b83ac7d8c546e5e0c2a815a626e8cf0b (diff) | |
download | yuescript-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.lua | 32 | ||||
-rwxr-xr-x | 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 | |||
1087 | do | 1087 | do |
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 | ||
1123 | end | 1123 | end |
1124 | do | 1124 | do |
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 | } |