[Libreoffice-commits] core.git: Branch 'libreoffice-7-2' - basic/qa basic/source

baltasarq (via logerrit) logerrit at kemper.freedesktop.org
Mon Jun 28 08:09:52 UTC 2021


 basic/qa/vba_tests/booltypename.vb |   37 +++++++++++++++++++++++++++++++++++++
 basic/source/comp/exprnode.cxx     |   14 +++++++-------
 basic/source/comp/symtbl.cxx       |    2 ++
 basic/source/inc/filefmt.hxx       |    3 +++
 basic/source/runtime/runtime.cxx   |    2 ++
 5 files changed, 51 insertions(+), 7 deletions(-)

New commits:
commit e7c5b2412446b4a5158b35745742389186856984
Author:     baltasarq <baltasarq at gmail.com>
AuthorDate: Tue Jun 22 12:55:21 2021 +0200
Commit:     Xisco Fauli <xiscofauli at libreoffice.org>
CommitDate: Mon Jun 28 10:09:20 2021 +0200

    tdf#142460: properly handle boolean values in string pool
    
    This makes sure that results of comparison of literals have proper boolean type,
    and that this type is properly stored to/read from the string pool.
    
    This introduces a new non-standard "type" character used in the pool: 'b'. It is
    not a proper type character used in Basic (unlike '%'/'&'/'!'/'@'), but we have
    to use this trick locally, because we need to pass the type that has no own type
    character.
    
    The change should be backward-compatible: older versions reading the value should
    just ignore the 'b', and read the value as double.
    
    Change-Id: Ibd4a70b366331342346eb171c8ed3c7026279596
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117655
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
    (cherry picked from commit 5eedb3beeaeed88de0d1ebd041a9f15ceea7e78c)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117862
    Reviewed-by: Xisco Fauli <xiscofauli at libreoffice.org>

