[Libreoffice-commits] core.git: Branch 'libreoffice-5-3-0' - sc/source

Eike Rathke erack at redhat.com
Wed Jan 25 12:47:04 UTC 2017


 sc/source/core/tool/interpr2.cxx |    4 ++++
 sc/source/core/tool/interpr4.cxx |   29 ++++++++++++++++++++++++-----
 2 files changed, 28 insertions(+), 5 deletions(-)

New commits:
commit 4c353b6b858a6027a088dd6a4466690d3d606389
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Jan 20 23:21:47 2017 +0100

    Resolves: tdf#105158 set date or time return type for DATEVALUE TIMEVALUE
    
    ... so adding/subtracting another date produces number of days instead of date,
    and adding/subtracting a number produces date. But if used as the final
    formula result force number type.
    
    Change-Id: I046f5cc53d1fe8c9f6f71876787f2f19d24fe146
    (cherry picked from commit b85ee27d9f8039a6442429587598426e73aeb1ba)
    Reviewed-on: https://gerrit.libreoffice.org/33363
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index 0e4245c..59e87b7 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -177,7 +177,10 @@ void ScInterpreter::ScGetDateValue()
     {
         short eType = pFormatter->GetType(nFIndex);
         if (eType == css::util::NumberFormat::DATE || eType == css::util::NumberFormat::DATETIME)
+        {
+            nFuncFmtType = css::util::NumberFormat::DATE;
             PushDouble(::rtl::math::approxFloor(fVal));
+        }
         else
             PushIllegalArgument();
     }
@@ -937,6 +940,7 @@ void ScInterpreter::ScGetTimeValue()
         short eType = pFormatter->GetType(nFIndex);
         if (eType == css::util::NumberFormat::TIME || eType == css::util::NumberFormat::DATETIME)
         {
+            nFuncFmtType = css::util::NumberFormat::TIME;
             double fDateVal = rtl::math::approxFloor(fVal);
             double fTimeVal = fVal - fDateVal;
             PushDouble(fTimeVal);
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 11a8870..4c34994 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -3879,11 +3879,12 @@ StackVar ScInterpreter::Interpret()
     // so reassure exceptions are really off.
     SAL_MATH_FPEXCEPTIONS_OFF();
 
+    OpCode eOp = ocNone;
     aCode.Reset();
     while( ( pCur = aCode.Next() ) != nullptr
             && (nGlobalError == FormulaError::NONE || nErrorFunction <= nErrorFunctionCount) )
     {
-        OpCode eOp = pCur->GetOpCode();
+        eOp = pCur->GetOpCode();
         cPar = pCur->GetByte();
         if ( eOp == ocPush )
         {
@@ -4454,6 +4455,21 @@ StackVar ScInterpreter::Interpret()
 
     // End: obtain result
 
+    bool bForcedResultType;
+    switch (eOp)
+    {
+        case ocGetDateValue:
+        case ocGetTimeValue:
+            // Force final result of DATEVALUE and TIMEVALUE to number type,
+            // which so far was date or time for calculations.
+            nRetTypeExpr = nFuncFmtType = css::util::NumberFormat::NUMBER;
+            nRetIndexExpr = nFuncFmtIndex = 0;
+            bForcedResultType = true;
+        break;
+        default:
+            bForcedResultType = false;
+    }
+
     if( sp )
     {
         pCur = pStack[ sp-1 ];
@@ -4476,9 +4492,12 @@ StackVar ScInterpreter::Interpret()
                         if (pCur->GetDoubleType())
                         {
                             const double fVal = PopDouble();
-                            if (nCurFmtType != nFuncFmtType)
-                                nRetIndexExpr = 0;  // carry format index only for matching type
-                            nRetTypeExpr = nFuncFmtType = nCurFmtType;
+                            if (!bForcedResultType)
+                            {
+                                if (nCurFmtType != nFuncFmtType)
+                                    nRetIndexExpr = 0;  // carry format index only for matching type
+                                nRetTypeExpr = nFuncFmtType = nCurFmtType;
+                            }
                             PushTempToken( new FormulaDoubleToken( fVal));
                         }
                         if ( nFuncFmtType == css::util::NumberFormat::UNDEFINED )
@@ -4573,7 +4592,7 @@ StackVar ScInterpreter::Interpret()
     else
         SetError( FormulaError::NoCode);
 
-    if( nRetTypeExpr != css::util::NumberFormat::UNDEFINED )
+    if (bForcedResultType || nRetTypeExpr != css::util::NumberFormat::UNDEFINED)
     {
         nRetFmtType = nRetTypeExpr;
         nRetFmtIndex = nRetIndexExpr;


More information about the Libreoffice-commits mailing list