mirror of https://github.com/swig/swig
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
|
@ -5,3 +5,6 @@ See the RELEASENOTES file for a summary of changes in each release.
|
|||
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 \
|
||||
empty \
|
||||
enums \
|
||||
enum_forward \
|
||||
extern_declaration \
|
||||
funcptr \
|
||||
function_typedef \
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
%}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
(void) n;
|
||||
if (GetFlag(n, "enumMissing"))
|
||||
enumDeclaration(n); // Generate an empty enum in target language
|
||||
return SWIG_OK;
|
||||
}
|
||||
|
||||
|
@ -3156,7 +3158,9 @@ Node *Language::enumLookup(SwigType *s) {
|
|||
n = Swig_symbol_clookup(base, stab);
|
||||
if (!n)
|
||||
break;
|
||||
if (Strcmp(nodeType(n), "enum") == 0)
|
||||
if (Equal(nodeType(n), "enum"))
|
||||
break;
|
||||
if (Equal(nodeType(n), "enumforward") && GetFlag(n, "enumMissing"))
|
||||
break;
|
||||
n = parentNode(n);
|
||||
if (!n)
|
||||
|
|
|
@ -886,7 +886,22 @@ class TypePass:private Dispatcher {
|
|||
|
||||
// Use enumDeclaration() to do all the hard work.
|
||||
// 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
|
||||
|
|
Loading…
Reference in New Issue