internal static double ConvertDecimalOrHexToDouble(string number) { if (TryConvertDecimalOrHexToDouble(number, out double result)) { return(result); } Error.ThrowInternalError("Cannot numeric evaluate"); return(0.0D); }
/// <summary> /// Read a string while checking the string precursor for intern opportunities. /// Taken from ndp\clr\src\bcl\system\io\binaryreader.cs-ReadString() /// </summary> override public String ReadString() { try { MemoryStream memoryStream = this.BaseStream as MemoryStream; int currPos = 0; int n = 0; int stringLength; int readLength; int charsRead; // Length of the string in bytes, not chars stringLength = Read7BitEncodedInt(); if (stringLength < 0) { throw new IOException(); } if (stringLength == 0) { return(String.Empty); } char[] charBuffer = _buffer.CharBuffer; StringBuilder sb = null; do { readLength = ((stringLength - currPos) > MaxCharsBuffer) ? MaxCharsBuffer : (stringLength - currPos); byte[] rawBuffer = null; int rawPosition = 0; if (memoryStream != null) { // Optimization: we can avoid reading into a byte buffer // and instead read directly from the memorystream's backing buffer rawBuffer = memoryStream.GetBuffer(); rawPosition = (int)memoryStream.Position; int length = (int)memoryStream.Length; n = (rawPosition + readLength) < length ? readLength : length - rawPosition; // Attempt to track down an intermittent failure -- n should not ever be negative, but // we're occasionally seeing it when we do the decoder.GetChars below -- by providing // a bit more information when we do hit the error, in the place where (by code inspection) // the actual error seems most likely to be occurring. if (n < 0) { ErrorUtilities.ThrowInternalError("From calculating based on the memorystream, about to read n = {0}. length = {1}, rawPosition = {2}, readLength = {3}, stringLength = {4}, currPos = {5}.", n, length, rawPosition, readLength, stringLength, currPos); } } if (rawBuffer == null) { rawBuffer = _buffer.ByteBuffer; rawPosition = 0; n = BaseStream.Read(rawBuffer, 0, readLength); // See above explanation -- the OutOfRange exception may also be coming from our setting of n here ... if (n < 0) { ErrorUtilities.ThrowInternalError("From getting the length out of BaseStream.Read directly, about to read n = {0}. readLength = {1}, stringLength = {2}, currPos = {3}", n, readLength, stringLength, currPos); } } if (n == 0) { throw new EndOfStreamException(); } charsRead = _decoder.GetChars(rawBuffer, rawPosition, n, charBuffer, 0); if (memoryStream != null) { memoryStream.Seek(readLength, SeekOrigin.Current); } if (currPos == 0 && n == stringLength) { return(OpportunisticIntern.CharArrayToString(charBuffer, charsRead)); } if (sb == null) { sb = new StringBuilder(stringLength); // Actual string length in chars may be smaller. } sb.Append(charBuffer, 0, charsRead); currPos += n; }while (currPos < stringLength); return(OpportunisticIntern.StringBuilderToString(sb)); } catch (Exception e) { Debug.Assert(false, e.ToString()); throw; } }
/// <summary> /// Read a string while checking the string precursor for intern opportunities. /// Taken from ndp\clr\src\bcl\system\io\binaryreader.cs-ReadString() /// </summary> override public String ReadString() { char[] resultBuffer = null; try { MemoryStream memoryStream = this.BaseStream as MemoryStream; int currPos = 0; int n = 0; int stringLength; int readLength; int charsRead = 0; // Length of the string in bytes, not chars stringLength = Read7BitEncodedInt(); if (stringLength < 0) { throw new IOException(); } if (stringLength == 0) { return(String.Empty); } char[] charBuffer = _buffer.CharBuffer; do { readLength = ((stringLength - currPos) > MaxCharsBuffer) ? MaxCharsBuffer : (stringLength - currPos); byte[] rawBuffer = null; int rawPosition = 0; if (memoryStream != null) { // Optimization: we can avoid reading into a byte buffer // and instead read directly from the memorystream's backing buffer rawBuffer = memoryStream.GetBuffer(); rawPosition = (int)memoryStream.Position; int length = (int)memoryStream.Length; n = (rawPosition + readLength) < length ? readLength : length - rawPosition; // Attempt to track down an intermittent failure -- n should not ever be negative, but // we're occasionally seeing it when we do the decoder.GetChars below -- by providing // a bit more information when we do hit the error, in the place where (by code inspection) // the actual error seems most likely to be occurring. if (n < 0) { ErrorUtilities.ThrowInternalError("From calculating based on the memorystream, about to read n = {0}. length = {1}, rawPosition = {2}, readLength = {3}, stringLength = {4}, currPos = {5}.", n, length, rawPosition, readLength, stringLength, currPos); } memoryStream.Seek(n, SeekOrigin.Current); } if (rawBuffer == null) { rawBuffer = _buffer.ByteBuffer; rawPosition = 0; n = BaseStream.Read(rawBuffer, 0, readLength); // See above explanation -- the OutOfRange exception may also be coming from our setting of n here ... if (n < 0) { ErrorUtilities.ThrowInternalError("From getting the length out of BaseStream.Read directly, about to read n = {0}. readLength = {1}, stringLength = {2}, currPos = {3}", n, readLength, stringLength, currPos); } } if (n == 0) { throw new EndOfStreamException(); } if (currPos == 0 && n == stringLength) { charsRead = _decoder.GetChars(rawBuffer, rawPosition, n, charBuffer, 0); return(Strings.WeakIntern(charBuffer.AsSpan(0, charsRead))); } #if !CLR2COMPATIBILITY resultBuffer ??= ArrayPool <char> .Shared.Rent(stringLength); // Actual string length in chars may be smaller. #else // Since NET35 is only used in rare TaskHost processes, we decided to leave it as-is. resultBuffer ??= new char[stringLength]; // Actual string length in chars may be smaller. #endif charsRead += _decoder.GetChars(rawBuffer, rawPosition, n, resultBuffer, charsRead); currPos += n; }while (currPos < stringLength); var retval = Strings.WeakIntern(resultBuffer.AsSpan(0, charsRead)); return(retval); } catch (Exception e) { Debug.Assert(false, e.ToString()); throw; } #if !CLR2COMPATIBILITY finally { // resultBuffer shall always be either Rented or null if (resultBuffer != null) { ArrayPool <char> .Shared.Return(resultBuffer); } } #endif }