From d18694c8dff1bbaade6d96437285d0bc7d54b0e2 Mon Sep 17 00:00:00 2001 From: msojocs Date: Tue, 18 Jul 2023 08:12:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84DealWxsTag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/night.h | 2 +- src/include/wxml.h | 2 +- src/night/night.cpp | 4 +-- src/wxml/compiler.cpp | 73 ++++++++++++++++++++++++++++++++++------ test/wcc.disassembly.cpp | 23 ++++++++----- 5 files changed, 82 insertions(+), 22 deletions(-) diff --git a/src/include/night.h b/src/include/night.h index bf95a13..555b7ce 100644 --- a/src/include/night.h +++ b/src/include/night.h @@ -40,7 +40,7 @@ namespace night extern std::string std_v_n; extern std::string std_v_v_n; - void compile_ns(std::string const&,std::string const&,std::string const&,uint,std::string&,bool); + int compile_ns(std::string const&,std::string const&,std::string const&,uint,std::string&,bool); void compile_ns_with_sourcemap(std::string const&,std::string const&,std::string const&,std::string const&,uint,std::string&,std::string&); void readfile(char const*, std::string &); void writefile(char const*, std::string &); diff --git a/src/include/wxml.h b/src/include/wxml.h index 51dce97..3f0a566 100644 --- a/src/include/wxml.h +++ b/src/include/wxml.h @@ -381,7 +381,6 @@ namespace WXML { private: /* data */ - std::shared_ptr dom; // offset_4 ? std::deque dequeStr;// offset_8 std::deque> dequeDom; // offset_48 int a1 + 48, _DWORD * a1 + 12 std::vector tokenList; // offset_88 @@ -391,6 +390,7 @@ namespace WXML WXML::DOMLib::Token offset_216; std::string filePath; public: + std::shared_ptr dom; // offset_72 Parser(/* args */); ~Parser(); void Match(); diff --git a/src/night/night.cpp b/src/night/night.cpp index 71c6614..f8ca23a 100644 --- a/src/night/night.cpp +++ b/src/night/night.cpp @@ -36,7 +36,7 @@ namespace night std::string std_v_n = ""; std::string std_v_v_n = ""; - void compile_ns( + int compile_ns( std::string const& a1, std::string const& a2, std::string const& a3, @@ -51,7 +51,7 @@ namespace night night::NSASTParse v39(a1, &v27, &v17); v17.hamlet(); - + return 0; } void compile_ns_with_sourcemap( diff --git a/src/wxml/compiler.cpp b/src/wxml/compiler.cpp index df27c64..a5e0bb0 100644 --- a/src/wxml/compiler.cpp +++ b/src/wxml/compiler.cpp @@ -124,8 +124,7 @@ namespace WXML{ data = data.append(v74); auto v83 = WXML::Compiler::GetFuncId(a11, data); std::string v72; - night::compile_ns(filePath, v83, v79, v65, v72, 0); - int compilerResult = 1; + int compilerResult = night::compile_ns(filePath, v83, v79, v65, v72, 0); if (compilerResult) { throw compilerResult; @@ -815,23 +814,29 @@ namespace WXML{ int * a6, std::string& errorMessage) { + // DealWxsTag - 0 std::string content = a2.GetContent(); - int pos = content.find('>', content[4]); int tokenPos = a2.GetPos(); + int pos = content.find('>', tokenPos); int tokenSize = a2.GetSize(); std::string sub; if (content[pos - 1] == '/') { // 这个尖括号附近是这样的:/> - sub = content.substr(tokenPos + 1, pos + 1 - tokenPos - 6); + sub = content.substr(tokenPos + 4, pos + 1 - tokenPos - 6); } else { - sub = content.substr(tokenPos + 1, pos + 1 - tokenPos - 5); + sub = content.substr(tokenPos + 4, pos + 1 - tokenPos - 5); } std::string data = ""); + /* + ......... + */ + // DealWxsTag - 5 for (int i = 1; i < a2.offset_8; i++) { data = "\n" + data; @@ -842,8 +847,9 @@ namespace WXML{ } WXML::DOMLib::Parser p; std::vector v50; - bool parseResult = p.Parse(&content[0], errorMessage, filePath, v50); - if (!parseResult) + bool parseResult = p.Parse(data.data(), errorMessage, filePath, v50); + // DealWxsTag - 10 + if (parseResult) { auto dom = p.GetParsed(); *a6 = a2.offset_8; @@ -857,7 +863,6 @@ namespace WXML{ int v41 = 1; for (int i = 0; i < a5.length(); i++) { - /* code */ int v14 = a5[i] - 9; if (v14 > 0x17u) { @@ -871,10 +876,58 @@ namespace WXML{ } } - // TODO.... + int v39 = dom->offset_72[0]->offset_48.count("src"); + if (v39) + { + auto v16 = dom->offset_72[0]->offset_48["src"]; + a4 = v16.ToAttrContent(); + } + if (!v39 || v41) + { + auto v42 = dom->offset_72[0]->offset_48; + if (v42.count("module")) + { + auto v23 = v42["module"]; + std::string v24 = v23.ToAttrContent(); + a3.assign(v24); + // 检查字符串命名格式是否正确 + for (auto &&i : v24) + { + bool v27 = i - 'a' <= 0x19u || i - '0' <= 9u; + if (!v27) + { + v27 = i == '_' || i - 'A' <= 0x19u; + } + if (!v27) + { + std::stringstream ss; + ss << filePath << ":" << a2.offset_8 << ":" << a2.offset_12 << ":" << errorMessage; + ss << "invalid module name, [0-9a-zA-Z_] allowed only"; + errorMessage = ss.str(); + return 1; + } + } + return 0; + } + else + { + std::stringstream ss; + ss << filePath << ":" << a2.offset_8 << ":" << a2.offset_12 << ":" << errorMessage; + ss << "module expected in wxs tag"; + errorMessage = ss.str(); + } + + } + else + { + std::stringstream ss; + ss << filePath << ":" << a2.offset_8 << ":" << a2.offset_12 << ":" << errorMessage; + ss << "wxs tag with src don't need any content"; + errorMessage = ss.str(); + } } - return 0; + return 1; } void GetVersionInfo(std::string &a1, std::string a2) diff --git a/test/wcc.disassembly.cpp b/test/wcc.disassembly.cpp index 7109b14..2c27746 100644 --- a/test/wcc.disassembly.cpp +++ b/test/wcc.disassembly.cpp @@ -10888,6 +10888,7 @@ int __cdecl WXML::Compiler::DealWxsTag( char v66[196]; // [esp+19Ch] [ebp-23Ch] BYREF void *v67[94]; // [esp+260h] [ebp-178h] BYREF + // DealWxsTag - 0 lpuexcptc = std::string::find(*a2, '>'/*62*/, (unsigned int)a2[4]); // a2.find('>') v40 = (unsigned int)(lpuexcptc + 1); @@ -10901,6 +10902,8 @@ int __cdecl WXML::Compiler::DealWxsTag( v9 = *a2; if ( v7 ) { + // int * v8 + // v8 -> a2.offset_16 std::string::substr(v55, v9, (unsigned int)(v8 + 1), v40 - (_DWORD)v8 - 6); std::string::operator=((unsigned __int8 **)v53, (int)v55); v10 = (void **)v55; @@ -10912,12 +10915,13 @@ int __cdecl WXML::Compiler::DealWxsTag( v10 = (void **)v56; } std::string::_M_dispose(v10); - std::string::basic_string((char *)v67, (int)v51); + std::string::basic_string((char *)v67, (int)v51); // "" std::string::basic_string(v56, v11); v37 = v12; std::string::_M_dispose(v67); + // DealWxsTag - 5 // a2[2] = a2.offset_8 for ( lpuexcpt = 1; (int)a2[2] > lpuexcpt; ++lpuexcpt ) { @@ -10935,6 +10939,8 @@ int __cdecl WXML::Compiler::DealWxsTag( WXML::DOMLib::Parser::Parser((WXML::DOMLib::Parser *)v37); memset(v50, 0, sizeof(v50)); lpuexcptb = WXML::DOMLib::Parser::Parse((int)v67, (WXML::DOMLib::Parser *)lpuexcpta, (char *)v56[0], (int)a7, a1, v50); + + // DealWxsTag - 10 if ( !lpuexcptb ) { WXML::DOMLib::Parser::GetParsed(&v48, (WXML::DOMLib::Parser *)v67); @@ -10970,13 +10976,14 @@ int __cdecl WXML::Compiler::DealWxsTag( // for end // v48 int + // v48 -> p // v48 + 72 => v48.offset_72 v38 = (_DWORD *)(**(_DWORD **)(v48 + 72) + 48); - std::string::basic_string(v60, (char *)off_547B7D); + std::string::basic_string(v60, (char *)off_547B7D); // src v39 = std::map::count(v38, (int)v60); std::string::_M_dispose(v60); if ( !v39 - || (std::string::basic_string(v64, (char *)off_547B7D), + || (std::string::basic_string(v64, (char *)off_547B7D), // src v16 = std::map::operator[]((_DWORD *)(**(_DWORD **)(v48 + 72) + 48), v64), v17 = WXML::DOMLib::Token::ToAttrContent[abi:cxx11]((int)v16), std::string::_M_assign(a4, v17), @@ -10995,17 +11002,17 @@ int __cdecl WXML::Compiler::DealWxsTag( std::string::_M_assign((int)a3, v24); std::string::_M_dispose(v64); v25 = (_BYTE *)*a3; - v26 = (unsigned __int8)(*(_BYTE *)*a3 - 48) > 9u; + v26 = (unsigned __int8)(*(_BYTE *)*a3 - '0'/*48*/) > 9u; while ( (_BYTE *)(*a3 + a3[1]) != v25 ) { - v27 = (unsigned __int8)(*v25 - 97) <= 0x19u || (unsigned __int8)(*v25 - 48) <= 9u; + v27 = (unsigned __int8)(*v25 - 'a'/*97*/) <= 0x19u || (unsigned __int8)(*v25 - '0'/*48*/) <= 9u; if ( !v27 ) - v27 = *v25 == 95 || (unsigned __int8)(*v25 - 65) <= 0x19u; + v27 = *v25 == '_'/*95*/ || (unsigned __int8)(*v25 - 'A'/*65*/) <= 0x19u; v26 &= v27; ++v25; } if ( v26 ) - goto LABEL_35; + goto LABEL_35; // 销毁数据,返回 std::basic_stringstream,std::allocator>::basic_stringstream((int)v64); std::operator+((char *)v63, a1, ":"); std::operator<<((std::ostream::sentry *)v65, v63);