Compare commits

...

3 Commits
master ... f24

Author SHA1 Message Date
Jitka Plesnikova 38ebab1998 Fix Ruby opaque pointer handling (bug #1299502) 2016-05-25 16:52:28 +02:00
Jitka Plesnikova 0600de995e Add support for Go 1.6 2016-04-18 16:05:18 +02:00
Jitka Plesnikova 92ed389917 Used updated upstream fix for GCC 6 issue 2016-03-01 14:23:53 +01:00
5 changed files with 468 additions and 25 deletions

View File

@ -17,7 +17,6 @@
%{!?Rlang:%global Rlang 0}
%else
%{!?golang:%global golang 1}
# R tests failed (since 3.0.4)
%{!?Rlang:%global Rlang 1}
%endif
%{!?javalang:%global javalang 1}
@ -29,14 +28,10 @@
%{!?octave:%global octave 1}
%endif
# Disable Go tests because they failed against new Go 1.6
# The tests passed against Go 1.5.3
%global golang 0
Summary: Connects C/C++/Objective C to some high-level programming languages
Name: swig
Version: 3.0.8
Release: 4%{?dist}
Release: 7%{?dist}
License: GPLv3+ and BSD
URL: http://swig.sourceforge.net/
Source0: http://downloads.sourceforge.net/project/swig/swig/swig-%{version}/swig-%{version}.tar.gz
@ -51,7 +46,9 @@ Source4: ccache-swig.csh
# on these arches
Patch0: swig308-Fix-li_boost_array-test.patch
Patch1: swig308-Do-not-use-isystem.patch
Patch2: swig308-Update-test-for-macro-isfinite.patch
Patch2: swig308-Python-Use-std-isfinite-under-C-11.patch
Patch3: swig308-Add-support-Go-1_6.patch
Patch4: swig308-Ruby-opaque-pointer-handling-regression-fix.patch
BuildRequires: perl, python2-devel, pcre-devel
BuildRequires: autoconf, automake, gawk, dos2unix
@ -132,6 +129,8 @@ This package contains documentation for SWIG and useful examples
%patch0 -p1 -b .signed
%patch1 -p1 -b .isystem
%patch2 -p1 -b .isfinite
%patch3 -p1
%patch4 -p1 -b .ruby
for all in CHANGES README; do
iconv -f ISO88591 -t UTF8 < $all > $all.new
@ -267,6 +266,15 @@ install -pm 644 %{SOURCE3} %{SOURCE4} %{buildroot}%{_sysconfdir}/profile.d
%doc Doc Examples COPYRIGHT
%changelog
* Wed May 25 2016 Jitka Plesnikova <jplesnik@redhat.com> - 3.0.8-7
- Fix Ruby opaque pointer handling (bug #1299502)
* Mon Apr 18 2016 Jitka Plesnikova <jplesnik@redhat.com> - 3.0.8-6
- Add support for Go 1.6
* Tue Mar 01 2016 Jitka Plesnikova <jplesnik@redhat.com> - 3.0.8-5
- Used updated upstream fix for GCC 6 issue
* Mon Feb 22 2016 Jitka Plesnikova <jplesnik@redhat.com> - 3.0.8-4
- Patched to build against GCC 6
- Disable Go tests, because they failed against new Go 1.6
@ -626,12 +634,12 @@ install -pm 644 %{SOURCE3} %{SOURCE4} %{buildroot}%{_sysconfdir}/profile.d
- swig can determine architecture now (#211095)
* Mon Aug 28 2006 Jitka Kudrnacova <jkudrnac@redhat.com> -1.3.29-1
-rebuilt
-rebuilt
* Tue Jul 18 2006 Jitka Kudrnacova <jkudrnac@redhat.com> - 1.3.29-0.3
- rebuilt
- rebuilt
* Fri Jun 30 2006 Jitka Kudrnacova <jkudrnac@redhat.com> - 1.3.29-0.2
* Fri Jun 30 2006 Jitka Kudrnacova <jkudrnac@redhat.com> - 1.3.29-0.2
- Build requires autoconf, automake (bug #197132)
* Wed Apr 19 2006 Jitka Kudrnacova <jkudrnac@redhat.com> - 1.3.29-0.1
@ -652,13 +660,13 @@ install -pm 644 %{SOURCE3} %{SOURCE4} %{buildroot}%{_sysconfdir}/profile.d
* Wed Mar 02 2005 Phil Knirsch <pknirsch@redhat.com> 1.3.24-2
- bump release and rebuild with gcc 4
* Thu Feb 03 2005 Karsten Hopp <karsten@redhat.de> 1.3.24-1
* Thu Feb 03 2005 Karsten Hopp <karsten@redhat.de> 1.3.24-1
- update
* Wed Dec 01 2004 Phil Knirsch <pknirsch@redhat.com> 1.3.23-2
- rebuild
* Tue Nov 23 2004 Karsten Hopp <karsten@redhat.de> 1.3.23-1
* Tue Nov 23 2004 Karsten Hopp <karsten@redhat.de> 1.3.23-1
- update
- new pylib patch
- remove destdir patch, swig.m4 is no longer included
@ -771,7 +779,7 @@ install -pm 644 %{SOURCE3} %{SOURCE4} %{buildroot}%{_sysconfdir}/profile.d
- rebuilt for 6.1
* Thu Apr 15 1999 Michael Maher <mike@redhat.com>
- built package for 6.0
- built package for 6.0
* Tue Sep 15 1998 Michael Maher <mike@redhat.com>
- built package

View File

@ -0,0 +1,217 @@
From 223c2a483563e5c9dd93067831a6a2af6252bcec Mon Sep 17 00:00:00 2001
From: Ian Lance Taylor <iant@golang.org>
Date: Sun, 17 Apr 2016 17:52:09 -0700
Subject: [PATCH] [Go] Fixes for Go 1.6: avoid returning Go pointers from
directors that return string values; add a trailing 0 byte when treating Go
string as C char*.
---
# CHANGES.current | 5 +++++
Examples/test-suite/apply_strings.i | 4 ++++
Examples/test-suite/go_inout.i | 13 +++++++++++--
Examples/test-suite/namespace_typemap.i | 6 +++++-
Lib/go/go.swg | 30 +++++++++++++++++++++++++++---
Lib/go/goruntime.swg | 4 ++++
Lib/go/std_string.i | 26 +++++++++++++++++++++++++-
7 files changed, 81 insertions(+), 7 deletions(-)
#diff --git a/CHANGES.current b/CHANGES.current
#index 8ab5627..c23a2d9 100644
#--- a/CHANGES.current
#+++ b/CHANGES.current
#@@ -5,6 +5,11 @@ See the RELEASENOTES file for a summary of changes in each release.
# Version 3.0.9 (in progress)
# ===========================
#
#+2016-04-17: ianlancetaylor
#+ [Go] Fixes for Go 1.6: avoid returning Go pointers from
#+ directors that return string values; add a trailing 0 byte
#+ when treating Go string as C char*.
#+
# 2016-04-06: smarchetto
# [Scilab] #552 Make Scilab runtime keep track of pointer types
# Instead of a Scilab pointer which has no type, SWIG Scilab maps a
diff --git a/Examples/test-suite/apply_strings.i b/Examples/test-suite/apply_strings.i
index 62b578b..695dd06 100644
--- a/Examples/test-suite/apply_strings.i
+++ b/Examples/test-suite/apply_strings.i
@@ -68,6 +68,10 @@ TAscii *DigitsGlobalC;
// Director test
%feature("director");
+#if defined(SWIGGO)
+%typemap(godirectorout) CharPtr, CCharPtr ""
+#endif
+
%inline %{
struct DirectorTest {
virtual UCharPtr UCharFunction(UCharPtr str) { return str; }
diff --git a/Examples/test-suite/go_inout.i b/Examples/test-suite/go_inout.i
index 57e7bf2..a174246 100644
--- a/Examples/test-suite/go_inout.i
+++ b/Examples/test-suite/go_inout.i
@@ -23,7 +23,7 @@ struct RetStruct {
// Write a typemap that calls C++ by converting in and out of JSON.
-%go_import("encoding/json", "bytes", "encoding/binary")
+%go_import("encoding/json", "bytes", "encoding/binary", "reflect", "unsafe")
%insert(go_header)
%{
@@ -87,6 +87,10 @@ struct MyArray {
std::vector<std::string> strings;
};
+void* Allocate(int n) {
+ return new char[n];
+}
+
static uint64_t getuint64(const char* s) {
uint64_t ret = 0;
for (int i = 0; i < 8; i++, s++) {
@@ -121,7 +125,12 @@ static void putuint64(std::string *s, size_t off, uint64_t v) {
buf.Write(b[:])
buf.WriteString(s)
}
- str := buf.String()
+ bb := buf.Bytes()
+ p := Allocate(len(bb))
+ copy((*[1<<15]byte)(unsafe.Pointer(p))[:len(bb)], bb)
+ var str string
+ (*reflect.StringHeader)(unsafe.Pointer(&str)).Data = uintptr(unsafe.Pointer(p))
+ (*reflect.StringHeader)(unsafe.Pointer(&str)).Len = len(bb)
$result = &str
}
%}
diff --git a/Examples/test-suite/namespace_typemap.i b/Examples/test-suite/namespace_typemap.i
index 8ead78c..7f474bd 100644
--- a/Examples/test-suite/namespace_typemap.i
+++ b/Examples/test-suite/namespace_typemap.i
@@ -109,7 +109,11 @@ namespace test {
#ifdef SWIGGO
%typemap(gotype) string_class * "string"
%typemap(in) string_class * {
- $1 = new string_class($input.p);
+ char* buf = new char[$input.n + 1];
+ memcpy(buf, $input.p, $input.n);
+ buf[$input.n] = '\0';
+ $1 = new string_class(buf);
+ delete[] buf;
}
%typemap(freearg) string_class * {
delete $1;
diff --git a/Lib/go/go.swg b/Lib/go/go.swg
index 24f1b73..40e2741 100644
--- a/Lib/go/go.swg
+++ b/Lib/go/go.swg
@@ -435,10 +435,22 @@
%typemap(in)
char *, char[ANY], char[]
-%{ $1 = ($1_ltype)$input.p; %}
+%{
+ $1 = ($1_ltype)malloc($input.n + 1);
+ memcpy($1, $input.p, $input.n);
+ $1[$input.n] = '\0';
+%}
%typemap(in) char *&
-%{ $1 = ($1_ltype)$input.p; %}
+%{
+ $1 = ($1_ltype)malloc($input.n + 1);
+ memcpy($1, $input.p, $input.n);
+ $1[$input.n] = '\0';
+%}
+
+%typemap(freearg)
+ char *, char *&, char[ANY], char[]
+%{ free($1); %}
%typemap(out,fragment="AllocateString")
char *, char *&, char[ANY], char[]
@@ -460,7 +472,19 @@
$result = swigCopyString($input)
%}
-%typemap(directorout)
+%typemap(godirectorout)
+ char *, char *&, char[ANY], char[]
+%{
+ {
+ p := Swig_malloc(len($input) + 1)
+ s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input) + 1]
+ copy(s, $input)
+ s[len($input)] = 0
+ $result = *(*string)(unsafe.Pointer(&s))
+ }
+%}
+
+%typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG)
char *, char *&, char[ANY], char[]
%{ $result = ($1_ltype)$input.p; %}
diff --git a/Lib/go/goruntime.swg b/Lib/go/goruntime.swg
index e7a33ad..dc6193d 100644
--- a/Lib/go/goruntime.swg
+++ b/Lib/go/goruntime.swg
@@ -8,6 +8,10 @@
static void Swig_free(void* p) {
free(p);
}
+
+static void* Swig_malloc(int c) {
+ return malloc(c);
+}
%}
%insert(runtime) %{
diff --git a/Lib/go/std_string.i b/Lib/go/std_string.i
index 068c688..099ae84 100644
--- a/Lib/go/std_string.i
+++ b/Lib/go/std_string.i
@@ -24,8 +24,21 @@ class string;
%typemap(in) string
%{ $1.assign($input.p, $input.n); %}
+%typemap(godirectorout) string
+%{
+ {
+ p := Swig_malloc(len($input))
+ s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)]
+ copy(s, $input)
+ $result = *(*string)(unsafe.Pointer(&s))
+ }
+%}
+
%typemap(directorout) string
-%{ $result.assign($input.p, $input.n); %}
+%{
+ $result.assign($input.p, $input.n);
+ free($input.p);
+%}
%typemap(out,fragment="AllocateString") string
%{ $result = Swig_AllocateString($1.data(), $1.length()); %}
@@ -45,10 +58,21 @@ class string;
$1 = &$1_str;
%}
+%typemap(godirectorout) const string &
+%{
+ {
+ p := Swig_malloc(len($input))
+ s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)]
+ copy(s, $input)
+ $result = *(*string)(unsafe.Pointer(&s))
+ }
+%}
+
%typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string &
%{
static $*1_ltype $1_str;
$1_str.assign($input.p, $input.n);
+ free($input.p);
$result = &$1_str;
%}

View File

@ -0,0 +1,15 @@
diff -up swig-3.0.8/Lib/typemaps/fragments.swg.orig swig-3.0.8/Lib/typemaps/fragments.swg
--- swig-3.0.8/Lib/typemaps/fragments.swg.orig 2015-12-30 23:23:47.000000000 +0100
+++ swig-3.0.8/Lib/typemaps/fragments.swg 2016-03-01 10:13:29.840682167 +0100
@@ -168,8 +168,11 @@
%fragment("SWIG_isfinite","header",fragment="<math.h>,<float.h>") %{
/* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */
#ifndef SWIG_isfinite
+/* isfinite() is a macro for C99, but a function in namespace std for C++11. */
# if defined(isfinite)
# define SWIG_isfinite(X) (isfinite(X))
+# elif defined __cplusplus && __cplusplus >= 201103L
+# define SWIG_isfinite(X) (std::isfinite(X))
# elif defined(_MSC_VER)
# define SWIG_isfinite(X) (_finite(X))
# elif defined(__sun) && defined(__SVR4)

View File

@ -0,0 +1,215 @@
From 763827c2e1fffd34e871c66d5d4c9e492c1cecec Mon Sep 17 00:00:00 2001
From: William S Fulton <wsf@fultondesigns.co.uk>
Date: Tue, 24 May 2016 07:33:25 +0100
Subject: [PATCH] Ruby opaque pointer handling regression fix
This bug was introduced in swig-3.0.8 in #146252 adding shared_ptr
support. An ObjectPreviouslyDeleted error was incorrectly thrown
when the pointer was used as a parameter after being set to zero
via a call to 'DATA_PTR(self) = 0'.
It isn't clear to me which approach is better in this corner case,
so I've gone for backwards compatibility and restored the old behaviour.
Closes #602
---
CHANGES.current | 6 ++
Examples/test-suite/ruby/Makefile.in | 3 +-
.../test-suite/ruby/ruby_manual_proxy_runme.rb | 49 ++++++++++++++++
Examples/test-suite/ruby_manual_proxy.i | 66 ++++++++++++++++++++++
Lib/ruby/rubyrun.swg | 12 ++--
5 files changed, 131 insertions(+), 5 deletions(-)
create mode 100644 Examples/test-suite/ruby/ruby_manual_proxy_runme.rb
create mode 100644 Examples/test-suite/ruby_manual_proxy.i
#diff --git a/CHANGES.current b/CHANGES.current
#index 6e347a7..f754e96 100644
#--- a/CHANGES.current
#+++ b/CHANGES.current
#@@ -5,6 +5,12 @@ See the RELEASENOTES file for a summary of changes in each release.
# Version 3.0.9 (in progress)
# ===========================
#
#+2016-05-23: wsfulton
#+ [Ruby] Fix #602 - Error handling regression of opaque pointers introduced
#+ in swig-3.0.8 when C functions explicitly reset a pointer using 'DATA_PTR(self) = 0'.
#+ An ObjectPreviouslyDeleted error was incorrectly thrown when the pointer was used
#+ as a parameter.
#+
# 2016-05-17: tamuratak
# [Ruby] Patch #651 - Correct overloaded function error message when function is
# using %newobject.
diff --git a/Examples/test-suite/ruby/Makefile.in b/Examples/test-suite/ruby/Makefile.in
index 847c959..d94ac70 100644
--- a/Examples/test-suite/ruby/Makefile.in
+++ b/Examples/test-suite/ruby/Makefile.in
@@ -32,7 +32,8 @@ CPP_TEST_CASES = \
C_TEST_CASES += \
li_cdata \
- li_cstring
+ li_cstring \
+ ruby_manual_proxy \
include $(srcdir)/../common.mk
diff --git a/Examples/test-suite/ruby/ruby_manual_proxy_runme.rb b/Examples/test-suite/ruby/ruby_manual_proxy_runme.rb
new file mode 100644
index 0000000..c1cee2d
--- /dev/null
+++ b/Examples/test-suite/ruby/ruby_manual_proxy_runme.rb
@@ -0,0 +1,49 @@
+#!/usr/bin/env ruby
+#
+# The Subversion bindings use this manually written proxy class approach
+# to the Ruby bindings. Note that in C the struct svn_fs_t is an
+# opaque pointer and the Ruby FileSystem proxy class is hand written around it.
+# This testcase tests this and the C close function and subsequent error
+# handling.
+
+require 'swig_assert'
+require 'ruby_manual_proxy'
+
+module Svn
+ module Fs
+ module_function
+ def create(path)
+ f = Ruby_manual_proxy::svn_fs_create(path)
+ return f
+ end
+
+ FileSystem = SWIG::TYPE_p_svn_fs_t
+ class FileSystem
+ class << self
+ def create(*args)
+ Fs.create(*args)
+ end
+ end
+ def path
+ Ruby_manual_proxy::svn_fs_path(self)
+ end
+ end
+ end
+end
+
+f = Svn::Fs::FileSystem.create("/tmp/myfile")
+path = f.path
+f.close
+begin
+ # regression in swig-3.0.8 meant ObjectPreviouslyDeleted error was thrown instead
+ path = f.path
+ raise RuntimeError.new("IOError (1) not thrown")
+rescue IOError
+end
+
+file = nil
+begin
+ path = Ruby_manual_proxy::svn_fs_path(file)
+ raise RuntimeError.new("IOError (2) not thrown")
+rescue IOError
+end
diff --git a/Examples/test-suite/ruby_manual_proxy.i b/Examples/test-suite/ruby_manual_proxy.i
new file mode 100644
index 0000000..2cb154e
--- /dev/null
+++ b/Examples/test-suite/ruby_manual_proxy.i
@@ -0,0 +1,66 @@
+%module ruby_manual_proxy
+
+
+%typemap(in, numinputs=0) SWIGTYPE ** ($*1_ltype temp) "$1 = &temp;";
+
+%typemap(argout) SWIGTYPE **OUTPARAM {
+ $result = SWIG_Ruby_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
+}
+
+%apply SWIGTYPE **OUTPARAM {
+ svn_fs_t **
+};
+
+%typemap(check) svn_fs_t * {
+ if (!$1) {
+ svn_swig_rb_raise_svn_fs_already_close();
+ }
+}
+
+%{
+typedef struct svn_fs_t {
+ char path[256];
+} svn_fs_t;
+
+void svn_fs_create(svn_fs_t **fs_p, const char *path) {
+ svn_fs_t *fs = (svn_fs_t *)malloc(sizeof(svn_fs_t));
+ strncpy(fs->path, path, 256);
+ *fs_p = fs;
+}
+const char *svn_fs_path(svn_fs_t *fs) {
+ return fs->path;
+}
+%}
+
+typedef struct svn_fs_t svn_fs_t;
+void svn_fs_create(svn_fs_t **fs_p, const char *path);
+const char *svn_fs_path(svn_fs_t *fs);
+
+%{
+static void svn_swig_rb_raise_svn_fs_already_close(void) {
+ rb_raise(rb_eIOError, "already closed");
+}
+
+static VALUE svn_fs_swig_rb_close(VALUE self) {
+ if (!DATA_PTR(self)) {
+ svn_swig_rb_raise_svn_fs_already_close();
+ }
+
+ DATA_PTR(self) = NULL;
+
+ return Qnil;
+}
+
+static VALUE svn_fs_swig_rb_closed(VALUE self) {
+ return DATA_PTR(self) ? Qfalse : Qtrue;
+}
+%}
+
+%insert("init") %{
+ {
+ VALUE cSvnfs;
+ cSvnfs = rb_const_get(_mSWIG, rb_intern("TYPE_p_svn_fs_t"));
+ rb_define_method(cSvnfs, "close",
+ VALUEFUNC(svn_fs_swig_rb_close), 0);
+ }
+%}
diff --git a/Lib/ruby/rubyrun.swg b/Lib/ruby/rubyrun.swg
index e18208f..249494a 100644
--- a/Lib/ruby/rubyrun.swg
+++ b/Lib/ruby/rubyrun.swg
@@ -305,6 +305,14 @@ SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags,
/* Do type-checking if type info was provided */
if (ty) {
+ if (ty->clientdata) {
+ if (rb_obj_is_kind_of(obj, ((swig_class *) (ty->clientdata))->klass)) {
+ if (vptr == 0) {
+ /* The object has already been deleted */
+ return SWIG_ObjectPreviouslyDeletedError;
+ }
+ }
+ }
if ((c = SWIG_MangleStr(obj)) == NULL) {
return SWIG_ERROR;
}
@@ -312,10 +320,6 @@ SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags,
if (!tc) {
return SWIG_ERROR;
} else {
- if (vptr == 0) {
- /* The object has already been deleted */
- return SWIG_ObjectPreviouslyDeletedError;
- }
if (ptr) {
if (tc->type == ty) {
*ptr = vptr;
--
2.5.5

View File

@ -1,12 +0,0 @@
diff -up swig-3.0.8/Lib/typemaps/fragments.swg.orig swig-3.0.8/Lib/typemaps/fragments.swg
--- swig-3.0.8/Lib/typemaps/fragments.swg.orig 2016-02-18 08:30:57.625989817 +0100
+++ swig-3.0.8/Lib/typemaps/fragments.swg 2016-02-18 08:31:13.260900411 +0100
@@ -168,7 +168,7 @@
%fragment("SWIG_isfinite","header",fragment="<math.h>,<float.h>") %{
/* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */
#ifndef SWIG_isfinite
-# if defined(isfinite)
+# if defined(isfinite) || (defined __cplusplus && __cplusplus >= 201103L)
# define SWIG_isfinite(X) (isfinite(X))
# elif defined(_MSC_VER)
# define SWIG_isfinite(X) (_finite(X))