diff --git a/src/bin/maple b/src/bin/maple index 6f71799a236f2781765114290f9c8b3d793e6be6..f8985a17d30724083a2ea8440d000d15d3bf47c5 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/bin/mplcg b/src/bin/mplcg index 05b2f8d19e5287949009988912240dc3147512f8..8c2e95b17e01ae0e72dacc34349cc22f2df169e3 100755 Binary files a/src/bin/mplcg and b/src/bin/mplcg differ diff --git a/src/mpl2mpl/include/reflection_analysis.h b/src/mpl2mpl/include/reflection_analysis.h index c506a8f626898d418008a5dede86f35885224391..624a60a0d05f503c99849b2126c0bcb55dbaaf4b 100644 --- a/src/mpl2mpl/include/reflection_analysis.h +++ b/src/mpl2mpl/include/reflection_analysis.h @@ -209,8 +209,6 @@ class ReflectionAnalysis : public AnalysisResult { PragmaKind paragKind, const std::string ¶gName, TyIdx fieldTypeIdx, std::map *paramNumArray = nullptr, int *paramIndex = nullptr); void AppendValueByType(std::string &annoArr, const MIRPragmaElement &elem); - void SetAnnoFieldConst(const MIRStructType &metadataRoType, MIRAggConst &newConst, uint32 fieldID, - std::map &idxNumMap, const std::string &annoArr); bool IsAnonymousClass(const std::string &annotationString); bool IsPrivateClass(const MIRClassType &classType) const; bool IsStaticClass(const MIRClassType &classType) const; @@ -218,13 +216,15 @@ class ReflectionAnalysis : public AnalysisResult { void CheckPrivateInnerAndNoSubClass(Klass &clazz, const std::string &annoArr); void ConvertMapleClassName(const std::string &mplClassName, std::string &javaDsp); - int GetDeflateStringIdx(const std::string &subStr); - uint32 GetAnnoCstrIndex(std::map &idxNumMap, const std::string &annoArr); + int GetDeflateStringIdx(const std::string &subStr, bool needSpecialFlag); + uint32 GetAnnoCstrIndex(std::map &idxNumMap, const std::string &annoArr, bool isField); uint32 GetMethodInVtabIndex(const Klass &clazz, const MIRFunction &func) const; void GetSignatureTypeNames(std::string &signature, std::vector &typeNames); MIRSymbol *GetClinitFuncSymbol(const Klass &klass); int SolveAnnotation(MIRClassType &classType, MIRFunction &func); uint32 GetTypeNameIdxFromType(const MIRType &type, const Klass &klass, const std::string &fieldName); + bool IsMemberClass(const std::string &annotationString); + int8_t GetAnnoFlag(const std::string &annotationString); MIRModule *mirModule; MapleAllocator allocator; diff --git a/src/mpl2mpl/src/reflection_analysis.cpp b/src/mpl2mpl/src/reflection_analysis.cpp index f2d83500db52eeea5da157fe7d795a6c81268a16..a0e39560aa027ca722c207dc110e9c524cfd1366 100644 --- a/src/mpl2mpl/src/reflection_analysis.cpp +++ b/src/mpl2mpl/src/reflection_analysis.cpp @@ -121,8 +121,8 @@ constexpr char kReflectionReferencePrefixStr[] = "Ljava_2Flang_2Fref_2FReference constexpr char kJavaLangAnnotationRetentionStr[] = "Ljava_2Flang_2Fannotation_2FRetention_3B"; constexpr int kAnonymousClassIndex = 5; constexpr char kAnonymousClassSuffix[] = "30"; -constexpr char kAnonymousClassPrefix[] = "Lark/annotation/InnerClass;"; -constexpr char kInnerClassPrefix[] = "Lark/annotation/EnclosingClass;"; +constexpr char kInnerClassStr[] = "Lark/annotation/InnerClass;"; +constexpr char kEnclosingClassStr[] = "Lark/annotation/EnclosingClass;"; constexpr char kArkAnnotationEnclosingClassStr[] = "Lark_2Fannotation_2FEnclosingClass_3B"; } // namespace @@ -141,8 +141,28 @@ std::string ReflectionAnalysis::strTabBothHot = std::string(1, '\0'); std::string ReflectionAnalysis::strTabRunHot = std::string(1, '\0'); bool ReflectionAnalysis::strTabInited = false; -int ReflectionAnalysis::GetDeflateStringIdx(const std::string &subStr) { - return FindOrInsertReflectString("1!" + subStr); +bool ReflectionAnalysis::IsMemberClass(const std::string &annotationString) { + uint32_t idx = ReflectionAnalysis::FindOrInsertReflectString(kEnclosingClassStr); + std::string target = annoDelimiterPrefix + std::to_string(idx) + annoDelimiter; + if (annotationString.find(target, 0) != std::string::npos) { + return true; + } + return false; +} + +int8_t ReflectionAnalysis::GetAnnoFlag(const std::string &annotationString) { + constexpr int8_t kMemberPosValid = 1; + constexpr int8_t kMemberPosValidOffset = 2; + constexpr int8_t kIsMemberClassOffset = 1; + constexpr int8_t kNewMeta = 1; + int8_t isMemberClass = IsMemberClass(annotationString); + int8_t value = (kMemberPosValid << kMemberPosValidOffset) + (isMemberClass << kIsMemberClassOffset) + kNewMeta; + return value; +} + +int ReflectionAnalysis::GetDeflateStringIdx(const std::string &subStr, bool needSpecialFlag) { + std::string flag = needSpecialFlag ? (std::to_string(GetAnnoFlag(subStr)) + annoDelimiter) : "1!"; + return FindOrInsertReflectString(flag + subStr); } uint32 ReflectionAnalysis::FirstFindOrInsertRepeatString(const std::string &str, bool isHot, uint8 hotType) { @@ -348,7 +368,7 @@ int ReflectionAnalysis::SolveAnnotation(MIRClassType &classType, MIRFunction &fu } subStr += annoArray2; } - return GetDeflateStringIdx(subStr); + return GetDeflateStringIdx(subStr, false); } uint32 ReflectionAnalysis::GetTypeNameIdxFromType(const MIRType &type, const Klass &klass, @@ -390,9 +410,9 @@ uint32 ReflectionAnalysis::GetTypeNameIdxFromType(const MIRType &type, const Kla void ReflectionAnalysis::CheckPrivateInnerAndNoSubClass(Klass &clazz, const std::string &annoArr) { // LMain_24A_3B `EC!`VL!24!LMain_3B!`IC!`AF!4!2!name!23!A! - uint32_t idx = FindOrInsertReflectString(kInnerClassPrefix); + uint32_t idx = FindOrInsertReflectString(kEnclosingClassStr); std::string target = annoDelimiterPrefix + std::to_string(idx) + annoDelimiter; - size_t pos = annoArr.find(kInnerClassPrefix, 0); + size_t pos = annoArr.find(kEnclosingClassStr, 0); if (pos == std::string::npos) { return; } @@ -975,7 +995,7 @@ void ReflectionAnalysis::GenFieldMeta(const Klass &klass, MIRStructType &fieldsI std::string annoArr; std::map idxNumMap; GenAnnotation(idxNumMap, annoArr, *classType, kPragmaVar, fieldName, ty->GetTypeIndex()); - uint32 annotationIdx = GetAnnoCstrIndex(idxNumMap, annoArr); + uint32 annotationIdx = GetAnnoCstrIndex(idxNumMap, annoArr, true); mirBuilder.AddIntFieldConst(fieldsInfoType, *newConst, fieldID++, annotationIdx); // @declaring class MIRSymbol *dklassSt = GetOrCreateSymbol(CLASSINFO_PREFIX_STR + klass.GetKlassName(), classMetadataTyIdx); @@ -1256,11 +1276,12 @@ void ReflectionAnalysis::GenAnnotation(std::map &idxNumMap, std::strin } } -uint32 ReflectionAnalysis::GetAnnoCstrIndex(std::map &idxNumMap, const std::string &annoArr) { +uint32 ReflectionAnalysis::GetAnnoCstrIndex(std::map &idxNumMap, const std::string &annoArr, bool isField) { size_t annoNum = idxNumMap.size(); uint32 signatureIdx = 0; if (annoNum == 0) { - std::string subStr = "1!0"; + std::string flag = isField ? "1!" : std::to_string(GetAnnoFlag(annoArr)) + annoDelimiter; + std::string subStr = flag + "0"; signatureIdx = FindOrInsertReflectString(subStr); } else { std::string subStr = std::to_string(annoNum); @@ -1270,7 +1291,7 @@ uint32 ReflectionAnalysis::GetAnnoCstrIndex(std::map &idxNumMap, const subStr += annoDelimiter; }); subStr += annoArr; - signatureIdx = GetDeflateStringIdx(subStr); + signatureIdx = GetDeflateStringIdx(subStr, !isField); } return signatureIdx; } @@ -1441,7 +1462,8 @@ void ReflectionAnalysis::GenClassMetaData(Klass &klass) { uint32 modifier = GetClassAccessFlags(*classType); mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, modifier); // @annotation: Set annotation field. - SetAnnoFieldConst(classMetadataROType, *newConst, fieldID++, idxNumMap, annoArray); + uint32_t signatureIdx = GetAnnoCstrIndex(idxNumMap, annoArray, false); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, signatureIdx); // @ClinitFuncAddr MIRSymbol *clinitFuncSym = GetClinitFuncSymbol(klass); if (clinitFuncSym != nullptr) { @@ -1520,26 +1542,6 @@ void ReflectionAnalysis::GenClassMetaData(Klass &klass) { classTab.push_back(classSt); } -void ReflectionAnalysis::SetAnnoFieldConst(const MIRStructType &metadataRoType, MIRAggConst &newConst, uint32 fieldid, - std::map &idxNumMap, const std::string &annoArr) { - size_t annoNum = idxNumMap.size(); - if (annoNum == 0) { - std::string subStr = "0!0"; - uint32 signatureIdx = FindOrInsertReflectString(subStr); - mirBuilder.AddIntFieldConst(metadataRoType, newConst, fieldid, signatureIdx); - } else { - std::string subStr = std::to_string(annoNum); - subStr += "!"; - std::for_each(idxNumMap.begin(), idxNumMap.end(), [&subStr](const std::pair p) { - subStr += std::to_string(p.second); - subStr += "!"; - }); - subStr += annoArr; - uint32 signatureIdx = GetDeflateStringIdx(subStr); - mirBuilder.AddIntFieldConst(metadataRoType, newConst, fieldid, signatureIdx); - } -} - int8 ReflectionAnalysis::JudgePara(MIRClassType &classType) { for (MIRPragma *prag : classType.GetPragmaVec()) { if (prag->GetKind() == kPragmaClass) { @@ -1555,7 +1557,7 @@ int8 ReflectionAnalysis::JudgePara(MIRClassType &classType) { bool ReflectionAnalysis::IsAnonymousClass(const std::string &annotationString) { // eg: `IC!`AF!4!0!name!30!! - uint32_t idx = ReflectionAnalysis::FindOrInsertReflectString(kAnonymousClassPrefix); + uint32_t idx = ReflectionAnalysis::FindOrInsertReflectString(kInnerClassStr); std::string target = annoDelimiterPrefix + std::to_string(idx) + annoDelimiter; size_t pos = annotationString.find(target, 0); if (pos != std::string::npos) {