Author: Ronan Lamy <[email protected]>
Branch: rffi-parser-2
Changeset: r89231:7757afd4a8a2
Date: 2016-12-26 15:45 +0100
http://bitbucket.org/pypy/pypy/changeset/7757afd4a8a2/
Log: Add configure_now flag
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
@@ -666,15 +666,6 @@
self.fields = fields
self.TYPE = TYPE
- def is_ready(self):
- if self.fields is None:
- return False
- try:
- [hash(fld[1]) for fld in self.fields]
- return True
- except TypeError:
- return False
-
def config_fields(self):
result = []
for name, value in self.fields:
@@ -708,11 +699,11 @@
self.structs.update(other.structs)
self.includes.append(other)
- def add_typedef(self, name, obj):
+ def add_typedef(self, name, obj, configure_now=False):
assert name not in self.definitions
tp = self.convert_type(obj)
if isinstance(tp, DelayedStruct):
- tp = self.realize_struct(tp, name)
+ tp = self.realize_struct(tp, name, configure_now=configure_now)
self.definitions[name] = tp
def add_macro(self, name, value):
@@ -729,10 +720,10 @@
[self.convert_type(field) for field in obj.fldtypes])
return struct
- def realize_struct(self, struct, type_name):
+ def realize_struct(self, struct, type_name, configure_now=False):
from pypy.module.cpyext.api import cpython_struct
configname = type_name.replace(' ', '__')
- if struct.is_ready():
+ if configure_now:
setattr(self._Config, configname,
rffi_platform.Struct(type_name, struct.config_fields()))
self._TYPES[configname] = struct.TYPE
@@ -740,13 +731,13 @@
cpython_struct(type_name, struct.fields, forward=struct.TYPE)
return struct.TYPE
- def configure_types(self):
+ def configure_types(self, configure_now=False):
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)
+ self.add_typedef(name, obj, configure_now=configure_now)
elif name.startswith('macro '):
name = name[6:]
self.add_macro(name, obj)
@@ -784,12 +775,12 @@
raise NotImplementedError
-def parse_source(source, includes=None, eci=None):
+def parse_source(source, includes=None, eci=None, configure_now=False):
ctx = Parser()
src = ParsedSource(source, ctx, eci=eci)
if includes is not None:
for header in includes:
src.include(header)
ctx.parse(source)
- src.configure_types()
+ src.configure_types(configure_now=configure_now)
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
@@ -16,7 +16,7 @@
hdr.write(decl)
eci = ExternalCompilationInfo(
include_dirs=[str(tmpdir)], includes=['sys/types.h', 'header.h'])
- res = parse_source(decl, eci=eci)
+ res = parse_source(decl, eci=eci, configure_now=True)
TestFloatObject = res.definitions['TestFloatObject']
assert isinstance(TestFloatObject, lltype.Struct)
assert TestFloatObject.c_ob_refcnt == rffi.SSIZE_T
@@ -70,10 +70,10 @@
eci = ExternalCompilationInfo(
include_dirs=[str(tmpdir)],
includes=['sys/types.h', 'base.h', 'object.h'])
- hdr1 = parse_source(cdef1, eci=eci)
+ hdr1 = parse_source(cdef1, eci=eci, configure_now=True)
Type = hdr1.definitions['Type']
assert isinstance(Type, lltype.Struct)
- hdr2 = parse_source(cdef2, includes=[hdr1], eci=eci)
+ hdr2 = parse_source(cdef2, includes=[hdr1], eci=eci, configure_now=True)
assert 'Type' not in hdr2.definitions
Object = hdr2.definitions['Object']
assert Object.c_type.TO is Type
@@ -125,7 +125,7 @@
eci = ExternalCompilationInfo(
include_dirs=[str(tmpdir)],
includes=['sys/types.h', 'foo.h'])
- foo_h = parse_source(cdef, eci=eci)
+ foo_h = parse_source(cdef, eci=eci, configure_now=True)
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