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); }
static void DeserializeNumberThunkReader(char leadingChar, ref ThunkReader reader, ObjectBuilder builder) { if (!UseFastNumberParsing) { var number = Methods.ReadDoubleThunkReader(leadingChar, ref 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", ref reader, next == -1); leadingChar = (char)next; negative = true; } else { negative = false; } beforeDot = Methods.ReadULongThunkReader(leadingChar, ref reader, out extraOrdersOfMagnitude); var c = reader.Peek(); if (c == '.') { reader.Read(); c = reader.Read(); if (c < '0' || c > '9') throw new DeserializationException("Expected digit", ref reader, c == -1); afterDot = Methods.ReadUIntThunkReader((char)c, ref 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", ref reader, c == -1); afterE = Methods.ReadLongThunkReader((char)c, ref reader); } else { afterE = 0; } if (extraOrdersOfMagnitude != 0) { try { checked { afterE += extraOrdersOfMagnitude; } } catch (OverflowException) { throw new DeserializationException("Number too large to be parsed encountered", ref reader, false); } } builder.PutFastNumber(negative, beforeDot, afterDot, afterDotLen, afterE); }