summaryrefslogtreecommitdiff
path: root/giscanner
diff options
context:
space:
mode:
Diffstat (limited to 'giscanner')
-rw-r--r--giscanner/gdumpparser.py32
-rw-r--r--giscanner/giscannermodule.c3
-rw-r--r--giscanner/scannerparser.y6
-rw-r--r--giscanner/sourcescanner.h2
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;