[gobject-introspection] giscanner: special case G_GINT64_CONSTANT and G_GUINT64_CONSTANT + misc



commit beb5c820139693c85f4e5277a7c430dd6042fbcb
Author: Alban Browaeys <prahal yahoo com>
Date:   Thu Jun 28 18:34:02 2012 +0200

    giscanner: special case G_GINT64_CONSTANT and G_GUINT64_CONSTANT + misc
    
    This let the macro expands to its value as gint64/guint64.
    
    Also
    - fix lexer identifier/typdef detection for macro and misc
    
    - do not discard cast

 giscanner/scannerlexer.l               |    4 +++-
 giscanner/scannerparser.y              |   23 +++++++++++++++++++++--
 giscanner/transformer.py               |    5 ++++-
 tests/scanner/Regress-1.0-expected.gir |    5 +++++
 tests/scanner/regress.h                |    1 +
 5 files changed, 34 insertions(+), 4 deletions(-)
---
diff --git a/giscanner/scannerlexer.l b/giscanner/scannerlexer.l
index 8ff6b7b..a783ec0 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 48e3c13..06a10ef 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 d6320d8..26c7793 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -719,7 +719,10 @@ raise ValueError."""
             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 37f2225..43258f2 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">
       <type name="gdouble" c:type="gdouble"/>
     </constant>
+    <constant name="G_GINT64_CONSTANT"
+              value="1000"
+              c:type="REGRESS_G_GINT64_CONSTANT">
+      <type name="gint64" c:type="gint64"/>
+    </constant>
     <constant name="INT_CONSTANT" value="4422" c:type="REGRESS_INT_CONSTANT">
       <type name="gint" c:type="gint"/>
     </constant>
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index d8db7aa..0c071f5 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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]