summaryrefslogtreecommitdiff
path: root/cffi/model.py
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2015-04-27 17:26:22 +0200
committerArmin Rigo <arigo@tunes.org>2015-04-27 17:26:22 +0200
commit7d128f3eff9c7e25c6de0e5a948adc51fd5d86fd (patch)
treed414ee6be0ef711f798fa40f4b45a09108f85bc0 /cffi/model.py
parentc1e6f9d84eb73ca530c6a91ba324045d4fc39aa5 (diff)
downloadcffi-7d128f3eff9c7e25c6de0e5a948adc51fd5d86fd.tar.gz
Check sizeof(global variables) when possible
Diffstat (limited to 'cffi/model.py')
-rw-r--r--cffi/model.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/cffi/model.py b/cffi/model.py
index 7da9d85..5ec9931 100644
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -31,6 +31,9 @@ class BaseTypeByIdentity(object):
def has_c_name(self):
return '$' not in self._get_c_name()
+
+ def sizeof_enabled(self):
+ return False
def get_cached_btype(self, ffi, finishlist, can_delay=False):
try:
@@ -121,6 +124,9 @@ class PrimitiveType(BaseType):
def is_float_type(self):
return self.ALL_PRIMITIVE_TYPES[self.name] == 'f'
+ def sizeof_enabled(self):
+ return True
+
def build_backend_type(self, ffi, finishlist):
return global_cache(self, ffi, 'new_primitive_type', self.name)
@@ -161,6 +167,9 @@ class RawFunctionType(BaseFunctionType):
class FunctionPtrType(BaseFunctionType):
_base_pattern = '(*&)(%s)'
+ def sizeof_enabled(self):
+ return True
+
def build_backend_type(self, ffi, finishlist):
result = self.result.get_cached_btype(ffi, finishlist)
args = []
@@ -186,6 +195,9 @@ class PointerType(BaseType):
extra = self._base_pattern
self.c_name_with_marker = totype.c_name_with_marker.replace('&', extra)
+ def sizeof_enabled(self):
+ return True
+
def build_backend_type(self, ffi, finishlist):
BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True)
return global_cache(self, ffi, 'new_pointer_type', BItem)
@@ -226,6 +238,9 @@ class ArrayType(BaseType):
self.c_name_with_marker = (
self.item.c_name_with_marker.replace('&', brackets))
+ def sizeof_enabled(self):
+ return self.item.sizeof_enabled() and self.length is not None
+
def resolve_length(self, newlength):
return ArrayType(self.item, newlength)
@@ -379,6 +394,9 @@ class StructOrUnion(StructOrUnionOrEnum):
from . import ffiplatform
raise ffiplatform.VerificationMissing(self._get_c_name())
+ def sizeof_enabled(self):
+ return self.fldtypes is not None
+
def build_backend_type(self, ffi, finishlist):
self.check_not_partial()
finishlist.append(self)
@@ -407,6 +425,9 @@ class EnumType(StructOrUnionOrEnum):
self.baseinttype = baseinttype
self.build_c_name_with_marker()
+ def sizeof_enabled(self):
+ return True # not strictly true, but external enums are obscure
+
def force_the_name(self, forcename):
StructOrUnionOrEnum.force_the_name(self, forcename)
if self.forcename is None: