diff --git a/src/include/wxml.h b/src/include/wxml.h index 5a28a91..5d799a0 100644 --- a/src/include/wxml.h +++ b/src/include/wxml.h @@ -92,7 +92,7 @@ namespace WXML int offset_24 = 0; // ??? int offset_40 = 0; // AttrsCompartor用到,怎么来不知道 // ??? -3, -1 - int offset_56 = 1; + int offset_56 = -1; std::string offset_60 = ""; // ??? Token(); Token(std::string &); @@ -236,9 +236,9 @@ namespace WXML private: /* data */ public: - std::string offset_0; - int offset_4; - RVMOpCodePosition(std::string); + int offset_0 = 0; + int offset_4 = 0; + RVMOpCodePosition(int); RVMOpCodePosition(/* args */); ~RVMOpCodePosition(); }; diff --git a/src/wxml/compiler.cpp b/src/wxml/compiler.cpp index b8c84cb..250befb 100644 --- a/src/wxml/compiler.cpp +++ b/src/wxml/compiler.cpp @@ -329,7 +329,8 @@ namespace WXML{ i->second->RewriteTree(); std::string v328 = "ALL"; auto v51 = componentListMap[v328]; - auto v282 = i->second; + std::shared_ptr v282 = i->second; + // 标记如果有后代 v282->MarkIfHasDescendant(v51); if (isLLA) { diff --git a/src/wxml/dom_lib/machine.cpp b/src/wxml/dom_lib/machine.cpp index 61981d0..bfc4bdf 100644 --- a/src/wxml/dom_lib/machine.cpp +++ b/src/wxml/dom_lib/machine.cpp @@ -389,6 +389,7 @@ namespace WXML this->offset_20 = this->lineLength; this->offset_16 = this->lineCount; token.offset_24 = WXML::DOMLib::Machine::STT[v45]; + token.offset_56 = -1; if(token.offset_24 == 3) { a5.push_back(token); @@ -416,6 +417,7 @@ namespace WXML v49.offset_20 = this->fileLength - t4; int stt = WXML::DOMLib::Machine::STT[v45]; v49.offset_24 = stt; + v49.offset_56 = -1; if (stt == 3) { a5.push_back(v49); diff --git a/src/wxml/dom_lib/rvm_op_code_position.cpp b/src/wxml/dom_lib/rvm_op_code_position.cpp index 4186e65..3a1d03e 100644 --- a/src/wxml/dom_lib/rvm_op_code_position.cpp +++ b/src/wxml/dom_lib/rvm_op_code_position.cpp @@ -2,12 +2,8 @@ namespace WXML { namespace DOMLib - { - /** - * 感觉不太对,可能不是一个类 - */ - - RVMOpCodePosition::RVMOpCodePosition(std::string a) + { + RVMOpCodePosition::RVMOpCodePosition(int a) { this->offset_0 = a; } diff --git a/src/wxml/dom_lib/wxml_dom.cpp b/src/wxml/dom_lib/wxml_dom.cpp index b191549..34b1f5c 100644 --- a/src/wxml/dom_lib/wxml_dom.cpp +++ b/src/wxml/dom_lib/wxml_dom.cpp @@ -104,7 +104,7 @@ namespace WXML { v52 = 0; if (v77.size() == 1) { - v52 = a8 & v77[0].offset_0 == true; + v52 = a8 & (v77[0].offset_0 == true); } } a3 << "Z("; @@ -163,13 +163,15 @@ namespace WXML { WXML::Rewrite::ToStringCode(r, a3); a3 << "']"; } + int v68 = a9->offset_0; int v43 = -1; if (v52) { v43 = a9->offset_4; } WXML::DOMLib::RVMOpCodePosition pos; - pos.offset_4 = -1; + pos.offset_0 = a9->offset_0; + pos.offset_4 = v43; v80.push_back({v29, pos}); } else @@ -213,6 +215,7 @@ namespace WXML { a3 << "]"; if (a5->offset_56 == -1) a5->offset_56 = a9->offset_0; + a9->offset_4 = 0; a9->offset_0++; for (auto i = v80.begin(); i != v80.end(); i++) { @@ -1599,9 +1602,6 @@ namespace WXML { } } - /** - * TODO - */ bool WXMLDom::IfHasItsElse( int a2, std::vector const& a3 @@ -1623,7 +1623,7 @@ namespace WXML { { int v11 = a2 - 1; auto v5 = this->offset_72[a2]; - if(v5->offset_48.begin() == v5->offset_48.end()) + if(v5->offset_72.begin() == v5->offset_72.end()) { for (int i = a2 + 1; i < this->offset_72.size(); i++) { diff --git a/test/wcc.disassembly.cpp b/test/wcc.disassembly.cpp index 1c92a43..1c7e465 100644 --- a/test/wcc.disassembly.cpp +++ b/test/wcc.disassembly.cpp @@ -23979,6 +23979,8 @@ int __cdecl WXML::DOMLib::WXMLDom::DealSingleTokenToOps( std::string::append(v83, v46); // v28 v57 = (_DWORD *)a4[2]; v63 = a4 + 1; + + // find while ( v57 ) { v30 = (unsigned __int8)std::operator<((int)(v57 + 4), (int)v83) == 0; @@ -23993,6 +23995,7 @@ int __cdecl WXML::DOMLib::WXMLDom::DealSingleTokenToOps( v57 = v32; v63 = v31; } + if ( a4 + 1 == v63 || (unsigned __int8)std::operator<((int)v83, (int)(v63 + 4)) ) { if ( *(_DWORD *)(*(_DWORD *)&v77[1] + 28 * v51) ) @@ -24145,6 +24148,7 @@ LABEL_107: if ( v52 ) std::operator<<>(lpuexcptd, "]"); v35 = *a9; + // a5->offset_56 if ( a5[14] == -1 ) a5[14] = v35; v67 = 0; @@ -27380,7 +27384,14 @@ LABEL_12: v29 = WXML::DOMLib::Machine::STT[v45]; // v53 -> v49.offset_16 = this->offset_4 修改之前的 v53 = v23; - v60 = -1; + v60 = -1; // offset_56 + /* + v49 offset_0 + + v50 + + v60 offset_56 + */ // v55 -> v49.offset_24 v55 = v29; if ( v29 == 3 ) @@ -53070,7 +53081,7 @@ char __thiscall WXML::DOMLib::WXMLDom::IfHasItsElse(_DWORD *this, signed int a2, std::string::_M_dispose(v23); if ( !v18 ) break; - v12 = a3[1]; // a3.offset_4 + v12 = a3[1]; // a3.end() if ( v12 != std::find<__gnu_cxx::__normal_iterator>,std::string>( *a3, // start v12, // end