* Bug 15586 fixed: tree2code() corrupted the function prototype 46/20046/6
Samuel GOUGEON [Wed, 23 May 2018 16:28:16 +0000 (18:28 +0200)]
  http://bugzilla.scilab.org/15586

Change-Id: I275972e32284a7d472a841a663350e9214d2bddd

scilab/CHANGES.md
scilab/modules/functions/macros/tree2code.sci
scilab/modules/functions/tests/unit_tests/tree2code.tst [new file with mode: 0644]

index 40df4fc..785ead8 100644 (file)
@@ -488,6 +488,7 @@ Known issues
 * [#15553](http://bugzilla.scilab.org/show_bug.cgi?id=15553): TOWS_c block failed with 0 simulation time.
 * [#15563](http://bugzilla.scilab.org/show_bug.cgi?id=15563): poly(A,v) was broken when A is a matrix.
 * [#15566](http://bugzilla.scilab.org/show_bug.cgi?id=15566): matrix insertion checked overall size but not individual dimensions.
+* [#15586](http://bugzilla.scilab.org/show_bug.cgi?id=15586): `tree2code()` added some leading `,` in the argins and argout lists.
 * [#15589](http://bugzilla.scilab.org/show_bug.cgi?id=15589): `inv()` could fail on some matrices of polynomials with complex coefficients.
 * [#15593](http://bugzilla.scilab.org/show_bug.cgi?id=15593): The `grand` page was alone in a main chapter instead of being in the `rand` section.
 * [#15594](http://bugzilla.scilab.org/show_bug.cgi?id=15594): The `bool2s` page was alone in a main chapter instead of being with the `boolean` page.
index 5381fea..cb794af 100644 (file)
@@ -11,7 +11,7 @@
 // along with this program.
 
 
-function C=tree2code(P,bprettyprintformat)
+function C = tree2code(P, bprettyprintformat)
     // Convert a tree returned by macr2tree() to a macro code
     // Input:
     // - P: 'program' tlist
@@ -21,54 +21,60 @@ function C=tree2code(P,bprettyprintformat)
 
     // Verify good type for input
     if typeof(P)<>"program" then
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: ''%s'' expected.\n"),"tree2code",2,"program tree"));
+        msg = gettext("%s: Wrong type for input argument #%d: ''%s'' expected.\n")
+        error(msprintf(msg, "tree2code", 2, "program tree"));
     end
 
     // Default value
     rhs = argn(2);
     if rhs==1 then
-        bprettyprintformat=%F
+        bprettyprintformat = %F
     end
 
     C=""
 
     // Function prototype
-    lhsstr=""
-    rhsstr=""
+    lhsstr = ""
+    rhsstr = ""
     if P.name<>"" then // Not a batch file
-        for k=1:size(P.outputs)
-            lhsstr=[lhsstr,expression2code(P.outputs(k))]
+        for k = 1:size(P.outputs)
+            lhsstr = [lhsstr, expression2code(P.outputs(k))]
+        end
+        if size(lhsstr,2)>1
+            lhsstr = "["+strcat(lhsstr(2:$),",")+"] = "
         end
-        lhsstr="["+strcat(lhsstr,",")+"]"
 
-        for k=1:size(P.inputs)
-            rhsstr=[rhsstr,expression2code(P.inputs(k))]
+        for k = 1:size(P.inputs)
+            rhsstr = [rhsstr, expression2code(P.inputs(k))]
+        end
+        if size(rhsstr,2)>1
+            rhsstr = strcat(rhsstr(2:$),",")
         end
-        rhsstr="("+strcat(rhsstr,",")+")"
+        rhsstr = "(" + rhsstr + ")"
 
-        C="function "+lhsstr+" = "+P.name+rhsstr;
+        C = "function " + lhsstr + P.name + rhsstr;
     end
 
-    I=P.statements
+    I = P.statements
 
     // To avoid to have some instructions on the first line (function prototype)
     if I(1)<>list("EOL") then
-        C=cat_code(C,instruction2code(list("EOL"),%T));
+        C = cat_code(C, instruction2code(list("EOL"),%T));
     end
 
     // For each statement, generate corresponding code
-    for i=1:size(I)-2 // -2 to ignore last return+EOL
-        if bprettyprintformat then
-            C=cat_code(C,"  "+instruction2code(I(i),bprettyprintformat));
-        else
-            C=cat_code(C,instruction2code(I(i),bprettyprintformat));
-        end
-        C = format_txt(C,I(i),bprettyprintformat,I(i+1));
+    header = ""
+    if bprettyprintformat then
+        header = "  "
+    end
+    for i = 1:size(I)-2 // -2 to ignore last return+EOL
+        C = cat_code(C, header + instruction2code(I(i), bprettyprintformat));
+        C = format_txt(C, I(i), bprettyprintformat, I(i+1));
     end
 
     if P.name<>"" then // Not a batch file
-        C=cat_code(C,"endfunction"); // Replace last return
-        C=cat_code(C,"");
+        C = cat_code(C, "endfunction"); // Replace last return
+        C = cat_code(C, "");
     end
 endfunction
 
diff --git a/scilab/modules/functions/tests/unit_tests/tree2code.tst b/scilab/modules/functions/tests/unit_tests/tree2code.tst
new file mode 100644 (file)
index 0000000..cc9b8bf
--- /dev/null
@@ -0,0 +1,41 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// Unit test for tree2code()
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+fp = funcprot(0);
+
+// Test the output prototype:
+// -------------------------
+protos = [
+"function test()"
+"function test(x)"
+"function test(x,y)"
+"function test(x,y,varargin)"
+"function [z] = test()"
+"function [z] = test(x)"
+"function [z] = test(x,y)"
+"function [z] = test(x,y,varargin)"
+"function [u,v] = test()"
+"function [u,v] = test(x)"
+"function [u,v] = test(x,y)"
+"function [u,v] = test(x,y,varargin)"
+"function [u,v,varargout] = test()"
+"function [u,v,varargout] = test(x)"
+"function [u,v,varargout] = test(x,y)"
+"function [u,v,varargout] = test(x,y,varargin)"
+];
+
+for p = protos'
+    execstr(p+", endfunction");
+    txt = tree2code(macr2tree(test));
+    assert_checkequal(txt(1), p);
+end
+
+funcprot(fp);