Fix PHP director_classes testcase failures on x86

This commit is contained in:
Jitka Plesnikova 2023-12-07 19:29:08 +01:00
parent d32feca3e6
commit 8b63a5b179
2 changed files with 235 additions and 7 deletions

View File

@ -0,0 +1,228 @@
From 5f8b9135cc2de52369a509792db578156368932f Mon Sep 17 00:00:00 2001
From: Olly Betts <olly@survex.com>
Date: Sun, 19 Nov 2023 21:26:28 +1300
Subject: [PATCH] Fix director_classes testcase failures on x86
Adjust the floating point constants to be 1.125 and 2.25 (which
can be exactly represented in base-2 floating point) instead of
1.1 and 2.2 (which can't). This avoids problems on platforms where
floating point calculations suffer from excess precision, the most
commonly used of which is x86 when using 387 FP instructions.
---
.../test-suite/csharp/director_classes_runme.cs | 16 ++++++++--------
Examples/test-suite/d/director_classes_runme.2.d | 16 ++++++++--------
Examples/test-suite/director_classes.i | 8 ++++----
.../test-suite/java/director_classes_runme.java | 16 ++++++++--------
.../test-suite/php/director_classes_runme.php | 2 +-
5 files changed, 29 insertions(+), 29 deletions(-)
diff --git a/Examples/test-suite/csharp/director_classes_runme.cs b/Examples/test-suite/csharp/director_classes_runme.cs
index cea4949c6..25bb35968 100644
--- a/Examples/test-suite/csharp/director_classes_runme.cs
+++ b/Examples/test-suite/csharp/director_classes_runme.cs
@@ -21,8 +21,8 @@ Base - FullyOverloaded(int 10)
Base - FullyOverloaded(bool 1)
Base - SemiOverloaded(int -678)
Base - SemiOverloaded(bool 1)
-Base - DefaultParms(10, 2.2)
-Base - DefaultParms(10, 1.1)
+Base - DefaultParms(10, 2.25)
+Base - DefaultParms(10, 1.125)
--------------------------------
Derived - Val(444.555)
Derived - Ref(444.555)
@@ -32,8 +32,8 @@ Derived - FullyOverloaded(int 10)
Derived - FullyOverloaded(bool 1)
Derived - SemiOverloaded(int -678)
Base - SemiOverloaded(bool 1)
-Derived - DefaultParms(10, 2.2)
-Derived - DefaultParms(10, 1.1)
+Derived - DefaultParms(10, 2.25)
+Derived - DefaultParms(10, 1.125)
--------------------------------
CSharpDerived - Val(444.555)
CSharpDerived - Ref(444.555)
@@ -43,8 +43,8 @@ CSharpDerived - FullyOverloaded(int 10)
CSharpDerived - FullyOverloaded(bool True)
CSharpDerived - SemiOverloaded(-678)
Base - SemiOverloaded(bool 1)
-CSharpDerived - DefaultParms(10, 2.2)
-CSharpDerived - DefaultParms(10, 1.1)
+CSharpDerived - DefaultParms(10, 2.25)
+CSharpDerived - DefaultParms(10, 1.125)
------------ Finish ------------
*/
@@ -113,7 +113,7 @@ public class runme
if (myCaller.SemiOverloadedCall(true) != "Base" + "::SemiOverloaded(bool)") throw new Exception("failed");
// Default parameters methods test
- if (NAMESPACE + myCaller.DefaultParmsCall(10, 2.2) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed");
+ if (NAMESPACE + myCaller.DefaultParmsCall(10, 2.25) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed");
if (myBase.GetType() == typeof(CSharpDerived)) { // special handling for C# derived classes, there is no way to do this any other way
if (NAMESPACE + myCaller.DefaultParmsCall(10) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed");
} else {
@@ -182,7 +182,7 @@ public class CSharpDerived : Base
public override String DefaultParms(int x)
{
if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - DefaultParms({0})", x);
- return DefaultParms(x, 1.1/*use C++ default here*/);
+ return DefaultParms(x, 1.125/*use C++ default here*/);
}
}
diff --git a/Examples/test-suite/d/director_classes_runme.2.d b/Examples/test-suite/d/director_classes_runme.2.d
index b16fa5461..5e9588b31 100644
--- a/Examples/test-suite/d/director_classes_runme.2.d
+++ b/Examples/test-suite/d/director_classes_runme.2.d
@@ -23,8 +23,8 @@
* Base - FullyOverloaded(bool 1)
* Base - SemiOverloaded(int -678)
* Base - SemiOverloaded(bool 1)
- * Base - DefaultParms(10, 2.2)
- * Base - DefaultParms(10, 1.1)
+ * Base - DefaultParms(10, 2.25)
+ * Base - DefaultParms(10, 1.125)
* --------------------------------
* Derived - Val(444.555)
* Derived - Ref(444.555)
@@ -34,8 +34,8 @@
* Derived - FullyOverloaded(bool 1)
* Derived - SemiOverloaded(int -678)
* Base - SemiOverloaded(bool 1)
- * Derived - DefaultParms(10, 2.2)
- * Derived - DefaultParms(10, 1.1)
+ * Derived - DefaultParms(10, 2.25)
+ * Derived - DefaultParms(10, 1.125)
* --------------------------------
* DDerived - Val(444.555)
* DDerived - Ref(444.555)
@@ -45,8 +45,8 @@
* DDerived - FullyOverloaded(bool true)
* DDerived - SemiOverloaded(-678)
* Base - SemiOverloaded(bool 1)
- * DDerived - DefaultParms(10, 2.2)
- * DDerived - DefaultParms(10, 1.1)
+ * DDerived - DefaultParms(10, 2.25)
+ * DDerived - DefaultParms(10, 1.125)
* ------------ Finish ------------
*/
module director_classes_runme;
@@ -111,7 +111,7 @@ void makeCalls(Caller myCaller, Base myBase) {
enforce(myCaller.SemiOverloadedCall(true) == "Base" ~ "::SemiOverloaded(bool)", "[7] failed");
// Default parameters methods test
- enforce(myCaller.DefaultParmsCall(10, 2.2) == myBaseType ~ "::DefaultParms(int, double)", "[8] failed");
+ enforce(myCaller.DefaultParmsCall(10, 2.25) == myBaseType ~ "::DefaultParms(int, double)", "[8] failed");
if (myBase.classinfo == DDerived.classinfo) { // special handling for D derived classes, there is no other way to do this
enforce(myCaller.DefaultParmsCall(10) == myBaseType ~ "::DefaultParms(int, double)", "[9] failed");
} else {
@@ -173,6 +173,6 @@ public class DDerived : Base {
// only here to ensure consistent behavior for calls from C++ and D code.
public override string DefaultParms(int x) {
if (PrintDebug) writefln("DDerived - DefaultParms(%s)", x);
- return DefaultParms(x, 1.1/*use C++ default here*/);
+ return DefaultParms(x, 1.125/*use C++ default here*/);
}
}
diff --git a/Examples/test-suite/director_classes.i b/Examples/test-suite/director_classes.i
index 52342bfc8..f8c4e68e2 100644
--- a/Examples/test-suite/director_classes.i
+++ b/Examples/test-suite/director_classes.i
@@ -56,10 +56,10 @@ public:
virtual std::string SemiOverloaded(int x) { if (PrintDebug) std::cout << "Base - SemiOverloaded(int " << x << ")" << std::endl; return "Base::SemiOverloaded(int)"; }
virtual std::string SemiOverloaded(bool x) { if (PrintDebug) std::cout << "Base - SemiOverloaded(bool " << x << ")" << std::endl; return "Base::SemiOverloaded(bool)"; }
- virtual std::string DefaultParms(int x, double y = 1.1) {
+ virtual std::string DefaultParms(int x, double y = 1.125) {
if (PrintDebug) std::cout << "Base - DefaultParms(" << x << ", " << y << ")" << std::endl;
std::string ret("Base::DefaultParms(int");
- if (y!=1.1)
+ if (y!=1.125)
ret = ret + std::string(", double");
ret = ret + std::string(")");
return ret;
@@ -82,10 +82,10 @@ public:
virtual std::string SemiOverloaded(int x) { if (PrintDebug) std::cout << "Derived - SemiOverloaded(int " << x << ")" << std::endl; return "Derived::SemiOverloaded(int)"; }
// No SemiOverloaded(bool x)
- virtual std::string DefaultParms(int x, double y = 1.1) {
+ virtual std::string DefaultParms(int x, double y = 1.125) {
if (PrintDebug) std::cout << "Derived - DefaultParms(" << x << ", " << y << ")" << std::endl;
std::string ret("Derived::DefaultParms(int");
- if (y!=1.1)
+ if (y!=1.125)
ret = ret + std::string(", double");
ret = ret + std::string(")");
return ret;
diff --git a/Examples/test-suite/java/director_classes_runme.java b/Examples/test-suite/java/director_classes_runme.java
index 9ee6302de..292cded7f 100644
--- a/Examples/test-suite/java/director_classes_runme.java
+++ b/Examples/test-suite/java/director_classes_runme.java
@@ -21,8 +21,8 @@ Base - FullyOverloaded(int 10)
Base - FullyOverloaded(bool 1)
Base - SemiOverloaded(int -678)
Base - SemiOverloaded(bool 1)
-Base - DefaultParms(10, 2.2)
-Base - DefaultParms(10, 1.1)
+Base - DefaultParms(10, 2.25)
+Base - DefaultParms(10, 1.125)
--------------------------------
Derived - Val(444.555)
Derived - Ref(444.555)
@@ -32,8 +32,8 @@ Derived - FullyOverloaded(int 10)
Derived - FullyOverloaded(bool 1)
Derived - SemiOverloaded(int -678)
Base - SemiOverloaded(bool 1)
-Derived - DefaultParms(10, 2.2)
-Derived - DefaultParms(10, 1.1)
+Derived - DefaultParms(10, 2.25)
+Derived - DefaultParms(10, 1.125)
--------------------------------
JavaDerived - Val(444.555)
JavaDerived - Ref(444.555)
@@ -43,8 +43,8 @@ JavaDerived - FullyOverloaded(int 10)
JavaDerived - FullyOverloaded(bool True)
JavaDerived - SemiOverloaded(-678)
Base - SemiOverloaded(bool 1)
-JavaDerived - DefaultParms(10, 2.2)
-JavaDerived - DefaultParms(10, 1.1)
+JavaDerived - DefaultParms(10, 2.25)
+JavaDerived - DefaultParms(10, 1.125)
------------ Finish ------------
*/
@@ -128,7 +128,7 @@ public class director_classes_runme {
if (!myCaller.SemiOverloadedCall(true).equals("Base" + "::SemiOverloaded(bool)")) throw new RuntimeException("failed");
// Default parameters methods test
- if (!(myCaller.DefaultParmsCall(10, 2.2)).equals(baseSimpleName + "::DefaultParms(int, double)")) throw new RuntimeException("failed");
+ if (!(myCaller.DefaultParmsCall(10, 2.25)).equals(baseSimpleName + "::DefaultParms(int, double)")) throw new RuntimeException("failed");
if (myBase instanceof JavaDerived) { // special handling for Java derived classes, there is no way to do this any other way
if (!myCaller.DefaultParmsCall(10).equals(baseSimpleName + "::DefaultParms(int, double)")) throw new RuntimeException("failed");
} else {
@@ -210,7 +210,7 @@ class JavaDerived extends Base
public String DefaultParms(int x)
{
if (director_classes.getPrintDebug()) System.out.println("JavaDerived - DefaultParms(" + x + ")");
- return DefaultParms(x, 1.1/*use C++ default here*/);
+ return DefaultParms(x, 1.125/*use C++ default here*/);
}
}
diff --git a/Examples/test-suite/php/director_classes_runme.php b/Examples/test-suite/php/director_classes_runme.php
index 170e10f26..c25d85d17 100644
--- a/Examples/test-suite/php/director_classes_runme.php
+++ b/Examples/test-suite/php/director_classes_runme.php
@@ -31,7 +31,7 @@ if (PHP_MAJOR_VERSION < 8) {
$rv = preg_replace('/Base/', 'PHPDerived', $rv);
return $rv;
}
- function DefaultParms($x, $y = 1.1) {
+ function DefaultParms($x, $y = 1.125) {
$rv = parent::DefaultParms($x, $y);
$rv = preg_replace('/Base/', 'PHPDerived', $rv);
return $rv;
--
2.43.0

View File

@ -19,12 +19,7 @@
%{!?tcl:%global tcl 1}
%{!?lualang:%global lualang 1}
%{!?perllang:%global perllang 1}
# https://github.com/swig/swig/issues/2490
%ifarch i686
%{!?phplang:%global phplang 0}
%else
%{!?phplang:%global phplang 1}
%endif
%{!?rubylang:%global rubylang 1}
%{!?python3lang:%global python3lang 1}
# OCaml packages not built on i686 since OCaml 5 / Fedora 39.
@ -63,7 +58,7 @@
Summary: Connects C/C++/Objective C to some high-level programming languages
Name: swig
Version: 4.1.1
Release: 12%{?dist}
Release: 13%{?dist}
License: GPL-3.0-or-later AND BSD-3-Clause
URL: https://www.swig.org/
Source0: http://downloads.sourceforge.net/project/swig/swig/swig-%{version}/swig-%{version}.tar.gz
@ -85,6 +80,8 @@ Patch2: swig-ocaml-5.0.patch
Patch3: swig-python-3.12.patch
# Fix a test that is broken with PHP 8.3
Patch4: swig-PHP-Fix-testcase-director_finalizer-with-PHP-8.3.patch
# Fix director_classes testcase failures on x86
Patch5: swig-PHP-Fix-director_classes-testcase-failures-on-x86.patch
BuildRequires: coreutils
BuildRequires: findutils
@ -368,7 +365,10 @@ install -pm 644 Tools/swig.gdb %{buildroot}%{_datadir}/%{name}/gdb
%{_datadir}/%{name}/gdb
%changelog
* Fri Oct 20 2023 Jitka Plesnikova <jplesnik@redhat.com> - 4.1.1-11
* Thu Dec 07 2023 Jitka Plesnikova <jplesnik@redhat.com> - 4.1.1-13
- Fix PHP director_classes testcase failures on x86
* Fri Oct 20 2023 Jitka Plesnikova <jplesnik@redhat.com> - 4.1.1-12
- Stop using Python's 2to3
* Wed Oct 11 2023 Jitka Plesnikova <jplesnik@redhat.com> - 4.1.1-11