From 7d757bfbc2015469bf572422b1a3e74718ffaada Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Thu, 5 Aug 2004 19:56:50 +0000 Subject: [PATCH] partial fix for function macro argument substitution, this will be enough to let Scanner2.testStringify and the tests for 60764, 36047 to pass. --- .../core/parser/scanner2/Scanner2.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java index 3e694f2bdae..e5e6fb5a8a6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java @@ -1985,6 +1985,11 @@ public class Scanner2 implements IScanner, IScannerData { arg = new char[arglen]; System.arraycopy(buffer, argstart, arg, 0, arglen); } + + //TODO 16.3.1 We are supposed to completely macro replace the arguments before + //substituting them in, this is only a partial replacement of object macros, + //we may need a full solution later. + arg = replaceArgumentMacros( arg ); argmap.put(arglist[currarg], arg); if (c == ')') @@ -1999,6 +2004,37 @@ public class Scanner2 implements IScanner, IScannerData { return result; } + private char[] replaceArgumentMacros( char [] arg ){ + // Check for macro expansion + Object expObject = definitions.get(arg, 0, arg.length); + + // but not if it has been expanded on the stack already + // i.e. recursion avoidance + if (expObject != null){ + for (int stackPos = bufferStackPos; stackPos >= 0; --stackPos){ + if (bufferData[stackPos] != null + && bufferData[stackPos] instanceof ObjectStyleMacro + && CharArrayUtils.equals(arg, ((ObjectStyleMacro)bufferData[stackPos]).name)) + { + expObject = null; + break; + } + } + } + + if( expObject == null ) + return arg; + + if (expObject instanceof ObjectStyleMacro) { + ObjectStyleMacro expMacro = (ObjectStyleMacro)expObject; + return expMacro.expansion; + } else if (expObject instanceof char[]) { + return (char[])expObject; + } + + return arg; + } + private int expandFunctionStyleMacro( char[] expansion, CharArrayObjectMap argmap,