Mercurial > cpython-lru_cache-weakref
annotate Modules/_elementtree.c @ 85327:5b5ef012cd4e
Issue #16809: Fixed some tkinter incompabilities with Tcl/Tk 8.6.
| author | Serhiy Storchaka <storchaka@gmail.com> |
|---|---|
| date | Thu, 22 Aug 2013 17:53:06 +0300 |
| parents | 8a060e2de608 |
| children | 8123479ac0d7 |
| rev | line source |
|---|---|
|
83459
56b70b557a23
Make license notices more consistent and remove old changelog.
Eli Bendersky <eliben@gmail.com>
parents:
81486
diff
changeset
|
1 /*-------------------------------------------------------------------- |
|
56b70b557a23
Make license notices more consistent and remove old changelog.
Eli Bendersky <eliben@gmail.com>
parents:
81486
diff
changeset
|
2 * Licensed to PSF under a Contributor Agreement. |
|
56b70b557a23
Make license notices more consistent and remove old changelog.
Eli Bendersky <eliben@gmail.com>
parents:
81486
diff
changeset
|
3 * See http://www.python.org/psf/license for licensing details. |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
4 * |
|
83459
56b70b557a23
Make license notices more consistent and remove old changelog.
Eli Bendersky <eliben@gmail.com>
parents:
81486
diff
changeset
|
5 * _elementtree - C accelerator for xml.etree.ElementTree |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
6 * Copyright (c) 1999-2009 by Secret Labs AB. All rights reserved. |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
7 * Copyright (c) 1999-2009 by Fredrik Lundh. |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
8 * |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
9 * info@pythonware.com |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
10 * http://www.pythonware.com |
|
83459
56b70b557a23
Make license notices more consistent and remove old changelog.
Eli Bendersky <eliben@gmail.com>
parents:
81486
diff
changeset
|
11 *-------------------------------------------------------------------- |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
12 */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
13 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
14 #include "Python.h" |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
15 #include "structmember.h" |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
16 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
17 /* -------------------------------------------------------------------- */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
18 /* configuration */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
19 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
20 /* An element can hold this many children without extra memory |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
21 allocations. */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
22 #define STATIC_CHILDREN 4 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
23 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
24 /* For best performance, chose a value so that 80-90% of all nodes |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
25 have no more than the given number of children. Set this to zero |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
26 to minimize the size of the element structure itself (this only |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
27 helps if you have lots of leaf nodes with attributes). */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
28 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
29 /* Also note that pymalloc always allocates blocks in multiples of |
|
74903
65fc79fb4eb2
Issue #13988: cElementTree is deprecated and the _elementtree accelerator is automatically used whenever available.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
74870
diff
changeset
|
30 eight bytes. For the current C version of ElementTree, this means |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
31 that the number of children should be an even number, at least on |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
32 32-bit platforms. */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
33 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
34 /* -------------------------------------------------------------------- */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
35 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
36 #if 0 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
37 static int memory = 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
38 #define ALLOC(size, comment)\ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
39 do { memory += size; printf("%8d - %s\n", memory, comment); } while (0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
40 #define RELEASE(size, comment)\ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
41 do { memory -= size; printf("%8d - %s\n", memory, comment); } while (0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
42 #else |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
43 #define ALLOC(size, comment) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
44 #define RELEASE(size, comment) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
45 #endif |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
46 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
47 /* compiler tweaks */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
48 #if defined(_MSC_VER) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
49 #define LOCAL(type) static __inline type __fastcall |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
50 #else |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
51 #define LOCAL(type) static type |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
52 #endif |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
53 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
54 /* macros used to store 'join' flags in string object pointers. note |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
55 that all use of text and tail as object pointers must be wrapped in |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
56 JOIN_OBJ. see comments in the ElementObject definition for more |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
57 info. */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
58 #define JOIN_GET(p) ((Py_uintptr_t) (p) & 1) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
59 #define JOIN_SET(p, flag) ((void*) ((Py_uintptr_t) (JOIN_OBJ(p)) | (flag))) |
|
79065
99112b851b25
Issue #15144: Fix possible integer overflow when handling pointers as integer values, by using Py_uintptr_t instead of size_t.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78221
diff
changeset
|
60 #define JOIN_OBJ(p) ((PyObject*) ((Py_uintptr_t) (p) & ~(Py_uintptr_t)1)) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
61 |
|
84714
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
62 /* Types defined by this extension */ |
|
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
63 static PyTypeObject Element_Type; |
|
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
64 static PyTypeObject ElementIter_Type; |
|
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
65 static PyTypeObject TreeBuilder_Type; |
|
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
66 static PyTypeObject XMLParser_Type; |
|
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
67 |
|
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
68 |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
69 /* Per-module state; PEP 3121 */ |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
70 typedef struct { |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
71 PyObject *parseerror_obj; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
72 PyObject *deepcopy_obj; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
73 PyObject *elementpath_obj; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
74 } elementtreestate; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
75 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
76 static struct PyModuleDef elementtreemodule; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
77 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
78 /* Given a module object (assumed to be _elementtree), get its per-module |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
79 * state. |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
80 */ |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
81 #define ET_STATE(mod) ((elementtreestate *) PyModule_GetState(mod)) |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
82 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
83 /* Find the module instance imported in the currently running sub-interpreter |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
84 * and get its state. |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
85 */ |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
86 #define ET_STATE_GLOBAL \ |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
87 ((elementtreestate *) PyModule_GetState(PyState_FindModule(&elementtreemodule))) |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
88 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
89 static int |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
90 elementtree_clear(PyObject *m) |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
91 { |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
92 elementtreestate *st = ET_STATE(m); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
93 Py_CLEAR(st->parseerror_obj); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
94 Py_CLEAR(st->deepcopy_obj); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
95 Py_CLEAR(st->elementpath_obj); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
96 return 0; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
97 } |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
98 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
99 static int |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
100 elementtree_traverse(PyObject *m, visitproc visit, void *arg) |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
101 { |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
102 elementtreestate *st = ET_STATE(m); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
103 Py_VISIT(st->parseerror_obj); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
104 Py_VISIT(st->deepcopy_obj); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
105 Py_VISIT(st->elementpath_obj); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
106 return 0; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
107 } |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
108 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
109 static void |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
110 elementtree_free(void *m) |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
111 { |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
112 elementtree_clear((PyObject *)m); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
113 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
114 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
115 /* helpers */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
116 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
117 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
118 deepcopy(PyObject* object, PyObject* memo) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
119 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
120 /* do a deep copy of the given object */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
121 PyObject* args; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
122 PyObject* result; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
123 elementtreestate *st = ET_STATE_GLOBAL; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
124 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
125 if (!st->deepcopy_obj) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
126 PyErr_SetString( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
127 PyExc_RuntimeError, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
128 "deepcopy helper not found" |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
129 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
130 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
131 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
132 |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
133 args = PyTuple_Pack(2, object, memo); |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
134 if (!args) |
|
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
135 return NULL; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
136 result = PyObject_CallObject(st->deepcopy_obj, args); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
137 Py_DECREF(args); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
138 return result; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
139 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
140 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
141 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
142 list_join(PyObject* list) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
143 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
144 /* join list elements (destroying the list in the process) */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
145 PyObject* joiner; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
146 PyObject* result; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
147 |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
148 joiner = PyUnicode_FromStringAndSize("", 0); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
149 if (!joiner) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
150 return NULL; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
151 result = PyUnicode_Join(joiner, list); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
152 Py_DECREF(joiner); |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
153 if (result) |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
154 Py_DECREF(list); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
155 return result; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
156 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
157 |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
158 /* Is the given object an empty dictionary? |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
159 */ |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
160 static int |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
161 is_empty_dict(PyObject *obj) |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
162 { |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
163 return PyDict_CheckExact(obj) && PyDict_Size(obj) == 0; |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
164 } |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
165 |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
166 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
167 /* -------------------------------------------------------------------- */ |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
168 /* the Element type */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
169 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
170 typedef struct { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
171 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
172 /* attributes (a dictionary object), or None if no attributes */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
173 PyObject* attrib; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
174 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
175 /* child elements */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
176 int length; /* actual number of items */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
177 int allocated; /* allocated items */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
178 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
179 /* this either points to _children or to a malloced buffer */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
180 PyObject* *children; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
181 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
182 PyObject* _children[STATIC_CHILDREN]; |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
183 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
184 } ElementObjectExtra; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
185 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
186 typedef struct { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
187 PyObject_HEAD |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
188 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
189 /* element tag (a string). */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
190 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
191 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
192 /* text before first child. note that this is a tagged pointer; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
193 use JOIN_OBJ to get the object pointer. the join flag is used |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
194 to distinguish lists created by the tree builder from lists |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
195 assigned to the attribute by application code; the former |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
196 should be joined before being returned to the user, the latter |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
197 should be left intact. */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
198 PyObject* text; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
199 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
200 /* text after this element, in parent. note that this is a tagged |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
201 pointer; use JOIN_OBJ to get the object pointer. */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
202 PyObject* tail; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
203 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
204 ElementObjectExtra* extra; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
205 |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
206 PyObject *weakreflist; /* For tp_weaklistoffset */ |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
207 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
208 } ElementObject; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
209 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
210 |
|
44351
86a2679dca46
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
211 #define Element_CheckExact(op) (Py_TYPE(op) == &Element_Type) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
212 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
213 /* -------------------------------------------------------------------- */ |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
214 /* Element constructors and destructor */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
215 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
216 LOCAL(int) |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
217 create_extra(ElementObject* self, PyObject* attrib) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
218 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
219 self->extra = PyObject_Malloc(sizeof(ElementObjectExtra)); |
|
84580
60b1d7967ef8
Issue #18408: Fix create_extra() of _elementtree.c, raise MemoryError on memory
Victor Stinner <victor.stinner@gmail.com>
parents:
84568
diff
changeset
|
220 if (!self->extra) { |
|
60b1d7967ef8
Issue #18408: Fix create_extra() of _elementtree.c, raise MemoryError on memory
Victor Stinner <victor.stinner@gmail.com>
parents:
84568
diff
changeset
|
221 PyErr_NoMemory(); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
222 return -1; |
|
84580
60b1d7967ef8
Issue #18408: Fix create_extra() of _elementtree.c, raise MemoryError on memory
Victor Stinner <victor.stinner@gmail.com>
parents:
84568
diff
changeset
|
223 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
224 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
225 if (!attrib) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
226 attrib = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
227 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
228 Py_INCREF(attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
229 self->extra->attrib = attrib; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
230 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
231 self->extra->length = 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
232 self->extra->allocated = STATIC_CHILDREN; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
233 self->extra->children = self->extra->_children; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
234 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
235 return 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
236 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
237 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
238 LOCAL(void) |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
239 dealloc_extra(ElementObject* self) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
240 { |
|
76101
118729090dc5
Fix Windows compilation errors
Eli Bendersky <eliben@gmail.com>
parents:
76098
diff
changeset
|
241 ElementObjectExtra *myextra; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
242 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
243 |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
244 if (!self->extra) |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
245 return; |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
246 |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
247 /* Avoid DECREFs calling into this code again (cycles, etc.) |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
248 */ |
|
76101
118729090dc5
Fix Windows compilation errors
Eli Bendersky <eliben@gmail.com>
parents:
76098
diff
changeset
|
249 myextra = self->extra; |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
250 self->extra = NULL; |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
251 |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
252 Py_DECREF(myextra->attrib); |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
253 |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
254 for (i = 0; i < myextra->length; i++) |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
255 Py_DECREF(myextra->children[i]); |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
256 |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
257 if (myextra->children != myextra->_children) |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
258 PyObject_Free(myextra->children); |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
259 |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
260 PyObject_Free(myextra); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
261 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
262 |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
263 /* Convenience internal function to create new Element objects with the given |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
264 * tag and attributes. |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
265 */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
266 LOCAL(PyObject*) |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
267 create_new_element(PyObject* tag, PyObject* attrib) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
268 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
269 ElementObject* self; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
270 |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
271 self = PyObject_GC_New(ElementObject, &Element_Type); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
272 if (self == NULL) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
273 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
274 self->extra = NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
275 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
276 Py_INCREF(tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
277 self->tag = tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
278 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
279 Py_INCREF(Py_None); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
280 self->text = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
281 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
282 Py_INCREF(Py_None); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
283 self->tail = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
284 |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
285 self->weakreflist = NULL; |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
286 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
287 ALLOC(sizeof(ElementObject), "create element"); |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
288 PyObject_GC_Track(self); |
|
84581
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
289 |
|
84568
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
290 if (attrib != Py_None && !is_empty_dict(attrib)) { |
|
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
291 if (create_extra(self, attrib) < 0) { |
|
84581
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
292 Py_DECREF(self); |
|
84568
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
293 return NULL; |
|
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
294 } |
|
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
295 } |
|
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
296 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
297 return (PyObject*) self; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
298 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
299 |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
300 static PyObject * |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
301 element_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
302 { |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
303 ElementObject *e = (ElementObject *)type->tp_alloc(type, 0); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
304 if (e != NULL) { |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
305 Py_INCREF(Py_None); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
306 e->tag = Py_None; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
307 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
308 Py_INCREF(Py_None); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
309 e->text = Py_None; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
310 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
311 Py_INCREF(Py_None); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
312 e->tail = Py_None; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
313 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
314 e->extra = NULL; |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
315 e->weakreflist = NULL; |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
316 } |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
317 return (PyObject *)e; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
318 } |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
319 |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
320 /* Helper function for extracting the attrib dictionary from a keywords dict. |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
321 * This is required by some constructors/functions in this module that can |
|
81479
7e072816b197
Clean trailing whitespace in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents:
81447
diff
changeset
|
322 * either accept attrib as a keyword argument or all attributes splashed |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
323 * directly into *kwds. |
|
83492
041960bf92fe
Issue #17736: fix misleading comment in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents:
81486
diff
changeset
|
324 * |
|
041960bf92fe
Issue #17736: fix misleading comment in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents:
81486
diff
changeset
|
325 * Return a dictionary with the content of kwds merged into the content of |
|
041960bf92fe
Issue #17736: fix misleading comment in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents:
81486
diff
changeset
|
326 * attrib. If there is no attrib keyword, return a copy of kwds. |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
327 */ |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
328 static PyObject* |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
329 get_attrib_from_keywords(PyObject *kwds) |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
330 { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
331 PyObject *attrib_str = PyUnicode_FromString("attrib"); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
332 PyObject *attrib = PyDict_GetItem(kwds, attrib_str); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
333 |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
334 if (attrib) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
335 /* If attrib was found in kwds, copy its value and remove it from |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
336 * kwds |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
337 */ |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
338 if (!PyDict_Check(attrib)) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
339 Py_DECREF(attrib_str); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
340 PyErr_Format(PyExc_TypeError, "attrib must be dict, not %.100s", |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
341 Py_TYPE(attrib)->tp_name); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
342 return NULL; |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
343 } |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
344 attrib = PyDict_Copy(attrib); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
345 PyDict_DelItem(kwds, attrib_str); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
346 } else { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
347 attrib = PyDict_New(); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
348 } |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
349 |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
350 Py_DECREF(attrib_str); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
351 |
|
83514
e022cc026afc
Revert c9674421d78e, leaving an additional comment
Eli Bendersky <eliben@gmail.com>
parents:
83494
diff
changeset
|
352 /* attrib can be NULL if PyDict_New failed */ |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
353 if (attrib) |
|
84734
76bb3fe6ce8f
Add missing check of PyDict_Update()'s return value in _elementtree.c
Christian Heimes <christian@cheimes.de>
parents:
84714
diff
changeset
|
354 if (PyDict_Update(attrib, kwds) < 0) |
|
76bb3fe6ce8f
Add missing check of PyDict_Update()'s return value in _elementtree.c
Christian Heimes <christian@cheimes.de>
parents:
84714
diff
changeset
|
355 return NULL; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
356 return attrib; |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
357 } |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
358 |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
359 static int |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
360 element_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
361 { |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
362 PyObject *tag; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
363 PyObject *tmp; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
364 PyObject *attrib = NULL; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
365 ElementObject *self_elem; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
366 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
367 if (!PyArg_ParseTuple(args, "O|O!:Element", &tag, &PyDict_Type, &attrib)) |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
368 return -1; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
369 |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
370 if (attrib) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
371 /* attrib passed as positional arg */ |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
372 attrib = PyDict_Copy(attrib); |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
373 if (!attrib) |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
374 return -1; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
375 if (kwds) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
376 if (PyDict_Update(attrib, kwds) < 0) { |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
377 Py_DECREF(attrib); |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
378 return -1; |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
379 } |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
380 } |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
381 } else if (kwds) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
382 /* have keywords args */ |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
383 attrib = get_attrib_from_keywords(kwds); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
384 if (!attrib) |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
385 return -1; |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
386 } |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
387 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
388 self_elem = (ElementObject *)self; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
389 |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
390 if (attrib != NULL && !is_empty_dict(attrib)) { |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
391 if (create_extra(self_elem, attrib) < 0) { |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
392 Py_DECREF(attrib); |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
393 return -1; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
394 } |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
395 } |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
396 |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
397 /* We own a reference to attrib here and it's no longer needed. */ |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
398 Py_XDECREF(attrib); |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
399 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
400 /* Replace the objects already pointed to by tag, text and tail. */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
401 tmp = self_elem->tag; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
402 Py_INCREF(tag); |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
403 self_elem->tag = tag; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
404 Py_DECREF(tmp); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
405 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
406 tmp = self_elem->text; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
407 Py_INCREF(Py_None); |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
408 self_elem->text = Py_None; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
409 Py_DECREF(JOIN_OBJ(tmp)); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
410 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
411 tmp = self_elem->tail; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
412 Py_INCREF(Py_None); |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
413 self_elem->tail = Py_None; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
414 Py_DECREF(JOIN_OBJ(tmp)); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
415 |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
416 return 0; |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
417 } |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
418 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
419 LOCAL(int) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
420 element_resize(ElementObject* self, int extra) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
421 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
422 int size; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
423 PyObject* *children; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
424 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
425 /* make sure self->children can hold the given number of extra |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
426 elements. set an exception and return -1 if allocation failed */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
427 |
|
84566
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
428 if (!self->extra) { |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
429 if (create_extra(self, NULL) < 0) |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
430 return -1; |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
431 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
432 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
433 size = self->extra->length + extra; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
434 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
435 if (size > self->extra->allocated) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
436 /* use Python 2.4's list growth strategy */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
437 size = (size >> 3) + (size < 9 ? 3 : 6) + size; |
|
44742
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
438 /* Coverity CID #182 size_error: Allocating 1 bytes to pointer "children" |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
439 * which needs at least 4 bytes. |
|
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
440 * Although it's a false alarm always assume at least one child to |
|
44742
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
441 * be safe. |
|
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
442 */ |
|
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
443 size = size ? size : 1; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
444 if (self->extra->children != self->extra->_children) { |
|
44742
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
445 /* Coverity CID #182 size_error: Allocating 1 bytes to pointer |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
446 * "children", which needs at least 4 bytes. Although it's a |
|
44742
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
447 * false alarm always assume at least one child to be safe. |
|
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
448 */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
449 children = PyObject_Realloc(self->extra->children, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
450 size * sizeof(PyObject*)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
451 if (!children) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
452 goto nomemory; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
453 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
454 children = PyObject_Malloc(size * sizeof(PyObject*)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
455 if (!children) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
456 goto nomemory; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
457 /* copy existing children from static area to malloc buffer */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
458 memcpy(children, self->extra->children, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
459 self->extra->length * sizeof(PyObject*)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
460 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
461 self->extra->children = children; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
462 self->extra->allocated = size; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
463 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
464 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
465 return 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
466 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
467 nomemory: |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
468 PyErr_NoMemory(); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
469 return -1; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
470 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
471 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
472 LOCAL(int) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
473 element_add_subelement(ElementObject* self, PyObject* element) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
474 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
475 /* add a child element to a parent */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
476 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
477 if (element_resize(self, 1) < 0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
478 return -1; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
479 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
480 Py_INCREF(element); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
481 self->extra->children[self->extra->length] = element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
482 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
483 self->extra->length++; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
484 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
485 return 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
486 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
487 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
488 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
489 element_get_attrib(ElementObject* self) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
490 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
491 /* return borrowed reference to attrib dictionary */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
492 /* note: this function assumes that the extra section exists */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
493 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
494 PyObject* res = self->extra->attrib; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
495 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
496 if (res == Py_None) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
497 /* create missing dictionary */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
498 res = PyDict_New(); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
499 if (!res) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
500 return NULL; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
501 Py_DECREF(Py_None); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
502 self->extra->attrib = res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
503 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
504 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
505 return res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
506 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
507 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
508 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
509 element_get_text(ElementObject* self) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
510 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
511 /* return borrowed reference to text attribute */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
512 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
513 PyObject* res = self->text; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
514 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
515 if (JOIN_GET(res)) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
516 res = JOIN_OBJ(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
517 if (PyList_CheckExact(res)) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
518 res = list_join(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
519 if (!res) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
520 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
521 self->text = res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
522 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
523 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
524 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
525 return res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
526 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
527 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
528 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
529 element_get_tail(ElementObject* self) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
530 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
531 /* return borrowed reference to text attribute */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
532 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
533 PyObject* res = self->tail; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
534 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
535 if (JOIN_GET(res)) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
536 res = JOIN_OBJ(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
537 if (PyList_CheckExact(res)) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
538 res = list_join(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
539 if (!res) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
540 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
541 self->tail = res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
542 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
543 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
544 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
545 return res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
546 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
547 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
548 static PyObject* |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
549 subelement(PyObject *self, PyObject *args, PyObject *kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
550 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
551 PyObject* elem; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
552 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
553 ElementObject* parent; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
554 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
555 PyObject* attrib = NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
556 if (!PyArg_ParseTuple(args, "O!O|O!:SubElement", |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
557 &Element_Type, &parent, &tag, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
558 &PyDict_Type, &attrib)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
559 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
560 |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
561 if (attrib) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
562 /* attrib passed as positional arg */ |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
563 attrib = PyDict_Copy(attrib); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
564 if (!attrib) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
565 return NULL; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
566 if (kwds) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
567 if (PyDict_Update(attrib, kwds) < 0) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
568 return NULL; |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
569 } |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
570 } |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
571 } else if (kwds) { |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
572 /* have keyword args */ |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
573 attrib = get_attrib_from_keywords(kwds); |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
574 if (!attrib) |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
575 return NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
576 } else { |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
577 /* no attrib arg, no kwds, so no attribute */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
578 Py_INCREF(Py_None); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
579 attrib = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
580 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
581 |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
582 elem = create_new_element(tag, attrib); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
583 Py_DECREF(attrib); |
|
84568
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
584 if (elem == NULL) |
|
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
585 return NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
586 |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
587 if (element_add_subelement(parent, elem) < 0) { |
|
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
588 Py_DECREF(elem); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
589 return NULL; |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
590 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
591 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
592 return elem; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
593 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
594 |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
595 static int |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
596 element_gc_traverse(ElementObject *self, visitproc visit, void *arg) |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
597 { |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
598 Py_VISIT(self->tag); |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
599 Py_VISIT(JOIN_OBJ(self->text)); |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
600 Py_VISIT(JOIN_OBJ(self->tail)); |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
601 |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
602 if (self->extra) { |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
603 int i; |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
604 Py_VISIT(self->extra->attrib); |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
605 |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
606 for (i = 0; i < self->extra->length; ++i) |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
607 Py_VISIT(self->extra->children[i]); |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
608 } |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
609 return 0; |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
610 } |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
611 |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
612 static int |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
613 element_gc_clear(ElementObject *self) |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
614 { |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
615 Py_CLEAR(self->tag); |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
616 |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
617 /* The following is like Py_CLEAR for self->text and self->tail, but |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
618 * written explicitily because the real pointers hide behind access |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
619 * macros. |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
620 */ |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
621 if (self->text) { |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
622 PyObject *tmp = JOIN_OBJ(self->text); |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
623 self->text = NULL; |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
624 Py_DECREF(tmp); |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
625 } |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
626 |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
627 if (self->tail) { |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
628 PyObject *tmp = JOIN_OBJ(self->tail); |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
629 self->tail = NULL; |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
630 Py_DECREF(tmp); |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
631 } |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
632 |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
633 /* After dropping all references from extra, it's no longer valid anyway, |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
634 * so fully deallocate it. |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
635 */ |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
636 dealloc_extra(self); |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
637 return 0; |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
638 } |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
639 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
640 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
641 element_dealloc(ElementObject* self) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
642 { |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
643 PyObject_GC_UnTrack(self); |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
644 |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
645 if (self->weakreflist != NULL) |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
646 PyObject_ClearWeakRefs((PyObject *) self); |
|
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
647 |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
648 /* element_gc_clear clears all references and deallocates extra |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
649 */ |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
650 element_gc_clear(self); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
651 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
652 RELEASE(sizeof(ElementObject), "destroy element"); |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
653 Py_TYPE(self)->tp_free((PyObject *)self); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
654 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
655 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
656 /* -------------------------------------------------------------------- */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
657 /* methods (in alphabetical order) */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
658 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
659 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
660 element_append(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
661 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
662 PyObject* element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
663 if (!PyArg_ParseTuple(args, "O!:append", &Element_Type, &element)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
664 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
665 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
666 if (element_add_subelement(self, element) < 0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
667 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
668 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
669 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
670 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
671 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
672 static PyObject* |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
673 element_clearmethod(ElementObject* self, PyObject* args) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
674 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
675 if (!PyArg_ParseTuple(args, ":clear")) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
676 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
677 |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
678 dealloc_extra(self); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
679 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
680 Py_INCREF(Py_None); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
681 Py_DECREF(JOIN_OBJ(self->text)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
682 self->text = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
683 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
684 Py_INCREF(Py_None); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
685 Py_DECREF(JOIN_OBJ(self->tail)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
686 self->tail = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
687 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
688 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
689 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
690 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
691 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
692 element_copy(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
693 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
694 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
695 ElementObject* element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
696 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
697 if (!PyArg_ParseTuple(args, ":__copy__")) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
698 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
699 |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
700 element = (ElementObject*) create_new_element( |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
701 self->tag, (self->extra) ? self->extra->attrib : Py_None |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
702 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
703 if (!element) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
704 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
705 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
706 Py_DECREF(JOIN_OBJ(element->text)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
707 element->text = self->text; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
708 Py_INCREF(JOIN_OBJ(element->text)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
709 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
710 Py_DECREF(JOIN_OBJ(element->tail)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
711 element->tail = self->tail; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
712 Py_INCREF(JOIN_OBJ(element->tail)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
713 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
714 if (self->extra) { |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
715 |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
716 if (element_resize(element, self->extra->length) < 0) { |
|
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
717 Py_DECREF(element); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
718 return NULL; |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
719 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
720 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
721 for (i = 0; i < self->extra->length; i++) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
722 Py_INCREF(self->extra->children[i]); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
723 element->extra->children[i] = self->extra->children[i]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
724 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
725 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
726 element->extra->length = self->extra->length; |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
727 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
728 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
729 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
730 return (PyObject*) element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
731 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
732 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
733 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
734 element_deepcopy(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
735 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
736 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
737 ElementObject* element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
738 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
739 PyObject* attrib; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
740 PyObject* text; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
741 PyObject* tail; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
742 PyObject* id; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
743 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
744 PyObject* memo; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
745 if (!PyArg_ParseTuple(args, "O:__deepcopy__", &memo)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
746 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
747 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
748 tag = deepcopy(self->tag, memo); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
749 if (!tag) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
750 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
751 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
752 if (self->extra) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
753 attrib = deepcopy(self->extra->attrib, memo); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
754 if (!attrib) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
755 Py_DECREF(tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
756 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
757 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
758 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
759 Py_INCREF(Py_None); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
760 attrib = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
761 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
762 |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
763 element = (ElementObject*) create_new_element(tag, attrib); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
764 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
765 Py_DECREF(tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
766 Py_DECREF(attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
767 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
768 if (!element) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
769 return NULL; |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
770 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
771 text = deepcopy(JOIN_OBJ(self->text), memo); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
772 if (!text) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
773 goto error; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
774 Py_DECREF(element->text); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
775 element->text = JOIN_SET(text, JOIN_GET(self->text)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
776 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
777 tail = deepcopy(JOIN_OBJ(self->tail), memo); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
778 if (!tail) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
779 goto error; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
780 Py_DECREF(element->tail); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
781 element->tail = JOIN_SET(tail, JOIN_GET(self->tail)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
782 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
783 if (self->extra) { |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
784 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
785 if (element_resize(element, self->extra->length) < 0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
786 goto error; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
787 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
788 for (i = 0; i < self->extra->length; i++) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
789 PyObject* child = deepcopy(self->extra->children[i], memo); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
790 if (!child) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
791 element->extra->length = i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
792 goto error; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
793 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
794 element->extra->children[i] = child; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
795 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
796 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
797 element->extra->length = self->extra->length; |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
798 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
799 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
800 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
801 /* add object to memo dictionary (so deepcopy won't visit it again) */ |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
802 id = PyLong_FromSsize_t((Py_uintptr_t) self); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
803 if (!id) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
804 goto error; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
805 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
806 i = PyDict_SetItem(memo, id, (PyObject*) element); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
807 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
808 Py_DECREF(id); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
809 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
810 if (i < 0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
811 goto error; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
812 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
813 return (PyObject*) element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
814 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
815 error: |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
816 Py_DECREF(element); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
817 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
818 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
819 |
|
77485
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
820 static PyObject* |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
821 element_sizeof(PyObject* _self, PyObject* args) |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
822 { |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
823 ElementObject *self = (ElementObject*)_self; |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
824 Py_ssize_t result = sizeof(ElementObject); |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
825 if (self->extra) { |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
826 result += sizeof(ElementObjectExtra); |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
827 if (self->extra->children != self->extra->_children) |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
828 result += sizeof(PyObject*) * self->extra->allocated; |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
829 } |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
830 return PyLong_FromSsize_t(result); |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
831 } |
|
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
832 |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
833 /* dict keys for getstate/setstate. */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
834 #define PICKLED_TAG "tag" |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
835 #define PICKLED_CHILDREN "_children" |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
836 #define PICKLED_ATTRIB "attrib" |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
837 #define PICKLED_TAIL "tail" |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
838 #define PICKLED_TEXT "text" |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
839 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
840 /* __getstate__ returns a fabricated instance dict as in the pure-Python |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
841 * Element implementation, for interoperability/interchangeability. This |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
842 * makes the pure-Python implementation details an API, but (a) there aren't |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
843 * any unnecessary structures there; and (b) it buys compatibility with 3.2 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
844 * pickles. See issue #16076. |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
845 */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
846 static PyObject * |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
847 element_getstate(ElementObject *self) |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
848 { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
849 int i, noattrib; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
850 PyObject *instancedict = NULL, *children; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
851 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
852 /* Build a list of children. */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
853 children = PyList_New(self->extra ? self->extra->length : 0); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
854 if (!children) |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
855 return NULL; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
856 for (i = 0; i < PyList_GET_SIZE(children); i++) { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
857 PyObject *child = self->extra->children[i]; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
858 Py_INCREF(child); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
859 PyList_SET_ITEM(children, i, child); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
860 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
861 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
862 /* Construct the state object. */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
863 noattrib = (self->extra == NULL || self->extra->attrib == Py_None); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
864 if (noattrib) |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
865 instancedict = Py_BuildValue("{sOsOs{}sOsO}", |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
866 PICKLED_TAG, self->tag, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
867 PICKLED_CHILDREN, children, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
868 PICKLED_ATTRIB, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
869 PICKLED_TEXT, self->text, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
870 PICKLED_TAIL, self->tail); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
871 else |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
872 instancedict = Py_BuildValue("{sOsOsOsOsO}", |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
873 PICKLED_TAG, self->tag, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
874 PICKLED_CHILDREN, children, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
875 PICKLED_ATTRIB, self->extra->attrib, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
876 PICKLED_TEXT, self->text, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
877 PICKLED_TAIL, self->tail); |
|
81445
5b36768b9a11
Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents:
81363
diff
changeset
|
878 if (instancedict) { |
|
5b36768b9a11
Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents:
81363
diff
changeset
|
879 Py_DECREF(children); |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
880 return instancedict; |
|
81445
5b36768b9a11
Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents:
81363
diff
changeset
|
881 } |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
882 else { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
883 for (i = 0; i < PyList_GET_SIZE(children); i++) |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
884 Py_DECREF(PyList_GET_ITEM(children, i)); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
885 Py_DECREF(children); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
886 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
887 return NULL; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
888 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
889 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
890 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
891 static PyObject * |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
892 element_setstate_from_attributes(ElementObject *self, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
893 PyObject *tag, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
894 PyObject *attrib, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
895 PyObject *text, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
896 PyObject *tail, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
897 PyObject *children) |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
898 { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
899 Py_ssize_t i, nchildren; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
900 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
901 if (!tag) { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
902 PyErr_SetString(PyExc_TypeError, "tag may not be NULL"); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
903 return NULL; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
904 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
905 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
906 Py_CLEAR(self->tag); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
907 self->tag = tag; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
908 Py_INCREF(self->tag); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
909 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
910 Py_CLEAR(self->text); |
|
81445
5b36768b9a11
Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents:
81363
diff
changeset
|
911 self->text = text ? text : Py_None; |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
912 Py_INCREF(self->text); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
913 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
914 Py_CLEAR(self->tail); |
|
81445
5b36768b9a11
Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents:
81363
diff
changeset
|
915 self->tail = tail ? tail : Py_None; |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
916 Py_INCREF(self->tail); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
917 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
918 /* Handle ATTRIB and CHILDREN. */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
919 if (!children && !attrib) |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
920 Py_RETURN_NONE; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
921 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
922 /* Compute 'nchildren'. */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
923 if (children) { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
924 if (!PyList_Check(children)) { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
925 PyErr_SetString(PyExc_TypeError, "'_children' is not a list"); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
926 return NULL; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
927 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
928 nchildren = PyList_Size(children); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
929 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
930 else { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
931 nchildren = 0; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
932 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
933 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
934 /* Allocate 'extra'. */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
935 if (element_resize(self, nchildren)) { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
936 return NULL; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
937 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
938 assert(self->extra && self->extra->allocated >= nchildren); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
939 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
940 /* Copy children */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
941 for (i = 0; i < nchildren; i++) { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
942 self->extra->children[i] = PyList_GET_ITEM(children, i); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
943 Py_INCREF(self->extra->children[i]); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
944 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
945 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
946 self->extra->length = nchildren; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
947 self->extra->allocated = nchildren; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
948 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
949 /* Stash attrib. */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
950 if (attrib) { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
951 Py_CLEAR(self->extra->attrib); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
952 self->extra->attrib = attrib; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
953 Py_INCREF(attrib); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
954 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
955 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
956 Py_RETURN_NONE; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
957 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
958 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
959 /* __setstate__ for Element instance from the Python implementation. |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
960 * 'state' should be the instance dict. |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
961 */ |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
962 static PyObject * |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
963 element_setstate_from_Python(ElementObject *self, PyObject *state) |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
964 { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
965 static char *kwlist[] = {PICKLED_TAG, PICKLED_ATTRIB, PICKLED_TEXT, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
966 PICKLED_TAIL, PICKLED_CHILDREN, 0}; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
967 PyObject *args; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
968 PyObject *tag, *attrib, *text, *tail, *children; |
|
81447
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
969 PyObject *retval; |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
970 |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
971 tag = attrib = text = tail = children = NULL; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
972 args = PyTuple_New(0); |
|
81447
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
973 if (!args) |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
974 return NULL; |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
975 |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
976 if (PyArg_ParseTupleAndKeywords(args, state, "|$OOOOO", kwlist, &tag, |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
977 &attrib, &text, &tail, &children)) |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
978 retval = element_setstate_from_attributes(self, tag, attrib, text, |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
979 tail, children); |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
980 else |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
981 retval = NULL; |
|
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
982 |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
983 Py_DECREF(args); |
|
81447
4501813ea676
Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents:
81445
diff
changeset
|
984 return retval; |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
985 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
986 |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
987 static PyObject * |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
988 element_setstate(ElementObject *self, PyObject *state) |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
989 { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
990 if (!PyDict_CheckExact(state)) { |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
991 PyErr_Format(PyExc_TypeError, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
992 "Don't know how to unpickle \"%.200R\" as an Element", |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
993 state); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
994 return NULL; |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
995 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
996 else |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
997 return element_setstate_from_Python(self, state); |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
998 } |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
999 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1000 LOCAL(int) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1001 checkpath(PyObject* tag) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1002 { |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
1003 Py_ssize_t i; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
1004 int check = 1; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1005 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1006 /* check if a tag contains an xpath character */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1007 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1008 #define PATHCHAR(ch) \ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1009 (ch == '/' || ch == '*' || ch == '[' || ch == '@' || ch == '.') |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1010 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1011 if (PyUnicode_Check(tag)) { |
| 72475 | 1012 const Py_ssize_t len = PyUnicode_GET_LENGTH(tag); |
| 1013 void *data = PyUnicode_DATA(tag); | |
| 1014 unsigned int kind = PyUnicode_KIND(tag); | |
| 1015 for (i = 0; i < len; i++) { | |
| 1016 Py_UCS4 ch = PyUnicode_READ(kind, data, i); | |
| 1017 if (ch == '{') | |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1018 check = 0; |
| 72475 | 1019 else if (ch == '}') |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1020 check = 1; |
| 72475 | 1021 else if (check && PATHCHAR(ch)) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1022 return 1; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1023 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1024 return 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1025 } |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
1026 if (PyBytes_Check(tag)) { |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
1027 char *p = PyBytes_AS_STRING(tag); |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
1028 for (i = 0; i < PyBytes_GET_SIZE(tag); i++) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1029 if (p[i] == '{') |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1030 check = 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1031 else if (p[i] == '}') |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1032 check = 1; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1033 else if (check && PATHCHAR(p[i])) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1034 return 1; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1035 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1036 return 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1037 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1038 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1039 return 1; /* unknown type; might be path expression */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1040 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1041 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1042 static PyObject* |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1043 element_extend(ElementObject* self, PyObject* args) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1044 { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1045 PyObject* seq; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1046 Py_ssize_t i, seqlen = 0; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1047 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1048 PyObject* seq_in; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1049 if (!PyArg_ParseTuple(args, "O:extend", &seq_in)) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1050 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1051 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1052 seq = PySequence_Fast(seq_in, ""); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1053 if (!seq) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1054 PyErr_Format( |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1055 PyExc_TypeError, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1056 "expected sequence, not \"%.200s\"", Py_TYPE(seq_in)->tp_name |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1057 ); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1058 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1059 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1060 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1061 seqlen = PySequence_Size(seq); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1062 for (i = 0; i < seqlen; i++) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1063 PyObject* element = PySequence_Fast_GET_ITEM(seq, i); |
|
75894
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1064 if (!PyObject_IsInstance(element, (PyObject *)&Element_Type)) { |
|
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1065 Py_DECREF(seq); |
|
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1066 PyErr_Format( |
|
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1067 PyExc_TypeError, |
|
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1068 "expected an Element, not \"%.200s\"", |
|
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1069 Py_TYPE(element)->tp_name); |
|
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1070 return NULL; |
|
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1071 } |
|
75268a773455
Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75722
diff
changeset
|
1072 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1073 if (element_add_subelement(self, element) < 0) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1074 Py_DECREF(seq); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1075 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1076 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1077 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1078 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1079 Py_DECREF(seq); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1080 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1081 Py_RETURN_NONE; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1082 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1083 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1084 static PyObject* |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1085 element_find(ElementObject *self, PyObject *args, PyObject *kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1086 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1087 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1088 PyObject* tag; |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1089 PyObject* namespaces = Py_None; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1090 static char *kwlist[] = {"path", "namespaces", 0}; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
1091 elementtreestate *st = ET_STATE_GLOBAL; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1092 |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1093 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:find", kwlist, |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1094 &tag, &namespaces)) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1095 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1096 |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1097 if (checkpath(tag) || namespaces != Py_None) { |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
1098 _Py_IDENTIFIER(find); |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1099 return _PyObject_CallMethodId( |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
1100 st->elementpath_obj, &PyId_find, "OOO", self, tag, namespaces |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1101 ); |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1102 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1103 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1104 if (!self->extra) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1105 Py_RETURN_NONE; |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
1106 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1107 for (i = 0; i < self->extra->length; i++) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1108 PyObject* item = self->extra->children[i]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1109 if (Element_CheckExact(item) && |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48660
diff
changeset
|
1110 PyObject_RichCompareBool(((ElementObject*)item)->tag, tag, Py_EQ) == 1) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1111 Py_INCREF(item); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1112 return item; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1113 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1114 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1115 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1116 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1117 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1118 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1119 static PyObject* |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1120 element_findtext(ElementObject *self, PyObject *args, PyObject *kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1121 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1122 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1123 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1124 PyObject* default_value = Py_None; |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1125 PyObject* namespaces = Py_None; |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
1126 _Py_IDENTIFIER(findtext); |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1127 static char *kwlist[] = {"path", "default", "namespaces", 0}; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
1128 elementtreestate *st = ET_STATE_GLOBAL; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1129 |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1130 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:findtext", kwlist, |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1131 &tag, &default_value, &namespaces)) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1132 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1133 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1134 if (checkpath(tag) || namespaces != Py_None) |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1135 return _PyObject_CallMethodId( |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
1136 st->elementpath_obj, &PyId_findtext, "OOOO", self, tag, default_value, namespaces |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1137 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1138 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1139 if (!self->extra) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1140 Py_INCREF(default_value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1141 return default_value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1142 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1143 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1144 for (i = 0; i < self->extra->length; i++) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1145 ElementObject* item = (ElementObject*) self->extra->children[i]; |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48660
diff
changeset
|
1146 if (Element_CheckExact(item) && (PyObject_RichCompareBool(item->tag, tag, Py_EQ) == 1)) { |
|
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48660
diff
changeset
|
1147 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1148 PyObject* text = element_get_text(item); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1149 if (text == Py_None) |
|
81486
6323e5f1ed81
Issue #16922: fixed findtext() to return empty Unicode string instead of empty bytes object when there's no text.
Eli Bendersky <eliben@gmail.com>
parents:
81485
diff
changeset
|
1150 return PyUnicode_New(0, 0); |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
1151 Py_XINCREF(text); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1152 return text; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1153 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1154 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1155 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1156 Py_INCREF(default_value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1157 return default_value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1158 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1159 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1160 static PyObject* |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1161 element_findall(ElementObject *self, PyObject *args, PyObject *kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1162 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1163 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1164 PyObject* out; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1165 PyObject* tag; |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1166 PyObject* namespaces = Py_None; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1167 static char *kwlist[] = {"path", "namespaces", 0}; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
1168 elementtreestate *st = ET_STATE_GLOBAL; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1169 |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1170 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:findall", kwlist, |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1171 &tag, &namespaces)) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1172 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1173 |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1174 if (checkpath(tag) || namespaces != Py_None) { |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
1175 _Py_IDENTIFIER(findall); |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1176 return _PyObject_CallMethodId( |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
1177 st->elementpath_obj, &PyId_findall, "OOO", self, tag, namespaces |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1178 ); |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1179 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1180 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1181 out = PyList_New(0); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1182 if (!out) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1183 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1184 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1185 if (!self->extra) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1186 return out; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1187 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1188 for (i = 0; i < self->extra->length; i++) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1189 PyObject* item = self->extra->children[i]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1190 if (Element_CheckExact(item) && |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48660
diff
changeset
|
1191 PyObject_RichCompareBool(((ElementObject*)item)->tag, tag, Py_EQ) == 1) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1192 if (PyList_Append(out, item) < 0) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1193 Py_DECREF(out); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1194 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1195 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1196 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1197 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1198 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1199 return out; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1200 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1201 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1202 static PyObject* |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1203 element_iterfind(ElementObject *self, PyObject *args, PyObject *kwds) |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1204 { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1205 PyObject* tag; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1206 PyObject* namespaces = Py_None; |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
1207 _Py_IDENTIFIER(iterfind); |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1208 static char *kwlist[] = {"path", "namespaces", 0}; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
1209 elementtreestate *st = ET_STATE_GLOBAL; |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1210 |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1211 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:iterfind", kwlist, |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1212 &tag, &namespaces)) |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1213 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1214 |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1215 return _PyObject_CallMethodId( |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
1216 st->elementpath_obj, &PyId_iterfind, "OOO", self, tag, namespaces |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1217 ); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1218 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1219 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1220 static PyObject* |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1221 element_get(ElementObject* self, PyObject* args, PyObject* kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1222 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1223 PyObject* value; |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1224 static char* kwlist[] = {"key", "default", 0}; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1225 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1226 PyObject* key; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1227 PyObject* default_value = Py_None; |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1228 |
|
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1229 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:get", kwlist, &key, |
|
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1230 &default_value)) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1231 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1232 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1233 if (!self->extra || self->extra->attrib == Py_None) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1234 value = default_value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1235 else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1236 value = PyDict_GetItem(self->extra->attrib, key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1237 if (!value) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1238 value = default_value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1239 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1240 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1241 Py_INCREF(value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1242 return value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1243 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1244 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1245 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1246 element_getchildren(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1247 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1248 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1249 PyObject* list; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1250 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1251 /* FIXME: report as deprecated? */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1252 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1253 if (!PyArg_ParseTuple(args, ":getchildren")) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1254 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1255 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1256 if (!self->extra) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1257 return PyList_New(0); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1258 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1259 list = PyList_New(self->extra->length); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1260 if (!list) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1261 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1262 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1263 for (i = 0; i < self->extra->length; i++) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1264 PyObject* item = self->extra->children[i]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1265 Py_INCREF(item); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1266 PyList_SET_ITEM(list, i, item); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1267 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1268 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1269 return list; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1270 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1271 |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1272 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1273 static PyObject * |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1274 create_elementiter(ElementObject *self, PyObject *tag, int gettext); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1275 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1276 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1277 static PyObject * |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1278 element_iter(ElementObject *self, PyObject *args, PyObject *kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1279 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1280 PyObject* tag = Py_None; |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1281 static char* kwlist[] = {"tag", 0}; |
|
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1282 |
|
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1283 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:iter", kwlist, &tag)) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1284 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1285 |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1286 return create_elementiter(self, tag, 0); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1287 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1288 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1289 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1290 static PyObject* |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1291 element_itertext(ElementObject* self, PyObject* args) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1292 { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1293 if (!PyArg_ParseTuple(args, ":itertext")) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1294 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1295 |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1296 return create_elementiter(self, Py_None, 1); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1297 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1298 |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1299 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1300 static PyObject* |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
1301 element_getitem(PyObject* self_, Py_ssize_t index) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1302 { |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
1303 ElementObject* self = (ElementObject*) self_; |
|
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
1304 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1305 if (!self->extra || index < 0 || index >= self->extra->length) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1306 PyErr_SetString( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1307 PyExc_IndexError, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1308 "child index out of range" |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1309 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1310 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1311 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1312 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1313 Py_INCREF(self->extra->children[index]); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1314 return self->extra->children[index]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1315 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1316 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1317 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1318 element_insert(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1319 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1320 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1321 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1322 int index; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1323 PyObject* element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1324 if (!PyArg_ParseTuple(args, "iO!:insert", &index, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1325 &Element_Type, &element)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1326 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1327 |
|
84566
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1328 if (!self->extra) { |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1329 if (create_extra(self, NULL) < 0) |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1330 return NULL; |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1331 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1332 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1333 if (index < 0) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1334 index += self->extra->length; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1335 if (index < 0) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1336 index = 0; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1337 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1338 if (index > self->extra->length) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1339 index = self->extra->length; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1340 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1341 if (element_resize(self, 1) < 0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1342 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1343 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1344 for (i = self->extra->length; i > index; i--) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1345 self->extra->children[i] = self->extra->children[i-1]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1346 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1347 Py_INCREF(element); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1348 self->extra->children[index] = element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1349 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1350 self->extra->length++; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1351 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1352 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1353 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1354 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1355 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1356 element_items(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1357 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1358 if (!PyArg_ParseTuple(args, ":items")) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1359 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1360 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1361 if (!self->extra || self->extra->attrib == Py_None) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1362 return PyList_New(0); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1363 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1364 return PyDict_Items(self->extra->attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1365 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1366 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1367 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1368 element_keys(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1369 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1370 if (!PyArg_ParseTuple(args, ":keys")) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1371 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1372 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1373 if (!self->extra || self->extra->attrib == Py_None) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1374 return PyList_New(0); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1375 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1376 return PyDict_Keys(self->extra->attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1377 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1378 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36450
diff
changeset
|
1379 static Py_ssize_t |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1380 element_length(ElementObject* self) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1381 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1382 if (!self->extra) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1383 return 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1384 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1385 return self->extra->length; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1386 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1387 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1388 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1389 element_makeelement(PyObject* self, PyObject* args, PyObject* kw) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1390 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1391 PyObject* elem; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1392 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1393 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1394 PyObject* attrib; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1395 if (!PyArg_ParseTuple(args, "OO:makeelement", &tag, &attrib)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1396 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1397 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1398 attrib = PyDict_Copy(attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1399 if (!attrib) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1400 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1401 |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1402 elem = create_new_element(tag, attrib); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1403 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1404 Py_DECREF(attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1405 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1406 return elem; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1407 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1408 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1409 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1410 element_remove(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1411 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1412 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1413 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1414 PyObject* element; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1415 if (!PyArg_ParseTuple(args, "O!:remove", &Element_Type, &element)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1416 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1417 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1418 if (!self->extra) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1419 /* element has no children, so raise exception */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1420 PyErr_SetString( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1421 PyExc_ValueError, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1422 "list.remove(x): x not in list" |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1423 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1424 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1425 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1426 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1427 for (i = 0; i < self->extra->length; i++) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1428 if (self->extra->children[i] == element) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1429 break; |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48660
diff
changeset
|
1430 if (PyObject_RichCompareBool(self->extra->children[i], element, Py_EQ) == 1) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1431 break; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1432 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1433 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1434 if (i == self->extra->length) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1435 /* element is not in children, so raise exception */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1436 PyErr_SetString( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1437 PyExc_ValueError, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1438 "list.remove(x): x not in list" |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1439 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1440 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1441 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1442 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1443 Py_DECREF(self->extra->children[i]); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1444 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1445 self->extra->length--; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1446 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1447 for (; i < self->extra->length; i++) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1448 self->extra->children[i] = self->extra->children[i+1]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1449 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1450 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1451 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1452 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1453 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1454 element_repr(ElementObject* self) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1455 { |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1456 if (self->tag) |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1457 return PyUnicode_FromFormat("<Element %R at %p>", self->tag, self); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1458 else |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1459 return PyUnicode_FromFormat("<Element at %p>", self); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1460 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1461 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1462 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1463 element_set(ElementObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1464 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1465 PyObject* attrib; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1466 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1467 PyObject* key; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1468 PyObject* value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1469 if (!PyArg_ParseTuple(args, "OO:set", &key, &value)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1470 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1471 |
|
84566
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1472 if (!self->extra) { |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1473 if (create_extra(self, NULL) < 0) |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1474 return NULL; |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1475 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1476 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1477 attrib = element_get_attrib(self); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1478 if (!attrib) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1479 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1480 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1481 if (PyDict_SetItem(attrib, key, value) < 0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1482 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1483 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1484 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1485 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1486 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1487 static int |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
1488 element_setitem(PyObject* self_, Py_ssize_t index, PyObject* item) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1489 { |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
1490 ElementObject* self = (ElementObject*) self_; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1491 int i; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1492 PyObject* old; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1493 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1494 if (!self->extra || index < 0 || index >= self->extra->length) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1495 PyErr_SetString( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1496 PyExc_IndexError, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1497 "child assignment index out of range"); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1498 return -1; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1499 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1500 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1501 old = self->extra->children[index]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1502 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1503 if (item) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1504 Py_INCREF(item); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1505 self->extra->children[index] = item; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1506 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1507 self->extra->length--; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1508 for (i = index; i < self->extra->length; i++) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1509 self->extra->children[i] = self->extra->children[i+1]; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1510 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1511 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1512 Py_DECREF(old); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1513 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1514 return 0; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1515 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1516 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1517 static PyObject* |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1518 element_subscr(PyObject* self_, PyObject* item) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1519 { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1520 ElementObject* self = (ElementObject*) self_; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1521 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1522 if (PyIndex_Check(item)) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1523 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1524 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1525 if (i == -1 && PyErr_Occurred()) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1526 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1527 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1528 if (i < 0 && self->extra) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1529 i += self->extra->length; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1530 return element_getitem(self_, i); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1531 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1532 else if (PySlice_Check(item)) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1533 Py_ssize_t start, stop, step, slicelen, cur, i; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1534 PyObject* list; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1535 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1536 if (!self->extra) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1537 return PyList_New(0); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1538 |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
65707
diff
changeset
|
1539 if (PySlice_GetIndicesEx(item, |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1540 self->extra->length, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1541 &start, &stop, &step, &slicelen) < 0) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1542 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1543 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1544 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1545 if (slicelen <= 0) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1546 return PyList_New(0); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1547 else { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1548 list = PyList_New(slicelen); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1549 if (!list) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1550 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1551 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1552 for (cur = start, i = 0; i < slicelen; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1553 cur += step, i++) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1554 PyObject* item = self->extra->children[cur]; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1555 Py_INCREF(item); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1556 PyList_SET_ITEM(list, i, item); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1557 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1558 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1559 return list; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1560 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1561 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1562 else { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1563 PyErr_SetString(PyExc_TypeError, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1564 "element indices must be integers"); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1565 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1566 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1567 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1568 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1569 static int |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1570 element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1571 { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1572 ElementObject* self = (ElementObject*) self_; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1573 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1574 if (PyIndex_Check(item)) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1575 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1576 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1577 if (i == -1 && PyErr_Occurred()) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1578 return -1; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1579 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1580 if (i < 0 && self->extra) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1581 i += self->extra->length; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1582 return element_setitem(self_, i, value); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1583 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1584 else if (PySlice_Check(item)) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1585 Py_ssize_t start, stop, step, slicelen, newlen, cur, i; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1586 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1587 PyObject* recycle = NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1588 PyObject* seq = NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1589 |
|
84566
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1590 if (!self->extra) { |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1591 if (create_extra(self, NULL) < 0) |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1592 return -1; |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1593 } |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1594 |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
65707
diff
changeset
|
1595 if (PySlice_GetIndicesEx(item, |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1596 self->extra->length, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1597 &start, &stop, &step, &slicelen) < 0) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1598 return -1; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1599 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1600 |
|
75505
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1601 if (value == NULL) { |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1602 /* Delete slice */ |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1603 size_t cur; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1604 Py_ssize_t i; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1605 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1606 if (slicelen <= 0) |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1607 return 0; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1608 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1609 /* Since we're deleting, the direction of the range doesn't matter, |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1610 * so for simplicity make it always ascending. |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1611 */ |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1612 if (step < 0) { |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1613 stop = start + 1; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1614 start = stop + step * (slicelen - 1) - 1; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1615 step = -step; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1616 } |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1617 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1618 assert((size_t)slicelen <= PY_SIZE_MAX / sizeof(PyObject *)); |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1619 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1620 /* recycle is a list that will contain all the children |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1621 * scheduled for removal. |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1622 */ |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1623 if (!(recycle = PyList_New(slicelen))) { |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1624 PyErr_NoMemory(); |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1625 return -1; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1626 } |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1627 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1628 /* This loop walks over all the children that have to be deleted, |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1629 * with cur pointing at them. num_moved is the amount of children |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1630 * until the next deleted child that have to be "shifted down" to |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1631 * occupy the deleted's places. |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1632 * Note that in the ith iteration, shifting is done i+i places down |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1633 * because i children were already removed. |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1634 */ |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1635 for (cur = start, i = 0; cur < (size_t)stop; cur += step, ++i) { |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1636 /* Compute how many children have to be moved, clipping at the |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1637 * list end. |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1638 */ |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1639 Py_ssize_t num_moved = step - 1; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1640 if (cur + step >= (size_t)self->extra->length) { |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1641 num_moved = self->extra->length - cur - 1; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1642 } |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1643 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1644 PyList_SET_ITEM(recycle, i, self->extra->children[cur]); |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1645 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1646 memmove( |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1647 self->extra->children + cur - i, |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1648 self->extra->children + cur + 1, |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1649 num_moved * sizeof(PyObject *)); |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1650 } |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1651 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1652 /* Leftover "tail" after the last removed child */ |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1653 cur = start + (size_t)slicelen * step; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1654 if (cur < (size_t)self->extra->length) { |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1655 memmove( |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1656 self->extra->children + cur - slicelen, |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1657 self->extra->children + cur, |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1658 (self->extra->length - cur) * sizeof(PyObject *)); |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1659 } |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1660 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1661 self->extra->length -= slicelen; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1662 |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1663 /* Discard the recycle list with all the deleted sub-elements */ |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1664 Py_XDECREF(recycle); |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1665 return 0; |
|
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1666 } |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1667 else { |
|
75505
1a721b9a4039
Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents:
75410
diff
changeset
|
1668 /* A new slice is actually being assigned */ |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1669 seq = PySequence_Fast(value, ""); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1670 if (!seq) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1671 PyErr_Format( |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1672 PyExc_TypeError, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1673 "expected sequence, not \"%.200s\"", Py_TYPE(value)->tp_name |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1674 ); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1675 return -1; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1676 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1677 newlen = PySequence_Size(seq); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1678 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1679 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1680 if (step != 1 && newlen != slicelen) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1681 { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1682 PyErr_Format(PyExc_ValueError, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1683 "attempt to assign sequence of size %zd " |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1684 "to extended slice of size %zd", |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1685 newlen, slicelen |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1686 ); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1687 return -1; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1688 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1689 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1690 /* Resize before creating the recycle bin, to prevent refleaks. */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1691 if (newlen > slicelen) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1692 if (element_resize(self, newlen - slicelen) < 0) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1693 if (seq) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1694 Py_DECREF(seq); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1695 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1696 return -1; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1697 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1698 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1699 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1700 if (slicelen > 0) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1701 /* to avoid recursive calls to this method (via decref), move |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1702 old items to the recycle bin here, and get rid of them when |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1703 we're done modifying the element */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1704 recycle = PyList_New(slicelen); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1705 if (!recycle) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1706 if (seq) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1707 Py_DECREF(seq); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1708 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1709 return -1; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1710 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1711 for (cur = start, i = 0; i < slicelen; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1712 cur += step, i++) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1713 PyList_SET_ITEM(recycle, i, self->extra->children[cur]); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1714 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1715 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1716 if (newlen < slicelen) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1717 /* delete slice */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1718 for (i = stop; i < self->extra->length; i++) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1719 self->extra->children[i + newlen - slicelen] = self->extra->children[i]; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1720 } else if (newlen > slicelen) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1721 /* insert slice */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1722 for (i = self->extra->length-1; i >= stop; i--) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1723 self->extra->children[i + newlen - slicelen] = self->extra->children[i]; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1724 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1725 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1726 /* replace the slice */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1727 for (cur = start, i = 0; i < newlen; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1728 cur += step, i++) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1729 PyObject* element = PySequence_Fast_GET_ITEM(seq, i); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1730 Py_INCREF(element); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1731 self->extra->children[cur] = element; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1732 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1733 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1734 self->extra->length += newlen - slicelen; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1735 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1736 if (seq) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1737 Py_DECREF(seq); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1738 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1739 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1740 /* discard the recycle bin, and everything in it */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1741 Py_XDECREF(recycle); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1742 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1743 return 0; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1744 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1745 else { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1746 PyErr_SetString(PyExc_TypeError, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1747 "element indices must be integers"); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1748 return -1; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1749 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1750 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1751 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1752 static PyMethodDef element_methods[] = { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1753 |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
1754 {"clear", (PyCFunction) element_clearmethod, METH_VARARGS}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1755 |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1756 {"get", (PyCFunction) element_get, METH_VARARGS | METH_KEYWORDS}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1757 {"set", (PyCFunction) element_set, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1758 |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1759 {"find", (PyCFunction) element_find, METH_VARARGS | METH_KEYWORDS}, |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1760 {"findtext", (PyCFunction) element_findtext, METH_VARARGS | METH_KEYWORDS}, |
|
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1761 {"findall", (PyCFunction) element_findall, METH_VARARGS | METH_KEYWORDS}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1762 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1763 {"append", (PyCFunction) element_append, METH_VARARGS}, |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1764 {"extend", (PyCFunction) element_extend, METH_VARARGS}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1765 {"insert", (PyCFunction) element_insert, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1766 {"remove", (PyCFunction) element_remove, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1767 |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1768 {"iter", (PyCFunction) element_iter, METH_VARARGS | METH_KEYWORDS}, |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1769 {"itertext", (PyCFunction) element_itertext, METH_VARARGS}, |
|
77217
7d252dbfbee3
Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77062
diff
changeset
|
1770 {"iterfind", (PyCFunction) element_iterfind, METH_VARARGS | METH_KEYWORDS}, |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1771 |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
1772 {"getiterator", (PyCFunction) element_iter, METH_VARARGS | METH_KEYWORDS}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1773 {"getchildren", (PyCFunction) element_getchildren, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1774 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1775 {"items", (PyCFunction) element_items, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1776 {"keys", (PyCFunction) element_keys, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1777 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1778 {"makeelement", (PyCFunction) element_makeelement, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1779 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1780 {"__copy__", (PyCFunction) element_copy, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1781 {"__deepcopy__", (PyCFunction) element_deepcopy, METH_VARARGS}, |
|
77485
093dec81ea1f
Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents:
77432
diff
changeset
|
1782 {"__sizeof__", element_sizeof, METH_NOARGS}, |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
1783 {"__getstate__", (PyCFunction)element_getstate, METH_NOARGS}, |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
1784 {"__setstate__", (PyCFunction)element_setstate, METH_O}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1785 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1786 {NULL, NULL} |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1787 }; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1788 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1789 static PyObject* |
|
48414
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
1790 element_getattro(ElementObject* self, PyObject* nameobj) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1791 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1792 PyObject* res; |
|
48414
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
1793 char *name = ""; |
|
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
1794 |
|
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
1795 if (PyUnicode_Check(nameobj)) |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1796 name = _PyUnicode_AsString(nameobj); |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
1797 |
|
66799
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
1798 if (name == NULL) |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
1799 return NULL; |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1800 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1801 /* handle common attributes first */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1802 if (strcmp(name, "tag") == 0) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1803 res = self->tag; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1804 Py_INCREF(res); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1805 return res; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1806 } else if (strcmp(name, "text") == 0) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1807 res = element_get_text(self); |
|
84568
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
1808 Py_XINCREF(res); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1809 return res; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1810 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1811 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1812 /* methods */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1813 res = PyObject_GenericGetAttr((PyObject*) self, nameobj); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1814 if (res) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1815 return res; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1816 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1817 /* less common attributes */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1818 if (strcmp(name, "tail") == 0) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1819 PyErr_Clear(); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1820 res = element_get_tail(self); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1821 } else if (strcmp(name, "attrib") == 0) { |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1822 PyErr_Clear(); |
|
84566
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1823 if (!self->extra) { |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1824 if (create_extra(self, NULL) < 0) |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1825 return NULL; |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1826 } |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1827 res = element_get_attrib(self); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1828 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1829 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1830 if (!res) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1831 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1832 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1833 Py_INCREF(res); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1834 return res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1835 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1836 |
|
83824
9682241dc8fc
Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents:
83492
diff
changeset
|
1837 static int |
|
77062
41a9d24d075e
Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents:
76110
diff
changeset
|
1838 element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1839 { |
|
77062
41a9d24d075e
Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents:
76110
diff
changeset
|
1840 char *name = ""; |
|
41a9d24d075e
Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents:
76110
diff
changeset
|
1841 if (PyUnicode_Check(nameobj)) |
|
41a9d24d075e
Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents:
76110
diff
changeset
|
1842 name = _PyUnicode_AsString(nameobj); |
|
84567
e1b398d0decb
Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84566
diff
changeset
|
1843 if (name == NULL) |
|
83824
9682241dc8fc
Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents:
83492
diff
changeset
|
1844 return -1; |
|
84567
e1b398d0decb
Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84566
diff
changeset
|
1845 |
|
e1b398d0decb
Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84566
diff
changeset
|
1846 if (strcmp(name, "tag") == 0) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1847 Py_DECREF(self->tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1848 self->tag = value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1849 Py_INCREF(self->tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1850 } else if (strcmp(name, "text") == 0) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1851 Py_DECREF(JOIN_OBJ(self->text)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1852 self->text = value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1853 Py_INCREF(self->text); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1854 } else if (strcmp(name, "tail") == 0) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1855 Py_DECREF(JOIN_OBJ(self->tail)); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1856 self->tail = value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1857 Py_INCREF(self->tail); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1858 } else if (strcmp(name, "attrib") == 0) { |
|
84566
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1859 if (!self->extra) { |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1860 if (create_extra(self, NULL) < 0) |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1861 return -1; |
|
e11121b9bd09
Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
83920
diff
changeset
|
1862 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1863 Py_DECREF(self->extra->attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1864 self->extra->attrib = value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1865 Py_INCREF(self->extra->attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1866 } else { |
|
83824
9682241dc8fc
Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents:
83492
diff
changeset
|
1867 PyErr_SetString(PyExc_AttributeError, |
|
83849
65680e3a7f07
Issue #17989: fix typo in error message
Eli Bendersky <eliben@gmail.com>
parents:
83833
diff
changeset
|
1868 "Can't set arbitrary attributes on Element"); |
|
83824
9682241dc8fc
Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents:
83492
diff
changeset
|
1869 return -1; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1870 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1871 |
|
83824
9682241dc8fc
Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents:
83492
diff
changeset
|
1872 return 0; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1873 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1874 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1875 static PySequenceMethods element_as_sequence = { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36450
diff
changeset
|
1876 (lenfunc) element_length, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1877 0, /* sq_concat */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1878 0, /* sq_repeat */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36450
diff
changeset
|
1879 element_getitem, |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1880 0, |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36450
diff
changeset
|
1881 element_setitem, |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1882 0, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1883 }; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1884 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1885 static PyMappingMethods element_as_mapping = { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1886 (lenfunc) element_length, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1887 (binaryfunc) element_subscr, |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
1888 (objobjargproc) element_ass_subscr, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1889 }; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1890 |
|
37144
91dd4d44d3bc
Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents:
36954
diff
changeset
|
1891 static PyTypeObject Element_Type = { |
|
42334
e70cdce0e8b2
Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41782
diff
changeset
|
1892 PyVarObject_HEAD_INIT(NULL, 0) |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
1893 "xml.etree.ElementTree.Element", sizeof(ElementObject), 0, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1894 /* methods */ |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1895 (destructor)element_dealloc, /* tp_dealloc */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1896 0, /* tp_print */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1897 0, /* tp_getattr */ |
|
77062
41a9d24d075e
Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents:
76110
diff
changeset
|
1898 0, /* tp_setattr */ |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1899 0, /* tp_reserved */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1900 (reprfunc)element_repr, /* tp_repr */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1901 0, /* tp_as_number */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1902 &element_as_sequence, /* tp_as_sequence */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1903 &element_as_mapping, /* tp_as_mapping */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1904 0, /* tp_hash */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1905 0, /* tp_call */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1906 0, /* tp_str */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1907 (getattrofunc)element_getattro, /* tp_getattro */ |
|
77062
41a9d24d075e
Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents:
76110
diff
changeset
|
1908 (setattrofunc)element_setattro, /* tp_setattro */ |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1909 0, /* tp_as_buffer */ |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
1910 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
1911 /* tp_flags */ |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1912 0, /* tp_doc */ |
|
75997
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
1913 (traverseproc)element_gc_traverse, /* tp_traverse */ |
|
0ca32013d77e
Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents:
75894
diff
changeset
|
1914 (inquiry)element_gc_clear, /* tp_clear */ |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1915 0, /* tp_richcompare */ |
|
76098
14abfa27ff19
Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents:
75997
diff
changeset
|
1916 offsetof(ElementObject, weakreflist), /* tp_weaklistoffset */ |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1917 0, /* tp_iter */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1918 0, /* tp_iternext */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1919 element_methods, /* tp_methods */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1920 0, /* tp_members */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1921 0, /* tp_getset */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1922 0, /* tp_base */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1923 0, /* tp_dict */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1924 0, /* tp_descr_get */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1925 0, /* tp_descr_set */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1926 0, /* tp_dictoffset */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1927 (initproc)element_init, /* tp_init */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1928 PyType_GenericAlloc, /* tp_alloc */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1929 element_new, /* tp_new */ |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
1930 0, /* tp_free */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1931 }; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
1932 |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1933 /******************************* Element iterator ****************************/ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1934 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1935 /* ElementIterObject represents the iteration state over an XML element in |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1936 * pre-order traversal. To keep track of which sub-element should be returned |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1937 * next, a stack of parents is maintained. This is a standard stack-based |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1938 * iterative pre-order traversal of a tree. |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1939 * The stack is managed using a single-linked list starting at parent_stack. |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1940 * Each stack node contains the saved parent to which we should return after |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1941 * the current one is exhausted, and the next child to examine in that parent. |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1942 */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1943 typedef struct ParentLocator_t { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1944 ElementObject *parent; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1945 Py_ssize_t child_index; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1946 struct ParentLocator_t *next; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1947 } ParentLocator; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1948 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1949 typedef struct { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1950 PyObject_HEAD |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1951 ParentLocator *parent_stack; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1952 ElementObject *root_element; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1953 PyObject *sought_tag; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1954 int root_done; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1955 int gettext; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1956 } ElementIterObject; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1957 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1958 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1959 static void |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1960 elementiter_dealloc(ElementIterObject *it) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1961 { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1962 ParentLocator *p = it->parent_stack; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1963 while (p) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1964 ParentLocator *temp = p; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1965 Py_XDECREF(p->parent); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1966 p = p->next; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1967 PyObject_Free(temp); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1968 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1969 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1970 Py_XDECREF(it->sought_tag); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1971 Py_XDECREF(it->root_element); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1972 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1973 PyObject_GC_UnTrack(it); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1974 PyObject_GC_Del(it); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1975 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1976 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1977 static int |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1978 elementiter_traverse(ElementIterObject *it, visitproc visit, void *arg) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1979 { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1980 ParentLocator *p = it->parent_stack; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1981 while (p) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1982 Py_VISIT(p->parent); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1983 p = p->next; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1984 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1985 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1986 Py_VISIT(it->root_element); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1987 Py_VISIT(it->sought_tag); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1988 return 0; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1989 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1990 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1991 /* Helper function for elementiter_next. Add a new parent to the parent stack. |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1992 */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1993 static ParentLocator * |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1994 parent_stack_push_new(ParentLocator *stack, ElementObject *parent) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1995 { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1996 ParentLocator *new_node = PyObject_Malloc(sizeof(ParentLocator)); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1997 if (new_node) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1998 new_node->parent = parent; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
1999 Py_INCREF(parent); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2000 new_node->child_index = 0; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2001 new_node->next = stack; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2002 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2003 return new_node; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2004 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2005 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2006 static PyObject * |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2007 elementiter_next(ElementIterObject *it) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2008 { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2009 /* Sub-element iterator. |
|
81479
7e072816b197
Clean trailing whitespace in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents:
81447
diff
changeset
|
2010 * |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2011 * A short note on gettext: this function serves both the iter() and |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2012 * itertext() methods to avoid code duplication. However, there are a few |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2013 * small differences in the way these iterations work. Namely: |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2014 * - itertext() only yields text from nodes that have it, and continues |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2015 * iterating when a node doesn't have text (so it doesn't return any |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2016 * node like iter()) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2017 * - itertext() also has to handle tail, after finishing with all the |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2018 * children of a node. |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2019 */ |
|
77432
3c089edbf02c
Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents:
77431
diff
changeset
|
2020 ElementObject *cur_parent; |
|
3c089edbf02c
Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents:
77431
diff
changeset
|
2021 Py_ssize_t child_index; |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2022 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2023 while (1) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2024 /* Handle the case reached in the beginning and end of iteration, where |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2025 * the parent stack is empty. The root_done flag gives us indication |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2026 * whether we've just started iterating (so root_done is 0), in which |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2027 * case the root is returned. If root_done is 1 and we're here, the |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2028 * iterator is exhausted. |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2029 */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2030 if (!it->parent_stack->parent) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2031 if (it->root_done) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2032 PyErr_SetNone(PyExc_StopIteration); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2033 return NULL; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2034 } else { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2035 it->parent_stack = parent_stack_push_new(it->parent_stack, |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2036 it->root_element); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2037 if (!it->parent_stack) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2038 PyErr_NoMemory(); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2039 return NULL; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2040 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2041 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2042 it->root_done = 1; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2043 if (it->sought_tag == Py_None || |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2044 PyObject_RichCompareBool(it->root_element->tag, |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2045 it->sought_tag, Py_EQ) == 1) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2046 if (it->gettext) { |
|
81363
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2047 PyObject *text = element_get_text(it->root_element); |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2048 if (!text) |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2049 return NULL; |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2050 if (PyObject_IsTrue(text)) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2051 Py_INCREF(text); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2052 return text; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2053 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2054 } else { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2055 Py_INCREF(it->root_element); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2056 return (PyObject *)it->root_element; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2057 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2058 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2059 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2060 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2061 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2062 /* See if there are children left to traverse in the current parent. If |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2063 * yes, visit the next child. If not, pop the stack and try again. |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2064 */ |
|
77432
3c089edbf02c
Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents:
77431
diff
changeset
|
2065 cur_parent = it->parent_stack->parent; |
|
3c089edbf02c
Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents:
77431
diff
changeset
|
2066 child_index = it->parent_stack->child_index; |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2067 if (cur_parent->extra && child_index < cur_parent->extra->length) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2068 ElementObject *child = (ElementObject *) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2069 cur_parent->extra->children[child_index]; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2070 it->parent_stack->child_index++; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2071 it->parent_stack = parent_stack_push_new(it->parent_stack, |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2072 child); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2073 if (!it->parent_stack) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2074 PyErr_NoMemory(); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2075 return NULL; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2076 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2077 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2078 if (it->gettext) { |
|
81363
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2079 PyObject *text = element_get_text(child); |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2080 if (!text) |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2081 return NULL; |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2082 if (PyObject_IsTrue(text)) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2083 Py_INCREF(text); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2084 return text; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2085 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2086 } else if (it->sought_tag == Py_None || |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2087 PyObject_RichCompareBool(child->tag, |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2088 it->sought_tag, Py_EQ) == 1) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2089 Py_INCREF(child); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2090 return (PyObject *)child; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2091 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2092 else |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2093 continue; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2094 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2095 else { |
|
81363
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2096 PyObject *tail; |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2097 ParentLocator *next = it->parent_stack->next; |
|
81363
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2098 if (it->gettext) { |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2099 tail = element_get_tail(cur_parent); |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2100 if (!tail) |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2101 return NULL; |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2102 } |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2103 else |
|
d965ff47cf94
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents:
81359
diff
changeset
|
2104 tail = Py_None; |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2105 Py_XDECREF(it->parent_stack->parent); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2106 PyObject_Free(it->parent_stack); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2107 it->parent_stack = next; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2108 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2109 /* Note that extra condition on it->parent_stack->parent here; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2110 * this is because itertext() is supposed to only return *inner* |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2111 * text, not text following the element it began iteration with. |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2112 */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2113 if (it->parent_stack->parent && PyObject_IsTrue(tail)) { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2114 Py_INCREF(tail); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2115 return tail; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2116 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2117 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2118 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2119 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2120 return NULL; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2121 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2122 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2123 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2124 static PyTypeObject ElementIter_Type = { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2125 PyVarObject_HEAD_INIT(NULL, 0) |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
2126 /* Using the module's name since the pure-Python implementation does not |
|
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
2127 have such a type. */ |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2128 "_elementtree._element_iterator", /* tp_name */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2129 sizeof(ElementIterObject), /* tp_basicsize */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2130 0, /* tp_itemsize */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2131 /* methods */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2132 (destructor)elementiter_dealloc, /* tp_dealloc */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2133 0, /* tp_print */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2134 0, /* tp_getattr */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2135 0, /* tp_setattr */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2136 0, /* tp_reserved */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2137 0, /* tp_repr */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2138 0, /* tp_as_number */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2139 0, /* tp_as_sequence */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2140 0, /* tp_as_mapping */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2141 0, /* tp_hash */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2142 0, /* tp_call */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2143 0, /* tp_str */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2144 0, /* tp_getattro */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2145 0, /* tp_setattro */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2146 0, /* tp_as_buffer */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2147 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2148 0, /* tp_doc */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2149 (traverseproc)elementiter_traverse, /* tp_traverse */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2150 0, /* tp_clear */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2151 0, /* tp_richcompare */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2152 0, /* tp_weaklistoffset */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2153 PyObject_SelfIter, /* tp_iter */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2154 (iternextfunc)elementiter_next, /* tp_iternext */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2155 0, /* tp_methods */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2156 0, /* tp_members */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2157 0, /* tp_getset */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2158 0, /* tp_base */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2159 0, /* tp_dict */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2160 0, /* tp_descr_get */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2161 0, /* tp_descr_set */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2162 0, /* tp_dictoffset */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2163 0, /* tp_init */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2164 0, /* tp_alloc */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2165 0, /* tp_new */ |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2166 }; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2167 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2168 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2169 static PyObject * |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2170 create_elementiter(ElementObject *self, PyObject *tag, int gettext) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2171 { |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2172 ElementIterObject *it; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2173 PyObject *star = NULL; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2174 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2175 it = PyObject_GC_New(ElementIterObject, &ElementIter_Type); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2176 if (!it) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2177 return NULL; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2178 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2179 if (PyUnicode_Check(tag)) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2180 star = PyUnicode_FromString("*"); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2181 else if (PyBytes_Check(tag)) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2182 star = PyBytes_FromString("*"); |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2183 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2184 if (star && PyObject_RichCompareBool(tag, star, Py_EQ) == 1) |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2185 tag = Py_None; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2186 Py_XDECREF(star); |
|
84567
e1b398d0decb
Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84566
diff
changeset
|
2187 |
|
e1b398d0decb
Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84566
diff
changeset
|
2188 Py_INCREF(tag); |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2189 it->sought_tag = tag; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2190 it->root_done = 0; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2191 it->gettext = gettext; |
|
84567
e1b398d0decb
Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84566
diff
changeset
|
2192 Py_INCREF(self); |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2193 it->root_element = self; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2194 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2195 PyObject_GC_Track(it); |
|
84581
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2196 |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2197 it->parent_stack = PyObject_Malloc(sizeof(ParentLocator)); |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2198 if (it->parent_stack == NULL) { |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2199 Py_DECREF(it); |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2200 PyErr_NoMemory(); |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2201 return NULL; |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2202 } |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2203 it->parent_stack->parent = NULL; |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2204 it->parent_stack->child_index = 0; |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2205 it->parent_stack->next = NULL; |
|
1e0afd558ba3
Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents:
84580
diff
changeset
|
2206 |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2207 return (PyObject *)it; |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2208 } |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2209 |
|
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
2210 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2211 /* ==================================================================== */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2212 /* the tree builder type */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2213 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2214 typedef struct { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2215 PyObject_HEAD |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2216 |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2217 PyObject *root; /* root node (first created node) */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2218 |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2219 PyObject *this; /* current node */ |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2220 PyObject *last; /* most recently created node */ |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2221 |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2222 PyObject *data; /* data collector (string or list), or NULL */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2223 |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2224 PyObject *stack; /* element stack */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2225 Py_ssize_t index; /* current stack size (0 means empty) */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2226 |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2227 PyObject *element_factory; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2228 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2229 /* element tracing */ |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2230 PyObject *events; /* list of events, or NULL if not collecting */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2231 PyObject *start_event_obj; /* event objects (NULL to ignore) */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2232 PyObject *end_event_obj; |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2233 PyObject *start_ns_event_obj; |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2234 PyObject *end_ns_event_obj; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2235 } TreeBuilderObject; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2236 |
|
44351
86a2679dca46
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
2237 #define TreeBuilder_CheckExact(op) (Py_TYPE(op) == &TreeBuilder_Type) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2238 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2239 /* -------------------------------------------------------------------- */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2240 /* constructor and destructor */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2241 |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2242 static PyObject * |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2243 treebuilder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2244 { |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2245 TreeBuilderObject *t = (TreeBuilderObject *)type->tp_alloc(type, 0); |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2246 if (t != NULL) { |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2247 t->root = NULL; |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2248 |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2249 Py_INCREF(Py_None); |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2250 t->this = Py_None; |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2251 Py_INCREF(Py_None); |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2252 t->last = Py_None; |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2253 |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2254 t->data = NULL; |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2255 t->element_factory = NULL; |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2256 t->stack = PyList_New(20); |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2257 if (!t->stack) { |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2258 Py_DECREF(t->this); |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2259 Py_DECREF(t->last); |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2260 Py_DECREF((PyObject *) t); |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2261 return NULL; |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2262 } |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2263 t->index = 0; |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2264 |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2265 t->events = NULL; |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2266 t->start_event_obj = t->end_event_obj = NULL; |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2267 t->start_ns_event_obj = t->end_ns_event_obj = NULL; |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2268 } |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2269 return (PyObject *)t; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2270 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2271 |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2272 static int |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2273 treebuilder_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2274 { |
|
77313
eb1d633fe307
Fix unterminated keyword array passed to PyArg_ParseTupleAndKeywords
Eli Bendersky <eliben@gmail.com>
parents:
77279
diff
changeset
|
2275 static char *kwlist[] = {"element_factory", 0}; |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2276 PyObject *element_factory = NULL; |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2277 TreeBuilderObject *self_tb = (TreeBuilderObject *)self; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2278 PyObject *tmp; |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2279 |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2280 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:TreeBuilder", kwlist, |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2281 &element_factory)) { |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2282 return -1; |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2283 } |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2284 |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2285 if (element_factory) { |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2286 Py_INCREF(element_factory); |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2287 tmp = self_tb->element_factory; |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2288 self_tb->element_factory = element_factory; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2289 Py_XDECREF(tmp); |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2290 } |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2291 |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2292 return 0; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2293 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2294 |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2295 static int |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2296 treebuilder_gc_traverse(TreeBuilderObject *self, visitproc visit, void *arg) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2297 { |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2298 Py_VISIT(self->root); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2299 Py_VISIT(self->this); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2300 Py_VISIT(self->last); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2301 Py_VISIT(self->data); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2302 Py_VISIT(self->stack); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2303 Py_VISIT(self->element_factory); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2304 return 0; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2305 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2306 |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2307 static int |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2308 treebuilder_gc_clear(TreeBuilderObject *self) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2309 { |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2310 Py_CLEAR(self->end_ns_event_obj); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2311 Py_CLEAR(self->start_ns_event_obj); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2312 Py_CLEAR(self->end_event_obj); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2313 Py_CLEAR(self->start_event_obj); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2314 Py_CLEAR(self->events); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2315 Py_CLEAR(self->stack); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2316 Py_CLEAR(self->data); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2317 Py_CLEAR(self->last); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2318 Py_CLEAR(self->this); |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2319 Py_CLEAR(self->element_factory); |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2320 Py_CLEAR(self->root); |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2321 return 0; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2322 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2323 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2324 static void |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2325 treebuilder_dealloc(TreeBuilderObject *self) |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2326 { |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2327 PyObject_GC_UnTrack(self); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2328 treebuilder_gc_clear(self); |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2329 Py_TYPE(self)->tp_free((PyObject *)self); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2330 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2331 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2332 /* -------------------------------------------------------------------- */ |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2333 /* helpers for handling of arbitrary element-like objects */ |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2334 |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2335 static int |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2336 treebuilder_set_element_text_or_tail(PyObject *element, PyObject *data, |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2337 PyObject **dest, _Py_Identifier *name) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2338 { |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2339 if (Element_CheckExact(element)) { |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2340 Py_DECREF(JOIN_OBJ(*dest)); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2341 *dest = JOIN_SET(data, PyList_CheckExact(data)); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2342 return 0; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2343 } |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2344 else { |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2345 PyObject *joined = list_join(data); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2346 int r; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2347 if (joined == NULL) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2348 return -1; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2349 r = _PyObject_SetAttrId(element, name, joined); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2350 Py_DECREF(joined); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2351 return r; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2352 } |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2353 } |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2354 |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2355 /* These two functions steal a reference to data */ |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2356 static int |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2357 treebuilder_set_element_text(PyObject *element, PyObject *data) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2358 { |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2359 _Py_IDENTIFIER(text); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2360 return treebuilder_set_element_text_or_tail( |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2361 element, data, &((ElementObject *) element)->text, &PyId_text); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2362 } |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2363 |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2364 static int |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2365 treebuilder_set_element_tail(PyObject *element, PyObject *data) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2366 { |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2367 _Py_IDENTIFIER(tail); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2368 return treebuilder_set_element_text_or_tail( |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2369 element, data, &((ElementObject *) element)->tail, &PyId_tail); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2370 } |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2371 |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2372 static int |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2373 treebuilder_add_subelement(PyObject *element, PyObject *child) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2374 { |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2375 _Py_IDENTIFIER(append); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2376 if (Element_CheckExact(element)) { |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2377 ElementObject *elem = (ElementObject *) element; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2378 return element_add_subelement(elem, child); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2379 } |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2380 else { |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2381 PyObject *res; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2382 res = _PyObject_CallMethodId(element, &PyId_append, "O", child); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2383 if (res == NULL) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2384 return -1; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2385 Py_DECREF(res); |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2386 return 0; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2387 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2388 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2389 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2390 /* -------------------------------------------------------------------- */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2391 /* handlers */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2392 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2393 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2394 treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2395 PyObject* attrib) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2396 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2397 PyObject* node; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2398 PyObject* this; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2399 elementtreestate *st = ET_STATE_GLOBAL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2400 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2401 if (self->data) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2402 if (self->this == self->last) { |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2403 if (treebuilder_set_element_text(self->last, self->data)) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2404 return NULL; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2405 } |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2406 else { |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2407 if (treebuilder_set_element_tail(self->last, self->data)) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2408 return NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2409 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2410 self->data = NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2411 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2412 |
|
83833
c430bea30457
Issue #17901: fix TreeBuilder construction for an explicit element_factory=None
Eli Bendersky <eliben@gmail.com>
parents:
83824
diff
changeset
|
2413 if (self->element_factory && self->element_factory != Py_None) { |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2414 node = PyObject_CallFunction(self->element_factory, "OO", tag, attrib); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2415 } else { |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2416 node = create_new_element(tag, attrib); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2417 } |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2418 if (!node) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2419 return NULL; |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2420 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2421 |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2422 this = self->this; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2423 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2424 if (this != Py_None) { |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2425 if (treebuilder_add_subelement(this, node) < 0) |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2426 goto error; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2427 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2428 if (self->root) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2429 PyErr_SetString( |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2430 st->parseerror_obj, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2431 "multiple elements on top level" |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2432 ); |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2433 goto error; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2434 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2435 Py_INCREF(node); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2436 self->root = node; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2437 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2438 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2439 if (self->index < PyList_GET_SIZE(self->stack)) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2440 if (PyList_SetItem(self->stack, self->index, this) < 0) |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2441 goto error; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2442 Py_INCREF(this); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2443 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2444 if (PyList_Append(self->stack, this) < 0) |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2445 goto error; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2446 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2447 self->index++; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2448 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2449 Py_DECREF(this); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2450 Py_INCREF(node); |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2451 self->this = node; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2452 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2453 Py_DECREF(self->last); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2454 Py_INCREF(node); |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2455 self->last = node; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2456 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2457 if (self->start_event_obj) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2458 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2459 PyObject* action = self->start_event_obj; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2460 res = PyTuple_Pack(2, action, node); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2461 if (res) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2462 PyList_Append(self->events, res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2463 Py_DECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2464 } else |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2465 PyErr_Clear(); /* FIXME: propagate error */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2466 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2467 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2468 return node; |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2469 |
|
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2470 error: |
|
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2471 Py_DECREF(node); |
|
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2472 return NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2473 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2474 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2475 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2476 treebuilder_handle_data(TreeBuilderObject* self, PyObject* data) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2477 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2478 if (!self->data) { |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2479 if (self->last == Py_None) { |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
2480 /* ignore calls to data before the first call to start */ |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
2481 Py_RETURN_NONE; |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
2482 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2483 /* store the first item as is */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2484 Py_INCREF(data); self->data = data; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2485 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2486 /* more than one item; use a list to collect items */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2487 if (PyBytes_CheckExact(self->data) && Py_REFCNT(self->data) == 1 && |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2488 PyBytes_CheckExact(data) && PyBytes_GET_SIZE(data) == 1) { |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2489 /* XXX this code path unused in Python 3? */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2490 /* expat often generates single character data sections; handle |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2491 the most common case by resizing the existing string... */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2492 Py_ssize_t size = PyBytes_GET_SIZE(self->data); |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2493 if (_PyBytes_Resize(&self->data, size + 1) < 0) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2494 return NULL; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2495 PyBytes_AS_STRING(self->data)[size] = PyBytes_AS_STRING(data)[0]; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2496 } else if (PyList_CheckExact(self->data)) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2497 if (PyList_Append(self->data, data) < 0) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2498 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2499 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2500 PyObject* list = PyList_New(2); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2501 if (!list) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2502 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2503 PyList_SET_ITEM(list, 0, self->data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2504 Py_INCREF(data); PyList_SET_ITEM(list, 1, data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2505 self->data = list; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2506 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2507 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2508 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2509 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2510 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2511 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2512 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2513 treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2514 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2515 PyObject* item; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2516 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2517 if (self->data) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2518 if (self->this == self->last) { |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2519 if (treebuilder_set_element_text(self->last, self->data)) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2520 return NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2521 } else { |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2522 if (treebuilder_set_element_tail(self->last, self->data)) |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2523 return NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2524 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2525 self->data = NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2526 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2527 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2528 if (self->index == 0) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2529 PyErr_SetString( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2530 PyExc_IndexError, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2531 "pop from empty stack" |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2532 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2533 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2534 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2535 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2536 self->index--; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2537 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2538 item = PyList_GET_ITEM(self->stack, self->index); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2539 Py_INCREF(item); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2540 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2541 Py_DECREF(self->last); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2542 |
|
79460
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2543 self->last = self->this; |
|
7bd9626d8b4f
Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79385
diff
changeset
|
2544 self->this = item; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2545 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2546 if (self->end_event_obj) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2547 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2548 PyObject* action = self->end_event_obj; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2549 PyObject* node = (PyObject*) self->last; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2550 res = PyTuple_Pack(2, action, node); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2551 if (res) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2552 PyList_Append(self->events, res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2553 Py_DECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2554 } else |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2555 PyErr_Clear(); /* FIXME: propagate error */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2556 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2557 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2558 Py_INCREF(self->last); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2559 return (PyObject*) self->last; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2560 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2561 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2562 LOCAL(void) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2563 treebuilder_handle_namespace(TreeBuilderObject* self, int start, |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2564 PyObject *prefix, PyObject *uri) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2565 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2566 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2567 PyObject* action; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2568 PyObject* parcel; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2569 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2570 if (!self->events) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2571 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2572 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2573 if (start) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2574 if (!self->start_ns_event_obj) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2575 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2576 action = self->start_ns_event_obj; |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2577 parcel = Py_BuildValue("OO", prefix, uri); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2578 if (!parcel) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2579 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2580 Py_INCREF(action); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2581 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2582 if (!self->end_ns_event_obj) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2583 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2584 action = self->end_ns_event_obj; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2585 Py_INCREF(action); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2586 parcel = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2587 Py_INCREF(parcel); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2588 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2589 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2590 res = PyTuple_New(2); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2591 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2592 if (res) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2593 PyTuple_SET_ITEM(res, 0, action); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2594 PyTuple_SET_ITEM(res, 1, parcel); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2595 PyList_Append(self->events, res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2596 Py_DECREF(res); |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2597 } |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2598 else { |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2599 Py_DECREF(action); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2600 Py_DECREF(parcel); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2601 PyErr_Clear(); /* FIXME: propagate error */ |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2602 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2603 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2604 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2605 /* -------------------------------------------------------------------- */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2606 /* methods (in alphabetical order) */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2607 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2608 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2609 treebuilder_data(TreeBuilderObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2610 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2611 PyObject* data; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2612 if (!PyArg_ParseTuple(args, "O:data", &data)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2613 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2614 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2615 return treebuilder_handle_data(self, data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2616 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2617 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2618 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2619 treebuilder_end(TreeBuilderObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2620 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2621 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2622 if (!PyArg_ParseTuple(args, "O:end", &tag)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2623 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2624 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2625 return treebuilder_handle_end(self, tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2626 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2627 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2628 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2629 treebuilder_done(TreeBuilderObject* self) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2630 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2631 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2632 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2633 /* FIXME: check stack size? */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2634 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2635 if (self->root) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2636 res = self->root; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2637 else |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2638 res = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2639 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2640 Py_INCREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2641 return res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2642 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2643 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2644 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2645 treebuilder_close(TreeBuilderObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2646 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2647 if (!PyArg_ParseTuple(args, ":close")) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2648 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2649 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2650 return treebuilder_done(self); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2651 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2652 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2653 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2654 treebuilder_start(TreeBuilderObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2655 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2656 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2657 PyObject* attrib = Py_None; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2658 if (!PyArg_ParseTuple(args, "O|O:start", &tag, &attrib)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2659 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2660 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2661 return treebuilder_handle_start(self, tag, attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2662 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2663 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2664 static PyMethodDef treebuilder_methods[] = { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2665 {"data", (PyCFunction) treebuilder_data, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2666 {"start", (PyCFunction) treebuilder_start, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2667 {"end", (PyCFunction) treebuilder_end, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2668 {"close", (PyCFunction) treebuilder_close, METH_VARARGS}, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2669 {NULL, NULL} |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2670 }; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2671 |
|
37144
91dd4d44d3bc
Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents:
36954
diff
changeset
|
2672 static PyTypeObject TreeBuilder_Type = { |
|
42334
e70cdce0e8b2
Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41782
diff
changeset
|
2673 PyVarObject_HEAD_INIT(NULL, 0) |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
2674 "xml.etree.ElementTree.TreeBuilder", sizeof(TreeBuilderObject), 0, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2675 /* methods */ |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2676 (destructor)treebuilder_dealloc, /* tp_dealloc */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2677 0, /* tp_print */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2678 0, /* tp_getattr */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2679 0, /* tp_setattr */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2680 0, /* tp_reserved */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2681 0, /* tp_repr */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2682 0, /* tp_as_number */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2683 0, /* tp_as_sequence */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2684 0, /* tp_as_mapping */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2685 0, /* tp_hash */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2686 0, /* tp_call */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2687 0, /* tp_str */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2688 0, /* tp_getattro */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2689 0, /* tp_setattro */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2690 0, /* tp_as_buffer */ |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2691 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2692 /* tp_flags */ |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2693 0, /* tp_doc */ |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2694 (traverseproc)treebuilder_gc_traverse, /* tp_traverse */ |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2695 (inquiry)treebuilder_gc_clear, /* tp_clear */ |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2696 0, /* tp_richcompare */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2697 0, /* tp_weaklistoffset */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2698 0, /* tp_iter */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2699 0, /* tp_iternext */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2700 treebuilder_methods, /* tp_methods */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2701 0, /* tp_members */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2702 0, /* tp_getset */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2703 0, /* tp_base */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2704 0, /* tp_dict */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2705 0, /* tp_descr_get */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2706 0, /* tp_descr_set */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2707 0, /* tp_dictoffset */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2708 (initproc)treebuilder_init, /* tp_init */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2709 PyType_GenericAlloc, /* tp_alloc */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2710 treebuilder_new, /* tp_new */ |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
2711 0, /* tp_free */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2712 }; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2713 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2714 /* ==================================================================== */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2715 /* the expat interface */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2716 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2717 #include "expat.h" |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2718 #include "pyexpat.h" |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2719 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2720 /* The PyExpat_CAPI structure is an immutable dispatch table, so it can be |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2721 * cached globally without being in per-module state. |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2722 */ |
|
77278
cf9c379a9859
We're always building _elementtree with USE_PYEXPAT_CAPI, so the #ifdefs in
Eli Bendersky <eliben@gmail.com>
parents:
77275
diff
changeset
|
2723 static struct PyExpat_CAPI *expat_capi; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2724 #define EXPAT(func) (expat_capi->func) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2725 |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
2726 static XML_Memory_Handling_Suite ExpatMemoryHandler = { |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
2727 PyObject_Malloc, PyObject_Realloc, PyObject_Free}; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2728 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2729 typedef struct { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2730 PyObject_HEAD |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2731 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2732 XML_Parser parser; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2733 |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2734 PyObject *target; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2735 PyObject *entity; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2736 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2737 PyObject *names; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2738 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2739 PyObject *handle_start; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2740 PyObject *handle_data; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2741 PyObject *handle_end; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2742 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2743 PyObject *handle_comment; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2744 PyObject *handle_pi; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2745 PyObject *handle_doctype; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2746 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2747 PyObject *handle_close; |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2748 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2749 } XMLParserObject; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2750 |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2751 #define XMLParser_CheckExact(op) (Py_TYPE(op) == &XMLParser_Type) |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
2752 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2753 /* helpers */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2754 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2755 LOCAL(PyObject*) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2756 makeuniversal(XMLParserObject* self, const char* string) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2757 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2758 /* convert a UTF-8 tag/attribute name from the expat parser |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2759 to a universal name string */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2760 |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2761 Py_ssize_t size = (Py_ssize_t) strlen(string); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2762 PyObject* key; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2763 PyObject* value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2764 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2765 /* look the 'raw' name up in the names dictionary */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2766 key = PyBytes_FromStringAndSize(string, size); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2767 if (!key) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2768 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2769 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2770 value = PyDict_GetItem(self->names, key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2771 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2772 if (value) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2773 Py_INCREF(value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2774 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2775 /* new name. convert to universal name, and decode as |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2776 necessary */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2777 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2778 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2779 char* p; |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2780 Py_ssize_t i; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2781 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2782 /* look for namespace separator */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2783 for (i = 0; i < size; i++) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2784 if (string[i] == '}') |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2785 break; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2786 if (i != size) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2787 /* convert to universal name */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2788 tag = PyBytes_FromStringAndSize(NULL, size+1); |
|
84568
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
2789 if (tag == NULL) { |
|
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
2790 Py_DECREF(key); |
|
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
2791 return NULL; |
|
0877e17fa25e
Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents:
84567
diff
changeset
|
2792 } |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2793 p = PyBytes_AS_STRING(tag); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2794 p[0] = '{'; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2795 memcpy(p+1, string, size); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2796 size++; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2797 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2798 /* plain name; use key as tag */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2799 Py_INCREF(key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2800 tag = key; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2801 } |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
2802 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2803 /* decode universal name */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
2804 p = PyBytes_AS_STRING(tag); |
|
42491
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2805 value = PyUnicode_DecodeUTF8(p, size, "strict"); |
|
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2806 Py_DECREF(tag); |
|
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2807 if (!value) { |
|
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2808 Py_DECREF(key); |
|
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2809 return NULL; |
|
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2810 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2811 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2812 /* add to names dictionary */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2813 if (PyDict_SetItem(self->names, key, value) < 0) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2814 Py_DECREF(key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2815 Py_DECREF(value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2816 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2817 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2818 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2819 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2820 Py_DECREF(key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2821 return value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2822 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2823 |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2824 /* Set the ParseError exception with the given parameters. |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2825 * If message is not NULL, it's used as the error string. Otherwise, the |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2826 * message string is the default for the given error_code. |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2827 */ |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2828 static void |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2829 expat_set_error(enum XML_Error error_code, int line, int column, char *message) |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2830 { |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2831 PyObject *errmsg, *error, *position, *code; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2832 elementtreestate *st = ET_STATE_GLOBAL; |
|
68805
74d3dc78f0db
Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68804
diff
changeset
|
2833 |
|
74d3dc78f0db
Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68804
diff
changeset
|
2834 errmsg = PyUnicode_FromFormat("%s: line %d, column %d", |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2835 message ? message : EXPAT(ErrorString)(error_code), |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2836 line, column); |
|
68805
74d3dc78f0db
Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68804
diff
changeset
|
2837 if (errmsg == NULL) |
|
74d3dc78f0db
Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68804
diff
changeset
|
2838 return; |
|
74d3dc78f0db
Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68804
diff
changeset
|
2839 |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2840 error = PyObject_CallFunction(st->parseerror_obj, "O", errmsg); |
|
68805
74d3dc78f0db
Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68804
diff
changeset
|
2841 Py_DECREF(errmsg); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2842 if (!error) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2843 return; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2844 |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2845 /* Add code and position attributes */ |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2846 code = PyLong_FromLong((long)error_code); |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2847 if (!code) { |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2848 Py_DECREF(error); |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2849 return; |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2850 } |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2851 if (PyObject_SetAttrString(error, "code", code) == -1) { |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2852 Py_DECREF(error); |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2853 Py_DECREF(code); |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2854 return; |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2855 } |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2856 Py_DECREF(code); |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2857 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2858 position = Py_BuildValue("(ii)", line, column); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2859 if (!position) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2860 Py_DECREF(error); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2861 return; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2862 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2863 if (PyObject_SetAttrString(error, "position", position) == -1) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2864 Py_DECREF(error); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2865 Py_DECREF(position); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2866 return; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2867 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2868 Py_DECREF(position); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2869 |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
2870 PyErr_SetObject(st->parseerror_obj, error); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2871 Py_DECREF(error); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2872 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2873 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2874 /* -------------------------------------------------------------------- */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2875 /* handlers */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2876 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2877 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2878 expat_default_handler(XMLParserObject* self, const XML_Char* data_in, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2879 int data_len) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2880 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2881 PyObject* key; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2882 PyObject* value; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2883 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2884 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2885 if (data_len < 2 || data_in[0] != '&') |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2886 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2887 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2888 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2889 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2890 |
|
42491
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2891 key = PyUnicode_DecodeUTF8(data_in + 1, data_len - 2, "strict"); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2892 if (!key) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2893 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2894 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2895 value = PyDict_GetItem(self->entity, key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2896 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2897 if (value) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2898 if (TreeBuilder_CheckExact(self->target)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2899 res = treebuilder_handle_data( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2900 (TreeBuilderObject*) self->target, value |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2901 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2902 else if (self->handle_data) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2903 res = PyObject_CallFunction(self->handle_data, "O", value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2904 else |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2905 res = NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2906 Py_XDECREF(res); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2907 } else if (!PyErr_Occurred()) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2908 /* Report the first error, not the last */ |
|
66799
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
2909 char message[128] = "undefined entity "; |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
2910 strncat(message, data_in, data_len < 100?data_len:100); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2911 expat_set_error( |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2912 XML_ERROR_UNDEFINED_ENTITY, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2913 EXPAT(GetErrorLineNumber)(self->parser), |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2914 EXPAT(GetErrorColumnNumber)(self->parser), |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
2915 message |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2916 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2917 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2918 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2919 Py_DECREF(key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2920 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2921 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2922 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2923 expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2924 const XML_Char **attrib_in) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2925 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2926 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2927 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2928 PyObject* attrib; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2929 int ok; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2930 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2931 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2932 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2933 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2934 /* tag name */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2935 tag = makeuniversal(self, tag_in); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2936 if (!tag) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2937 return; /* parser will look for errors */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2938 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2939 /* attributes */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2940 if (attrib_in[0]) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2941 attrib = PyDict_New(); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2942 if (!attrib) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2943 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2944 while (attrib_in[0] && attrib_in[1]) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2945 PyObject* key = makeuniversal(self, attrib_in[0]); |
|
42491
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2946 PyObject* value = PyUnicode_DecodeUTF8(attrib_in[1], strlen(attrib_in[1]), "strict"); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2947 if (!key || !value) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2948 Py_XDECREF(value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2949 Py_XDECREF(key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2950 Py_DECREF(attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2951 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2952 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2953 ok = PyDict_SetItem(attrib, key, value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2954 Py_DECREF(value); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2955 Py_DECREF(key); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2956 if (ok < 0) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2957 Py_DECREF(attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2958 return; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2959 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2960 attrib_in += 2; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2961 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2962 } else { |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
2963 /* Pass an empty dictionary on */ |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2964 attrib = PyDict_New(); |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2965 if (!attrib) |
|
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2966 return; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2967 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2968 |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2969 if (TreeBuilder_CheckExact(self->target)) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2970 /* shortcut */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2971 res = treebuilder_handle_start((TreeBuilderObject*) self->target, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2972 tag, attrib); |
|
77246
20b8f0ee3d64
Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents:
77226
diff
changeset
|
2973 } |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2974 else if (self->handle_start) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2975 res = PyObject_CallFunction(self->handle_start, "OO", tag, attrib); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
2976 } else |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2977 res = NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2978 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2979 Py_DECREF(tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2980 Py_DECREF(attrib); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2981 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2982 Py_XDECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2983 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2984 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2985 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2986 expat_data_handler(XMLParserObject* self, const XML_Char* data_in, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2987 int data_len) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2988 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2989 PyObject* data; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2990 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2991 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2992 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2993 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
2994 |
|
42491
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
2995 data = PyUnicode_DecodeUTF8(data_in, data_len, "strict"); |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2996 if (!data) |
|
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
2997 return; /* parser will look for errors */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2998 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
2999 if (TreeBuilder_CheckExact(self->target)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3000 /* shortcut */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3001 res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3002 else if (self->handle_data) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3003 res = PyObject_CallFunction(self->handle_data, "O", data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3004 else |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3005 res = NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3006 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3007 Py_DECREF(data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3008 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3009 Py_XDECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3010 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3011 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3012 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3013 expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3014 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3015 PyObject* tag; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3016 PyObject* res = NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3017 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3018 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3019 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3020 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3021 if (TreeBuilder_CheckExact(self->target)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3022 /* shortcut */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3023 /* the standard tree builder doesn't look at the end tag */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3024 res = treebuilder_handle_end( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3025 (TreeBuilderObject*) self->target, Py_None |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3026 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3027 else if (self->handle_end) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3028 tag = makeuniversal(self, tag_in); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3029 if (tag) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3030 res = PyObject_CallFunction(self->handle_end, "O", tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3031 Py_DECREF(tag); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3032 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3033 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3034 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3035 Py_XDECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3036 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3037 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3038 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3039 expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3040 const XML_Char *uri) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3041 { |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3042 PyObject* sprefix = NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3043 PyObject* suri = NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3044 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3045 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3046 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3047 |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3048 suri = PyUnicode_DecodeUTF8(uri, strlen(uri), "strict"); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3049 if (!suri) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3050 return; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3051 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3052 if (prefix) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3053 sprefix = PyUnicode_DecodeUTF8(prefix, strlen(prefix), "strict"); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3054 else |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3055 sprefix = PyUnicode_FromString(""); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3056 if (!sprefix) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3057 Py_DECREF(suri); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3058 return; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3059 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3060 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3061 treebuilder_handle_namespace( |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3062 (TreeBuilderObject*) self->target, 1, sprefix, suri |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3063 ); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3064 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3065 Py_DECREF(sprefix); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3066 Py_DECREF(suri); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3067 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3068 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3069 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3070 expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3071 { |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3072 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3073 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3074 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3075 treebuilder_handle_namespace( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3076 (TreeBuilderObject*) self->target, 0, NULL, NULL |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3077 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3078 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3079 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3080 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3081 expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3082 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3083 PyObject* comment; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3084 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3085 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3086 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3087 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3088 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3089 if (self->handle_comment) { |
|
42491
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
3090 comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict"); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3091 if (comment) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3092 res = PyObject_CallFunction(self->handle_comment, "O", comment); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3093 Py_XDECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3094 Py_DECREF(comment); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3095 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3096 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3097 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3098 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3099 static void |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3100 expat_start_doctype_handler(XMLParserObject *self, |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3101 const XML_Char *doctype_name, |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3102 const XML_Char *sysid, |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3103 const XML_Char *pubid, |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3104 int has_internal_subset) |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3105 { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3106 PyObject *self_pyobj = (PyObject *)self; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3107 PyObject *doctype_name_obj, *sysid_obj, *pubid_obj; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3108 PyObject *parser_doctype = NULL; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3109 PyObject *res = NULL; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3110 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3111 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3112 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3113 |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3114 doctype_name_obj = makeuniversal(self, doctype_name); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3115 if (!doctype_name_obj) |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3116 return; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3117 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3118 if (sysid) { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3119 sysid_obj = makeuniversal(self, sysid); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3120 if (!sysid_obj) { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3121 Py_DECREF(doctype_name_obj); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3122 return; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3123 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3124 } else { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3125 Py_INCREF(Py_None); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3126 sysid_obj = Py_None; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3127 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3128 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3129 if (pubid) { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3130 pubid_obj = makeuniversal(self, pubid); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3131 if (!pubid_obj) { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3132 Py_DECREF(doctype_name_obj); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3133 Py_DECREF(sysid_obj); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3134 return; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3135 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3136 } else { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3137 Py_INCREF(Py_None); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3138 pubid_obj = Py_None; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3139 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3140 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3141 /* If the target has a handler for doctype, call it. */ |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3142 if (self->handle_doctype) { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3143 res = PyObject_CallFunction(self->handle_doctype, "OOO", |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3144 doctype_name_obj, pubid_obj, sysid_obj); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3145 Py_CLEAR(res); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3146 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3147 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3148 /* Now see if the parser itself has a doctype method. If yes and it's |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3149 * a subclass, call it but warn about deprecation. If it's not a subclass |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3150 * (i.e. vanilla XMLParser), do nothing. |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3151 */ |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3152 parser_doctype = PyObject_GetAttrString(self_pyobj, "doctype"); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3153 if (parser_doctype) { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3154 if (!XMLParser_CheckExact(self_pyobj)) { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3155 if (PyErr_WarnEx(PyExc_DeprecationWarning, |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3156 "This method of XMLParser is deprecated. Define" |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3157 " doctype() method on the TreeBuilder target.", |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3158 1) < 0) { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3159 goto clear; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3160 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3161 res = PyObject_CallFunction(parser_doctype, "OOO", |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3162 doctype_name_obj, pubid_obj, sysid_obj); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3163 Py_CLEAR(res); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3164 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3165 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3166 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3167 clear: |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3168 Py_XDECREF(parser_doctype); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3169 Py_DECREF(doctype_name_obj); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3170 Py_DECREF(pubid_obj); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3171 Py_DECREF(sysid_obj); |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3172 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3173 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3174 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3175 expat_pi_handler(XMLParserObject* self, const XML_Char* target_in, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3176 const XML_Char* data_in) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3177 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3178 PyObject* target; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3179 PyObject* data; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3180 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3181 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3182 if (PyErr_Occurred()) |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3183 return; |
|
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3184 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3185 if (self->handle_pi) { |
|
42491
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
3186 target = PyUnicode_DecodeUTF8(target_in, strlen(target_in), "strict"); |
|
a8f13a43eaa1
SF patch # 1769767, get test_xml_etree_c working. More conversions are probably needed.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
3187 data = PyUnicode_DecodeUTF8(data_in, strlen(data_in), "strict"); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3188 if (target && data) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3189 res = PyObject_CallFunction(self->handle_pi, "OO", target, data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3190 Py_XDECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3191 Py_DECREF(data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3192 Py_DECREF(target); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3193 } else { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3194 Py_XDECREF(data); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3195 Py_XDECREF(target); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3196 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3197 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3198 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3199 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3200 /* -------------------------------------------------------------------- */ |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3201 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3202 static PyObject * |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3203 xmlparser_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3204 { |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3205 XMLParserObject *self = (XMLParserObject *)type->tp_alloc(type, 0); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3206 if (self) { |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3207 self->parser = NULL; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3208 self->target = self->entity = self->names = NULL; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3209 self->handle_start = self->handle_data = self->handle_end = NULL; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3210 self->handle_comment = self->handle_pi = self->handle_close = NULL; |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3211 self->handle_doctype = NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3212 } |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3213 return (PyObject *)self; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3214 } |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3215 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3216 static int |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3217 xmlparser_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3218 { |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3219 XMLParserObject *self_xp = (XMLParserObject *)self; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3220 PyObject *target = NULL, *html = NULL; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3221 char *encoding = NULL; |
|
77313
eb1d633fe307
Fix unterminated keyword array passed to PyArg_ParseTupleAndKeywords
Eli Bendersky <eliben@gmail.com>
parents:
77279
diff
changeset
|
3222 static char *kwlist[] = {"html", "target", "encoding", 0}; |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3223 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3224 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOz:XMLParser", kwlist, |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3225 &html, &target, &encoding)) { |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3226 return -1; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3227 } |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
3228 |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3229 self_xp->entity = PyDict_New(); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3230 if (!self_xp->entity) |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3231 return -1; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3232 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3233 self_xp->names = PyDict_New(); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3234 if (!self_xp->names) { |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3235 Py_CLEAR(self_xp->entity); |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3236 return -1; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3237 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3238 |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3239 self_xp->parser = EXPAT(ParserCreate_MM)(encoding, &ExpatMemoryHandler, "}"); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3240 if (!self_xp->parser) { |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3241 Py_CLEAR(self_xp->entity); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3242 Py_CLEAR(self_xp->names); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3243 PyErr_NoMemory(); |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3244 return -1; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3245 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3246 |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3247 if (target) { |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3248 Py_INCREF(target); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3249 } else { |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
3250 target = treebuilder_new(&TreeBuilder_Type, NULL, NULL); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3251 if (!target) { |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3252 Py_CLEAR(self_xp->entity); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3253 Py_CLEAR(self_xp->names); |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3254 EXPAT(ParserFree)(self_xp->parser); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3255 return -1; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3256 } |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3257 } |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3258 self_xp->target = target; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3259 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3260 self_xp->handle_start = PyObject_GetAttrString(target, "start"); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3261 self_xp->handle_data = PyObject_GetAttrString(target, "data"); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3262 self_xp->handle_end = PyObject_GetAttrString(target, "end"); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3263 self_xp->handle_comment = PyObject_GetAttrString(target, "comment"); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3264 self_xp->handle_pi = PyObject_GetAttrString(target, "pi"); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3265 self_xp->handle_close = PyObject_GetAttrString(target, "close"); |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3266 self_xp->handle_doctype = PyObject_GetAttrString(target, "doctype"); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3267 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3268 PyErr_Clear(); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3269 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3270 /* configure parser */ |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3271 EXPAT(SetUserData)(self_xp->parser, self_xp); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3272 EXPAT(SetElementHandler)( |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3273 self_xp->parser, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3274 (XML_StartElementHandler) expat_start_handler, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3275 (XML_EndElementHandler) expat_end_handler |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3276 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3277 EXPAT(SetDefaultHandlerExpand)( |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3278 self_xp->parser, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3279 (XML_DefaultHandler) expat_default_handler |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3280 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3281 EXPAT(SetCharacterDataHandler)( |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3282 self_xp->parser, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3283 (XML_CharacterDataHandler) expat_data_handler |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3284 ); |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3285 if (self_xp->handle_comment) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3286 EXPAT(SetCommentHandler)( |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3287 self_xp->parser, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3288 (XML_CommentHandler) expat_comment_handler |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3289 ); |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3290 if (self_xp->handle_pi) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3291 EXPAT(SetProcessingInstructionHandler)( |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3292 self_xp->parser, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3293 (XML_ProcessingInstructionHandler) expat_pi_handler |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3294 ); |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3295 EXPAT(SetStartDoctypeDeclHandler)( |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3296 self_xp->parser, |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3297 (XML_StartDoctypeDeclHandler) expat_start_doctype_handler |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3298 ); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3299 EXPAT(SetUnknownEncodingHandler)( |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3300 self_xp->parser, |
|
83919
f7b47fb30169
Issue #13612: handle unknown encodings without a buffer overflow.
Eli Bendersky <eliben@gmail.com>
parents:
83890
diff
changeset
|
3301 EXPAT(DefaultUnknownEncodingHandler), NULL |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3302 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3303 |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3304 return 0; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3305 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3306 |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3307 static int |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3308 xmlparser_gc_traverse(XMLParserObject *self, visitproc visit, void *arg) |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3309 { |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3310 Py_VISIT(self->handle_close); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3311 Py_VISIT(self->handle_pi); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3312 Py_VISIT(self->handle_comment); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3313 Py_VISIT(self->handle_end); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3314 Py_VISIT(self->handle_data); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3315 Py_VISIT(self->handle_start); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3316 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3317 Py_VISIT(self->target); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3318 Py_VISIT(self->entity); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3319 Py_VISIT(self->names); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3320 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3321 return 0; |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3322 } |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3323 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3324 static int |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3325 xmlparser_gc_clear(XMLParserObject *self) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3326 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3327 EXPAT(ParserFree)(self->parser); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3328 |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3329 Py_CLEAR(self->handle_close); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3330 Py_CLEAR(self->handle_pi); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3331 Py_CLEAR(self->handle_comment); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3332 Py_CLEAR(self->handle_end); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3333 Py_CLEAR(self->handle_data); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3334 Py_CLEAR(self->handle_start); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3335 Py_CLEAR(self->handle_doctype); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3336 |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3337 Py_CLEAR(self->target); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3338 Py_CLEAR(self->entity); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3339 Py_CLEAR(self->names); |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3340 |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3341 return 0; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3342 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3343 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3344 static void |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3345 xmlparser_dealloc(XMLParserObject* self) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3346 { |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3347 PyObject_GC_UnTrack(self); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3348 xmlparser_gc_clear(self); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3349 Py_TYPE(self)->tp_free((PyObject *)self); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3350 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3351 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3352 LOCAL(PyObject*) |
|
83890
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3353 expat_parse(XMLParserObject* self, const char* data, int data_len, int final) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3354 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3355 int ok; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3356 |
|
84709
6ec0e9347dd4
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
Victor Stinner <victor.stinner@gmail.com>
parents:
84581
diff
changeset
|
3357 assert(!PyErr_Occurred()); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3358 ok = EXPAT(Parse)(self->parser, data, data_len, final); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3359 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3360 if (PyErr_Occurred()) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3361 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3362 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3363 if (!ok) { |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3364 expat_set_error( |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
3365 EXPAT(GetErrorCode)(self->parser), |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3366 EXPAT(GetErrorLineNumber)(self->parser), |
|
75722
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
3367 EXPAT(GetErrorColumnNumber)(self->parser), |
|
b76fa310e73d
Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents:
75721
diff
changeset
|
3368 NULL |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3369 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3370 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3371 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3372 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3373 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3374 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3375 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3376 static PyObject* |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3377 xmlparser_close(XMLParserObject* self, PyObject* args) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3378 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3379 /* end feeding data to parser */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3380 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3381 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3382 if (!PyArg_ParseTuple(args, ":close")) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3383 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3384 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3385 res = expat_parse(self, "", 0, 1); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3386 if (!res) |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3387 return NULL; |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3388 |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3389 if (TreeBuilder_CheckExact(self->target)) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3390 Py_DECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3391 return treebuilder_done((TreeBuilderObject*) self->target); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3392 } if (self->handle_close) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3393 Py_DECREF(res); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3394 return PyObject_CallFunction(self->handle_close, ""); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3395 } else |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3396 return res; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3397 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3398 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3399 static PyObject* |
|
83890
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3400 xmlparser_feed(XMLParserObject* self, PyObject* arg) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3401 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3402 /* feed data to parser */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3403 |
|
83890
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3404 if (PyUnicode_Check(arg)) { |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3405 Py_ssize_t data_len; |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3406 const char *data = PyUnicode_AsUTF8AndSize(arg, &data_len); |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3407 if (data == NULL) |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3408 return NULL; |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3409 if (data_len > INT_MAX) { |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3410 PyErr_SetString(PyExc_OverflowError, "size does not fit in an int"); |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3411 return NULL; |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3412 } |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3413 /* Explicitly set UTF-8 encoding. Return code ignored. */ |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3414 (void)EXPAT(SetEncoding)(self->parser, "utf-8"); |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3415 return expat_parse(self, data, (int)data_len, 0); |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3416 } |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3417 else { |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3418 Py_buffer view; |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3419 PyObject *res; |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3420 if (PyObject_GetBuffer(arg, &view, PyBUF_SIMPLE) < 0) |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3421 return NULL; |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3422 if (view.len > INT_MAX) { |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3423 PyBuffer_Release(&view); |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3424 PyErr_SetString(PyExc_OverflowError, "size does not fit in an int"); |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3425 return NULL; |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3426 } |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3427 res = expat_parse(self, view.buf, (int)view.len, 0); |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3428 PyBuffer_Release(&view); |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3429 return res; |
|
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3430 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3431 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3432 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3433 static PyObject* |
|
83852
8425e8cc2bf2
Get rid of ugly code duplication for ElementTree.parse when the accelerator
Eli Bendersky <eliben@gmail.com>
parents:
83850
diff
changeset
|
3434 xmlparser_parse_whole(XMLParserObject* self, PyObject* args) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3435 { |
|
83852
8425e8cc2bf2
Get rid of ugly code duplication for ElementTree.parse when the accelerator
Eli Bendersky <eliben@gmail.com>
parents:
83850
diff
changeset
|
3436 /* (internal) parse the whole input, until end of stream */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3437 PyObject* reader; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3438 PyObject* buffer; |
|
75721
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3439 PyObject* temp; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3440 PyObject* res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3441 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3442 PyObject* fileobj; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3443 if (!PyArg_ParseTuple(args, "O:_parse", &fileobj)) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3444 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3445 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3446 reader = PyObject_GetAttrString(fileobj, "read"); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3447 if (!reader) |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3448 return NULL; |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
3449 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3450 /* read from open file object */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3451 for (;;) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3452 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3453 buffer = PyObject_CallFunction(reader, "i", 64*1024); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3454 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3455 if (!buffer) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3456 /* read failed (e.g. due to KeyboardInterrupt) */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3457 Py_DECREF(reader); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3458 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3459 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3460 |
|
75721
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3461 if (PyUnicode_CheckExact(buffer)) { |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3462 /* A unicode object is encoded into bytes using UTF-8 */ |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3463 if (PyUnicode_GET_SIZE(buffer) == 0) { |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3464 Py_DECREF(buffer); |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3465 break; |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3466 } |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3467 temp = PyUnicode_AsEncodedString(buffer, "utf-8", "surrogatepass"); |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3468 Py_DECREF(buffer); |
|
75721
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3469 if (!temp) { |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3470 /* Propagate exception from PyUnicode_AsEncodedString */ |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3471 Py_DECREF(reader); |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3472 return NULL; |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3473 } |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3474 buffer = temp; |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3475 } |
|
7bdf5c96fdc0
Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents:
75505
diff
changeset
|
3476 else if (!PyBytes_CheckExact(buffer) || PyBytes_GET_SIZE(buffer) == 0) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3477 Py_DECREF(buffer); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3478 break; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3479 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3480 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3481 res = expat_parse( |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
3482 self, PyBytes_AS_STRING(buffer), PyBytes_GET_SIZE(buffer), 0 |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3483 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3484 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3485 Py_DECREF(buffer); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3486 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3487 if (!res) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3488 Py_DECREF(reader); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3489 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3490 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3491 Py_DECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3492 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3493 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3494 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3495 Py_DECREF(reader); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3496 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3497 res = expat_parse(self, "", 0, 1); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3498 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3499 if (res && TreeBuilder_CheckExact(self->target)) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3500 Py_DECREF(res); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3501 return treebuilder_done((TreeBuilderObject*) self->target); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3502 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3503 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3504 return res; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3505 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3506 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3507 static PyObject* |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3508 xmlparser_doctype(XMLParserObject *self, PyObject *args) |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3509 { |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3510 Py_RETURN_NONE; |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3511 } |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3512 |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3513 static PyObject* |
|
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3514 xmlparser_setevents(XMLParserObject *self, PyObject* args) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3515 { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3516 /* activate element event reporting */ |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3517 Py_ssize_t i, seqlen; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3518 TreeBuilderObject *target; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3519 |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3520 PyObject *events_queue; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3521 PyObject *events_to_report = Py_None; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3522 PyObject *events_seq; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3523 if (!PyArg_ParseTuple(args, "O!|O:_setevents", &PyList_Type, &events_queue, |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3524 &events_to_report)) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3525 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3526 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3527 if (!TreeBuilder_CheckExact(self->target)) { |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3528 PyErr_SetString( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3529 PyExc_TypeError, |
|
74903
65fc79fb4eb2
Issue #13988: cElementTree is deprecated and the _elementtree accelerator is automatically used whenever available.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
74870
diff
changeset
|
3530 "event handling only supported for ElementTree.TreeBuilder " |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3531 "targets" |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3532 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3533 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3534 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3535 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3536 target = (TreeBuilderObject*) self->target; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3537 |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3538 Py_INCREF(events_queue); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3539 Py_XDECREF(target->events); |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3540 target->events = events_queue; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3541 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3542 /* clear out existing events */ |
|
79385
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3543 Py_CLEAR(target->start_event_obj); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3544 Py_CLEAR(target->end_event_obj); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3545 Py_CLEAR(target->start_ns_event_obj); |
|
f9224f23f473
Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79065
diff
changeset
|
3546 Py_CLEAR(target->end_ns_event_obj); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3547 |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3548 if (events_to_report == Py_None) { |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3549 /* default is "end" only */ |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3550 target->end_event_obj = PyUnicode_FromString("end"); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3551 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3552 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3553 |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3554 if (!(events_seq = PySequence_Fast(events_to_report, |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3555 "events must be a sequence"))) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3556 return NULL; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3557 } |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3558 |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3559 seqlen = PySequence_Size(events_seq); |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3560 for (i = 0; i < seqlen; ++i) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3561 PyObject *event_name_obj = PySequence_Fast_GET_ITEM(events_seq, i); |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3562 char *event_name = NULL; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3563 if (PyUnicode_Check(event_name_obj)) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3564 event_name = _PyUnicode_AsString(event_name_obj); |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3565 } else if (PyBytes_Check(event_name_obj)) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3566 event_name = PyBytes_AS_STRING(event_name_obj); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3567 } |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3568 |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3569 if (event_name == NULL) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3570 Py_DECREF(events_seq); |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3571 PyErr_Format(PyExc_ValueError, "invalid events sequence"); |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3572 return NULL; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3573 } else if (strcmp(event_name, "start") == 0) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3574 Py_INCREF(event_name_obj); |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3575 target->start_event_obj = event_name_obj; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3576 } else if (strcmp(event_name, "end") == 0) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3577 Py_INCREF(event_name_obj); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3578 Py_XDECREF(target->end_event_obj); |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3579 target->end_event_obj = event_name_obj; |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3580 } else if (strcmp(event_name, "start-ns") == 0) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3581 Py_INCREF(event_name_obj); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3582 Py_XDECREF(target->start_ns_event_obj); |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3583 target->start_ns_event_obj = event_name_obj; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3584 EXPAT(SetNamespaceDeclHandler)( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3585 self->parser, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3586 (XML_StartNamespaceDeclHandler) expat_start_ns_handler, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3587 (XML_EndNamespaceDeclHandler) expat_end_ns_handler |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3588 ); |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3589 } else if (strcmp(event_name, "end-ns") == 0) { |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3590 Py_INCREF(event_name_obj); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3591 Py_XDECREF(target->end_ns_event_obj); |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3592 target->end_ns_event_obj = event_name_obj; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3593 EXPAT(SetNamespaceDeclHandler)( |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3594 self->parser, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3595 (XML_StartNamespaceDeclHandler) expat_start_ns_handler, |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3596 (XML_EndNamespaceDeclHandler) expat_end_ns_handler |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3597 ); |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3598 } else { |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3599 Py_DECREF(events_seq); |
|
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3600 PyErr_Format(PyExc_ValueError, "unknown event '%s'", event_name); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3601 return NULL; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3602 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3603 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3604 |
|
83843
b6c333579c2b
_elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents:
83834
diff
changeset
|
3605 Py_DECREF(events_seq); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3606 Py_RETURN_NONE; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3607 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3608 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3609 static PyMethodDef xmlparser_methods[] = { |
|
83890
7781ccae7b9a
Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents:
83849
diff
changeset
|
3610 {"feed", (PyCFunction) xmlparser_feed, METH_O}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3611 {"close", (PyCFunction) xmlparser_close, METH_VARARGS}, |
|
83852
8425e8cc2bf2
Get rid of ugly code duplication for ElementTree.parse when the accelerator
Eli Bendersky <eliben@gmail.com>
parents:
83850
diff
changeset
|
3612 {"_parse_whole", (PyCFunction) xmlparser_parse_whole, METH_VARARGS}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3613 {"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS}, |
|
77279
6f9bfcc1896f
Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents:
77278
diff
changeset
|
3614 {"doctype", (PyCFunction) xmlparser_doctype, METH_VARARGS}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3615 {NULL, NULL} |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3616 }; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3617 |
|
68804
d0fe7489c4cc
_elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66799
diff
changeset
|
3618 static PyObject* |
|
48414
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
3619 xmlparser_getattro(XMLParserObject* self, PyObject* nameobj) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3620 { |
|
66799
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3621 if (PyUnicode_Check(nameobj)) { |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3622 PyObject* res; |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3623 if (PyUnicode_CompareWithASCIIString(nameobj, "entity") == 0) |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3624 res = self->entity; |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3625 else if (PyUnicode_CompareWithASCIIString(nameobj, "target") == 0) |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3626 res = self->target; |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3627 else if (PyUnicode_CompareWithASCIIString(nameobj, "version") == 0) { |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3628 return PyUnicode_FromFormat( |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3629 "Expat %d.%d.%d", XML_MAJOR_VERSION, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3630 XML_MINOR_VERSION, XML_MICRO_VERSION); |
|
66799
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3631 } |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3632 else |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3633 goto generic; |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3634 |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3635 Py_INCREF(res); |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3636 return res; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3637 } |
|
66799
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3638 generic: |
|
50d170bb71c7
Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66664
diff
changeset
|
3639 return PyObject_GenericGetAttr((PyObject*) self, nameobj); |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3640 } |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3641 |
|
37144
91dd4d44d3bc
Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents:
36954
diff
changeset
|
3642 static PyTypeObject XMLParser_Type = { |
|
42334
e70cdce0e8b2
Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41782
diff
changeset
|
3643 PyVarObject_HEAD_INIT(NULL, 0) |
|
81359
8d6dadfecf22
Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents:
81296
diff
changeset
|
3644 "xml.etree.ElementTree.XMLParser", sizeof(XMLParserObject), 0, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3645 /* methods */ |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3646 (destructor)xmlparser_dealloc, /* tp_dealloc */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3647 0, /* tp_print */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3648 0, /* tp_getattr */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3649 0, /* tp_setattr */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3650 0, /* tp_reserved */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3651 0, /* tp_repr */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3652 0, /* tp_as_number */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3653 0, /* tp_as_sequence */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3654 0, /* tp_as_mapping */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3655 0, /* tp_hash */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3656 0, /* tp_call */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3657 0, /* tp_str */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3658 (getattrofunc)xmlparser_getattro, /* tp_getattro */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3659 0, /* tp_setattro */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3660 0, /* tp_as_buffer */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3661 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3662 /* tp_flags */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3663 0, /* tp_doc */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3664 (traverseproc)xmlparser_gc_traverse, /* tp_traverse */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3665 (inquiry)xmlparser_gc_clear, /* tp_clear */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3666 0, /* tp_richcompare */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3667 0, /* tp_weaklistoffset */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3668 0, /* tp_iter */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3669 0, /* tp_iternext */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3670 xmlparser_methods, /* tp_methods */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3671 0, /* tp_members */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3672 0, /* tp_getset */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3673 0, /* tp_base */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3674 0, /* tp_dict */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3675 0, /* tp_descr_get */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3676 0, /* tp_descr_set */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3677 0, /* tp_dictoffset */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3678 (initproc)xmlparser_init, /* tp_init */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3679 PyType_GenericAlloc, /* tp_alloc */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3680 xmlparser_new, /* tp_new */ |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3681 0, /* tp_free */ |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3682 }; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3683 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3684 /* ==================================================================== */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3685 /* python module interface */ |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3686 |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3687 static PyMethodDef _functions[] = { |
|
81296
c1fc6b6d1cfc
The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents:
79460
diff
changeset
|
3688 {"SubElement", (PyCFunction) subelement, METH_VARARGS | METH_KEYWORDS}, |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3689 {NULL, NULL} |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3690 }; |
|
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3691 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3692 |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3693 static struct PyModuleDef elementtreemodule = { |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3694 PyModuleDef_HEAD_INIT, |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3695 "_elementtree", |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3696 NULL, |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3697 sizeof(elementtreestate), |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3698 _functions, |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3699 NULL, |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3700 elementtree_traverse, |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3701 elementtree_clear, |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3702 elementtree_free |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3703 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3704 |
| 40528 | 3705 PyMODINIT_FUNC |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3706 PyInit__elementtree(void) |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3707 { |
|
77431
652d148bdc1d
Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents:
77313
diff
changeset
|
3708 PyObject *m, *temp; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3709 elementtreestate *st; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3710 |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3711 m = PyState_FindModule(&elementtreemodule); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3712 if (m) { |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3713 Py_INCREF(m); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3714 return m; |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3715 } |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3716 |
|
48414
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
3717 /* Initialize object types */ |
|
84714
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
3718 if (PyType_Ready(&ElementIter_Type) < 0) |
|
cd4c9d4bd88f
#18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
83919
diff
changeset
|
3719 return NULL; |
|
48414
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
3720 if (PyType_Ready(&TreeBuilder_Type) < 0) |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
59893
diff
changeset
|
3721 return NULL; |
|
48414
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
3722 if (PyType_Ready(&Element_Type) < 0) |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
59893
diff
changeset
|
3723 return NULL; |
|
48414
4025f638911f
#3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
3724 if (PyType_Ready(&XMLParser_Type) < 0) |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
59893
diff
changeset
|
3725 return NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3726 |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3727 m = PyModule_Create(&elementtreemodule); |
|
36954
db5e720b0cef
merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents:
36684
diff
changeset
|
3728 if (!m) |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3729 return NULL; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3730 st = ET_STATE(m); |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3731 |
|
76110
1ddf58262706
Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents:
76101
diff
changeset
|
3732 if (!(temp = PyImport_ImportModule("copy"))) |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3733 return NULL; |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3734 st->deepcopy_obj = PyObject_GetAttrString(temp, "deepcopy"); |
|
76110
1ddf58262706
Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents:
76101
diff
changeset
|
3735 Py_XDECREF(temp); |
|
1ddf58262706
Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents:
76101
diff
changeset
|
3736 |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3737 if (!(st->elementpath_obj = PyImport_ImportModule("xml.etree.ElementPath"))) |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3738 return NULL; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3739 |
|
77278
cf9c379a9859
We're always building _elementtree with USE_PYEXPAT_CAPI, so the #ifdefs in
Eli Bendersky <eliben@gmail.com>
parents:
77275
diff
changeset
|
3740 /* link against pyexpat */ |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3741 expat_capi = PyCapsule_Import(PyExpat_CAPSULE_NAME, 0); |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3742 if (expat_capi) { |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3743 /* check that it's usable */ |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3744 if (strcmp(expat_capi->magic, PyExpat_CAPI_MAGIC) != 0 || |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3745 expat_capi->size < sizeof(struct PyExpat_CAPI) || |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3746 expat_capi->MAJOR_VERSION != XML_MAJOR_VERSION || |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3747 expat_capi->MINOR_VERSION != XML_MINOR_VERSION || |
|
78220
c8534d55c5e6
Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents:
78152
diff
changeset
|
3748 expat_capi->MICRO_VERSION != XML_MICRO_VERSION) { |
|
c8534d55c5e6
Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents:
78152
diff
changeset
|
3749 PyErr_SetString(PyExc_ImportError, |
|
c8534d55c5e6
Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents:
78152
diff
changeset
|
3750 "pyexpat version is incompatible"); |
|
c8534d55c5e6
Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents:
78152
diff
changeset
|
3751 return NULL; |
|
c8534d55c5e6
Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents:
78152
diff
changeset
|
3752 } |
|
c8534d55c5e6
Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents:
78152
diff
changeset
|
3753 } else { |
|
c8534d55c5e6
Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents:
78152
diff
changeset
|
3754 return NULL; |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3755 } |
|
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3756 |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3757 st->parseerror_obj = PyErr_NewException( |
|
74903
65fc79fb4eb2
Issue #13988: cElementTree is deprecated and the _elementtree accelerator is automatically used whenever available.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
74870
diff
changeset
|
3758 "xml.etree.ElementTree.ParseError", PyExc_SyntaxError, NULL |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3759 ); |
|
85083
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3760 Py_INCREF(st->parseerror_obj); |
|
8a060e2de608
Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents:
84735
diff
changeset
|
3761 PyModule_AddObject(m, "ParseError", st->parseerror_obj); |
|
59601
7a18c2762886
Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
53816
diff
changeset
|
3762 |
|
75379
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
3763 Py_INCREF((PyObject *)&Element_Type); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
3764 PyModule_AddObject(m, "Element", (PyObject *)&Element_Type); |
|
ce1c26cbe5fb
Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents:
74903
diff
changeset
|
3765 |
|
77226
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
3766 Py_INCREF((PyObject *)&TreeBuilder_Type); |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
3767 PyModule_AddObject(m, "TreeBuilder", (PyObject *)&TreeBuilder_Type); |
|
717632ae7b3f
Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents:
77217
diff
changeset
|
3768 |
|
77275
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3769 Py_INCREF((PyObject *)&XMLParser_Type); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3770 PyModule_AddObject(m, "XMLParser", (PyObject *)&XMLParser_Type); |
|
a29ae1c2b8b2
Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents:
77246
diff
changeset
|
3771 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3772 return m; |
|
36050
6586cd9920e7
updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff
changeset
|
3773 } |