diff --git a/basic/qa/vba_tests/booltypename.vb b/basic/qa/vba_tests/booltypename.vb
new file mode 100644
index 000000000000..8c1fd17c211b
--- /dev/null
+++ b/basic/qa/vba_tests/booltypename.vb
@@ -0,0 +1,37 @@
+'
+' This file is part of the LibreOffice project.
+'
+' This Source Code Form is subject to the terms of the Mozilla Public
+' License, v. 2.0. If a copy of the MPL was not distributed with this
+' file, You can obtain one at http://mozilla.org/MPL/2.0/.
+'
+
+Option VBASupport 1
+Option Explicit
+
+Function doUnitTest() As String
+    TestUtil.TestInit
+    verify_testTypeNameBoolean
+    doUnitTest = TestUtil.GetResult()
+End Function
+
+Sub verify_testTypeNameBoolean()
+    On Error GoTo errorHandler
+
+    TestUtil.AssertEqual(TypeName 1>2,       "Boolean",  "TypeName 1>2")
+    TestUtil.AssertEqual(TypeName 2.0>1.0,   "Boolean",  "TypeName 2.0>1.0")
+    TestUtil.AssertEqual(TypeName "A">"B",   "Boolean",  "TypeName ""A"">""B""")
+
+    TestUtil.AssertEqual(Str(2>1), "True",  "Str(2>1)")
+    TestUtil.AssertEqual(Str(1>2), "False", "Str(1>2)")
+
+    TestUtil.AssertEqual(Str(2.0>1.0), "True",  "Str(2.0>1.0)")
+    TestUtil.AssertEqual(Str(1.0>2.0), "False", "Str(1.0>2.0)")
+
+    TestUtil.AssertEqual(Str("B">"A"), "True",  "Str(""B"">""A"")")
+    TestUtil.AssertEqual(Str("A">"B"), "False", "Str(""A"">""B"")")
+
+    Exit Sub
+errorHandler:
+    TestUtil.ReportErrorHandler("verify_testTypeNameBoolean", Err, Error$, Erl)
+End Sub
diff --git a/basic/source/comp/exprnode.cxx b/basic/source/comp/exprnode.cxx
index 4192ceb8d49d..17bdbca25258 100644
--- a/basic/source/comp/exprnode.cxx
+++ b/basic/source/comp/exprnode.cxx
@@ -262,7 +262,7 @@ void SbiExprNode::FoldConstantsBinaryNode(SbiParser* pParser)
         }
         else
         {
-            eType = SbxDOUBLE;
+            eType = SbxBOOL;
             eNodeType = SbxNUMVAL;
             int eRes = rr.compareTo( rl );
             switch( eTok )
@@ -365,22 +365,22 @@ void SbiExprNode::FoldConstantsBinaryNode(SbiParser* pParser)
                 nVal = nl - nr; break;
             case EQ:
                 nVal = ( nl == nr ) ? SbxTRUE : SbxFALSE;
-                eType = SbxINTEGER; break;
+                eType = SbxBOOL; break;
             case NE:
                 nVal = ( nl != nr ) ? SbxTRUE : SbxFALSE;
-                eType = SbxINTEGER; break;
+                eType = SbxBOOL; break;
             case LT:
                 nVal = ( nl <  nr ) ? SbxTRUE : SbxFALSE;
-                eType = SbxINTEGER; break;
+                eType = SbxBOOL; break;
             case GT:
                 nVal = ( nl >  nr ) ? SbxTRUE : SbxFALSE;
-                eType = SbxINTEGER; break;
+                eType = SbxBOOL; break;
             case LE:
                 nVal = ( nl <= nr ) ? SbxTRUE : SbxFALSE;
-                eType = SbxINTEGER; break;
+                eType = SbxBOOL; break;
             case GE:
                 nVal = ( nl >= nr ) ? SbxTRUE : SbxFALSE;
-                eType = SbxINTEGER; break;
+                eType = SbxBOOL; break;
             case IDIV:
                 if( !lr )
                 {
diff --git a/basic/source/comp/symtbl.cxx b/basic/source/comp/symtbl.cxx
index d9e7fcae6abc..ed245a364874 100644
--- a/basic/source/comp/symtbl.cxx
+++ b/basic/source/comp/symtbl.cxx
@@ -66,6 +66,8 @@ short SbiStringPool::Add( double n, SbxDataType t )
     char buf[40]{};
     switch( t )
     {
+        // tdf#142460 - properly handle boolean values in string pool
+        case SbxBOOL: snprintf( buf, sizeof(buf), "%db", static_cast<short>(n) ); break;
         // tdf#131296 - store numeric value including its type character
         // See GetSuffixType in basic/source/comp/scanner.cxx for type characters
         case SbxINTEGER: snprintf( buf, sizeof(buf), "%d%%", static_cast<short>(n) ); break;
diff --git a/basic/source/inc/filefmt.hxx b/basic/source/inc/filefmt.hxx
index 3460b1abbd7f..25ba647ad743 100644
--- a/basic/source/inc/filefmt.hxx
+++ b/basic/source/inc/filefmt.hxx
@@ -40,6 +40,9 @@
 // Version 13: tdf#94617 store methods nStart information greater than sal_Int16 limit
 //             tdf#57113 store UTF-16 strings after legacy 1-byte-encoded strings in pool (no
 //                       version number bump for backward compatibility; relies on magic number)
+//             tdf#142460: properly handle boolean values in string pool (no
+//                       version number bump for backward compatibility; relies on
+//                       new integer type suffix 'b')
 //
 
 #define B_LEGACYVERSION 0x00000011
diff --git a/basic/source/runtime/runtime.cxx b/basic/source/runtime/runtime.cxx
index 385f67540b37..43e8eea9a0e4 100644
--- a/basic/source/runtime/runtime.cxx
+++ b/basic/source/runtime/runtime.cxx
@@ -2840,6 +2840,8 @@ void SbiRuntime::StepLOADNC( sal_uInt32 nOp1 )
             case '&': eType = SbxLONG; break;
             case '!': eType = SbxSINGLE; break;
             case '@': eType = SbxCURRENCY; break;
+            // tdf#142460 - properly handle boolean values in string pool
+            case 'b': eType = SbxBOOL; break;
         }
     }
     SbxVariable* p = new SbxVariable( eType );


More information about the Libreoffice-commits mailing list