diff --git a/giscanner/scannerlexer.l b/giscanner/scannerlexer.l index 8ff6b7be..a783ec06 100644 --- a/giscanner/scannerlexer.l +++ b/giscanner/scannerlexer.l @@ -147,7 +147,9 @@ stringtext ([^\\\"])|(\\.) "__typeof" { if (!parse_ignored_macro()) REJECT; } "_Bool" { return BOOL; } -[a-zA-Z_][a-zA-Z_0-9]* { if (scanner->macro_scan) return IDENTIFIER; else REJECT; } +"G_GINT64_CONSTANT" { return INTL_CONST; } +"G_GUINT64_CONSTANT" { return INTUL_CONST; } +[a-zA-Z_][a-zA-Z_0-9]* { if (scanner->macro_scan) return check_identifier(scanner, yytext); else REJECT; } "asm" { if (!parse_ignored_macro()) REJECT; } "auto" { return AUTO; } diff --git a/giscanner/scannerparser.y b/giscanner/scannerparser.y index 48e3c132..06a10efa 100644 --- a/giscanner/scannerparser.y +++ b/giscanner/scannerparser.y @@ -150,6 +150,7 @@ out: %token INTEGER FLOATING CHARACTER STRING +%token INTL_CONST INTUL_CONST %token ELLIPSIS ADDEQ SUBEQ MULEQ DIVEQ MODEQ XOREQ ANDEQ OREQ SL SR %token SLEQ SREQ EQ NOTEQ LTEQ GTEQ ANDAND OROR PLUSPLUS MINUSMINUS ARROW @@ -377,6 +378,20 @@ unary_expression break; } } + | INTL_CONST '(' unary_expression ')' + { + $$ = $3; + if ($$->const_int_set) { + $$->base_type = gi_source_basic_type_new ("gint64"); + } + } + | INTUL_CONST '(' unary_expression ')' + { + $$ = $3; + if ($$->const_int_set) { + $$->base_type = gi_source_basic_type_new ("guint64"); + } + } | SIZEOF unary_expression { $$ = gi_source_symbol_new (CSYMBOL_TYPE_INVALID, scanner->current_filename, lineno); @@ -419,8 +434,12 @@ cast_expression : unary_expression | '(' type_name ')' cast_expression { - ctype_free ($2); $$ = $4; + if ($$->const_int_set || $$->const_double_set || $$->const_string != NULL) { + $$->base_type = $2; + } else { + ctype_free ($2); + } } ; @@ -588,7 +607,7 @@ logical_or_expression conditional_expression : logical_or_expression - | logical_or_expression '?' expression ':' conditional_expression + | logical_or_expression '?' expression ':' expression { $$ = gi_source_symbol_get_const_boolean ($1) ? $3 : $5; } diff --git a/giscanner/transformer.py b/giscanner/transformer.py index d6320d84..26c7793b 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -719,7 +719,10 @@ def _create_const(self, symbol): typeval = ast.TYPE_STRING value = unicode(symbol.const_string, 'utf-8') elif symbol.const_int is not None: - typeval = ast.TYPE_INT + if symbol.base_type is not None: + typeval = self._create_type_from_base(symbol.base_type) + else: + typeval = ast.TYPE_INT value = '%d' % (symbol.const_int, ) elif symbol.const_double is not None: typeval = ast.TYPE_DOUBLE diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir index 37f22250..43258f2a 100644 --- a/tests/scanner/Regress-1.0-expected.gir +++ b/tests/scanner/Regress-1.0-expected.gir @@ -44,6 +44,11 @@ and/or use gtk-doc annotations. --> c:type="REGRESS_DOUBLE_CONSTANT"> + + + diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h index d8db7aa8..0c071f51 100644 --- a/tests/scanner/regress.h +++ b/tests/scanner/regress.h @@ -259,6 +259,7 @@ GQuark regress_atest_error_quark (void); #define REGRESS_DOUBLE_CONSTANT 44.22 #define REGRESS_STRING_CONSTANT "Some String" #define REGRESS_Mixed_Case_Constant 4423 +#define REGRESS_G_GINT64_CONSTANT (G_GINT64_CONSTANT (1000)) /* structures */ typedef struct _RegressTestStructA RegressTestStructA;