GT-3646 - Demangler - Fixed DemangledVariable to not have duplicate

namespace entries returned from getNamespaceString()
This commit is contained in:
dragonmacher 2020-07-22 16:50:23 -04:00
parent 4d48d6f180
commit bb77d3cda9
7 changed files with 24 additions and 93 deletions

View File

@ -207,7 +207,6 @@ public class DemangledFunction extends DemangledObject {
if (!isTypeCast()) {
buffer.append(returnType == null ? "" : returnType.getSignature() + " ");
}
// buffer.append(returnType == null ? "" : returnType.toSignature() + " ");
}
buffer.append(callingConvention == null ? "" : callingConvention + " ");

View File

@ -24,11 +24,6 @@ public class DemangledLambda extends DemangledFunction {
super(mangled, originalDemangled, name);
}
@Override
public String getNamespaceName() {
return getName();
}
@Override
public String toString() {
return getName();

View File

@ -243,13 +243,9 @@ public abstract class DemangledObject implements Demangled {
return getSignature(false);
}
/**
* Returns a signature that contains only the name (and parameter list for functions)
* @return the signature
*/
@Override
public String getNamespaceName() {
return getSignature(false);
return getName();
}
/**

View File

@ -50,7 +50,7 @@ public class DemangledString extends DemangledObject {
@Override
public String getSignature(boolean format) {
StringBuffer buffer = new StringBuffer();
StringBuilder buffer = new StringBuilder();
if (specialPrefix != null) {
buffer.append(specialPrefix);
}

View File

@ -197,70 +197,4 @@ public class DemangledThunk extends DemangledObject {
return program.getFunctionManager().getFunctionAt(addr);
}
// private Function createAndThunkUnknownExternalFunction(Function function) {
//
// Program program = function.getProgram();
// ExternalManager extMgr = program.getExternalManager();
// SymbolTable symbolTable = program.getSymbolTable();
//
// try {
//
// Symbol librarySymbol =
// symbolTable.getSymbol(Library.UNKNOWN, program.getGlobalNamespace());
// if (librarySymbol != null) {
// if (librarySymbol.getSymbolType() != SymbolType.LIBRARY) {
// return function; // Reserved library name misused - can't create external function
// }
// }
// else {
// Library unknownLibrary =
// extMgr.addExternalLibraryName(Library.UNKNOWN, SourceType.IMPORTED);
// librarySymbol = unknownLibrary.getSymbol();
// }
//
// // add namespaces to unknown library
// Stack<Namespace> nsStack = new Stack<Namespace>();
// Namespace ns = function;
// while ((ns = ns.getParentNamespace()).getID() != Namespace.GLOBAL_NAMESPACE_ID) {
// nsStack.push(ns);
// }
// Namespace parent = (Namespace) librarySymbol.getObject();
// while (!nsStack.isEmpty()) {
// ns = nsStack.pop();
// SymbolType type = ns.getSymbol().getSymbolType();
// Symbol s = symbolTable.getSymbol(ns.getName(), parent);
// if (s != null) {
// if (s.getSymbolType() != type) {
// // wrong type of namespace - just return original function
// return function;
// }
// }
// else if (type == SymbolType.CLASS) {
// parent = symbolTable.createClass(parent, ns.getName(), SourceType.IMPORTED);
// }
// else {
// parent = symbolTable.createNameSpace(parent, ns.getName(), SourceType.IMPORTED);
// }
// }
//
// ExternalLocation extLoc =
// extMgr.addExtFunction(parent, function.getName(), null, SourceType.IMPORTED);
// Function extFunction = extLoc.getFunction();
// extFunction.setCallingConvention(function.getCallingConventionName());
// function.setThunkedFunction(extFunction);
//
// // External function will only have this parameter or none
//
// return extFunction;
// }
// catch (DuplicateNameException e) {
// // unexpected
// }
// catch (InvalidInputException e) {
// // unexpected
// }
//
// return function; // return original function on failure
// }
}

View File

@ -74,7 +74,7 @@ public class DemangledVariable extends DemangledObject {
String n = getDemangledName();
boolean hasName = !StringUtils.isBlank(n);
StringBuffer datatypeBuffer = new StringBuffer();
StringBuilder datatypeBuffer = new StringBuilder();
String spacer = EMPTY_STRING;
if (!(datatype instanceof DemangledFunctionPointer) &&
!(datatype instanceof DemangledFunctionReference) &&
@ -162,20 +162,6 @@ public class DemangledVariable extends DemangledObject {
return buffer.toString();
}
@Override
public String getNamespaceName() {
String n = getDemangledName();
if (!StringUtils.isBlank(n)) {
return n;
}
if (datatype != null) {
return datatype.getSignature();
}
return "<no name>"; // shouldn't happen
}
@Override
protected boolean isAlreadyDemangled(Program program, Address address) {
Data data = program.getListing().getDefinedDataAt(address);

View File

@ -434,6 +434,26 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
object.getSignature(false));
}
@Test
public void testTypeInfo_AddressTable() throws Exception {
String mangled = "_ZTIN10NonDiamond1AE";
String demangled = process.demangle(mangled);
assertEquals("typeinfo for NonDiamond::A", demangled);
DemangledObject object = parser.parse(mangled, demangled);
assertType(object, DemangledAddressTable.class);
assertName(object, "typeinfo", "NonDiamond", "A");
assertEquals("NonDiamond::A::typeinfo", object.getSignature(false));
DemangledAddressTable addressTable = (DemangledAddressTable) object;
assertEquals("typeinfo", addressTable.getName());
assertEquals("NonDiamond::A::typeinfo", addressTable.getNamespaceString());
assertEquals("A", addressTable.getNamespace().getNamespaceName());
assertEquals("NonDiamond::A", addressTable.getNamespace().getNamespaceString());
}
@Test
public void testTypeInfo() throws Exception {
String mangled = "_ZTIN4Arts28FileInputStream_impl_FactoryE";
@ -508,6 +528,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
DemangledVariable variable = (DemangledVariable) object;
assertEquals("dot", variable.getName());
assertEquals("KDirLister::emitChanges()::dot", variable.getNamespaceString());
assertEquals("emitChanges()", variable.getNamespace().getNamespaceName());
assertEquals("KDirLister::emitChanges()", variable.getNamespace().getNamespaceString());
assertNull(variable.getDataType()); // no type information provided