Browse Source

Fixed forum-17502: exception in C# and VB lexer when a hexadecimal literal is larger than ulong.MaxValue.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.1@2559 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
6331df6b0c
  1. 6
      src/Libraries/NRefactory/NRefactory.sln
  2. 8
      src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs
  3. 8
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  4. 4
      src/Libraries/NRefactory/Test/Lexer/CSharp/NumberLexerTest.cs
  5. 32
      src/Libraries/NRefactory/Test/Lexer/VBNet/LiteralsTests.cs

6
src/Libraries/NRefactory/NRefactory.sln

@ -1,5 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 9.00 
# SharpDevelop 2.1.0.1865 Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
# SharpDevelop 2.2.0.2532
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryTests", "Test\NRefactoryTests.csproj", "{870115DD-960A-4406-A6B9-600BCDC36A03}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryTests", "Test\NRefactoryTests.csproj", "{870115DD-960A-4406-A6B9-600BCDC36A03}"

8
src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs

@ -289,7 +289,13 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
// Try to determine a parsable value using ranges. (Quick hack!) // Try to determine a parsable value using ranges. (Quick hack!)
double d = 0; double d = 0;
if (ishex) { if (ishex) {
d = ulong.Parse(digit, NumberStyles.HexNumber); ulong result;
if (ulong.TryParse(digit, NumberStyles.HexNumber, null, out result)) {
d = result;
} else {
errors.Error(y, x, String.Format("Can't parse hexadecimal constant {0}", digit));
return new Token(Tokens.Literal, x, y, stringValue.ToString(), 0);
}
} else { } else {
if (!Double.TryParse(digit, NumberStyles.Integer, null, out d)) { if (!Double.TryParse(digit, NumberStyles.Integer, null, out d)) {
errors.Error(y, x, String.Format("Can't parse integral constant {0}", digit)); errors.Error(y, x, String.Format("Can't parse integral constant {0}", digit));

8
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs

@ -12,7 +12,7 @@ using System.Text;
namespace ICSharpCode.NRefactory.Parser.VB namespace ICSharpCode.NRefactory.Parser.VB
{ {
internal class Lexer : AbstractLexer internal sealed class Lexer : AbstractLexer
{ {
bool lineEnd = true; bool lineEnd = true;
@ -318,6 +318,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
ch = Char.ToUpper(ch, CultureInfo.InvariantCulture); ch = Char.ToUpper(ch, CultureInfo.InvariantCulture);
bool unsigned = ch == 'U'; bool unsigned = ch == 'U';
if (unsigned) { if (unsigned) {
ReaderRead(); // read the U
ch = (char)ReaderPeek(); ch = (char)ReaderPeek();
sb.Append(ch); sb.Append(ch);
ch = Char.ToUpper(ch, CultureInfo.InvariantCulture); ch = Char.ToUpper(ch, CultureInfo.InvariantCulture);
@ -325,6 +326,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
errors.Error(Line, Col, "Invalid type character: U" + ch); errors.Error(Line, Col, "Invalid type character: U" + ch);
} }
} }
try {
if (isokt) { if (isokt) {
ReaderRead(); ReaderRead();
ulong number = 0L; ulong number = 0L;
@ -380,6 +382,10 @@ namespace ICSharpCode.NRefactory.Parser.VB
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((int)number)); return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((int)number));
} }
} }
} catch (OverflowException ex) {
errors.Error(Line, Col, ex.Message);
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0);
}
} }
Token nextToken = null; // if we accedently read a 'dot' Token nextToken = null; // if we accedently read a 'dot'
if (!isdouble && ReaderPeek() == '.') { // read floating point number if (!isdouble && ReaderPeek() == '.') { // read floating point number

4
src/Libraries/NRefactory/Test/Lexer/CSharp/NumberLexerTest.cs

@ -37,6 +37,7 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.CSharp
Assert.AreEqual(Tokens.Literal, t.kind, "Tokens.Literal"); Assert.AreEqual(Tokens.Literal, t.kind, "Tokens.Literal");
Assert.AreEqual(text, t.val, "value"); Assert.AreEqual(text, t.val, "value");
Assert.IsNotNull(t.literalValue, "literalValue is null"); Assert.IsNotNull(t.literalValue, "literalValue is null");
Assert.AreEqual(val.GetType(), t.literalValue.GetType(), "literalValue.GetType()");
Assert.AreEqual(val, t.literalValue, "literalValue"); Assert.AreEqual(val, t.literalValue, "literalValue");
} }
@ -80,12 +81,15 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.CSharp
GenerateLexer(new StringReader("0xG2F")).NextToken(); GenerateLexer(new StringReader("0xG2F")).NextToken();
// SD2-457 // SD2-457
GenerateLexer(new StringReader("0x")).NextToken(); GenerateLexer(new StringReader("0x")).NextToken();
// hexadecimal integer >ulong.MaxValue
GenerateLexer(new StringReader("0xfedcba98765432100")).NextToken();
} }
[Test] [Test]
public void TestLongHexadecimalInteger() public void TestLongHexadecimalInteger()
{ {
CheckToken("0x4244636f446c6d58", 0x4244636f446c6d58); CheckToken("0x4244636f446c6d58", 0x4244636f446c6d58);
CheckToken("0xf244636f446c6d58", 0xf244636f446c6d58);
} }
[Test] [Test]

