Address PR feedback
authorStephen Toub <stoub@microsoft.com>
Wed, 29 Nov 2017 03:22:50 +0000 (22:22 -0500)
committerStephen Toub <stoub@microsoft.com>
Wed, 29 Nov 2017 03:22:50 +0000 (22:22 -0500)
- Simplify FCALL signatures
- Simplify mantissa logic copied from corert

src/classlibnative/bcltype/number.cpp
src/classlibnative/bcltype/number.h
src/mscorlib/shared/System/Number.Parsing.cs
src/mscorlib/src/System/Number.CoreCLR.cs

index c9eec00..eb50e45 100644 (file)
@@ -2009,26 +2009,28 @@ ParseSection:
 #pragma warning(pop)
 #endif
 
-FCIMPL3(void, COMNumber::DoubleToNumberFC, double value, int precision, BYTE* number)
+FCIMPL3(void, COMNumber::DoubleToNumberFC, double value, int precision, NUMBER* number)
 {
     FCALL_CONTRACT;
 
-    DoubleToNumber(value, precision, (NUMBER*)number);
+    DoubleToNumber(value, precision, number);
 }
 FCIMPLEND
 
-FCIMPL2(void, COMNumber::NumberToDoubleFC, BYTE* number, double* result)
+FCIMPL1(double, COMNumber::NumberToDoubleFC, NUMBER* number)
 {
     FCALL_CONTRACT;
 
-    NumberToDouble((NUMBER*)number, result);
+    double d = 0;
+    NumberToDouble(number, &d);
+    return d;
 }
 FCIMPLEND
 
-FCIMPL2(FC_BOOL_RET, COMNumber::NumberBufferToDecimal, BYTE* number, DECIMAL* value)
+FCIMPL2(FC_BOOL_RET, COMNumber::NumberBufferToDecimal, NUMBER* number, DECIMAL* value)
 {
     FCALL_CONTRACT;
 
-    FC_RETURN_BOOL(COMDecimal::NumberToDecimal((NUMBER *) number, value) != 0);
+    FC_RETURN_BOOL(COMDecimal::NumberToDecimal(number, value) != 0);
 }
 FCIMPLEND
index 0ddcb97..c225b3e 100644 (file)
@@ -31,9 +31,9 @@ struct NUMBER {
 class COMNumber
 {
 public:
-    static FCDECL3(void, DoubleToNumberFC, double value, int precision, BYTE* number);
-    static FCDECL2(void, NumberToDoubleFC, BYTE* number, double* value);
-    static FCDECL2(FC_BOOL_RET, NumberBufferToDecimal, BYTE* number, DECIMAL* value);
+    static FCDECL3(void, DoubleToNumberFC, double value, int precision, NUMBER* number);
+    static FCDECL1(double, NumberToDoubleFC, NUMBER* number);
+    static FCDECL2(FC_BOOL_RET, NumberBufferToDecimal, NUMBER* number, DECIMAL* value);
     
     static wchar_t* Int32ToDecChars(__in wchar_t* p, unsigned int value, int digits);
 };
index 46a1639..9d40e49 100644 (file)
@@ -954,7 +954,7 @@ namespace System
                 (*((uint*)&d + 1) >> 20) & 0x000007ff;
 
             public static unsafe ulong Mantissa(double d) =>
-                *((uint*)&d) | ((ulong)(*((uint*)&d + 1) & 0x000fffff) << 32);
+                *((ulong*)&d) & 0x000fffffffffffff;
 
             public static unsafe bool Sign(double d) =>
                 (*((uint*)&d + 1) >> 31) != 0;
index d6e8daf..e14db02 100644 (file)
@@ -8,38 +8,13 @@ namespace System
 {
     internal static partial class Number
     {
-        public static unsafe void DoubleToNumber(double value, int precision, ref NumberBuffer number)
-        {
-            fixed (NumberBuffer* numberPtr = &number)
-            {
-                DoubleToNumber(value, precision, (byte*)numberPtr);
-            }
-        }
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern unsafe void DoubleToNumber(double value, int precision, byte* number);
+        public static extern void DoubleToNumber(double value, int precision, ref NumberBuffer number);
 
-
-        public static unsafe double NumberToDouble(ref NumberBuffer number)
-        {
-            fixed (NumberBuffer* numberPtr = &number)
-            {
-                double d = 0;
-                NumberToDouble((byte*)numberPtr, &d);
-                return d;
-            }
-        }
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern unsafe void NumberToDouble(byte* number, double* result);
-
+        public static extern double NumberToDouble(ref NumberBuffer number);
 
-        public static unsafe bool NumberBufferToDecimal(ref Number.NumberBuffer number, ref decimal value)
-        {
-            fixed (NumberBuffer* numberPtr = &number)
-            {
-                return NumberBufferToDecimal((byte*)numberPtr, ref value);
-            }
-        }
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern unsafe bool NumberBufferToDecimal(byte* number, ref decimal value);
+        public static extern bool NumberBufferToDecimal(ref NumberBuffer number, ref decimal value);
     }
 }