diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2009-01-12 20:11:44 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2009-01-12 20:11:44 +0000 |
commit | 7dbbda9abea9882d2c98726f382a905fa8738706 (patch) | |
tree | bdf438fc921de19ddee90d7f2c5972cf76fec48f /giscanner/giscannermodule.c | |
parent | ba4ee2e606545ac703941698aa25e6d865e6976f (diff) | |
download | gobject-introspection-7dbbda9abea9882d2c98726f382a905fa8738706.tar.gz |
Bug 563794 - Redo annotation parsing & applying
2009-01-12 Johan Dahlin <jdahlin@async.com.br>
Bug 563794 - Redo annotation parsing & applying
Thanks to Colin for helping out considerably in landing this.
* giscanner/Makefile.am:
* giscanner/ast.py:
* giscanner/dumper.py:
* giscanner/girparser.py:
* giscanner/giscannermodule.c (pygi_source_scanner_get_comments),
(calc_attrs_length), (pygi_collect_attributes), (init_giscanner):
* giscanner/glibtransformer.py:
* giscanner/scannerlexer.l:
* giscanner/sourcescanner.c (gi_source_symbol_unref),
(gi_source_scanner_new), (gi_source_scanner_free),
(gi_source_scanner_get_comments):
* giscanner/sourcescanner.h:
* giscanner/sourcescanner.py:
* giscanner/transformer.py:
* giscanner/xmlwriter.py:
* tests/scanner/annotation-1.0-expected.gir:
* tests/scanner/annotation-1.0-expected.tgir:
* tests/scanner/annotation.c:
* tests/scanner/annotation.h:
* tests/scanner/foo-1.0-expected.gir:
* tests/scanner/foo-1.0-expected.tgir:
* tests/scanner/foo.h:
* tools/g-ir-scanner:
This commit merges the annotation parser rewrite branch.
It'll change the annotation parsing to be done completely in python
code which will make it easier to do further annotation parsing
easier.
svn path=/trunk/; revision=1017
Diffstat (limited to 'giscanner/giscannermodule.c')
-rw-r--r-- | giscanner/giscannermodule.c | 128 |
1 files changed, 17 insertions, 111 deletions
diff --git a/giscanner/giscannermodule.c b/giscanner/giscannermodule.c index df1ba095..afa4c29c 100644 --- a/giscanner/giscannermodule.c +++ b/giscanner/giscannermodule.c @@ -64,11 +64,6 @@ PyTypeObject Py##cname##_Type = { \ typedef struct { PyObject_HEAD - GISourceDirective *directive; -} PyGISourceDirective; - -typedef struct { - PyObject_HEAD GISourceType *type; } PyGISourceType; @@ -77,7 +72,6 @@ static PyObject * pygi_source_type_new (GISourceType *type); typedef struct { PyObject_HEAD GISourceSymbol *symbol; - PyObject *directives; } PyGISourceSymbol; typedef struct { @@ -85,76 +79,11 @@ typedef struct { GISourceScanner *scanner; } PyGISourceScanner; -NEW_CLASS (PyGISourceDirective, "SourceDirective", GISourceDirective); NEW_CLASS (PyGISourceSymbol, "SourceSymbol", GISourceSymbol); NEW_CLASS (PyGISourceType, "SourceType", GISourceType); NEW_CLASS (PyGISourceScanner, "SourceScanner", GISourceScanner); -/* Directive */ - -static PyObject * -pygi_source_directive_new (GISourceDirective *directive) -{ - PyGISourceDirective *self; - - if (directive == NULL) - { - Py_INCREF (Py_None); - return Py_None; - } - - self = (PyGISourceDirective *)PyObject_New (PyGISourceDirective, - &PyGISourceDirective_Type); - self->directive = directive; - return (PyObject*)self; -} - -static PyObject * -directive_get_name (PyGISourceDirective *self, - void *context) -{ - return PyString_FromString (self->directive->name); -} - -static PyObject * -directive_get_value (PyGISourceDirective *self, - void *context) -{ - return PyString_FromString (self->directive->value); -} - -static PyObject * -directive_get_options (PyGISourceDirective *self, - void *context) -{ - GSList *l; - PyObject *list; - int i = 0; - - if (!self->directive) - return Py_BuildValue("[]"); - - list = PyList_New (g_slist_length (self->directive->options)); - - for (l = self->directive->options; l; l = l->next) - { - PyObject *item = PyString_FromString (l->data); - PyList_SetItem (list, i++, item); - Py_INCREF (item); - } - - Py_INCREF (list); - return list; -} - -static const PyGetSetDef _PyGISourceDirective_getsets[] = { - { "name", (getter)directive_get_name, NULL, NULL}, - { "value", (getter)directive_get_value, NULL, NULL}, - { "options", (getter)directive_get_options, NULL, NULL}, - { 0 } -}; - /* Symbol */ static PyObject * @@ -222,26 +151,6 @@ symbol_get_const_string (PyGISourceSymbol *self, return PyString_FromString (self->symbol->const_string); } -static PyObject * -symbol_get_directives (PyGISourceSymbol *self, - void *context) -{ - if (!self->directives) - self->directives = Py_BuildValue("[]"); - Py_INCREF (self->directives); - return self->directives; -} - -static int -symbol_set_directives (PyGISourceSymbol *self, - PyObject *value, - void *context) -{ - self->directives = value; - Py_INCREF(value); - return 0; -} - static const PyGetSetDef _PyGISourceSymbol_getsets[] = { /* int ref_count; */ { "type", (getter)symbol_get_type, NULL, NULL}, @@ -251,8 +160,6 @@ static const PyGetSetDef _PyGISourceSymbol_getsets[] = { /* gboolean const_int_set; */ { "const_int", (getter)symbol_get_const_int, NULL, NULL}, { "const_string", (getter)symbol_get_const_string, NULL, NULL}, - { "directives", (getter)symbol_get_directives, - (setter)symbol_set_directives, NULL}, { 0 } }; @@ -555,23 +462,18 @@ pygi_source_scanner_get_symbols (PyGISourceScanner *self) } static PyObject * -pygi_source_scanner_get_directives (PyGISourceScanner *self, - PyObject *args) +pygi_source_scanner_get_comments (PyGISourceScanner *self) { - GSList *l, *directives; + GSList *l, *comments; PyObject *list; int i = 0; - char *name; - - if (!PyArg_ParseTuple (args, "s:SourceScanner.get_directives", &name)) - return NULL; - directives = gi_source_scanner_get_directives (self->scanner, name); - list = PyList_New (g_slist_length (directives)); + comments = gi_source_scanner_get_comments (self->scanner); + list = PyList_New (g_slist_length (comments)); - for (l = directives; l; l = l->next) + for (l = comments; l; l = l->next) { - PyObject *item = pygi_source_directive_new (l->data); + PyObject *item = PyString_FromString (l->data); PyList_SetItem (list, i++, item); Py_INCREF (item); } @@ -581,7 +483,7 @@ pygi_source_scanner_get_directives (PyGISourceScanner *self, } static const PyMethodDef _PyGISourceScanner_methods[] = { - { "get_directives", (PyCFunction) pygi_source_scanner_get_directives, METH_VARARGS }, + { "get_comments", (PyCFunction) pygi_source_scanner_get_comments, METH_NOARGS }, { "get_symbols", (PyCFunction) pygi_source_scanner_get_symbols, METH_NOARGS }, { "append_filename", (PyCFunction) pygi_source_scanner_append_filename, METH_VARARGS }, { "parse_file", (PyCFunction) pygi_source_scanner_parse_file, METH_VARARGS }, @@ -611,7 +513,8 @@ static int calc_attrs_length(PyObject *attributes, int indent, if (PyTuple_GetItem(tuple, 1) == Py_None) continue; - g_assert(PyArg_ParseTuple(tuple, "ss", &attr, &value)); + if (!PyArg_ParseTuple(tuple, "ss", &attr, &value)) + return -1; escaped = g_markup_escape_text (value, -1); attr_length += 2 + strlen(attr) + strlen(escaped) + 2; @@ -631,6 +534,7 @@ pygi_collect_attributes (PyObject *self, char *indent_char; gboolean first; GString *attr_value; + int len; if (!PyArg_ParseTuple(args, "sOisi", &tag_name, &attributes, @@ -641,7 +545,10 @@ pygi_collect_attributes (PyObject *self, if (attributes == Py_None || !PyList_Size(attributes)) return PyString_FromString(""); - if (calc_attrs_length(attributes, indent, self_indent) > 79) + len = calc_attrs_length(attributes, indent, self_indent); + if (len < 0) + return NULL; + if (len > 79) indent_len = self_indent + strlen(tag_name) + 1; else indent_len = 0; @@ -660,7 +567,9 @@ pygi_collect_attributes (PyObject *self, if (PyTuple_GetItem(tuple, 1) == Py_None) continue; - g_assert(PyArg_ParseTuple(tuple, "ss", &attr, &value)); + /* this leaks, but we exit after, so */ + if (!PyArg_ParseTuple(tuple, "ss", &attr, &value)) + return NULL; if (indent_len && !first) { @@ -699,9 +608,6 @@ init_giscanner(void) (PyMethodDef*)pyscanner_functions); d = PyModule_GetDict (m); - PyGISourceDirective_Type.tp_getset = (PyGetSetDef*)_PyGISourceDirective_getsets; - REGISTER_TYPE (d, "SourceDirective", PyGISourceDirective_Type); - PyGISourceScanner_Type.tp_init = (initproc)pygi_source_scanner_init; PyGISourceScanner_Type.tp_methods = (PyMethodDef*)_PyGISourceScanner_methods; REGISTER_TYPE (d, "SourceScanner", PyGISourceScanner_Type); |