summaryrefslogtreecommitdiff
path: root/giscanner
diff options
context:
space:
mode:
authorColin Walters <walters@src.gnome.org>2008-10-02 14:07:38 +0000
committerColin Walters <walters@src.gnome.org>2008-10-02 14:07:38 +0000
commitb8b1ab1162b492fcf5176678201ce191b740c3f8 (patch)
tree8ddaf13e9d4f1f41b1511f642b0b1c4e9cca3fce /giscanner
parent9d03f102950cfb1235db5efe81e399e7c14a30af (diff)
downloadgobject-introspection-b8b1ab1162b492fcf5176678201ce191b740c3f8.tar.gz
Merge branch 'bug552393-varargs'
svn path=/trunk/; revision=643
Diffstat (limited to 'giscanner')
-rw-r--r--giscanner/ast.py6
-rw-r--r--giscanner/girwriter.py6
-rw-r--r--giscanner/scannerparser.y16
-rw-r--r--giscanner/sourcescanner.h1
-rw-r--r--giscanner/sourcescanner.py4
-rw-r--r--giscanner/transformer.py13
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']: