bug 13890 : fix macro getd, avoid use of stack order 75/17175/2
Antoine ELIAS [Tue, 8 Sep 2015 15:00:12 +0000 (17:00 +0200)]
Change-Id: I63085fb9b76433e8e336b5947662d425806f2a5a

scilab/CHANGES_6.0.X
scilab/modules/functions/macros/getd.sci
scilab/modules/functions/tests/nonreg_tests/bug_13890.dia.ref [new file with mode: 0644]
scilab/modules/functions/tests/nonreg_tests/bug_13890.tst [new file with mode: 0644]

index 0753caf..7077eba 100644 (file)
@@ -25,6 +25,8 @@ Scilab Bug Fixes
 
 * Bug #13872 fixed - Non regression test added for unique function (the indices returned were wrong)
 
+* Bug #13890 fixed - getd did not return loaded symbols in previous scope.
+
 * Bug #13907 fixed - Avoids the gray background on the right panel of the palette Browser.
 
 * Bug #13944 fixed - The menu "Toolboxes" was missing.
index 58ee0c5..2d00a6b 100644 (file)
@@ -43,7 +43,7 @@ function getd(path,option)
         return ;
     end
 
-    nold = size(who("get"),"*")
+    old = who("get");
     //prot = funcprot();funcprot(0)
 
     for k=1:size(lst,"*");
@@ -56,7 +56,14 @@ function getd(path,option)
 
     //funcprot(prot);
     new = who("get");
-    new = new(1:(size(new,"*")-nold-2));  // -4 becomes -2: fix the fix for bug 2807
+    for i=1:size(old, "*")
+        b = find(new == old(i));
+        if isempty(b) == %f then
+            new(b) = [];
+        end
+    end
+
+    //new = new(1:(size(new,"*")-nold-2));  // -4 becomes -2: fix the fix for bug 2807
     if new<>[] then
         execstr("["+strcat(new,",")+"]=resume("+strcat(new,",")+")")
     end
diff --git a/scilab/modules/functions/tests/nonreg_tests/bug_13890.dia.ref b/scilab/modules/functions/tests/nonreg_tests/bug_13890.dia.ref
new file mode 100644 (file)
index 0000000..5058a21
--- /dev/null
@@ -0,0 +1,66 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13890 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13890
+//
+// <-- Short Description -->
+// Bug when use getd with a ".sci" file with more than one function
+str1 = ["function macro1_1()";
+        "    disp(""macro1_1"");";
+        "endfunction";
+        "";
+        "function macro1_2()";
+        "    disp(""macro1_2"");";
+        "endfunction";
+        "";
+        "function macro1_3()";
+        "    disp(""macro1_3"");";
+        "endfunction";
+        "";
+        "function macro1_4()";
+        "    disp(""macro1_4"");";
+        "endfunction"];
+str2 = ["function macro2_1()";
+        "    disp(""macro2_1"");";
+        "endfunction";
+        "";
+        "function macro2_2()";
+        "    disp(""macro2_2"");";
+        "endfunction";
+        "";
+        "function macro2_3()";
+        "    disp(""macro2_3"");";
+        "endfunction";
+        "";
+        "function macro2_4()";
+        "    disp(""macro2_4"");";
+        "endfunction"];
+mkdir(TMPDIR + "/bug_13890");
+mputl(str1, TMPDIR + "/bug_13890/macro1.sci");
+mputl(str2, TMPDIR + "/bug_13890/macro2.sci");
+assert_checktrue(exists("macro1_1") == 0);
+assert_checktrue(exists("macro1_2") == 0);
+assert_checktrue(exists("macro1_3") == 0);
+assert_checktrue(exists("macro1_4") == 0);
+assert_checktrue(exists("macro2_1") == 0);
+assert_checktrue(exists("macro2_2") == 0);
+assert_checktrue(exists("macro2_3") == 0);
+assert_checktrue(exists("macro2_4") == 0);
+getd(TMPDIR + "/bug_13890");
+assert_checkfalse(exists("macro1_1") == 0);
+assert_checkfalse(exists("macro1_2") == 0);
+assert_checkfalse(exists("macro1_3") == 0);
+assert_checkfalse(exists("macro1_4") == 0);
+assert_checkfalse(exists("macro2_1") == 0);
+assert_checkfalse(exists("macro2_2") == 0);
+assert_checkfalse(exists("macro2_3") == 0);
+assert_checkfalse(exists("macro2_4") == 0);
diff --git a/scilab/modules/functions/tests/nonreg_tests/bug_13890.tst b/scilab/modules/functions/tests/nonreg_tests/bug_13890.tst
new file mode 100644 (file)
index 0000000..0be7f6b
--- /dev/null
@@ -0,0 +1,74 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13890 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13890
+//
+// <-- Short Description -->
+// Bug when use getd with a ".sci" file with more than one function
+
+str1 = ["function macro1_1()";
+        "    disp(""macro1_1"");";
+        "endfunction";
+        "";
+        "function macro1_2()";
+        "    disp(""macro1_2"");";
+        "endfunction";
+        "";
+        "function macro1_3()";
+        "    disp(""macro1_3"");";
+        "endfunction";
+        "";
+        "function macro1_4()";
+        "    disp(""macro1_4"");";
+        "endfunction"];
+
+str2 = ["function macro2_1()";
+        "    disp(""macro2_1"");";
+        "endfunction";
+        "";
+        "function macro2_2()";
+        "    disp(""macro2_2"");";
+        "endfunction";
+        "";
+        "function macro2_3()";
+        "    disp(""macro2_3"");";
+        "endfunction";
+        "";
+        "function macro2_4()";
+        "    disp(""macro2_4"");";
+        "endfunction"];
+
+mkdir(TMPDIR + "/bug_13890");
+mputl(str1, TMPDIR + "/bug_13890/macro1.sci");
+mputl(str2, TMPDIR + "/bug_13890/macro2.sci");
+
+assert_checktrue(exists("macro1_1") == 0);
+assert_checktrue(exists("macro1_2") == 0);
+assert_checktrue(exists("macro1_3") == 0);
+assert_checktrue(exists("macro1_4") == 0);
+
+assert_checktrue(exists("macro2_1") == 0);
+assert_checktrue(exists("macro2_2") == 0);
+assert_checktrue(exists("macro2_3") == 0);
+assert_checktrue(exists("macro2_4") == 0);
+
+getd(TMPDIR + "/bug_13890");
+
+assert_checkfalse(exists("macro1_1") == 0);
+assert_checkfalse(exists("macro1_2") == 0);
+assert_checkfalse(exists("macro1_3") == 0);
+assert_checkfalse(exists("macro1_4") == 0);
+
+assert_checkfalse(exists("macro2_1") == 0);
+assert_checkfalse(exists("macro2_2") == 0);
+assert_checkfalse(exists("macro2_3") == 0);
+assert_checkfalse(exists("macro2_4") == 0);