Merge remote-tracking branch 'origin/patch'

This commit is contained in:
Ryan Kurtz 2024-02-23 13:18:16 -05:00
commit 1b96e1610c
2 changed files with 36 additions and 17 deletions

View file

@ -95,31 +95,51 @@ public class CompareFuncsFromMatchedTokensAction extends AbstractMatchedTokensAc
currentPair.rightToken() == null) { currentPair.rightToken() == null) {
return; return;
} }
FunctionComparisonService service = tool.getService(FunctionComparisonService.class);
if (service == null) {
Msg.error(this, "Function Comparison Service not found!");
return;
}
FunctionComparisonProvider comparisonProvider = service.createFunctionComparisonProvider();
comparisonProvider.removeAddFunctionsAction();
ClangFuncNameToken leftFuncToken = (ClangFuncNameToken) currentPair.leftToken(); ClangFuncNameToken leftFuncToken = (ClangFuncNameToken) currentPair.leftToken();
ClangFuncNameToken rightFuncToken = (ClangFuncNameToken) currentPair.rightToken(); ClangFuncNameToken rightFuncToken = (ClangFuncNameToken) currentPair.rightToken();
Function leftFunction = getFuncFromToken(leftFuncToken, decompPanel.getLeftProgram()); Function leftFunction = getFuncFromToken(leftFuncToken, decompPanel.getLeftProgram());
Function rightFunction = getFuncFromToken(rightFuncToken, decompPanel.getRightProgram()); Function rightFunction = getFuncFromToken(rightFuncToken, decompPanel.getRightProgram());
if (leftFunction == null || rightFunction == null) { if (leftFunction == null || rightFunction == null) {
return; return;
} }
comparisonProvider.getModel().compareFunctions(leftFunction, rightFunction); FunctionComparisonService service = tool.getService(FunctionComparisonService.class);
if (service == null) {
Msg.error(this, "Function Comparison Service not found!");
return;
}
FunctionComparisonProvider comparisonProvider = service.createFunctionComparisonProvider();
comparisonProvider.removeAddFunctionsAction();
comparisonProvider.getModel().compareFunctions(leftFunction, rightFunction);
} }
private Function getFuncFromToken(ClangFuncNameToken funcToken, Program program) { private Function getFuncFromToken(ClangFuncNameToken funcToken, Program program) {
Address callTarget = funcToken.getPcodeOp().getInput(0).getAddress(); Address callTarget = funcToken.getPcodeOp().getInput(0).getAddress();
return program.getFunctionManager().getFunctionAt(callTarget); Function func = program.getFunctionManager().getFunctionAt(callTarget);
if (func == null) {
Msg.showWarn(this, null, "Unable to Compare Callees",
"Can't compare callees - null Function for " + funcToken.getText());
return null;
}
if (func.isExternal()) {
Msg.showWarn(this, null, "Unable to Compare Callees",
"Can't compare callees - " + func.getName() + " is external");
return null;
}
if (!func.isThunk()) {
return func;
}
func = func.getThunkedFunction(true);
if (func.isExternal()) {
Msg.showWarn(this, null, "Unable to Compare",
"Can't compare callees - " + func.getName() + " is external");
return null;
}
return func;
} }
} }

View file

@ -460,9 +460,9 @@ public class PackedDecode implements Decoder {
curPos.advancePosition(length); curPos.advancePosition(length);
return res; return res;
} }
StringBuilder buf = new StringBuilder(); int size = curLen;
String res = new String(curPos.array, curPos.current, curLen); byte[] buf = new byte[length];
buf.append(res); System.arraycopy(curPos.array, curPos.current, buf, 0, curLen);
length -= curLen; length -= curLen;
curPos.advancePosition(curLen); curPos.advancePosition(curLen);
while (length > 0) { while (length > 0) {
@ -470,13 +470,12 @@ public class PackedDecode implements Decoder {
if (curLen > length) { if (curLen > length) {
curLen = length; curLen = length;
} }
res = new String(curPos.array, curPos.current, curLen); System.arraycopy(curPos.array, curPos.current, buf, size, curLen);
buf.append(res); size += curLen;
length -= curLen; length -= curLen;
curPos.advancePosition(curLen); curPos.advancePosition(curLen);
} }
res = buf.toString(); return new String(buf, 0, size);
return res;
} }
@Override @Override