diff --git a/src/bin/maple b/src/bin/maple index 6858eb43c96fab33e491cdf0d71cd1d1ee0022d1..33d2c01e25116adf68821a76ffef63b6f88c9768 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/mpl2mpl/include/reflection_analysis.h b/src/mpl2mpl/include/reflection_analysis.h index 565d064a7808507d2fff53bb920e001769f79607..f9233ca7762fe126a86c854dc900b5fa1da6adfc 100644 --- a/src/mpl2mpl/include/reflection_analysis.h +++ b/src/mpl2mpl/include/reflection_analysis.h @@ -35,6 +35,12 @@ enum class ClassRO : uint32 { kClinitAddr }; +enum StaticFieldName { + kClassName = 0, + kFieldName = 1, + kTypeName = 2, +}; + enum class ClassProperty : uint32 { kShadow, kMonitor, diff --git a/src/mpl2mpl/src/reflection_analysis.cpp b/src/mpl2mpl/src/reflection_analysis.cpp index a3470f283c7d339df2ba629fe7ad462b4e30c983..4d44bf37c0eafb287224b93c2541cb74c2f2a905 100644 --- a/src/mpl2mpl/src/reflection_analysis.cpp +++ b/src/mpl2mpl/src/reflection_analysis.cpp @@ -82,7 +82,9 @@ constexpr char kIfieldsStr[] = "ifields"; constexpr char kMethodsStr[] = "methods"; constexpr char kMonitorStr[] = "monitor"; constexpr char kObjsizeStr[] = "objsize"; +#ifndef USE_32BIT_REF constexpr char kPaddingStr[] = "padding"; +#endif constexpr char kTypeNameStr[] = "typeName"; constexpr char kClassNameStr[] = "classname"; constexpr char kFieldNameStr[] = "fieldname"; @@ -918,16 +920,20 @@ static void ConvertFieldName(std::string &fieldname, bool staticfield) { // Convert field name to java define name. if (staticfield) { // Remove class name prefix. - size_t pos1 = fieldname.find(NameMangler::kClassNameSplitterStr); - CHECK_FATAL(pos1 != fieldname.npos, "fieldname not found"); - int fieldLength = strlen(NameMangler::kClassNameSplitterStr); - fieldname = fieldname.substr(pos1 + fieldLength); - size_t pos2 = fieldname.find(NameMangler::kNameSplitterStr); - if (pos2 != fieldname.npos) { - fieldname = fieldname.substr(0, pos2); + std::string decodeFieldName; + NameMangler::DecodeMapleNameToJavaDescriptor(fieldname, decodeFieldName); + std::stringstream ss(decodeFieldName); + std::string item; + std::vector res; + std::string typeName, fieldName; + while (std::getline(ss, item, '|')) { + res.push_back(item); } + CHECK_FATAL(res.size() > 1, "fieldname not found"); + fieldname = res[StaticFieldName::kFieldName]; + } else { + fieldname = NameMangler::DecodeName(fieldname); } - fieldname = NameMangler::DecodeName(fieldname); } void ReflectionAnalysis::GenFieldMeta(const Klass &klass, MIRStructType &fieldsInfoType, @@ -1428,7 +1434,6 @@ void ReflectionAnalysis::GenClassMetaData(Klass &klass) { GenAnnotation(idxNumMap, annoArray, *classType, kPragmaClass, klass.GetKlassName(), invalidIdx); bool isAnonymous = IsAnonymousClass(annoArray); CheckPrivateInnerAndNoSubClass(klass, annoArray); - #ifndef USE_32BIT_REF // @flag // Array class and primitive class is not generated by compiler.