mirror of https://github.com/swig/swig
[Java] Fix regression wrapping enum values
Fix regression wrapping enum values which don't fit in a Java signed int. Fixes #3070
This commit is contained in:
parent
d9edb22d1c
commit
dfe9d8ea2f
|
@ -7,6 +7,10 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
||||||
Version 4.4.0 (in progress)
|
Version 4.4.0 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2024-11-21: olly
|
||||||
|
[Java] #3070 Fix regression wrapping enum values which don't fit
|
||||||
|
in a Java signed int.
|
||||||
|
|
||||||
2024-11-09: wsfulton
|
2024-11-09: wsfulton
|
||||||
#3064 Perform repeated typedef lookups instead of a single typedef
|
#3064 Perform repeated typedef lookups instead of a single typedef
|
||||||
lookup on the type being applied in %apply when looking for a family
|
lookup on the type being applied in %apply when looking for a family
|
||||||
|
|
|
@ -578,6 +578,14 @@ enumWithMacro enumWithMacroTest(enumWithMacro e) { return e; }
|
||||||
}
|
}
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
#ifdef SWIGCSHARP
|
||||||
|
// It seems these never worked for SWIG/C#.
|
||||||
|
%ignore global_typeunsigned1;
|
||||||
|
%ignore global_typeunsigned2;
|
||||||
|
%ignore global_typeunsigned3;
|
||||||
|
%ignore global_typeunsigned4;
|
||||||
|
#endif
|
||||||
|
|
||||||
%inline %{
|
%inline %{
|
||||||
namespace DifferentSpace {
|
namespace DifferentSpace {
|
||||||
enum DifferentTypes {
|
enum DifferentTypes {
|
||||||
|
@ -600,7 +608,13 @@ enum {
|
||||||
global_typechar = 'C',
|
global_typechar = 'C',
|
||||||
global_typedefaultint,
|
global_typedefaultint,
|
||||||
global_typecharcompound='A'+1,
|
global_typecharcompound='A'+1,
|
||||||
global_typecharcompound2='B' << 2
|
global_typecharcompound2='B' << 2,
|
||||||
|
// Regression tests for #3070 affecting SWIG/Java, introduced in 4.3.0:
|
||||||
|
global_typeunsigned1 = 0x80000000,
|
||||||
|
global_typeunsigned2 = 0xffffffff,
|
||||||
|
// These should also work in > 4.3.0.
|
||||||
|
global_typeunsigned3 = 2147483648,
|
||||||
|
global_typeunsigned4 = 4294967295
|
||||||
};
|
};
|
||||||
int globalDifferentTypesTest(int n) { return n; }
|
int globalDifferentTypesTest(int n) { return n; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1424,7 +1424,25 @@ public:
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
String *numval = Getattr(n, "enumnumval");
|
String *numval = Getattr(n, "enumnumval");
|
||||||
if (numval) Setattr(n, "enumvalue", numval);
|
if (numval) {
|
||||||
|
const char *p = Char(numval);
|
||||||
|
if (isdigit(p[0])) {
|
||||||
|
char *e;
|
||||||
|
unsigned long long value = strtoull(p, &e, 0);
|
||||||
|
if (errno != ERANGE && *e == '\0' && value >= 0x80000000) {
|
||||||
|
// Use hex for larger unsigned integer constants in Java code since
|
||||||
|
// Java allows implicit conversion to a signed integer value.
|
||||||
|
String *hexval = NewStringf("0x%llx", value);
|
||||||
|
Setattr(n, "enumvalue", hexval);
|
||||||
|
Delete(hexval);
|
||||||
|
} else {
|
||||||
|
Setattr(n, "enumvalue", numval);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Emit negative values as-is.
|
||||||
|
Setattr(n, "enumvalue", numval);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue