From 57f28cca627217583762927a2b8be1f334e1013c Mon Sep 17 00:00:00 2001 From: msojocs Date: Fri, 14 Jul 2023 23:22:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/wxml/dom_lib/wxml_dom.cpp | 7 +- src/wxml/expr_lib/common.cpp | 2 + src/wxml/expr_lib/expr_syntax_tree.cpp | 112 +++++++++++++------------ src/wxml/expr_lib/parser.cpp | 2 +- src/wxml/rewrite.cpp | 2 +- test/wcc.disassembly.cpp | 5 ++ 6 files changed, 70 insertions(+), 60 deletions(-) diff --git a/src/wxml/dom_lib/wxml_dom.cpp b/src/wxml/dom_lib/wxml_dom.cpp index a0c73cc..9ec524d 100644 --- a/src/wxml/dom_lib/wxml_dom.cpp +++ b/src/wxml/dom_lib/wxml_dom.cpp @@ -150,10 +150,11 @@ namespace WXML { a3 << "undefined"; break; } - WXML::EXPRLib::ExprSyntaxTree v70; - v70.offset_0 = v85; + // WXML::EXPRLib::ExprSyntaxTree v70; + // v70.offset_0 = vp.offset_80->offset_0; + // v70.offset_52.push_back(); // v70.offset_0 = v77[i].offset_4; - v70.RenderAsOps(a3, v85, v77_b); + vp.offset_80->RenderAsOps(a3, v85, v77_b); } else { diff --git a/src/wxml/expr_lib/common.cpp b/src/wxml/expr_lib/common.cpp index 78ecb12..ae5b05c 100644 --- a/src/wxml/expr_lib/common.cpp +++ b/src/wxml/expr_lib/common.cpp @@ -19,10 +19,12 @@ namespace WXML if (a2 == "false") { a1 << WXML::EXPRLib::OPShort::CONST << ",false"; + return; } if (a2 != "$global") { a1 << WXML::EXPRLib::OPShort::NAME << ",'" << a2 << "'"; + return; } a1 << WXML::EXPRLib::OPShort::CS_GLOBAL; } diff --git a/src/wxml/expr_lib/expr_syntax_tree.cpp b/src/wxml/expr_lib/expr_syntax_tree.cpp index 7f5e00a..a835a42 100644 --- a/src/wxml/expr_lib/expr_syntax_tree.cpp +++ b/src/wxml/expr_lib/expr_syntax_tree.cpp @@ -33,7 +33,8 @@ namespace WXML { a2 << WXML::EXPRLib::OPShort::CONST << ",'"; std::string v6 = this->offset_24.GetLiteral(); - // WXML::Rewrite::ToStringCode(v6.size(), ,a2); + // this->off + WXML::Rewrite::ToStringCode(v6.data() + 1, v6.length() - 2,a2); const char off_5542FA[] = {'\'','\0','[','\0'}; a2 << off_5542FA; } @@ -57,26 +58,26 @@ namespace WXML { if (this->offset_0 == "OP_PATH") { - // if (this->offset_52.size() != 1) - // { - // a2 << "]"; - // return; - // } + if (this->offset_52.size() != 1) + { + a2 << "]"; + return; + } a2 << "[" << WXML::EXPRLib::OPShort::GET_FROM_ENV << "],"; - WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); + this->offset_52[0]->RenderAsOps(a2, a3, a4); a2 << "]"; return; } if (this->offset_0 == "OP_LIST") { a2 << "[" << WXML::EXPRLib::OPShort::MAKE_LIST << "],"; - // if (this->offset_52.size() == 0) - // { - // a2 << "]"; - // return; - // } - WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); + if (this->offset_52.size() == 0) + { + a2 << "]"; + return; + } + this->offset_52[0]->RenderAsOps(a2, a3, a4); a2 << "]"; return; @@ -84,45 +85,46 @@ namespace WXML if (this->offset_0 == "OP_LIST_CONCAT") { a2 << "[" << WXML::EXPRLib::OPShort::CON_LIST << "]"; - // for (int i = 0; i < this->offset_52.size(); i++) - // { - // a2 << ","; - // WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); - // } + for (int i = 0; i < this->offset_52.size(); i++) + { + a2 << ","; + this->offset_52[i]->RenderAsOps(a2, a3, a4); + } } else if (this->offset_0 == "OP_DICT_CONCAT") { a2 << "[" << WXML::EXPRLib::OPShort::UNION_KV << "]"; - // for (int i = 0; i < this->offset_52.size(); i++) - // { - // a2 << ","; - // WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); - // } + for (int i = 0; i < this->offset_52.size(); i++) + { + a2 << ","; + this->offset_52[i]->RenderAsOps(a2, a3, a4); + } } else if (this->offset_0 == "OP_MAKE_DICT") { a2 << "[" << WXML::EXPRLib::OPShort::MAKE_KV << "],'"; - // this->offset_52.offset_24; - // a2 << ; - a2 << "',"; - // if (this->offset_52.size() == 0) - // { - // a2 << "[" << "[7],"; - // WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); - // a2 << "]"; - // } - // else - // { - // WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); - // } + const char off_5542FA[] = {'\'','\0','[','\0'}; + a2 << off_5542FA; + std::string v18 = this->offset_52[0]->offset_24.GetLiteral(); + a2 << v18 << "',"; + if (this->offset_52.size() <= 1) + { + a2 << "[" << "[7],"; + this->offset_52[0]->RenderAsOps(a2, a3, a4); + a2 << "]"; + } + else + { + this->offset_52[0]->RenderAsOps(a2, a3, a4); + } } else { if (this->offset_0 == "OP_EXPAND") { a2 << "[" << WXML::EXPRLib::OPShort::EX_DICT << "],"; - WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); + this->offset_52[0]->RenderAsOps(a2, a3, a4); a2 << "]"; return; @@ -131,22 +133,22 @@ namespace WXML if (this->offset_0 == "OP_DICT") { a2 << "[" << WXML::EXPRLib::OPShort::GET_NAME << "]"; - // for (int i = 0; i < this->offset_52.size(); i++) - // { - // a2 << ","; - // WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); + for (int i = 0; i < this->offset_52.size(); i++) + { + a2 << ","; + this->offset_52[i]->RenderAsOps(a2, a3, a4); - // } + } } else if (this->offset_0 == "OP_FUNC") { a2 << "[" << WXML::EXPRLib::OPShort::DO_FUNC << "]"; - // for (int i = 0; i < this->offset_52.size(); i++) - // { - // a2 << ","; - // WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); + for (int i = 0; i < this->offset_52.size(); i++) + { + a2 << ","; + this->offset_52[i]->RenderAsOps(a2, a3, a4); - // } + } } } @@ -157,14 +159,14 @@ namespace WXML { a2 << "[" << WXML::EXPRLib::OPShort::AOP; a2 << ",'" << this->offset_0 << "'],"; - // for (int i = 0; i < this->offset_52.size(); i++) - // { - // if (i) - // { - // a2 << ","; - // } - // WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(a2, a3, a4); - // } + for (int i = 0; i < this->offset_52.size(); i++) + { + if (i) + { + a2 << ","; + } + this->offset_52[i]->RenderAsOps(a2, a3, a4); + } } // RenderAsOps - 15 diff --git a/src/wxml/expr_lib/parser.cpp b/src/wxml/expr_lib/parser.cpp index e69f3bd..df530a9 100644 --- a/src/wxml/expr_lib/parser.cpp +++ b/src/wxml/expr_lib/parser.cpp @@ -109,6 +109,7 @@ namespace WXML std::string v18 = v84.GetTokenName(); v80->offset_0 = v18; + v80->offset_24 = v84; this->offset_40.push_back(v80); } @@ -140,7 +141,6 @@ namespace WXML return 1002; } auto v21 = this->offset_40.back(); - this->offset_40.pop_back(); this->offset_40.push_back(v78); } diff --git a/src/wxml/rewrite.cpp b/src/wxml/rewrite.cpp index 9482cdd..68f41d8 100644 --- a/src/wxml/rewrite.cpp +++ b/src/wxml/rewrite.cpp @@ -7,7 +7,7 @@ namespace WXML { { void ToStringCode(char const* src, int len, std::stringstream &ss) { - for (size_t i = 0; i < len; i++) + for (int i = 0; i < len; i++) { char v4 = src[i]; if ( v4 == '\''/*39*/ ) diff --git a/test/wcc.disassembly.cpp b/test/wcc.disassembly.cpp index 7d92cb7..1c92a43 100644 --- a/test/wcc.disassembly.cpp +++ b/test/wcc.disassembly.cpp @@ -27791,8 +27791,13 @@ int __thiscall WXML::EXPRLib::ExprSyntaxTree::RenderAsOps(int *this, int a2, int { v5 = std::operator<<>(v44, WXML::EXPRLib::OPShort::CONST); std::operator<<>(v5, ",'"); + // this[9] -> this->offset_24->offset_12 -> v6 + // +4 -> length lpuexcpta = (struct _Unwind_Exception *)(*(_DWORD *)(this[9] + 4) - 2); v6 = WXML::EXPRLib::Token::GetLiteral(v37); + /** + * a2 stringstream + */ WXML::Rewrite::ToStringCode((int)(v6 + 1), (int)lpuexcpta, a2); std::operator<<>(v44, (char *)off_5542FA); }