From d61c4d35ec5d359e388a03411ce1c48228ead58f Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 13 Nov 2006 11:50:35 +0000 Subject: [PATCH] Fixes two exceptions in the scanner (parsing firefox). --- .../core/parser/scanner2/BaseScanner.java | 54 +++++++++---------- .../core/parser/scanner2/DOMScanner.java | 26 ++++++--- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java index 9037daef24e..e53ee231e15 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java @@ -1534,21 +1534,9 @@ abstract class BaseScanner implements IScanner { * @see org.eclipse.cdt.core.parser.IScanner#nextToken() */ public IToken nextToken() throws EndOfFileException { - boolean exception = false; if (nextToken == null && !finished) { - try { - nextToken = fetchToken(); - } catch (Exception e) { - if (e instanceof OffsetLimitReachedException) - throw (OffsetLimitReachedException) e; - if (e instanceof ArrayIndexOutOfBoundsException && isCancelled) - throw new ParseError( - ParseError.ParseErrorKind.TIMEOUT_OR_CANCELLED); - - exception = true; - errorHandle(); - } - if (nextToken == null && !exception) { + nextToken= doFetchToken(); + if (nextToken == null) { finished = true; } } @@ -1578,25 +1566,15 @@ abstract class BaseScanner implements IScanner { IToken oldToken = lastToken; lastToken = nextToken; - try { - nextToken = fetchToken(); - } catch (Exception e) { - if (e instanceof OffsetLimitReachedException) - throw (OffsetLimitReachedException) e; - - nextToken = null; - exception = true; - errorHandle(); - } + nextToken = doFetchToken(); if (nextToken == null) { - if (!exception) - finished = true; + finished = true; } else if (nextToken.getType() == IToken.tCOMPLETION) { finished = true; } else if (nextToken.getType() == IToken.tPOUNDPOUND) { // time for a pasting - IToken token2 = fetchToken(); + IToken token2 = doFetchToken(); if (token2 == null) { nextToken = null; finished = true; @@ -1623,13 +1601,33 @@ abstract class BaseScanner implements IScanner { .getCharImage(), nextToken.getCharImage())); if (oldToken != null) oldToken.setNext(lastToken); - nextToken = fetchToken(); + nextToken = doFetchToken(); } } return lastToken; } + private IToken doFetchToken() throws EndOfFileException { + IToken result= null; + try { + result = fetchToken(); + } catch (ArrayIndexOutOfBoundsException e) { + if (isCancelled) { + throw new ParseError(ParseError.ParseErrorKind.TIMEOUT_OR_CANCELLED); + } + errorHandle(); + throw e; + } catch (RuntimeException e) { + errorHandle(); + throw e; + } catch (Error e) { + errorHandle(); + throw e; + } + return result; + } + /** * @throws EndOfFileException */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java index b73126e6b36..5c0af941610 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java @@ -179,6 +179,14 @@ public class DOMScanner extends BaseScanner { return codeReaderFactory.createCodeReaderForInclusion(this, finalPath); } + protected void pushContext(char[] buffer) { + // called before the constructor, so check for bufferDelta to be + // initialized. + if (bufferDelta != null) { + initBufferDelta(bufferStackPos + 1); + } + super.pushContext(buffer); + } /* * (non-Javadoc) * @@ -186,13 +194,7 @@ public class DOMScanner extends BaseScanner { * java.lang.Object) */ protected void pushContext(char[] buffer, Object data) { - if (bufferStackPos + 1 == bufferDelta.length) { - int size = bufferDelta.length * 2; - int[] oldBufferDelta = bufferDelta; - bufferDelta = new int[size]; - System.arraycopy(oldBufferDelta, 0, bufferDelta, 0, - oldBufferDelta.length); - } + initBufferDelta(bufferStackPos + 1); if (data instanceof InclusionData) { @@ -238,6 +240,16 @@ public class DOMScanner extends BaseScanner { super.pushContext(buffer, data); } + private void initBufferDelta(int size) { + if (size >= bufferDelta.length) { + size = Math.max(bufferDelta.length * 2, size); + int[] oldBufferDelta = bufferDelta; + bufferDelta = new int[size]; + System.arraycopy(oldBufferDelta, 0, bufferDelta, 0, + oldBufferDelta.length); + } + } + protected int fsmCount = 0; /*