Author: Ronan Lamy <[email protected]>
Branch: rffi-parser-2
Changeset: r89230:16dc5f310fe9
Date: 2016-12-26 15:45 +0100
http://bitbucket.org/pypy/pypy/changeset/16dc5f310fe9/
Log: refactor .configure_types()
diff --git a/pypy/module/cpyext/__init__.py b/pypy/module/cpyext/__init__.py
--- a/pypy/module/cpyext/__init__.py
+++ b/pypy/module/cpyext/__init__.py
@@ -18,7 +18,7 @@
method = pypy.module.cpyext.typeobject.get_new_method_def(space)
w_obj = pypy.module.cpyext.methodobject.W_PyCFunctionObject(space,
method, space.wrap(''))
space.appexec([space.type(w_obj)], """(methodtype):
- from pickle import Pickler
+ from pickle import Pickler
Pickler.dispatch[methodtype] = Pickler.save_global
""")
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -625,7 +625,6 @@
typedef void (*freefunc)(void *);
""")
-h.configure_types()
Py_ssize_t = lltype.Typedef(h.definitions['Py_ssize_t'], 'Py_ssize_t')
Py_ssize_tP = rffi.CArrayPtr(Py_ssize_t)
diff --git a/pypy/module/cpyext/cparser.py b/pypy/module/cpyext/cparser.py
--- a/pypy/module/cpyext/cparser.py
+++ b/pypy/module/cpyext/cparser.py
@@ -675,6 +675,15 @@
except TypeError:
return False
+ def config_fields(self):
+ result = []
+ for name, value in self.fields:
+ if isinstance(value, DelayedStruct):
+ result.append((name, value.TYPE))
+ else:
+ result.append((name, value))
+ return result
+
def __repr__(self):
return "<struct {struct_name}>".format(**vars(self))
@@ -704,7 +713,6 @@
tp = self.convert_type(obj)
if isinstance(tp, DelayedStruct):
tp = self.realize_struct(tp, name)
- self.structs[obj] = tp
self.definitions[name] = tp
def add_macro(self, name, value):
@@ -726,13 +734,22 @@
configname = type_name.replace(' ', '__')
if struct.is_ready():
setattr(self._Config, configname,
- rffi_platform.Struct(type_name, struct.fields))
+ rffi_platform.Struct(type_name, struct.config_fields()))
self._TYPES[configname] = struct.TYPE
else:
cpython_struct(type_name, struct.fields, forward=struct.TYPE)
return struct.TYPE
def configure_types(self):
+ for name, (obj, quals) in self.ctx._declarations.iteritems():
+ if obj in self.ctx._included_declarations:
+ continue
+ if name.startswith('typedef '):
+ name = name[8:]
+ self.add_typedef(name, obj)
+ elif name.startswith('macro '):
+ name = name[6:]
+ self.add_macro(name, obj)
for name, TYPE in rffi_platform.configure(self._Config).iteritems():
if name in self._TYPES:
self._TYPES[name].become(TYPE)
@@ -774,13 +791,5 @@
for header in includes:
src.include(header)
ctx.parse(source)
- for name, (obj, quals) in ctx._declarations.iteritems():
- if obj in ctx._included_declarations:
- continue
- if name.startswith('typedef '):
- name = name[8:]
- src.add_typedef(name, obj)
- elif name.startswith('macro '):
- name = name[6:]
- src.add_macro(name, obj)
+ src.configure_types()
return src
diff --git a/pypy/module/cpyext/test/test_cparser.py
b/pypy/module/cpyext/test/test_cparser.py
--- a/pypy/module/cpyext/test/test_cparser.py
+++ b/pypy/module/cpyext/test/test_cparser.py
@@ -17,7 +17,6 @@
eci = ExternalCompilationInfo(
include_dirs=[str(tmpdir)], includes=['sys/types.h', 'header.h'])
res = parse_source(decl, eci=eci)
- res.configure_types()
TestFloatObject = res.definitions['TestFloatObject']
assert isinstance(TestFloatObject, lltype.Struct)
assert TestFloatObject.c_ob_refcnt == rffi.SSIZE_T
@@ -72,11 +71,9 @@
include_dirs=[str(tmpdir)],
includes=['sys/types.h', 'base.h', 'object.h'])
hdr1 = parse_source(cdef1, eci=eci)
- hdr1.configure_types()
Type = hdr1.definitions['Type']
assert isinstance(Type, lltype.Struct)
hdr2 = parse_source(cdef2, includes=[hdr1], eci=eci)
- hdr2.configure_types()
assert 'Type' not in hdr2.definitions
Object = hdr2.definitions['Object']
assert Object.c_type.TO is Type
@@ -102,7 +99,6 @@
include_dirs=[str(tmpdir)],
includes=['sys/types.h', 'foo.h'])
foo_h = parse_source(cdef, eci=eci)
- foo_h.configure_types()
Object = foo_h.definitions['Object']
assert isinstance(Object, lltype.ForwardReference) or hash(Object)
@@ -130,7 +126,6 @@
include_dirs=[str(tmpdir)],
includes=['sys/types.h', 'foo.h'])
foo_h = parse_source(cdef, eci=eci)
- foo_h.configure_types()
Object = foo_h.definitions['Object']
assert isinstance(Object, lltype.Struct)
hash(Object)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit