From 8191d408f347490d1a2c67e6c808d2c6ff1b808f Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Sat, 11 Mar 2023 21:47:46 +0000 Subject: [PATCH] GP-3183 Fixed CParser.parse(String) method with not data type archive. Fixed return data type of method when parsing a structure. --- .../main/javacc/ghidra/app/util/cparser/C/C.jj | 4 +++- .../java/ghidra/app/util/cparser/CParserTest.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj index 40de994a62..2aea289b8d 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj @@ -307,6 +307,8 @@ public class CParser { private DataType addDef(Map table, String name, DataType dt) { // System.out.println("** addDef " + name + " = " + (dt != null ? dt.getName() : " - no type -") ); + lastDataType = dt; + DataType existingDT = table.get(name); if (existingDT != null && dt.isEquivalent(existingDT)) { return existingDT; @@ -426,7 +428,7 @@ public class CParser { hasNoComponents = (dtComp.getNumDefinedComponents() == 0 ? true : false); - hasSameSourceArchive = dt.getSourceArchive().equals(dtMgr.getLocalSourceArchive()); + hasSameSourceArchive = Objects.equals(dt.getSourceArchive(), dtMgr.getLocalSourceArchive()); } // make sure comp is a Composite, if existing dt is empty, in same category and archive diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java b/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java index 97a867e30f..2ecc411491 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java @@ -51,6 +51,21 @@ public class CParserTest extends AbstractGenericTest { DataType dt = parser.getDataTypeManager().getDataType("/int32_t"); assertTrue(dt != null); assertTrue(dt instanceof TypeDef); + + dt = parser.parse("struct mystruct {" + + " int field1;" + + " char field2;" + + " };"); + + assertTrue(dt != null); + assertTrue(dt instanceof Structure); + Structure sdt = (Structure) dt; + DataTypeComponent comp = sdt.getComponent(0); + assertEquals("field1", comp.getFieldName()); + assertEquals(comp.getDataType().getName(),"int"); + comp = sdt.getComponent(1); + assertEquals("field2", comp.getFieldName()); + assertEquals(comp.getDataType().getName(),"char"); } /**