Fix C enum forward declarations in some target languages (notably Java)
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@13030 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
d6cef9337f
commit
73b0431fbc
8 changed files with 119 additions and 2 deletions
|
|
@ -5,3 +5,6 @@ See the RELEASENOTES file for a summary of changes in each release.
|
||||||
Version 2.0.7 (in progress)
|
Version 2.0.7 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2012-05-01: wsfulton
|
||||||
|
Fix generated code for C forward enum declarations in some languages.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -495,6 +495,7 @@ C_TEST_CASES += \
|
||||||
constant_expr \
|
constant_expr \
|
||||||
empty \
|
empty \
|
||||||
enums \
|
enums \
|
||||||
|
enum_forward \
|
||||||
extern_declaration \
|
extern_declaration \
|
||||||
funcptr \
|
funcptr \
|
||||||
function_typedef \
|
function_typedef \
|
||||||
|
|
|
||||||
16
Examples/test-suite/csharp/enum_forward_runme.cs
Normal file
16
Examples/test-suite/csharp/enum_forward_runme.cs
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System;
|
||||||
|
using enum_forwardNamespace;
|
||||||
|
|
||||||
|
public class runme {
|
||||||
|
static void Main() {
|
||||||
|
ForwardEnum1 f1 = enum_forward.get_enum1();
|
||||||
|
f1 = enum_forward.test_function1(f1);
|
||||||
|
|
||||||
|
ForwardEnum2 f2 = enum_forward.get_enum2();
|
||||||
|
f2 = enum_forward.test_function2(f2);
|
||||||
|
|
||||||
|
ForwardEnum3 f3 = enum_forward.get_enum3();
|
||||||
|
f3 = enum_forward.test_function3(f3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
35
Examples/test-suite/enum_forward.i
Normal file
35
Examples/test-suite/enum_forward.i
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
%module enum_forward
|
||||||
|
|
||||||
|
%{
|
||||||
|
enum ForwardEnum1 { AAA, BBB };
|
||||||
|
enum ForwardEnum2 { CCC, DDD };
|
||||||
|
%}
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
enum ForwardEnum1;
|
||||||
|
enum ForwardEnum1 get_enum1() { return AAA; }
|
||||||
|
enum ForwardEnum1 test_function1(enum ForwardEnum1 e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
enum ForwardEnum2;
|
||||||
|
enum ForwardEnum2;
|
||||||
|
enum ForwardEnum2 get_enum2() { return CCC; }
|
||||||
|
enum ForwardEnum2 test_function2(enum ForwardEnum2 e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
enum ForwardEnum2;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
enum ForwardEnum3;
|
||||||
|
enum ForwardEnum3 { EEE, FFF };
|
||||||
|
enum ForwardEnum3 get_enum3() { return EEE; }
|
||||||
|
enum ForwardEnum3 test_function3(enum ForwardEnum3 e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
enum ForwardEnum3;
|
||||||
|
%}
|
||||||
|
|
||||||
33
Examples/test-suite/java/enum_forward_runme.java
Normal file
33
Examples/test-suite/java/enum_forward_runme.java
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
|
||||||
|
import enum_forward.*;
|
||||||
|
|
||||||
|
public class enum_forward_runme {
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
System.loadLibrary("enum_forward");
|
||||||
|
} catch (UnsatisfiedLinkError e) {
|
||||||
|
System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String argv[])
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
ForwardEnum1 f1 = enum_forward.get_enum1();
|
||||||
|
f1 = enum_forward.test_function1(f1);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
ForwardEnum2 f2 = enum_forward.get_enum2();
|
||||||
|
f2 = enum_forward.test_function2(f2);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ForwardEnum3 f3 = enum_forward.get_enum3();
|
||||||
|
f3 = enum_forward.test_function3(f3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
10
Examples/test-suite/python/enum_forward_runme.py
Normal file
10
Examples/test-suite/python/enum_forward_runme.py
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
import enum_forward
|
||||||
|
|
||||||
|
f1 = enum_forward.get_enum1();
|
||||||
|
f1 = enum_forward.test_function1(f1);
|
||||||
|
|
||||||
|
f2 = enum_forward.get_enum2();
|
||||||
|
f2 = enum_forward.test_function2(f2);
|
||||||
|
|
||||||
|
f3 = enum_forward.get_enum3();
|
||||||
|
f3 = enum_forward.test_function3(f3);
|
||||||
|
|
@ -1664,6 +1664,8 @@ int Language::enumvalueDeclaration(Node *n) {
|
||||||
|
|
||||||
int Language::enumforwardDeclaration(Node *n) {
|
int Language::enumforwardDeclaration(Node *n) {
|
||||||
(void) n;
|
(void) n;
|
||||||
|
if (GetFlag(n, "enumMissing"))
|
||||||
|
enumDeclaration(n); // Generate an empty enum in target language
|
||||||
return SWIG_OK;
|
return SWIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3156,7 +3158,9 @@ Node *Language::enumLookup(SwigType *s) {
|
||||||
n = Swig_symbol_clookup(base, stab);
|
n = Swig_symbol_clookup(base, stab);
|
||||||
if (!n)
|
if (!n)
|
||||||
break;
|
break;
|
||||||
if (Strcmp(nodeType(n), "enum") == 0)
|
if (Equal(nodeType(n), "enum"))
|
||||||
|
break;
|
||||||
|
if (Equal(nodeType(n), "enumforward") && GetFlag(n, "enumMissing"))
|
||||||
break;
|
break;
|
||||||
n = parentNode(n);
|
n = parentNode(n);
|
||||||
if (!n)
|
if (!n)
|
||||||
|
|
|
||||||
|
|
@ -886,7 +886,22 @@ class TypePass:private Dispatcher {
|
||||||
|
|
||||||
// Use enumDeclaration() to do all the hard work.
|
// Use enumDeclaration() to do all the hard work.
|
||||||
// Note that no children can be emitted in a forward declaration as there aren't any.
|
// Note that no children can be emitted in a forward declaration as there aren't any.
|
||||||
return enumDeclaration(n);
|
int result = enumDeclaration(n);
|
||||||
|
if (result == SWIG_OK) {
|
||||||
|
// Detect when the real enum matching the forward enum declaration has not been parsed/declared
|
||||||
|
SwigType *ty = SwigType_typedef_resolve_all(Getattr(n, "type"));
|
||||||
|
Replaceall(ty, "enum ", "");
|
||||||
|
Node *nn = Swig_symbol_clookup(ty, 0);
|
||||||
|
|
||||||
|
String *nodetype = nn ? nodeType(nn) : 0;
|
||||||
|
if (nodetype) {
|
||||||
|
if (Equal(nodetype, "enumforward")) {
|
||||||
|
SetFlag(nn, "enumMissing");
|
||||||
|
} // if a real enum was declared this would be an "enum" node type
|
||||||
|
}
|
||||||
|
Delete(ty);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_OVERLOADED
|
#ifdef DEBUG_OVERLOADED
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue