Merge branch 'jiulongw-master'

* jiulongw-master:
  Fix go wrapper compilation error
  Fix missing semicolon in golang wrapper
  Fix extra quote escape in golang
  Fix #define error when value contains char in compound expression
  Add more test case for char const expression in enum
  Revert "Add enum test cases with const char in compound expression"
  Add runtime tests for char in compound expression patch
  Add enum test cases with const char in compound expression
  Fix enum error when value contains char in compound expression
This commit is contained in:
William S Fulton 2016-10-23 10:32:48 +01:00
commit f89b8836dd
6 changed files with 82 additions and 42 deletions

View file

@ -405,6 +405,10 @@ public class runme {
if (enum_thorough_typesafe.repeatTest(repeat.llast).swigValue != 3) throw new Exception("repeatTest 5 failed"); if (enum_thorough_typesafe.repeatTest(repeat.llast).swigValue != 3) throw new Exception("repeatTest 5 failed");
if (enum_thorough_typesafe.repeatTest(repeat.end).swigValue != 3) throw new Exception("repeatTest 6 failed"); if (enum_thorough_typesafe.repeatTest(repeat.end).swigValue != 3) throw new Exception("repeatTest 6 failed");
} }
{
if (enum_thorough_typesafe.enumWithMacroTest(enumWithMacro.ABCD).swigValue != (('A' << 24) | ('B' << 16) | ('C' << 8) | 'D')) throw new Exception("enumWithMacroTest 1 failed");
if (enum_thorough_typesafe.enumWithMacroTest(enumWithMacro.ABCD2).swigValue != enum_thorough_typesafe.enumWithMacroTest(enumWithMacro.ABCD).swigValue) throw new Exception("enumWithMacroTest 2 failed");
}
// different types // different types
{ {
if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typeint).swigValue != 10) throw new Exception("differentTypes 1 failed"); if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typeint).swigValue != 10) throw new Exception("differentTypes 1 failed");
@ -413,6 +417,8 @@ public class runme {
if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typeboolfalse).swigValue != 0) throw new Exception("differentTypes 4 failed"); if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typeboolfalse).swigValue != 0) throw new Exception("differentTypes 4 failed");
if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typechar).swigValue != (int)'C') throw new Exception("differentTypes 5 failed"); if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typechar).swigValue != (int)'C') throw new Exception("differentTypes 5 failed");
if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typedefaultint).swigValue != (int)'D') throw new Exception("differentTypes 6 failed"); if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typedefaultint).swigValue != (int)'D') throw new Exception("differentTypes 6 failed");
if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typecharcompound).swigValue != (int)'A' + 1) throw new Exception("differentTypes 7 failed");
if (enum_thorough_typesafe.differentTypesTest(DifferentTypes.typecharcompound2).swigValue != (int)'B' << 2) throw new Exception("differentTypes 8 failed");
int global_enum = enum_thorough_typesafe.global_typeint; int global_enum = enum_thorough_typesafe.global_typeint;
if (enum_thorough_typesafe.globalDifferentTypesTest(global_enum) != 10) throw new Exception("global differentTypes 1 failed"); if (enum_thorough_typesafe.globalDifferentTypesTest(global_enum) != 10) throw new Exception("global differentTypes 1 failed");
@ -426,6 +432,10 @@ public class runme {
if (enum_thorough_typesafe.globalDifferentTypesTest(global_enum) != 'C') throw new Exception("global differentTypes 5 failed"); if (enum_thorough_typesafe.globalDifferentTypesTest(global_enum) != 'C') throw new Exception("global differentTypes 5 failed");
global_enum = enum_thorough_typesafe.global_typedefaultint; global_enum = enum_thorough_typesafe.global_typedefaultint;
if (enum_thorough_typesafe.globalDifferentTypesTest(global_enum) != 'D') throw new Exception("global differentTypes 6 failed"); if (enum_thorough_typesafe.globalDifferentTypesTest(global_enum) != 'D') throw new Exception("global differentTypes 6 failed");
global_enum = enum_thorough_typesafe.global_typecharcompound;
if (enum_thorough_typesafe.globalDifferentTypesTest(global_enum) != (int)'A' + 1) throw new Exception("global differentTypes 7 failed");
global_enum = enum_thorough_typesafe.global_typecharcompound2;
if (enum_thorough_typesafe.globalDifferentTypesTest(global_enum) != (int)'B' << 2) throw new Exception("global differentTypes 8 failed");
} }
} }
} }

