* Bug 16571 fixed [m2sci]: Bad ~ conversion on operations, integers, or complex 16/21616/4
Samuel GOUGEON [Sat, 31 Oct 2020 01:34:02 +0000 (02:34 +0100)]
  http://bugzilla.scilab.org/16571

  After merging this commit, .dia.ref will have to be updated for
  ISPS, ISUNIX and ISMAC @ https://codereview.scilab.org/21610
  (and likely other ones elsewhere in m2sci. But This will be done
  later, progressively, after fixing bugs that piled up).

Change-Id: I8ad221f123499e485ea91688290317920b2a421e

scilab/CHANGES.md
scilab/modules/m2sci/macros/kernel/convert2double.sci
scilab/modules/m2sci/macros/percent/%52sci.sci
scilab/modules/m2sci/tests/nonreg_tests/bug_16571.dia.ref [new file with mode: 0644]
scilab/modules/m2sci/tests/nonreg_tests/bug_16571.m [new file with mode: 0644]
scilab/modules/m2sci/tests/nonreg_tests/bug_16571.tst [new file with mode: 0644]

index d893b72..124f908 100644 (file)
@@ -390,6 +390,7 @@ Bug Fixes
 * [#16553](https://bugzilla.scilab.org/16553): `unique(["" ""])` returned `["" ""]`.
 * [#16557](https://bugzilla.scilab.org/16557): `macr2tree` + `tree2code` translated `e={2}` into `"e=1"` and `e={2,"ab"}` into `"e=[2,"ab"]"`.
 * [#16559](https://bugzilla.scilab.org/16553): `isempty(A)` was true for sparse matrix of dimension 2^16 or larger.
+* [#16571](https://bugzilla.scilab.org/16571): `mfile2sci` had several issues when converting the NOT ~ operator: 1) `~(1-1)` was converted into `~1-1` instead of `~(1-1)`  2) ~ applied to an integer expression yielded an error from `convert2double`  3) `~i` was converted into `~%i` instead of `~abs(%i)`.
 * [#16596](https://bugzilla.scilab.org/16596): Concatenating encoded integers with sparse numeric data was not possible. 
 * [#16609](https://bugzilla.scilab.org/16609): `bitcmp` needed to be upgraded for Scilab 6.
 * [#16622](https://bugzilla.scilab.org/16622): `inv` could no longer be overloaded for hypermatrices of decimal or complex numbers.
@@ -399,7 +400,6 @@ Bug Fixes
 * [#16654](https://bugzilla.scilab.org/16654): `interp` was leaking memory.
 
 
-
 ### Bugs fixed in 6.1.0:
 * [#2694](https://bugzilla.scilab.org/2694): `bitget` did not accept positive integers of types int8, int16 or int32.
 * [#5824](https://bugzilla.scilab.org/5824): The `datafit` algorithm was not documented.
index 0ecd088..e0a370b 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2012 - 2020 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function [dble]=convert2double(A)
-    // This function converts input parameters to double to avoid to write overloading functions in Scilab
+function dble = convert2double(A)
+    // This function converts input parameters to double to avoid to write
+    // overloading functions in Scilab
 
-    lhs=argn(1)
+    lhs = argn(1)
 
     if A.vtype==Double then
-        dble=A
+        dble = A
         return
     end
 
     if only_double then
-        dble=A
-        dble.type=Type(Double,Unknown)
+        dble = A
+        dble.type = Type(Double,Unknown)
     else
         if A.vtype==String then
-            lhslist=list();
-            lhslist($+1)=Variable("ans",Infer(A.dims,Type(Double,Real)))
-            dble=Funcall("asciimat",1,Rhs_tlist(A),lhslist)
+            LHS = Variable("ans", Infer(A.dims,Type(Double,Real)))
+            dble = Funcall("asciimat", 1, Rhs_tlist(A), list(LHS))
         elseif A.vtype==Boolean then
-            lhslist=list();
-            lhslist($+1)=Variable("ans",Infer(A.dims,Type(Double,Real)))
-            dble=Funcall("bool2s",1,Rhs_tlist(A),lhslist)
+            LHS = Variable("ans",Infer(A.dims,Type(Double,Real)))
+            dble = Funcall("bool2s", 1, Rhs_tlist(A), list(LHS))
+        elseif A.vtype==Int then
+            LHS = Variable("ans",Infer(A.dims,Type(Double,Real)))
+            dble = Funcall("double", 1, Rhs_tlist(A), list(LHS))
         elseif A.vtype==Unknown then
-            lhslist=list();
-            lhslist($+1)=Variable("ans",Infer(A.dims,Type(Double,Unknown)))
-            dble=Funcall("mtlb_double",1,Rhs_tlist(A),lhslist)
+            LHS = Variable("ans", Infer(A.dims,Type(Double,Unknown)))
+            dble = Funcall("mtlb_double", 1, Rhs_tlist(A), list(LHS))
         else
-            error(msprintf(gettext("%s is not yet implemented."),string(A.vtype)))
+            msg = gettext("m2sci.convert2double(): Type %s not yet implemented.")
+            error(msprintf(msg, string(A.vtype)))
         end
     end
 endfunction
index 0342273..3159e5d 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2020 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -10,7 +10,7 @@
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function [tree]=%52sci(tree)
+function tree = %52sci(tree)
     // M2SCI function
     // Conversion function for Matlab negation
     // Input: tree = Matlab operation tree
@@ -19,10 +19,17 @@ function [tree]=%52sci(tree)
     A = getoperands(tree)
     if and(A.vtype<>[Double,Boolean]) then
         A = convert2double(A)
-        tree.operands=list(A)
+        tree.operands = list(A)
+    end
+    if A.vtype==Double & A.property==Complex then
+        tree.operands = list(Funcall("abs", 1, list(A), list()))
+    elseif typeof(A)=="operation" then
+        // We add parentheses around the operation, because ~ is applied to the
+        // operation's result, not to the left operand of the operation
+        tree.operands = list(tree.operands)
     end
 
-    tree.out(1).dims=A.dims
-    tree.out(1).type=Type(Boolean,Real)
+    tree.out(1).dims = A.dims
+    tree.out(1).type = Type(Boolean,Real)
 
 endfunction
diff --git a/scilab/modules/m2sci/tests/nonreg_tests/bug_16571.dia.ref b/scilab/modules/m2sci/tests/nonreg_tests/bug_16571.dia.ref
new file mode 100644 (file)
index 0000000..18ab914
--- /dev/null
@@ -0,0 +1,47 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 16571 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16571
+//
+// <-- Short Description -->
+// 1) ~true(2,3) was converted into ~ones(2,3)==1 instead of ~(ones(2,3)==1)
+// 2) ~ applied to integer contents yielded an error from convert2double()
+// 3) ~ applied to complex contents forgot applying abs() before ~
+mfile = SCI+"/modules/m2sci/tests/nonreg_tests/bug_16571.m";
+mfile2sci(mfile, TMPDIR);
+  ****** Beginning of mfile2sci() session ******
+  File to convert: SCI/modules/m2sci/tests/nonreg_tests/bug_16571.m
+  Result file path: TMPDIR/
+  Recursive mode: OFF
+  Only double values used in M-file: NO
+  Verbose mode: 3
+  Generate formatted code: NO
+  M-file reading...
+  M-file reading: Done
+  Syntax modification...
+  Syntax modification: Done
+  Macro to tree conversion...
+  Conversion of M-tree...
+  Conversion of M-tree: Done
+  Macro to tree conversion: Done
+  ****** End of mfile2sci() session ******
+mprintf("%s\n", mgetl(TMPDIR + "/bug_16571.sci"));
+~%t// constant
+~(ones(2,3)==1)// function''s result
+A = %t;
+~(A | %f)// operation''s result
+~asciimat("ABC")// string negation
+~double(B)// integer negation
+~%pi// real negation
+~abs(%i)// complex negation
+~abs(%i-1.234)// complex negation
diff --git a/scilab/modules/m2sci/tests/nonreg_tests/bug_16571.m b/scilab/modules/m2sci/tests/nonreg_tests/bug_16571.m
new file mode 100644 (file)
index 0000000..b8a5a0c
--- /dev/null
@@ -0,0 +1,10 @@
+~true         % constant
+~true(2,3)    % function's result
+A = true;
+~(A | false)  % operation's result
+~'ABC'        % string negation
+%m2scideclare B|1 1|Int|?
+~B            % integer negation
+~pi           % real negation
+~i            % complex negation
+~(i-1.234)    % complex negation
diff --git a/scilab/modules/m2sci/tests/nonreg_tests/bug_16571.tst b/scilab/modules/m2sci/tests/nonreg_tests/bug_16571.tst
new file mode 100644 (file)
index 0000000..d573ede
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 16571 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16571
+//
+// <-- Short Description -->
+// 1) ~true(2,3) was converted into ~ones(2,3)==1 instead of ~(ones(2,3)==1)
+// 2) ~ applied to integer contents yielded an error from convert2double()
+// 3) ~ applied to complex contents forgot applying abs() before ~
+
+
+mfile = SCI+"/modules/m2sci/tests/nonreg_tests/bug_16571.m";
+mfile2sci(mfile, TMPDIR);
+mprintf("%s\n", mgetl(TMPDIR + "/bug_16571.sci"));