diff options
author | Colin Walters <walters@src.gnome.org> | 2008-10-02 14:07:38 +0000 |
---|---|---|
committer | Colin Walters <walters@src.gnome.org> | 2008-10-02 14:07:38 +0000 |
commit | b8b1ab1162b492fcf5176678201ce191b740c3f8 (patch) | |
tree | 8ddaf13e9d4f1f41b1511f642b0b1c4e9cca3fce /giscanner | |
parent | 9d03f102950cfb1235db5efe81e399e7c14a30af (diff) | |
download | gobject-introspection-b8b1ab1162b492fcf5176678201ce191b740c3f8.tar.gz |
Merge branch 'bug552393-varargs'
svn path=/trunk/; revision=643
Diffstat (limited to 'giscanner')
-rw-r--r-- | giscanner/ast.py | 6 | ||||
-rw-r--r-- | giscanner/girwriter.py | 6 | ||||
-rw-r--r-- | giscanner/scannerparser.y | 16 | ||||
-rw-r--r-- | giscanner/sourcescanner.h | 1 | ||||
-rw-r--r-- | giscanner/sourcescanner.py | 4 | ||||
-rw-r--r-- | giscanner/transformer.py | 13 |
6 files changed, 30 insertions, 16 deletions
diff --git a/giscanner/ast.py b/giscanner/ast.py index 7cd4fc6c..6f2e9c2e 100644 --- a/giscanner/ast.py +++ b/giscanner/ast.py @@ -169,6 +169,12 @@ class Type(Node): self.resolved = False +class Varargs(Type): + + def __init__(self): + Type.__init__(self, '<varargs>') + + class Array(Type): def __init__(self, ctype, element_type): diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py index 996da873..fa7c0e57 100644 --- a/giscanner/girwriter.py +++ b/giscanner/girwriter.py @@ -23,7 +23,7 @@ from __future__ import with_statement import os from .ast import (Callback, Class, Enum, Function, Interface, Member, - Array, Struct, Alias, Union, List, Map) + Array, Struct, Alias, Union, List, Map, Varargs) from .glibast import (GLibBoxed, GLibEnum, GLibEnumMember, GLibFlags, GLibObject, GLibInterface) from .xmlwriter import XMLWriter @@ -152,6 +152,10 @@ class GIRWriter(XMLWriter): else: typename = ntype.name type_cname = ntype.ctype + if isinstance(ntype, Varargs): + with self.tagcontext('varargs', []): + pass + return if isinstance(ntype, Array): attrs = [] if not ntype.zeroterminated: diff --git a/giscanner/scannerparser.y b/giscanner/scannerparser.y index dbde3223..53a30a31 100644 --- a/giscanner/scannerparser.y +++ b/giscanner/scannerparser.y @@ -100,7 +100,6 @@ static GHashTable *const_table = NULL; %type <list> enumerator_list %type <list> identifier_list %type <list> init_declarator_list -%type <list> parameter_type_list %type <list> parameter_list %type <list> struct_declaration %type <list> struct_declaration_list @@ -904,7 +903,7 @@ direct_declarator $$ = $1; gi_source_symbol_merge_type ($$, gi_source_array_new ()); } - | direct_declarator '(' parameter_type_list ')' + | direct_declarator '(' parameter_list ')' { GISourceType *func = gi_source_function_new (); // ignore (void) parameter list @@ -958,11 +957,6 @@ type_qualifier_list } ; -parameter_type_list - : parameter_list - | parameter_list ',' ELLIPSIS - ; - parameter_list : parameter_declaration { @@ -990,6 +984,10 @@ parameter_declaration $$ = gi_source_symbol_new (CSYMBOL_TYPE_INVALID); $$->base_type = $1; } + | ELLIPSIS + { + $$ = gi_source_symbol_new (CSYMBOL_TYPE_ELLIPSIS); + } ; identifier_list @@ -1057,7 +1055,7 @@ direct_abstract_declarator $$ = gi_source_symbol_new (CSYMBOL_TYPE_INVALID); gi_source_symbol_merge_type ($$, func); } - | '(' parameter_type_list ')' + | '(' parameter_list ')' { GISourceType *func = gi_source_function_new (); // ignore (void) parameter list @@ -1073,7 +1071,7 @@ direct_abstract_declarator $$ = $1; gi_source_symbol_merge_type ($$, func); } - | direct_abstract_declarator '(' parameter_type_list ')' + | direct_abstract_declarator '(' parameter_list ')' { GISourceType *func = gi_source_function_new (); // ignore (void) parameter list diff --git a/giscanner/sourcescanner.h b/giscanner/sourcescanner.h index 171a995a..3e2aacda 100644 --- a/giscanner/sourcescanner.h +++ b/giscanner/sourcescanner.h @@ -36,6 +36,7 @@ typedef struct _GISourceDirective GISourceDirective; typedef enum { CSYMBOL_TYPE_INVALID, + CSYMBOL_TYPE_ELLIPSIS, CSYMBOL_TYPE_CONST, CSYMBOL_TYPE_OBJECT, CSYMBOL_TYPE_FUNCTION, diff --git a/giscanner/sourcescanner.py b/giscanner/sourcescanner.py index 1030f04b..a4355ca5 100644 --- a/giscanner/sourcescanner.py +++ b/giscanner/sourcescanner.py @@ -25,6 +25,7 @@ import tempfile from . import _giscanner (CSYMBOL_TYPE_INVALID, + CSYMBOL_TYPE_ELLIPSIS, CSYMBOL_TYPE_CONST, CSYMBOL_TYPE_OBJECT, CSYMBOL_TYPE_FUNCTION, @@ -32,7 +33,7 @@ from . import _giscanner CSYMBOL_TYPE_UNION, CSYMBOL_TYPE_ENUM, CSYMBOL_TYPE_TYPEDEF, - CSYMBOL_TYPE_MEMBER) = range(9) + CSYMBOL_TYPE_MEMBER) = range(10) (CTYPE_INVALID, CTYPE_VOID, @@ -72,6 +73,7 @@ FUNCTION_INLINE = 1 << 1 def symbol_type_name(symbol_type): return { CSYMBOL_TYPE_INVALID: 'invalid', + CSYMBOL_TYPE_ELLIPSIS: 'ellipsis', CSYMBOL_TYPE_CONST: 'const', CSYMBOL_TYPE_OBJECT: 'object', CSYMBOL_TYPE_FUNCTION: 'function', diff --git a/giscanner/transformer.py b/giscanner/transformer.py index d560474d..f8e09d13 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -23,8 +23,8 @@ import os from giscanner.ast import (Callback, Enum, Function, Namespace, Member, Parameter, Return, Array, Struct, Field, Type, Alias, Interface, Class, Node, Union, - List, Map, type_name_from_ctype, type_names, - default_array_types) + List, Map, Varargs, type_name_from_ctype, + type_names, default_array_types) from giscanner.config import DATADIR from .glibast import GLibBoxed from giscanner.sourcescanner import ( @@ -33,7 +33,7 @@ from giscanner.sourcescanner import ( CTYPE_VOID, CTYPE_ENUM, CTYPE_FUNCTION, CTYPE_STRUCT, CSYMBOL_TYPE_FUNCTION, CSYMBOL_TYPE_TYPEDEF, CSYMBOL_TYPE_STRUCT, CSYMBOL_TYPE_ENUM, CSYMBOL_TYPE_UNION, CSYMBOL_TYPE_OBJECT, - CSYMBOL_TYPE_MEMBER) + CSYMBOL_TYPE_MEMBER, CSYMBOL_TYPE_ELLIPSIS) from .odict import odict from .utils import strip_common_prefix, to_underscores @@ -318,7 +318,7 @@ class Transformer(object): def _create_type(self, source_type, options=[]): ctype = self._create_source_type(source_type) if ctype == 'va_list': - raise SkipError + raise SkipError() # FIXME: FILE* should not be skipped, it should be handled # properly instead elif ctype == 'FILE*': @@ -353,7 +353,10 @@ class Transformer(object): return Type(resolved_type_name, ctype) def _create_parameter(self, symbol, options): - ptype = self._create_type(symbol.base_type, options) + if symbol.type == CSYMBOL_TYPE_ELLIPSIS: + ptype = Varargs() + else: + ptype = self._create_type(symbol.base_type, options) param = Parameter(symbol.ident, ptype) for option in options: if option in ['in-out', 'inout']: |