diff --git a/libredex/Purity.cpp b/libredex/Purity.cpp index 15ba9cd3a20..66fef47888e 100644 --- a/libredex/Purity.cpp +++ b/libredex/Purity.cpp @@ -188,6 +188,7 @@ static const std::string_view pure_method_names[] = { "Ljava/lang/Integer;.toString:(I)Ljava/lang/String;", "Ljava/lang/Integer;.toString:(II)Ljava/lang/String;", "Ljava/lang/Integer;.valueOf:(I)Ljava/lang/Integer;", + "Ljava/lang/Integer;.parseInt:(Ljava/lang/String;)I", "Ljava/lang/Long;.bitCount:(J)I", "Ljava/lang/Long;.compareTo:(Ljava/lang/Long;)I", "Ljava/lang/Long;.doubleValue:()D", diff --git a/libredex/WellKnownTypes.h b/libredex/WellKnownTypes.h index 442d9092a98..f4824e31955 100644 --- a/libredex/WellKnownTypes.h +++ b/libredex/WellKnownTypes.h @@ -56,10 +56,11 @@ FOR_EACH(java_lang_Integer_valueOf, \ "Ljava/lang/Integer;.valueOf:(I)Ljava/lang/Integer;") \ FOR_EACH(java_lang_Integer_intValue, "Ljava/lang/Integer;.intValue:()I") \ + FOR_EACH(java_lang_Integer_parseInt, "Ljava/lang/Integer;.parseInt:(Ljava/lang/String;)I") \ FOR_EACH(java_lang_Throwable_fillInStackTrace, \ "Ljava/lang/Throwable;.fillInStackTrace:()Ljava/lang/Throwable;") \ FOR_EACH(java_lang_RuntimeException_init_String, \ "Ljava/lang/RuntimeException;.:(Ljava/lang/String;)V") \ FOR_EACH(java_lang_String_equals, \ "Ljava/lang/String;.equals:(Ljava/lang/Object;)Z") \ - FOR_EACH(java_lang_String_hashCode, "Ljava/lang/String;.hashCode:()I") + FOR_EACH(java_lang_String_hashCode, "Ljava/lang/String;.hashCode:()I") diff --git a/service/constant-propagation/ConstantPropagationAnalysis.cpp b/service/constant-propagation/ConstantPropagationAnalysis.cpp index 6ff65e8330a..ae43fce85bb 100644 --- a/service/constant-propagation/ConstantPropagationAnalysis.cpp +++ b/service/constant-propagation/ConstantPropagationAnalysis.cpp @@ -806,6 +806,13 @@ bool StringAnalyzer::analyze_invoke(const IRInstruction* insn, env->set(RESULT_REGISTER, SignedConstantDomain(res)); return true; } + }else if (method == method::java_lang_Integer_parseInt()){ + if (const auto* arg0 = maybe_string(0)) { + const char* int_ = arg0->c_str(); + int64_t res = atoi(int_); + env->set(RESULT_REGISTER, SignedConstantDomain(res)); + return true; + } } return false;