bug 4515
Allan CORNET [Mon, 18 May 2009 14:06:50 +0000 (16:06 +0200)]
scilab/CHANGES_5.2.X
scilab/modules/dynamic_link/help/en_US/ilib_for_link.xml
scilab/modules/dynamic_link/macros/ilib_for_link.sci
scilab/modules/dynamic_link/macros/ilib_gen_loader.sci
scilab/modules/dynamic_link/tests/nonreg_tests/bug_4515.dia.ref [new file with mode: 0644]
scilab/modules/dynamic_link/tests/nonreg_tests/bug_4515.tst [new file with mode: 0644]
scilab/modules/dynamic_link/tests/unit_tests/ilib_for_link.macosx.dia.ref
scilab/modules/dynamic_link/tests/unit_tests/ilib_for_link.unix.dia.ref
scilab/modules/dynamic_link/tests/unit_tests/ilib_for_link.win.dia.ref

index d7ca327..b9cfd54 100644 (file)
@@ -203,4 +203,6 @@ Bug fixes:
 
 * bug 4522 fixed - The Tcl interpreter initialization code makes use of some unitialized variables.
 
+* bug 4515 fixed - linking and loading some external functions already used crashs scilab.
+
 * bug 4525 fixed - scilab.sln and scilab_f2c.sln do not apply same dependencies on libraries (windows).
index 5009e43..b3a4dc8 100644 (file)
     current directory, <literal>loader</literal> script must be located in
     the same directory using the <literal>loadername</literal> variable.</para>
     <para>
-    Many examples are provided in <literal>examples/link-examples-so</literal>
+    Many examples are provided in <literal>SCI/modules/dynamic_link/examples</literal>
     directory. They are all released into the public domain.</para>
        <para><emphasis role="bold">Note that a compiler must be available on the system to use this function.</emphasis></para>
        <para><emphasis role="bold">Languages handle by this function are: C, C++, Fortran and Fortran 90.</emphasis></para>
