diff options
Diffstat (limited to 'giscanner')
-rw-r--r-- | giscanner/gdumpparser.py | 32 | ||||
-rw-r--r-- | giscanner/giscannermodule.c | 3 | ||||
-rw-r--r-- | giscanner/scannerparser.y | 6 | ||||
-rw-r--r-- | giscanner/sourcescanner.h | 2 |
4 files changed, 31 insertions, 12 deletions
diff --git a/giscanner/gdumpparser.py b/giscanner/gdumpparser.py index 1c6adfe4..2f5feb50 100644 --- a/giscanner/gdumpparser.py +++ b/giscanner/gdumpparser.py @@ -254,13 +254,36 @@ blob containing data gleaned from GObject's primitive introspection.""" raise ValueError("Unhandled introspection XML tag %s", xmlnode.tag) def _introspect_enum(self, xmlnode): + type_name = xmlnode.attrib['name'] + (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode) + try: + enum_name = self._transformer.strip_identifier(type_name) + except TransformerException, e: + message.fatal(e) + + # The scanned member values are more accurate than the values that the + # we dumped from GEnumValue.value because GEnumValue.value has the + # values as a 32-bit signed integer, even if they were unsigned + # in the source code. + previous_values = {} + previous = self._namespace.get(enum_name) + if isinstance(previous, (ast.Enum, ast.Bitfield)): + for member in previous.members: + previous_values[member.name] = member.value + members = [] for member in xmlnode.findall('member'): # Keep the name closer to what we'd take from C by default; # see http://bugzilla.gnome.org/show_bug.cgi?id=575613 name = member.attrib['nick'].replace('-', '_') + + if name in previous_values: + value = previous_values[name] + else: + value = member.attrib['value'] + members.append(ast.Member(name, - member.attrib['value'], + value, member.attrib['name'], member.attrib['nick'])) @@ -269,12 +292,7 @@ blob containing data gleaned from GObject's primitive introspection.""" klass = ast.Bitfield else: klass = ast.Enum - type_name = xmlnode.attrib['name'] - (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode) - try: - enum_name = self._transformer.strip_identifier(type_name) - except TransformerException, e: - message.fatal(e) + node = klass(enum_name, type_name, gtype_name=type_name, c_symbol_prefix=c_symbol_prefix, diff --git a/giscanner/giscannermodule.c b/giscanner/giscannermodule.c index c639e0f2..abea9858 100644 --- a/giscanner/giscannermodule.c +++ b/giscanner/giscannermodule.c @@ -155,7 +155,8 @@ symbol_get_const_int (PyGISourceSymbol *self, Py_INCREF(Py_None); return Py_None; } - return PyInt_FromLong (self->symbol->const_int); + + return PyLong_FromLongLong ((long long)self->symbol->const_int); } static PyObject * diff --git a/giscanner/scannerparser.y b/giscanner/scannerparser.y index 80da1b9b..d32bbcc8 100644 --- a/giscanner/scannerparser.y +++ b/giscanner/scannerparser.y @@ -155,11 +155,11 @@ primary_expression $$ = gi_source_symbol_new (CSYMBOL_TYPE_CONST, lineno); $$->const_int_set = TRUE; if (g_str_has_prefix (yytext, "0x") && strlen (yytext) > 2) { - $$->const_int = strtol (yytext + 2, NULL, 16); + $$->const_int = g_ascii_strtoll (yytext + 2, NULL, 16); } else if (g_str_has_prefix (yytext, "0") && strlen (yytext) > 1) { - $$->const_int = strtol (yytext + 1, NULL, 8); + $$->const_int = g_ascii_strtoll (yytext + 1, NULL, 8); } else { - $$->const_int = atoi (yytext); + $$->const_int = g_ascii_strtoll (yytext, NULL, 10); } } | CHARACTER diff --git a/giscanner/sourcescanner.h b/giscanner/sourcescanner.h index 500d84c3..b67f037b 100644 --- a/giscanner/sourcescanner.h +++ b/giscanner/sourcescanner.h @@ -124,7 +124,7 @@ struct _GISourceSymbol GISourceType *base_type; gboolean const_int_set; gboolean private; - int const_int; + gint64 const_int; /* 64-bit we can handle signed and unsigned 32-bit values */ char *const_string; gboolean const_double_set; double const_double; |