Update to 3.0.10
This commit is contained in:
parent
7d5ee86e80
commit
00cff92a60
2
.gitignore
vendored
2
.gitignore
vendored
@ -18,3 +18,5 @@ swig-2.0.0.tar.gz
|
|||||||
/swig-3.0.6.tar.gz
|
/swig-3.0.6.tar.gz
|
||||||
/swig-3.0.7.tar.gz
|
/swig-3.0.7.tar.gz
|
||||||
/swig-3.0.8.tar.gz
|
/swig-3.0.8.tar.gz
|
||||||
|
/swig-3.0.9.tar.gz
|
||||||
|
/swig-3.0.10.tar.gz
|
||||||
|
2
sources
2
sources
@ -1 +1 @@
|
|||||||
c96a1d5ecb13d38604d7e92148c73c97 swig-3.0.8.tar.gz
|
bb4ab8047159469add7d00910e203124 swig-3.0.10.tar.gz
|
||||||
|
22
swig.spec
22
swig.spec
@ -30,8 +30,8 @@
|
|||||||
|
|
||||||
Summary: Connects C/C++/Objective C to some high-level programming languages
|
Summary: Connects C/C++/Objective C to some high-level programming languages
|
||||||
Name: swig
|
Name: swig
|
||||||
Version: 3.0.8
|
Version: 3.0.10
|
||||||
Release: 8%{?dist}
|
Release: 1%{?dist}
|
||||||
License: GPLv3+ and BSD
|
License: GPLv3+ and BSD
|
||||||
URL: http://swig.sourceforge.net/
|
URL: http://swig.sourceforge.net/
|
||||||
Source0: http://downloads.sourceforge.net/project/swig/swig/swig-%{version}/swig-%{version}.tar.gz
|
Source0: http://downloads.sourceforge.net/project/swig/swig/swig-%{version}/swig-%{version}.tar.gz
|
||||||
@ -41,14 +41,7 @@ Source2: description-ccache.h2m
|
|||||||
Source3: ccache-swig.sh
|
Source3: ccache-swig.sh
|
||||||
Source4: ccache-swig.csh
|
Source4: ccache-swig.csh
|
||||||
|
|
||||||
# Fixed python test li_boost_array on arm, ppc, s390
|
Patch0: swig308-Do-not-use-isystem.patch
|
||||||
# The failure was caused because "char" is not equivalent to "signed char"
|
|
||||||
# on these arches
|
|
||||||
Patch0: swig308-Fix-li_boost_array-test.patch
|
|
||||||
Patch1: swig308-Do-not-use-isystem.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: perl, python2-devel, pcre-devel
|
||||||
BuildRequires: autoconf, automake, gawk, dos2unix
|
BuildRequires: autoconf, automake, gawk, dos2unix
|
||||||
@ -126,11 +119,7 @@ This package contains documentation for SWIG and useful examples
|
|||||||
%prep
|
%prep
|
||||||
%setup -q -n swig-%{version}
|
%setup -q -n swig-%{version}
|
||||||
|
|
||||||
%patch0 -p1 -b .signed
|
%patch0 -p1 -b .isystem
|
||||||
%patch1 -p1 -b .isystem
|
|
||||||
%patch2 -p1 -b .isfinite
|
|
||||||
%patch3 -p1
|
|
||||||
%patch4 -p1 -b .ruby
|
|
||||||
|
|
||||||
for all in CHANGES README; do
|
for all in CHANGES README; do
|
||||||
iconv -f ISO88591 -t UTF8 < $all > $all.new
|
iconv -f ISO88591 -t UTF8 < $all > $all.new
|
||||||
@ -266,6 +255,9 @@ install -pm 644 %{SOURCE3} %{SOURCE4} %{buildroot}%{_sysconfdir}/profile.d
|
|||||||
%doc Doc Examples COPYRIGHT
|
%doc Doc Examples COPYRIGHT
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jun 13 2016 Jitka Plesnikova <jplesnik@redhat.com> - 3.0.10-1
|
||||||
|
- Update to 3.0.10
|
||||||
|
|
||||||
* Wed May 25 2016 Jitka Plesnikova <jplesnik@redhat.com> - 3.0.8-8
|
* Wed May 25 2016 Jitka Plesnikova <jplesnik@redhat.com> - 3.0.8-8
|
||||||
- Fix Ruby opaque pointer handling (bug #1299502)
|
- Fix Ruby opaque pointer handling (bug #1299502)
|
||||||
|
|
||||||
|
@ -1,217 +0,0 @@
|
|||||||
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;
|
|
||||||
%}
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
diff -up swig-3.0.8/Examples/test-suite/li_boost_array.i.orig swig-3.0.8/Examples/test-suite/li_boost_array.i
|
|
||||||
--- swig-3.0.8/Examples/test-suite/li_boost_array.i.orig 2016-01-06 08:09:48.851786620 +0100
|
|
||||||
+++ swig-3.0.8/Examples/test-suite/li_boost_array.i 2016-01-06 08:10:54.028471052 +0100
|
|
||||||
@@ -31,7 +31,7 @@ namespace boost {
|
|
||||||
|
|
||||||
%inline %{
|
|
||||||
boost::array<int, 6> arrayOutVal() {
|
|
||||||
- const char carray[] = { -2, -1, 0, 0, 1, 2 };
|
|
||||||
+ const signed char carray[] = { -2, -1, 0, 0, 1, 2 };
|
|
||||||
boost::array<int, 6> myarray;
|
|
||||||
for (size_t i=0; i<6; ++i) {
|
|
||||||
myarray[i] = carray[i];
|
|
@ -1,15 +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 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)
|
|
@ -1,215 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user