index 33c272f..76c7abc 100644 (file)
@@ -38,6 +38,11 @@ function libn = ilib_for_link(names, ..
   
   ilib_gen_loader(names,flag,loadername,libs,libname);
   
+  // bug 4515 - unlink previous function with same name
+  n = size(names,'*');
+  for i = 1:n
+    execstr("[bOK,ilib] = c_link(''" + names(i) + "'');if (bOK) then ulink(ilib),end", names(i));
+  end
   
   // generate a Makefile
   if ( ilib_verbose() <> 0 ) then
index ab9069d..4d82f9f 100644 (file)
@@ -126,11 +126,17 @@ function ilib_4_link_gen_loader(names, flag, loadername, libs, libname)
       end
   end  
   
+  // bug 4515 - unlink previous function with same name
+  names = names(:)';
+  n = size(names,'*');
+  mfprintf(fd,"// ulink previous function with same name\n");
+  for i = 1:n
+    mfprintf(fd,"[bOK,ilib] = c_link(''%s'');if (bOK) then ulink(ilib),end\n", names(i));
+  end
+
   //** second "link" : user defined functions  
   mfprintf(fd,"link(%s_path+''lib%s%s'',[",shortlibname_path,libname,lib_suf);
   
-  names = names(:)';
-  n = size(names,'*');
   for i=1:n
     mfprintf(fd,"''%s''",names(i))
     if i <>n ; mfprintf(fd,","); else mfprintf(fd,"],");end
diff --git a/scilab/modules/dynamic_link/tests/nonreg_tests/bug_4515.dia.ref b/scilab/modules/dynamic_link/tests/nonreg_tests/bug_4515.dia.ref
new file mode 100644 (file)
index 0000000..1bb5e38
--- /dev/null
@@ -0,0 +1,42 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- JVM NOT MANDATORY -->
+// <-- Non-regression test for bug 4515 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=4515
+//
+// <-- Short Description -->
+// linking and loading some external functions already used crashs scilab
+// exec SCI/modules/dynamic_link/tests/nonreg_tests/bug_4515.tst;
+ilib_verbose(0);
+chdir(TMPDIR);
+f1 = ['int ext1c(int *n, double *a, double *b, double *c)',
+'{int k;',
+' for (k = 0; k < *n; ++k) ',
+' c[k] = a[k] + b[k];',
+' return(0);}'];
+mputl(f1,'fun1.c');
+ilib_for_link('ext1c','fun1.c',[],"c");
+a=[1,2,3];b=[4,5,6];n=3;
+c=call('ext1c',n,1,'i',a,2,'d',b,3,'d','out',[1,3],4,'d');     
+if or(c <> [5 7 9]) <> %f then bugmes();quit;end
+f2 = ['#include <math.h>',
+'#include <stdlib.h>';
+'int ext1c(int *n, double *a, double *b, double *c, double *g)',
+'{int k;',
+'  for (k = 0; k < *n; ++k){ ',
+'      c[k] = 2.0 *a[k] + b[k];',
+'      g[k] = 3.0 + a[k] * b[k];',
+'      a[k] = 2.5 * b[k];',
+'      g[k] = 3.0 + a[k] * b[k];}',
+'  return(0);}'];
+ilib_for_link('ext1c','fun1.c',[],"c");
+exec loader.sce;
+c=call('ext1c',n,1,'i',a,2,'d',b,3,'d','out',[1,3],4,'d');     
+if or(c <> [5 7 9]) <> %f then bugmes();quit;end
+// =============================================================================
diff --git a/scilab/modules/dynamic_link/tests/nonreg_tests/bug_4515.tst b/scilab/modules/dynamic_link/tests/nonreg_tests/bug_4515.tst
new file mode 100644 (file)
index 0000000..4bcd91a
--- /dev/null
@@ -0,0 +1,53 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- JVM NOT MANDATORY -->
+// <-- Non-regression test for bug 4515 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=4515
+//
+// <-- Short Description -->
+// linking and loading some external functions already used crashs scilab
+// exec SCI/modules/dynamic_link/tests/nonreg_tests/bug_4515.tst;
+
+ilib_verbose(0);
+chdir(TMPDIR);
+
+f1 = ['int ext1c(int *n, double *a, double *b, double *c)',
+'{int k;',
+' for (k = 0; k < *n; ++k) ',
+' c[k] = a[k] + b[k];',
+' return(0);}'];
+
+mputl(f1,'fun1.c');
+
+ilib_for_link('ext1c','fun1.c',[],"c");
+exec('loader.sce');
+
+a=[1,2,3];b=[4,5,6];n=3;
+c=call('ext1c',n,1,'i',a,2,'d',b,3,'d','out',[1,3],4,'d');     
+if or(c <> [5 7 9]) <> %f then pause,end
+
+f2 = ['#include <math.h>',
+'#include <stdlib.h>';
+'int ext1c(int *n, double *a, double *b, double *c, double *g)',
+'{int k;',
+'  for (k = 0; k < *n; ++k){ ',
+'      c[k] = 2.0 *a[k] + b[k];',
+'      g[k] = 3.0 + a[k] * b[k];',
+'      a[k] = 2.5 * b[k];',
+'      g[k] = 3.0 + a[k] * b[k];}',
+'  return(0);}'];
+
+ilib_for_link('ext1c','fun1.c',[],"c");
+exec loader.sce;
+
+c=call('ext1c',n,1,'i',a,2,'d',b,3,'d','out',[1,3],4,'d');     
+if or(c <> [5 7 9]) <> %f then pause,end
+
+// =============================================================================
index 3bf844e..4101a7c 100644 (file)
@@ -50,7 +50,8 @@ exec loader.sce
  
 ext1c_path = get_absolute_file_path('loader.sce');
  
+// ulink previous function with same name
+ [bOK,ilib] = c_link('ext1c');if (bOK) then ulink(ilib),end 
 link(ext1c_path+'libext1c.dylib',['ext1c'],'c');
 Shared archive loaded.
 Link done.
index 1fbc6b8..8df7fc5 100644 (file)
@@ -50,7 +50,8 @@ exec loader.sce
  
 ext1c_path = get_absolute_file_path('loader.sce');
  
+// ulink previous function with same name
+[bOK,ilib] = c_link('ext1c');if (bOK) then ulink(ilib),end  
 link(ext1c_path+'libext1c.so',['ext1c'],'c');
 Shared archive loaded.
 Link done.
index 0c13bd5..33edc2a 100644 (file)
@@ -49,7 +49,8 @@ exec loader.sce
  
 ext1c_path = get_absolute_file_path('loader.sce');
  
+// ulink previous function with same name
+ [bOK,ilib] = c_link('ext1c');if (bOK) then ulink(ilib),end 
 link(ext1c_path+'libext1c.dll',['ext1c'],'c');
 Shared archive loaded.
 Link done.