Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ecff5897 authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge "Fix a few demangler issues."

parents 643f1e93 d7bb826a
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -509,6 +509,29 @@ TEST(DemangleTest, non_virtual_thunk) {
  ASSERT_EQ("_ZTH_N3oneE", demangler.Parse("_ZTH_N3oneE"));
}

TEST(DemangleTest, r_value_reference) {
  Demangler demangler;
  ASSERT_EQ(
      "android::SurfaceComposerClient::Transaction::merge(android::SurfaceComposerClient::"
      "Transaction&&)",
      demangler.Parse("_ZN7android21SurfaceComposerClient11Transaction5mergeEOS1_"));
}

TEST(DemangleTest, initial_St) {
  Demangler demangler;
  EXPECT_EQ("std::state", demangler.Parse("_ZSt5state"));
  EXPECT_EQ("std::_In::ward", demangler.Parse("_ZNSt3_In4wardE"));
  EXPECT_EQ("std::__terminate(void (*)())", demangler.Parse("_ZSt11__terminatePFvvE"));
}

TEST(DemangleTest, cfi) {
  Demangler demangler;
  EXPECT_EQ("nfa_sys_ptim_timer_update(tPTIM_CB*)",
            demangler.Parse("_Z25nfa_sys_ptim_timer_updateP8tPTIM_CB"));
  EXPECT_EQ("nfa_sys_ptim_timer_update(tPTIM_CB*) [clone .cfi]",
            demangler.Parse("_Z25nfa_sys_ptim_timer_updateP8tPTIM_CB.cfi"));
}

TEST(DemangleTest, demangle) {
  std::string str;

+17 −0
Original line number Diff line number Diff line
@@ -580,6 +580,10 @@ const char* Demangler::ParseArguments(const char* name) {
    }
    return name + 1;

  case 'O':
    cur_state_.suffixes.push_back("&&");
    return name + 1;

  case 'K':
  case 'V': {
    const char* suffix;
@@ -701,6 +705,9 @@ const char* Demangler::ParseArguments(const char* name) {
        cur_state_.str.clear();
      }
      return name;
    } else if (strcmp(name, ".cfi") == 0) {
      function_suffix_ += " [clone .cfi]";
      return name + 4;
    }
  }
  return nullptr;
@@ -816,6 +823,16 @@ const char* Demangler::FindFunctionName(const char* name) {
    return name + 1;
  }

  if (*name == 'S') {
    name++;
    if (*name == 't') {
      function_name_ = "std::";
      name++;
    } else {
      return nullptr;
    }
  }

  if (std::isdigit(*name)) {
    name = GetStringFromLength(name, &function_name_);
  } else if (*name == 'L' && std::isdigit(name[1])) {