static void DeserializeNumber(char leadingChar, TextReader reader, ObjectBuilder builder)
{
if (!UseFastNumberParsing)
{
var number = Methods.ReadDouble(leadingChar, reader, ref builder.CommonStringBuffer);
builder.PutNumber(number);
return;
}
bool negative;
ulong beforeDot;
long afterE;
uint afterDot;
byte afterDotLen;
byte extraOrdersOfMagnitude;
if (leadingChar == '-')
{
var next = reader.Read();
if (next != '-' && !(next >= '0' && next <= '9'))
{
throw new DeserializationException("Expected -, or digit", reader, next == -1);
}
leadingChar = (char)next;
negative = true;
}
else
{
negative = false;
}
beforeDot = Methods.ReadULong(leadingChar, reader, out extraOrdersOfMagnitude);
var c = reader.Peek();
if (c == '.')
{
reader.Read();
c = reader.Read();
if (c < '0' || c > '9')
{
throw new DeserializationException("Expected digit", reader, c == -1);
}
afterDot = Methods.ReadUInt((char)c, reader, out afterDotLen);
c = reader.Peek();
}
else
{
afterDot = afterDotLen = 0;
}
if (c == 'e' || c == 'E')
{
reader.Read();
c = reader.Read();
if (c == '+')
{
c = reader.Read();
}
if (c != '-' && !(c >= '0' || c <= '9'))
{
throw new DeserializationException("Expected -, +, or digit", reader, c == -1);
}
afterE = Methods.ReadLong((char)c, reader);
}
else
{
afterE = 0;
}
if (extraOrdersOfMagnitude != 0)
{
try
{
checked
{
afterE += extraOrdersOfMagnitude;
}
}
catch (OverflowException)
{
throw new DeserializationException("Number too large to be parsed encountered", reader, false);
}
}
builder.PutFastNumber(negative, beforeDot, afterDot, afterDotLen, afterE);
}