diff options
-rw-r--r-- | giscanner/giscannermodule.c | 5 | ||||
-rw-r--r-- | giscanner/scannerparser.y | 14 | ||||
-rw-r--r-- | giscanner/sourcescanner.h | 1 | ||||
-rw-r--r-- | tests/scanner/Regress-1.0-expected.gir | 15 | ||||
-rw-r--r-- | tests/scanner/regress.h | 5 |
5 files changed, 34 insertions, 6 deletions
diff --git a/giscanner/giscannermodule.c b/giscanner/giscannermodule.c index 0da20f18..4a854413 100644 --- a/giscanner/giscannermodule.c +++ b/giscanner/giscannermodule.c @@ -162,7 +162,10 @@ symbol_get_const_int (PyGISourceSymbol *self, return Py_None; } - return PyLong_FromLongLong ((long long)self->symbol->const_int); + if (self->symbol->const_int_is_unsigned) + return PyLong_FromUnsignedLongLong ((unsigned long long)self->symbol->const_int); + else + return PyLong_FromLongLong ((long long)self->symbol->const_int); } static PyObject * diff --git a/giscanner/scannerparser.y b/giscanner/scannerparser.y index 06a10efa..cc495cc3 100644 --- a/giscanner/scannerparser.y +++ b/giscanner/scannerparser.y @@ -1,4 +1,4 @@ -/* GObject introspection: C parser +/* GObject introspection: C parser -*- indent-tabs-mode: t; tab-width: 8 -*- * * Copyright (c) 1997 Sandro Sigala <ssigala@globalnet.it> * Copyright (c) 2007-2008 Jürg Billeter <j@bitron.ch> @@ -232,15 +232,19 @@ primary_expression } | INTEGER { + char *rest; + guint64 value; $$ = gi_source_symbol_new (CSYMBOL_TYPE_CONST, scanner->current_filename, lineno); $$->const_int_set = TRUE; if (g_str_has_prefix (yytext, "0x") && strlen (yytext) > 2) { - $$->const_int = g_ascii_strtoll (yytext + 2, NULL, 16); + value = g_ascii_strtoull (yytext + 2, &rest, 16); } else if (g_str_has_prefix (yytext, "0") && strlen (yytext) > 1) { - $$->const_int = g_ascii_strtoll (yytext + 1, NULL, 8); + value = g_ascii_strtoull (yytext + 1, &rest, 8); } else { - $$->const_int = g_ascii_strtoll (yytext, NULL, 10); + value = g_ascii_strtoull (yytext, &rest, 10); } + $$->const_int = value; + $$->const_int_is_unsigned = (rest && (rest[0] == 'U')); } | CHARACTER { @@ -382,7 +386,7 @@ unary_expression { $$ = $3; if ($$->const_int_set) { - $$->base_type = gi_source_basic_type_new ("gint64"); + $$->base_type = gi_source_basic_type_new ($$->const_int_is_unsigned ? "guint64" : "gint64"); } } | INTUL_CONST '(' unary_expression ')' diff --git a/giscanner/sourcescanner.h b/giscanner/sourcescanner.h index df16cf6a..a2834caf 100644 --- a/giscanner/sourcescanner.h +++ b/giscanner/sourcescanner.h @@ -126,6 +126,7 @@ struct _GISourceSymbol gboolean const_int_set; gboolean private; gint64 const_int; /* 64-bit we can handle signed and unsigned 32-bit values */ + gboolean const_int_is_unsigned; char *const_string; gboolean const_double_set; double const_double; diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir index 8d123f7a..1adc5caf 100644 --- a/tests/scanner/Regress-1.0-expected.gir +++ b/tests/scanner/Regress-1.0-expected.gir @@ -87,11 +87,26 @@ and/or use gtk-doc annotations. --> <type name="gdouble" c:type="double"/> </field> </record> + <constant name="MAXUINT64" + value="18446744073709551615" + c:type="REGRESS_MAXUINT64"> + <type name="guint64" c:type="guint64"/> + </constant> + <constant name="MININT64" + value="-9223372036854775808" + c:type="REGRESS_MININT64"> + <type name="gint64" c:type="gint64"/> + </constant> <constant name="Mixed_Case_Constant" value="4423" c:type="REGRESS_Mixed_Case_Constant"> <type name="gint" c:type="gint"/> </constant> + <constant name="NEGATIVE_INT_CONSTANT" + value="-42" + c:type="REGRESS_NEGATIVE_INT_CONSTANT"> + <type name="gint" c:type="gint"/> + </constant> <constant name="STRING_CONSTANT" value="Some String" c:type="REGRESS_STRING_CONSTANT"> diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h index 635ea7bd..e1024b04 100644 --- a/tests/scanner/regress.h +++ b/tests/scanner/regress.h @@ -255,6 +255,7 @@ GQuark regress_atest_error_quark (void); /* constants */ +#define REGRESS_NEGATIVE_INT_CONSTANT -42 #define REGRESS_INT_CONSTANT 4422 #define REGRESS_DOUBLE_CONSTANT 44.22 #define REGRESS_STRING_CONSTANT "Some String" @@ -899,4 +900,8 @@ typedef struct { double dummy2; } RegressLikeGnomeKeyringPasswordSchema; +/* https://bugzilla.gnome.org/show_bug.cgi?id=685022 */ +#define REGRESS_MININT64 ((gint64) G_GINT64_CONSTANT(0x8000000000000000)) +#define REGRESS_MAXUINT64 (G_GINT64_CONSTANT(0xffffffffffffffffU)) + #endif /* __GITESTTYPES_H__ */ |