View file

@ -569,6 +569,17 @@ repeat repeatTest(repeat e) { return e; }
} }
%} %}
%inline %{
namespace EnumWithMacro {
#define PACK(C1,C2,C3,C4) ((C1<<24)|(C2<<16)|(C3<<8)|C4)
typedef enum {
ABCD = PACK('A','B','C','D'),
ABCD2 = ABCD
} enumWithMacro;
enumWithMacro enumWithMacroTest(enumWithMacro e) { return e; }
}
%}
%inline %{ %inline %{
namespace DifferentSpace { namespace DifferentSpace {
enum DifferentTypes { enum DifferentTypes {
@ -577,7 +588,9 @@ enum DifferentTypes {
typebooltrue = true, typebooltrue = true,
typebooltwo, typebooltwo,
typechar = 'C', typechar = 'C',
typedefaultint typedefaultint,
typecharcompound='A'+1,
typecharcompound2='B' << 2
}; };
DifferentTypes differentTypesTest(DifferentTypes n) { return n; } DifferentTypes differentTypesTest(DifferentTypes n) { return n; }
@ -587,7 +600,9 @@ enum {
global_typebooltrue = true, global_typebooltrue = true,
global_typebooltwo, global_typebooltwo,
global_typechar = 'C', global_typechar = 'C',
global_typedefaultint global_typedefaultint,
global_typecharcompound='A'+1,
global_typecharcompound2='B' << 2
}; };
int globalDifferentTypesTest(int n) { return n; } int globalDifferentTypesTest(int n) { return n; }
} }

View file

@ -51,7 +51,7 @@
// Expressions - runtime tests check the type for any necessary type promotions of the expressions // Expressions - runtime tests check the type for any necessary type promotions of the expressions
#define INT_AND_BOOL 0xFF & true #define INT_AND_BOOL 0xFF & true
//#define INT_AND_CHAR 0xFF & 'A' /* FIXME compile error */ #define INT_AND_CHAR 0xFF & 'A'
#define INT_AND_INT 0xFF & 2 #define INT_AND_INT 0xFF & 2
#define INT_AND_UINT 0xFF & 2u #define INT_AND_UINT 0xFF & 2u
#define INT_AND_LONG 0xFF & 2l #define INT_AND_LONG 0xFF & 2l
@ -60,8 +60,7 @@
#define INT_AND_ULLONG 0xFF & 2ull #define INT_AND_ULLONG 0xFF & 2ull
#define BOOL_AND_BOOL true & true // Note integral promotion to type int #define BOOL_AND_BOOL true & true // Note integral promotion to type int
//#define CHAR_AND_CHAR 'A' & 'B' // Note integral promotion to type int #define CHAR_AND_CHAR 'A' & 'B' // Note integral promotion to type int
/* FIXME ABOVE */
#define EXPR_MULTIPLY 0xFF * 2 #define EXPR_MULTIPLY 0xFF * 2
@ -88,6 +87,9 @@
#define EXPR_LOR 0xFF || 1 #define EXPR_LOR 0xFF || 1
#define EXPR_CONDITIONAL true ? 2 : 2.2 #define EXPR_CONDITIONAL true ? 2 : 2.2
#define EXPR_CHAR_COMPOUND_ADD 'A' + 12
#define EXPR_CHAR_COMPOUND_LSHIFT 'B' << 6
#define H_SUPPRESS_SCALING_MAGIC (('s'<<24) | ('u'<<16) | ('p'<<8) | 'p')
/// constant assignment in enum /// constant assignment in enum
#if defined(SWIGCSHARP) #if defined(SWIGCSHARP)

View file

@ -78,4 +78,7 @@ extern "C" {
#define SWIG_WARN_NODE_END(Node) \ #define SWIG_WARN_NODE_END(Node) \
if (wrnfilter) Swig_warnfilter(wrnfilter,0); \ if (wrnfilter) Swig_warnfilter(wrnfilter,0); \
} }
#define COMPOUND_EXPR_VAL(dtype) \
((dtype).type == T_CHAR || (dtype).type == T_WCHAR ? (dtype).rawval : (dtype).val)
#endif #endif

View file

@ -5828,7 +5828,7 @@ definetype : { /* scanner_check_typedef(); */ } expr {
if ($$.type == T_STRING) { if ($$.type == T_STRING) {
$$.rawval = NewStringf("\"%(escape)s\"",$$.val); $$.rawval = NewStringf("\"%(escape)s\"",$$.val);
} else if ($$.type != T_CHAR && $$.type != T_WSTRING && $$.type != T_WCHAR) { } else if ($$.type != T_CHAR && $$.type != T_WSTRING && $$.type != T_WCHAR) {
$$.rawval = 0; $$.rawval = NewStringf("%s", $$.val);
} }
$$.qualifier = 0; $$.qualifier = 0;
$$.bitfield = 0; $$.bitfield = 0;
@ -6095,81 +6095,81 @@ exprnum : NUM_INT { $$ = $1; }
; ;
exprcompound : expr PLUS expr { exprcompound : expr PLUS expr {
$$.val = NewStringf("%s+%s",$1.val,$3.val); $$.val = NewStringf("%s+%s", COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote($1.type,$3.type); $$.type = promote($1.type,$3.type);
} }
| expr MINUS expr { | expr MINUS expr {
$$.val = NewStringf("%s-%s",$1.val,$3.val); $$.val = NewStringf("%s-%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote($1.type,$3.type); $$.type = promote($1.type,$3.type);
} }
| expr STAR expr { | expr STAR expr {
$$.val = NewStringf("%s*%s",$1.val,$3.val); $$.val = NewStringf("%s*%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote($1.type,$3.type); $$.type = promote($1.type,$3.type);
} }
| expr SLASH expr { | expr SLASH expr {
$$.val = NewStringf("%s/%s",$1.val,$3.val); $$.val = NewStringf("%s/%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote($1.type,$3.type); $$.type = promote($1.type,$3.type);
} }
| expr MODULO expr { | expr MODULO expr {
$$.val = NewStringf("%s%%%s",$1.val,$3.val); $$.val = NewStringf("%s%%%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote($1.type,$3.type); $$.type = promote($1.type,$3.type);
} }
| expr AND expr { | expr AND expr {
$$.val = NewStringf("%s&%s",$1.val,$3.val); $$.val = NewStringf("%s&%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote($1.type,$3.type); $$.type = promote($1.type,$3.type);
} }
| expr OR expr { | expr OR expr {
$$.val = NewStringf("%s|%s",$1.val,$3.val); $$.val = NewStringf("%s|%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote($1.type,$3.type); $$.type = promote($1.type,$3.type);
} }
| expr XOR expr { | expr XOR expr {
$$.val = NewStringf("%s^%s",$1.val,$3.val); $$.val = NewStringf("%s^%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote($1.type,$3.type); $$.type = promote($1.type,$3.type);
} }
| expr LSHIFT expr { | expr LSHIFT expr {
$$.val = NewStringf("%s << %s",$1.val,$3.val); $$.val = NewStringf("%s << %s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote_type($1.type); $$.type = promote_type($1.type);
} }
| expr RSHIFT expr { | expr RSHIFT expr {
$$.val = NewStringf("%s >> %s",$1.val,$3.val); $$.val = NewStringf("%s >> %s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = promote_type($1.type); $$.type = promote_type($1.type);
} }
| expr LAND expr { | expr LAND expr {
$$.val = NewStringf("%s&&%s",$1.val,$3.val); $$.val = NewStringf("%s&&%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = cparse_cplusplus ? T_BOOL : T_INT; $$.type = cparse_cplusplus ? T_BOOL : T_INT;
} }
| expr LOR expr { | expr LOR expr {
$$.val = NewStringf("%s||%s",$1.val,$3.val); $$.val = NewStringf("%s||%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = cparse_cplusplus ? T_BOOL : T_INT; $$.type = cparse_cplusplus ? T_BOOL : T_INT;
} }
| expr EQUALTO expr { | expr EQUALTO expr {
$$.val = NewStringf("%s==%s",$1.val,$3.val); $$.val = NewStringf("%s==%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = cparse_cplusplus ? T_BOOL : T_INT; $$.type = cparse_cplusplus ? T_BOOL : T_INT;
} }
| expr NOTEQUALTO expr { | expr NOTEQUALTO expr {
$$.val = NewStringf("%s!=%s",$1.val,$3.val); $$.val = NewStringf("%s!=%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3));
$$.type = cparse_cplusplus ? T_BOOL : T_INT; $$.type = cparse_cplusplus ? T_BOOL : T_INT;
} }
/* Sadly this causes 2 reduce-reduce conflicts with templates. FIXME resolve these. /* Sadly this causes 2 reduce-reduce conflicts with templates. FIXME resolve these.
| expr GREATERTHAN expr { | expr GREATERTHAN expr {
$$.val = NewStringf("%s > %s", $1.val, $3.val); $$.val = NewStringf("%s > %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3));
$$.type = cparse_cplusplus ? T_BOOL : T_INT; $$.type = cparse_cplusplus ? T_BOOL : T_INT;
} }
| expr LESSTHAN expr { | expr LESSTHAN expr {
$$.val = NewStringf("%s < %s", $1.val, $3.val); $$.val = NewStringf("%s < %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3));
$$.type = cparse_cplusplus ? T_BOOL : T_INT; $$.type = cparse_cplusplus ? T_BOOL : T_INT;
} }
*/ */
| expr GREATERTHANOREQUALTO expr { | expr GREATERTHANOREQUALTO expr {
$$.val = NewStringf("%s >= %s", $1.val, $3.val); $$.val = NewStringf("%s >= %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3));
$$.type = cparse_cplusplus ? T_BOOL : T_INT; $$.type = cparse_cplusplus ? T_BOOL : T_INT;
} }
| expr LESSTHANOREQUALTO expr { | expr LESSTHANOREQUALTO expr {
$$.val = NewStringf("%s <= %s", $1.val, $3.val); $$.val = NewStringf("%s <= %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3));
$$.type = cparse_cplusplus ? T_BOOL : T_INT; $$.type = cparse_cplusplus ? T_BOOL : T_INT;
} }
| expr QUESTIONMARK expr COLON expr %prec QUESTIONMARK { | expr QUESTIONMARK expr COLON expr %prec QUESTIONMARK {
$$.val = NewStringf("%s?%s:%s", $1.val, $3.val, $5.val); $$.val = NewStringf("%s?%s:%s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3), COMPOUND_EXPR_VAL($5));
/* This may not be exactly right, but is probably good enough /* This may not be exactly right, but is probably good enough
* for the purposes of parsing constant expressions. */ * for the purposes of parsing constant expressions. */
$$.type = promote($3.type, $5.type); $$.type = promote($3.type, $5.type);
@ -6187,7 +6187,7 @@ exprcompound : expr PLUS expr {
$$.type = $2.type; $$.type = $2.type;
} }
| LNOT expr { | LNOT expr {
$$.val = NewStringf("!%s",$2.val); $$.val = NewStringf("!%s",COMPOUND_EXPR_VAL($2));
$$.type = T_INT; $$.type = T_INT;
} }
| type LPAREN { | type LPAREN {

View file

@ -2809,29 +2809,39 @@ private:
String *get = NewString(""); String *get = NewString("");
Printv(get, Swig_cresult_name(), " = ", NULL); Printv(get, Swig_cresult_name(), " = ", NULL);
char quote; String *rawval = Getattr(n, "rawval");
if (Getattr(n, "wrappedasconstant")) { if (rawval && Len(rawval)) {
quote = '\0'; if (SwigType_type(type) == T_STRING) {
} else if (SwigType_type(type) == T_CHAR) { Printv(get, "(char *)", NULL);
quote = '\''; }
} else if (SwigType_type(type) == T_STRING) {
Printv(get, "(char *)", NULL); Printv(get, rawval, NULL);
quote = '"';
} else { } else {
quote = '\0'; char quote;
} if (Getattr(n, "wrappedasconstant")) {
quote = '\0';
} else if (SwigType_type(type) == T_CHAR) {
quote = '\'';
} else if (SwigType_type(type) == T_STRING) {
Printv(get, "(char *)", NULL);
quote = '"';
} else {
quote = '\0';
}
if (quote != '\0') { if (quote != '\0') {
Printf(get, "%c", quote); Printf(get, "%c", quote);
} }
Printv(get, Getattr(n, "value"), NULL); Printv(get, Getattr(n, "value"), NULL);
if (quote != '\0') { if (quote != '\0') {
Printf(get, "%c", quote); Printf(get, "%c", quote);
}
} }
Printv(get, ";\n", NULL); Printv(get, ";\n", NULL);
Setattr(n, "wrap:action", get); Setattr(n, "wrap:action", get);
String *sname = Copy(symname); String *sname = Copy(symname);