From b9768b37d59c21f2a9c4b0cee9a008ffeefa4076 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Thu, 19 Aug 2004 03:29:26 +0000 Subject: [PATCH] Fixed Bug 71839 [Parser] Parser in infinite loop (ExpressionParser.errorHandling()) --- .../parser/tests/scanner2/Scanner2Test.java | 66 ++++++------------- .../core/parser/scanner2/Scanner2.java | 6 +- 2 files changed, 26 insertions(+), 46 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java index b78febf72ca..f1bf8a75288 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java @@ -558,7 +558,7 @@ public class Scanner2Test extends BaseScanner2Test } } - public void testIfs() + public void testIfs() throws Exception { try { @@ -601,34 +601,24 @@ public class Scanner2Test extends BaseScanner2Test fail(EXCEPTION_THROWN + e.toString()); } - try - { - initializeScanner( - "#ifndef FIVE \n" + //$NON-NLS-1$ - "#define FIVE 5\n" + //$NON-NLS-1$ - "#endif \n" + //$NON-NLS-1$ - "#ifndef TEN\n" + //$NON-NLS-1$ - "#define TEN 2 * FIVE\n" + //$NON-NLS-1$ - "#endif\n" + //$NON-NLS-1$ - "#if TEN != 10\n" + //$NON-NLS-1$ - "#define MISTAKE 1\n" + //$NON-NLS-1$ - "#error Five does not equal 10\n" + //$NON-NLS-1$ - "#endif\n"); //$NON-NLS-1$ - scanner.addDefinition("FIVE", "55"); //$NON-NLS-1$ //$NON-NLS-2$ - validateEOF(); - fail(EXPECTED_FAILURE); - } - catch (ScannerException se) - { - validateBalance(1); - validateDefinition("FIVE", "55"); //$NON-NLS-1$ //$NON-NLS-2$ - validateDefinition("TEN", "2 * FIVE"); //$NON-NLS-1$ //$NON-NLS-2$ - validateDefinition("MISTAKE", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - } - catch (Exception e) - { - fail(EXCEPTION_THROWN + e.toString()); - } + Callback callback = new Callback( ParserMode.QUICK_PARSE ); + initializeScanner( + "#ifndef FIVE \n" + //$NON-NLS-1$ + "#define FIVE 5\n" + //$NON-NLS-1$ + "#endif \n" + //$NON-NLS-1$ + "#ifndef TEN\n" + //$NON-NLS-1$ + "#define TEN 2 * FIVE\n" + //$NON-NLS-1$ + "#endif\n" + //$NON-NLS-1$ + "#if TEN != 10\n" + //$NON-NLS-1$ + "#define MISTAKE 1\n" + //$NON-NLS-1$ + "#error Five does not equal 10\n" + //$NON-NLS-1$ + "#endif\n", ParserMode.QUICK_PARSE, callback); //$NON-NLS-1$ + scanner.addDefinition("FIVE", "55"); //$NON-NLS-1$ //$NON-NLS-2$ + validateEOF(); + validateDefinition("FIVE", "55"); //$NON-NLS-1$ //$NON-NLS-2$ + validateDefinition("TEN", "2 * FIVE"); //$NON-NLS-1$ //$NON-NLS-2$ + validateDefinition("MISTAKE", "1"); //$NON-NLS-1$ //$NON-NLS-2$ + assertFalse( callback.problems.isEmpty() ); try { @@ -669,22 +659,8 @@ public class Scanner2Test extends BaseScanner2Test fail(EXCEPTION_THROWN + e.toString()); } - try - { - initializeScanner("#if ! 0\n#error Correct!\n#endif"); //$NON-NLS-1$ - scanner.nextToken(); - fail(EXPECTED_FAILURE); - } - catch (ScannerException se) - { - validateBalance(1); - // TODO define problems - //assertEquals( se.getProblem().getID(), IProblem.PREPROCESSOR_POUND_ERROR); - } - catch (Exception e) - { - fail(EXCEPTION_THROWN + e.toString()); - } + initializeScanner("#if ! 0\n#error Correct!\n#endif"); //$NON-NLS-1$ + validateEOF(); } public void testPreprocessorMacros() 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 c4f8cbf4ec2..aeaa1d1f639 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 @@ -1294,7 +1294,11 @@ public class Scanner2 implements IScanner, IScannerData { handleInvalidCompletion(); return; case ppError: - throw new ScannerException(null); + start = bufferPos[bufferStackPos]; + skipToNewLine(); + len = bufferPos[bufferStackPos] - start; + handleProblem( IProblem.PREPROCESSOR_POUND_ERROR, start, CharArrayUtils.extract( buffer, start, len )); + break; case ppEndif: if( !branchState( BRANCH_END ) ) handleProblem( IProblem.PREPROCESSOR_UNBALANCE_CONDITION, start, ppKeywords.findKey( buffer, start, len ) );