diff options
author | Armin Rigo <arigo@tunes.org> | 2015-10-05 20:05:17 +0200 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2015-10-05 20:05:17 +0200 |
commit | 52c1a75736ca235a91122f732eae710e12aef7e8 (patch) | |
tree | ce325c4f8af4fb2ddfd7dead3500cd52ecfcbd17 /cffi/cparser.py | |
parent | ec65919e86fd2a81a2735727033902fdf29f8ed4 (diff) | |
download | cffi-52c1a75736ca235a91122f732eae710e12aef7e8.tar.gz |
Starting, with exactly two function types: no-abi (i.e. cdecl on windows), or stdcall.
Diffstat (limited to 'cffi/cparser.py')
-rw-r--r-- | cffi/cparser.py | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/cffi/cparser.py b/cffi/cparser.py index ac9b4f4..42ac367 100644 --- a/cffi/cparser.py +++ b/cffi/cparser.py @@ -103,6 +103,7 @@ class Parser(object): self._structnode2type = weakref.WeakKeyDictionary() self._override = False self._packed = False + self._abi = None self._int_constants = {} self._recomplete = [] self._uses_new_feature = None @@ -162,16 +163,26 @@ class Parser(object): msg = 'parse error\n%s' % (msg,) raise api.CDefError(msg) - def parse(self, csource, override=False, packed=False): + def parse(self, csource, override=False, packed=False, calling_conv=None): + if calling_conv is None or calling_conv == "cdecl": + abi = None + elif calling_conv == "stdcall": + abi = "stdcall" + else: + raise api.CDefError("calling_conv must be 'cdecl' or 'stdcall';" + " got %r" % (calling_conv,)) prev_override = self._override prev_packed = self._packed + prev_abi = self._abi try: self._override = override self._packed = packed + self._abi = abi self._internal_parse(csource) finally: self._override = prev_override self._packed = prev_packed + self._abi = prev_abi def _internal_parse(self, csource): ast, macros, csource = self._parse(csource) @@ -449,7 +460,7 @@ class Parser(object): if not ellipsis and args == [model.void_type]: args = [] result, quals = self._get_type_and_quals(typenode.type) - return model.RawFunctionType(tuple(args), result, ellipsis) + return model.RawFunctionType(tuple(args), result, ellipsis, self._abi) def _as_func_arg(self, type, quals): if isinstance(type, model.ArrayType): |