32
src/Libraries/NRefactory/Test/Lexer/VBNet/LiteralsTests.cs

@ -37,6 +37,7 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.VB
Token t = GetSingleToken(text); Token t = GetSingleToken(text);
Assert.AreEqual(tokenType, t.kind, "Tokens.Literal"); Assert.AreEqual(tokenType, t.kind, "Tokens.Literal");
Assert.IsNotNull(t.literalValue, "literalValue is null"); Assert.IsNotNull(t.literalValue, "literalValue is null");
Assert.AreEqual(val.GetType(), t.literalValue.GetType(), "literalValue.GetType()");
Assert.AreEqual(val, t.literalValue, "literalValue"); Assert.AreEqual(val, t.literalValue, "literalValue");
} }
@ -63,8 +64,35 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.VB
public void TestHexadecimalInteger() public void TestHexadecimalInteger()
{ {
CheckToken("&H10", Tokens.LiteralInteger, 0x10); CheckToken("&H10", Tokens.LiteralInteger, 0x10);
CheckToken("&H10&", Tokens.LiteralInteger, 0x10); CheckToken("&H10&", Tokens.LiteralInteger, (long)0x10);
CheckToken("&h3ff&", Tokens.LiteralInteger, 0x3ff); CheckToken("&h3ff%", Tokens.LiteralInteger, 0x3ff);
CheckToken("&h8000s", Tokens.LiteralInteger, short.MinValue);
CheckToken("&h8000us", Tokens.LiteralInteger, (ushort)0x8000);
CheckToken("&HffffFFFF", Tokens.LiteralInteger, -1);
CheckToken("&HffffFFFF%", Tokens.LiteralInteger, -1);
CheckToken("&HffffFFFFui", Tokens.LiteralInteger, uint.MaxValue);
CheckToken("&HffffFFFF&", Tokens.LiteralInteger, (long)uint.MaxValue);
}
[Test]
public void TestLongHexadecimalInteger()
{
CheckToken("&H4244636f446c6d58", Tokens.LiteralInteger, 0x4244636f446c6d58);
CheckToken("&hf244636f446c6d58", Tokens.LiteralInteger, -989556688574190248);
CheckToken("&hf244636f446c6d58&", Tokens.LiteralInteger, -989556688574190248);
CheckToken("&hf244636f446c6d58ul", Tokens.LiteralInteger, 0xf244636f446c6d58);
}
[Test]
public void InvalidHexadecimalInteger()
{
// just check that we don't get exceptions:
GenerateLexer(new StringReader("&H")).NextToken();
// >ulong.MaxValue
GenerateLexer(new StringReader("&hff244636f446c6d58")).NextToken();
// needs an ulong, but "i" postfix specified integer
GenerateLexer(new StringReader("&hf244636f446c6d58i")).NextToken();
GenerateLexer(new StringReader("&hf244636f446c6d58ui")).NextToken();
} }
[Test] [Test]

Loading…
Cancel
Save