From b5973263633f4bb85a78d627e409d42144c3b0fc Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Thu, 12 Feb 2015 21:36:17 +0300 Subject: [PATCH] fix crashes --- src/ddc/lexer/tokenizer.d | 26 +++++++++++++++++--------- src/dlangide/ui/dsourceedit.d | 7 +++++-- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/ddc/lexer/tokenizer.d b/src/ddc/lexer/tokenizer.d index 5df8367..f7776d2 100644 --- a/src/ddc/lexer/tokenizer.d +++ b/src/ddc/lexer/tokenizer.d @@ -1375,6 +1375,15 @@ struct StringAppender { buf[len .. len + s.length] = s; len += s.length; } + void append(dchar ch) { + if (len + 1 > buf.length) { + uint newsize = cast(uint)(buf.length * 2); + if (newsize < 128) + newsize = 128; + buf.length = newsize; + } + buf[len++] = ch; + } void reset() { len = 0; } @@ -1781,20 +1790,19 @@ class Tokenizer return null; } - protected Token processIdent() { + protected Token processIdent(dchar firstChar) { _sharedIdentToken.setPos(_startLine, _startPos); _identAppender.reset(); - int startPos = _startPos; - int endPos = _len; - for (int i = startPos + 1; i < _len; i++) { - dchar ch = _lineText[i]; + _identAppender.append(firstChar); + for (; _pos < _len; ) { + dchar ch = _lineText[_pos]; if (!isIdentMiddleChar(ch)) { - endPos = i; break; } + _identAppender.append(ch); + _pos++; } - _pos = endPos; - _sharedIdentToken.setText(_lineText[startPos .. endPos]); + _sharedIdentToken.setText(_identAppender.get); return _sharedIdentToken; } @@ -2756,7 +2764,7 @@ class Tokenizer return _sharedKeywordToken; } } - return processIdent(); + return processIdent(ch); } OpCode op = detectOp(ch); if (op != OpCode.NONE) { diff --git a/src/dlangide/ui/dsourceedit.d b/src/dlangide/ui/dsourceedit.d index cf67271..fc732b6 100644 --- a/src/dlangide/ui/dsourceedit.d +++ b/src/dlangide/ui/dsourceedit.d @@ -649,8 +649,11 @@ class SimpleDSyntaxHighlighter : SyntaxHighlighter { for (int i = tokenLine; i <= newLine; i++) { int start = i > tokenLine ? 0 : tokenPos; int end = i < newLine ? cast(int)lines[i].length : newPos; - for (int j = start; j < end; j++) - _props[i][j] = category; + for (int j = start; j < end; j++) { + if (j < _props[i].length) { + _props[i][j] = category; + } + } } // handle token - convert to category