annotate Modules/_elementtree.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 2b2925c08a6c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
85676
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
62 /* Py_CLEAR for a PyObject* that uses a join flag. Pass the pointer by
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
63 * reference since this function sets it to NULL.
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
64 */
85737
111a74819192 - followup for issue #18997, make _clear_joined_ptr static.
doko@ubuntu.com
parents: 85676
diff changeset
65 static void _clear_joined_ptr(PyObject **p)
85676
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
66 {
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
67 if (*p) {
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
68 PyObject *tmp = JOIN_OBJ(*p);
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
69 *p = NULL;
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
70 Py_DECREF(tmp);
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
71 }
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
72 }
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
73
84714
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
74 /* Types defined by this extension */
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
75 static PyTypeObject Element_Type;
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
76 static PyTypeObject ElementIter_Type;
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
77 static PyTypeObject TreeBuilder_Type;
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
78 static PyTypeObject XMLParser_Type;
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
79
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
80
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
81 /* Per-module state; PEP 3121 */
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
82 typedef struct {
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
83 PyObject *parseerror_obj;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
84 PyObject *deepcopy_obj;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
85 PyObject *elementpath_obj;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
86 } elementtreestate;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
87
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
88 static struct PyModuleDef elementtreemodule;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
89
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
90 /* 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
91 * state.
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
92 */
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
93 #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
94
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
95 /* 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
96 * and get its state.
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 #define ET_STATE_GLOBAL \
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
99 ((elementtreestate *) PyModule_GetState(PyState_FindModule(&elementtreemodule)))
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
100
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
101 static int
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
102 elementtree_clear(PyObject *m)
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
103 {
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
104 elementtreestate *st = ET_STATE(m);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
105 Py_CLEAR(st->parseerror_obj);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
106 Py_CLEAR(st->deepcopy_obj);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
107 Py_CLEAR(st->elementpath_obj);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
108 return 0;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
109 }
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
110
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
111 static int
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
112 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
113 {
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
114 elementtreestate *st = ET_STATE(m);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
115 Py_VISIT(st->parseerror_obj);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
116 Py_VISIT(st->deepcopy_obj);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
117 Py_VISIT(st->elementpath_obj);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
118 return 0;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
119 }
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
120
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
121 static void
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
122 elementtree_free(void *m)
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
123 {
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
124 elementtree_clear((PyObject *)m);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
125 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
126
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
127 /* helpers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
128
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
129 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
130 deepcopy(PyObject* object, PyObject* memo)
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 /* 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
133 PyObject* args;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
134 PyObject* result;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
135 elementtreestate *st = ET_STATE_GLOBAL;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
136
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
137 if (!st->deepcopy_obj) {
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
138 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
139 PyExc_RuntimeError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
140 "deepcopy helper not found"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
141 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
142 return NULL;
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
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
145 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
146 if (!args)
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
147 return NULL;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
148 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
149 Py_DECREF(args);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
150 return result;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
151 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
152
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
153 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
154 list_join(PyObject* list)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
155 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
156 /* 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
157 PyObject* joiner;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
158 PyObject* result;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
159
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
160 joiner = PyUnicode_FromStringAndSize("", 0);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
161 if (!joiner)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
162 return NULL;
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
163 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
164 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
165 if (result)
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
166 Py_DECREF(list);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
167 return result;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
168 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
169
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
170 /* 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
171 */
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
172 static int
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
173 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
174 {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
175 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
176 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
177
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
178
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
179 /* -------------------------------------------------------------------- */
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
180 /* the Element type */
36050
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 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
183
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
184 /* 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
185 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
186
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
187 /* child elements */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
188 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
189 int allocated; /* allocated items */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
190
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
191 /* 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
192 PyObject* *children;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
193
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
194 PyObject* _children[STATIC_CHILDREN];
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
195
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
196 } ElementObjectExtra;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
197
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
198 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
199 PyObject_HEAD
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
200
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
201 /* element tag (a string). */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
202 PyObject* tag;
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 /* 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
205 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
206 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
207 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
208 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
209 should be left intact. */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
210 PyObject* text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
211
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
212 /* 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
213 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
214 PyObject* tail;
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 ElementObjectExtra* extra;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
217
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
218 PyObject *weakreflist; /* For tp_weaklistoffset */
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
219
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
220 } ElementObject;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
221
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
222
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
223 #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
224
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
225 /* -------------------------------------------------------------------- */
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
226 /* Element constructors and destructor */
36050
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 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
229 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
230 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
231 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
232 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
233 PyErr_NoMemory();
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
234 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
235 }
36050
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 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
238 attrib = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
239
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
240 Py_INCREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
241 self->extra->attrib = attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
242
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
243 self->extra->length = 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
244 self->extra->allocated = STATIC_CHILDREN;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
245 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
246
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
247 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
248 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
249
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
250 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
251 dealloc_extra(ElementObject* self)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
252 {
76101
118729090dc5 Fix Windows compilation errors
Eli Bendersky <eliben@gmail.com>
parents: 76098
diff changeset
253 ElementObjectExtra *myextra;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
254 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
255
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
256 if (!self->extra)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
257 return;
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
258
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
259 /* Avoid DECREFs calling into this code again (cycles, etc.)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
260 */
76101
118729090dc5 Fix Windows compilation errors
Eli Bendersky <eliben@gmail.com>
parents: 76098
diff changeset
261 myextra = self->extra;
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
262 self->extra = NULL;
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
263
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
264 Py_DECREF(myextra->attrib);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
265
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
266 for (i = 0; i < myextra->length; i++)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
267 Py_DECREF(myextra->children[i]);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
268
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
269 if (myextra->children != myextra->_children)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
270 PyObject_Free(myextra->children);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
271
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
272 PyObject_Free(myextra);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
273 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
274
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
275 /* 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
276 * 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
277 */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
278 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
279 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
280 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
281 ElementObject* self;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
282
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
283 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
284 if (self == NULL)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
285 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
286 self->extra = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
287
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
288 Py_INCREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
289 self->tag = tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
290
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
291 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
292 self->text = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
293
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
294 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
295 self->tail = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
296
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
297 self->weakreflist = NULL;
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
298
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
299 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
300 PyObject_GC_Track(self);
84581
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
301
84568
0877e17fa25e Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84567
diff changeset
302 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
303 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
304 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
305 return NULL;
0877e17fa25e Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84567
diff changeset
306 }
0877e17fa25e Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84567
diff changeset
307 }
0877e17fa25e Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84567
diff changeset
308
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
309 return (PyObject*) self;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
310 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
311
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
312 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
313 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
314 {
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
315 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
316 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
317 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
318 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
319
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
320 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
321 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
322
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
323 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
324 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
325
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
326 e->extra = NULL;
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
327 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
328 }
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
329 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
330 }
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
331
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
332 /* 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
333 * 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
334 * 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
335 * directly into *kwds.
83492
041960bf92fe Issue #17736: fix misleading comment in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents: 81486
diff changeset
336 *
041960bf92fe Issue #17736: fix misleading comment in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents: 81486
diff changeset
337 * 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
338 * 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
339 */
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
340 static PyObject*
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
341 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
342 {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
343 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
344 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
345
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
346 if (attrib) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
347 /* 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
348 * kwds
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 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
351 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
352 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
353 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
354 return NULL;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
355 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
356 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
357 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
358 } else {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
359 attrib = PyDict_New();
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
360 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
361
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
362 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
363
83514
e022cc026afc Revert c9674421d78e, leaving an additional comment
Eli Bendersky <eliben@gmail.com>
parents: 83494
diff changeset
364 /* 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
365 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
366 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
367 return NULL;
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
368 return attrib;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
369 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
370
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
371 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
372 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
373 {
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 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
375 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
376 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
377 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
378
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
379 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
380 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
381
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
382 if (attrib) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
383 /* 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
384 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
385 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
386 return -1;
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
387 if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
388 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
389 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
390 return -1;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
391 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
392 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
393 } else if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
394 /* have keywords args */
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
395 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
396 if (!attrib)
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
397 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
398 }
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 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
401
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
402 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
403 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
404 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
405 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
406 }
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
407 }
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
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
409 /* 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
410 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
411
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
412 /* 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
413 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
414 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
415 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
416 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
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 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
419 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
420 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
421 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
422
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
423 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
424 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
425 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
426 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
427
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
428 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
429 }
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
430
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
431 LOCAL(int)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
432 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
433 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
434 int size;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
435 PyObject* *children;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
436
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
437 /* 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
438 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
439
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
440 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
441 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
442 return -1;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
443 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
444
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
445 size = self->extra->length + extra;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
446
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
447 if (size > self->extra->allocated) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
448 /* 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
449 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
450 /* 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
451 * which needs at least 4 bytes.
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
452 * 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
453 * be safe.
14d4104976fc Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
454 */
14d4104976fc Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
455 size = size ? size : 1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
456 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
457 /* 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
458 * "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
459 * 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
460 */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
461 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
462 size * sizeof(PyObject*));
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
463 if (!children)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
464 goto nomemory;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
465 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
466 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
467 if (!children)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
468 goto nomemory;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
469 /* 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
470 memcpy(children, self->extra->children,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
471 self->extra->length * sizeof(PyObject*));
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
472 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
473 self->extra->children = children;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
474 self->extra->allocated = size;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
475 }
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 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
478
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
479 nomemory:
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
480 PyErr_NoMemory();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
481 return -1;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
484 LOCAL(int)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
485 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
486 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
487 /* 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
488
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
489 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
490 return -1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
491
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
492 Py_INCREF(element);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
493 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
494
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
495 self->extra->length++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
496
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
497 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
498 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
499
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
500 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
501 element_get_attrib(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
502 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
503 /* 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
504 /* 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
505
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
506 PyObject* res = self->extra->attrib;
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 if (res == Py_None) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
509 /* create missing dictionary */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
510 res = PyDict_New();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
511 if (!res)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
512 return NULL;
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
513 Py_DECREF(Py_None);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
514 self->extra->attrib = res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
515 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
516
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
517 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
518 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
519
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
520 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
521 element_get_text(ElementObject* self)
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 /* 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
524
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
525 PyObject* res = self->text;
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 if (JOIN_GET(res)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
528 res = JOIN_OBJ(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
529 if (PyList_CheckExact(res)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
530 res = list_join(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
531 if (!res)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
532 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
533 self->text = res;
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
536
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
537 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
538 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
539
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
540 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
541 element_get_tail(ElementObject* self)
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 /* 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
544
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
545 PyObject* res = self->tail;
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 if (JOIN_GET(res)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
548 res = JOIN_OBJ(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
549 if (PyList_CheckExact(res)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
550 res = list_join(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
551 if (!res)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
552 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
553 self->tail = res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
554 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
555 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
556
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
557 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
558 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
559
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
560 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
561 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
562 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
563 PyObject* elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
564
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
565 ElementObject* parent;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
566 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
567 PyObject* attrib = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
568 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
569 &Element_Type, &parent, &tag,
87505
e02bf9919f01 Cosmetic fixes
Eli Bendersky <eliben@gmail.com>
parents: 87083
diff changeset
570 &PyDict_Type, &attrib)) {
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
571 return NULL;
87505
e02bf9919f01 Cosmetic fixes
Eli Bendersky <eliben@gmail.com>
parents: 87083
diff changeset
572 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
573
77217
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 /* 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
576 attrib = PyDict_Copy(attrib);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
577 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
578 return NULL;
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
579 if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
580 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
581 return NULL;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
582 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
583 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
584 } else if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
585 /* have keyword args */
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
586 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
587 if (!attrib)
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
588 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
589 } else {
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
590 /* 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
591 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
592 attrib = Py_None;
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
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
595 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
596 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
597 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
598 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
599
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
600 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
601 Py_DECREF(elem);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
602 return NULL;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
603 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
604
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
605 return elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
606 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
607
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
608 static int
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
609 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
610 {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
611 Py_VISIT(self->tag);
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
612 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
613 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
614
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
615 if (self->extra) {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
616 int i;
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
617 Py_VISIT(self->extra->attrib);
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
618
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
619 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
620 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
621 }
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
622 return 0;
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
623 }
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
624
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
625 static int
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
626 element_gc_clear(ElementObject *self)
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
627 {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
628 Py_CLEAR(self->tag);
85676
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
629 _clear_joined_ptr(&self->text);
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
630 _clear_joined_ptr(&self->tail);
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
631
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
632 /* 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
633 * so fully deallocate it.
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
634 */
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
635 dealloc_extra(self);
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
636 return 0;
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
637 }
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
638
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
639 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
640 element_dealloc(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
641 {
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
642 PyObject_GC_UnTrack(self);
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
643
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
644 if (self->weakreflist != NULL)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
645 PyObject_ClearWeakRefs((PyObject *) self);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
646
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
647 /* 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
648 */
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
649 element_gc_clear(self);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
650
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
651 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
652 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
653 }
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 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
658 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
659 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
660 PyObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
661 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
662 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
663
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
664 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
665 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
666
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
667 Py_RETURN_NONE;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
670 static PyObject*
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
671 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
672 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
673 if (!PyArg_ParseTuple(args, ":clear"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
674 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
675
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
676 dealloc_extra(self);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
677
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
678 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
679 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
680 self->text = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
681
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
682 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
683 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
684 self->tail = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
685
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
686 Py_RETURN_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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
689 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
690 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
691 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
692 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
693 ElementObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
694
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
695 if (!PyArg_ParseTuple(args, ":__copy__"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
696 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
697
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
698 element = (ElementObject*) create_new_element(
87505
e02bf9919f01 Cosmetic fixes
Eli Bendersky <eliben@gmail.com>
parents: 87083
diff changeset
699 self->tag, (self->extra) ? self->extra->attrib : Py_None);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
700 if (!element)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
701 return NULL;
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 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
704 element->text = self->text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
705 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
706
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
707 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
708 element->tail = self->tail;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
709 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
710
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
711 if (self->extra) {
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
712 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
713 Py_DECREF(element);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
714 return NULL;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
715 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
716
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
717 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
718 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
719 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
720 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
721
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
722 element->extra->length = self->extra->length;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
723 }
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 return (PyObject*) element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
726 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
727
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
728 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
729 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
730 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
731 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
732 ElementObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
733 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
734 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
735 PyObject* text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
736 PyObject* tail;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
737 PyObject* id;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
738
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
739 PyObject* memo;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
740 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
741 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
742
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
743 tag = deepcopy(self->tag, memo);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
744 if (!tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
745 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
746
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
747 if (self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
748 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
749 if (!attrib) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
750 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
751 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
752 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
753 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
754 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
755 attrib = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
756 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
757
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
758 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
759
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
760 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
761 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
762
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
763 if (!element)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
764 return NULL;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
765
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
766 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
767 if (!text)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
768 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
769 Py_DECREF(element->text);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
770 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
771
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
772 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
773 if (!tail)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
774 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
775 Py_DECREF(element->tail);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
776 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
777
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
778 if (self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
779 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
780 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
781
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
782 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
783 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
784 if (!child) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
785 element->extra->length = i;
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 element->extra->children[i] = child;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
789 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
790
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
791 element->extra->length = self->extra->length;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
792 }
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 /* 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
795 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
796 if (!id)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
797 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
798
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
799 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
800
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
801 Py_DECREF(id);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
802
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
803 if (i < 0)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
804 goto error;
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 return (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 error:
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
809 Py_DECREF(element);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
810 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
811 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
812
77485
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
813 static PyObject*
86590
763af3d957f3 Issue #19356: Avoid using a C variabled named "_self", it's a reserved word in some C compilers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85737
diff changeset
814 element_sizeof(PyObject* myself, PyObject* args)
77485
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
815 {
86590
763af3d957f3 Issue #19356: Avoid using a C variabled named "_self", it's a reserved word in some C compilers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85737
diff changeset
816 ElementObject *self = (ElementObject*)myself;
77485
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
817 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
818 if (self->extra) {
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
819 result += sizeof(ElementObjectExtra);
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
820 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
821 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
822 }
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
823 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
824 }
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
825
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
826 /* 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
827 #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
828 #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
829 #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
830 #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
831 #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
832
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
833 /* __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
834 * 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
835 * 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
836 * 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
837 * 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
838 */
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
839 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
840 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
841 {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
842 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
843 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
844
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
845 /* 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
846 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
847 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
848 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
849 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
850 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
851 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
852 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
853 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
854
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
855 /* 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
856 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
857 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
858 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
859 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
860 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
861 PICKLED_ATTRIB,
85676
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
862 PICKLED_TEXT, JOIN_OBJ(self->text),
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
863 PICKLED_TAIL, JOIN_OBJ(self->tail));
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
864 else
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("{sOsOsOsOsO}",
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, self->extra->attrib,
85676
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
869 PICKLED_TEXT, JOIN_OBJ(self->text),
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
870 PICKLED_TAIL, JOIN_OBJ(self->tail));
81445
5b36768b9a11 Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents: 81363
diff changeset
871 if (instancedict) {
5b36768b9a11 Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents: 81363
diff changeset
872 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
873 return instancedict;
81445
5b36768b9a11 Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents: 81363
diff changeset
874 }
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
875 else {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
876 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
877 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
878 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
879
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 NULL;
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
881 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
882 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
883
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
884 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
885 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
886 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
887 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
888 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
889 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
890 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
891 {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
892 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
893
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
894 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
895 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
896 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
897 }
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_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
900 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
901 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
902
85676
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
903 _clear_joined_ptr(&self->text);
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
904 self->text = text ? JOIN_SET(text, PyList_CheckExact(text)) : Py_None;
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
905 Py_INCREF(JOIN_OBJ(self->text));
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
906
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
907 _clear_joined_ptr(&self->tail);
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
908 self->tail = tail ? JOIN_SET(tail, PyList_CheckExact(tail)) : Py_None;
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
909 Py_INCREF(JOIN_OBJ(self->tail));
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
910
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
911 /* 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
912 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
913 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
914
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
915 /* 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
916 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
917 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
918 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
919 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
920 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
921 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
922 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
923 else {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
924 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
925 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
926
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
927 /* 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
928 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
929 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
930 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
931 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
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 /* 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
934 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
935 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
936 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
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
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
939 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
940 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
941
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
942 /* 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
943 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
944 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
945 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
946 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
947 }
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 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
950 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
951
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
952 /* __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
953 * '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
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 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
956 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
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 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
959 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
960 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
961 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
962 PyObject *retval;
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
963
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
964 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
965 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
966 if (!args)
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
967 return NULL;
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
968
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
969 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
970 &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
971 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
972 tail, children);
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
973 else
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
974 retval = NULL;
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
975
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
976 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
977 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
978 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
979
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
980 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
981 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
982 {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
983 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
984 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
985 "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
986 state);
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
987 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
988 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
989 else
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
990 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
991 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
992
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
993 LOCAL(int)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
994 checkpath(PyObject* tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
995 {
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
996 Py_ssize_t i;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
997 int check = 1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
998
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
999 /* 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
1000
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1001 #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
1002 (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
1003
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1004 if (PyUnicode_Check(tag)) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1005 const Py_ssize_t len = PyUnicode_GET_LENGTH(tag);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1006 void *data = PyUnicode_DATA(tag);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1007 unsigned int kind = PyUnicode_KIND(tag);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1008 for (i = 0; i < len; i++) {
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1009 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1010 if (ch == '{')
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1011 check = 0;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1012 else if (ch == '}')
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1013 check = 1;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1014 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
1015 return 1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1016 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1017 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1018 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
1019 if (PyBytes_Check(tag)) {
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
1020 char *p = PyBytes_AS_STRING(tag);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
1021 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
1022 if (p[i] == '{')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1023 check = 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1024 else if (p[i] == '}')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1025 check = 1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1026 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
1027 return 1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1028 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1029 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1030 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1031
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1032 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
1033 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1034
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1035 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
1036 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
1037 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1038 PyObject* seq;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1039 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
1040
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1041 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
1042 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
1043 return NULL;
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 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
1046 if (!seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1047 PyErr_Format(
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1048 PyExc_TypeError,
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1049 "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
1050 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1051 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1052 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1053
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1054 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
1055 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
1056 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
1057 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
1058 Py_DECREF(seq);
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1059 PyErr_Format(
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1060 PyExc_TypeError,
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1061 "expected an Element, not \"%.200s\"",
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1062 Py_TYPE(element)->tp_name);
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1063 return NULL;
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1064 }
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1065
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1066 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
1067 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
1068 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1069 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1070 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1071
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1072 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
1073
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1074 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
1075 }
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 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1078 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
1079 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1080 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1081 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
1082 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
1083 static char *kwlist[] = {"path", "namespaces", 0};
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1084 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
1085
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1086 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
1087 &tag, &namespaces))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1088 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1089
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1090 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
1091 _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
1092 return _PyObject_CallMethodId(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1093 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
1094 );
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1095 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1096
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1097 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1098 Py_RETURN_NONE;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
1099
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1100 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
1101 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
1102 if (Element_CheckExact(item) &&
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1103 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
1104 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1105 return item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1106 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1107 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1108
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1109 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1110 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1111
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1112 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1113 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
1114 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1115 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1116 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1117 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
1118 PyObject* namespaces = Py_None;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
1119 _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
1120 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
1121 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
1122
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1123 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
1124 &tag, &default_value, &namespaces))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1125 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1126
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1127 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
1128 return _PyObject_CallMethodId(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1129 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
1130 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1131
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1132 if (!self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1133 Py_INCREF(default_value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1134 return default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1135 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1136
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1137 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
1138 ElementObject* item = (ElementObject*) self->extra->children[i];
87505
e02bf9919f01 Cosmetic fixes
Eli Bendersky <eliben@gmail.com>
parents: 87083
diff changeset
1139 if (Element_CheckExact(item) &&
e02bf9919f01 Cosmetic fixes
Eli Bendersky <eliben@gmail.com>
parents: 87083
diff changeset
1140 (PyObject_RichCompareBool(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
1141 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
1142 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
1143 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
1144 Py_XINCREF(text);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1145 return text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1146 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1147 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1148
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1149 Py_INCREF(default_value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1150 return default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1151 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1152
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1153 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1154 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
1155 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1156 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1157 PyObject* out;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1158 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
1159 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
1160 static char *kwlist[] = {"path", "namespaces", 0};
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1161 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
1162
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1163 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
1164 &tag, &namespaces))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1165 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1166
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1167 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
1168 _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
1169 return _PyObject_CallMethodId(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1170 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
1171 );
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1172 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1173
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1174 out = PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1175 if (!out)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1176 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1177
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1178 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1179 return out;
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 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
1182 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
1183 if (Element_CheckExact(item) &&
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1184 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
1185 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
1186 Py_DECREF(out);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1187 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1188 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1189 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1190 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1191
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1192 return out;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1193 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1194
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1195 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1196 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
1197 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1198 PyObject* tag;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1199 PyObject* namespaces = Py_None;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
1200 _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
1201 static char *kwlist[] = {"path", "namespaces", 0};
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1202 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
1203
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1204 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:iterfind", kwlist,
87505
e02bf9919f01 Cosmetic fixes
Eli Bendersky <eliben@gmail.com>
parents: 87083
diff changeset
1205 &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
1206 return NULL;
87505
e02bf9919f01 Cosmetic fixes
Eli Bendersky <eliben@gmail.com>
parents: 87083
diff changeset
1207 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1208
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1209 return _PyObject_CallMethodId(
87505
e02bf9919f01 Cosmetic fixes
Eli Bendersky <eliben@gmail.com>
parents: 87083
diff changeset
1210 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
1211 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1212
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1213 static PyObject*
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1214 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
1215 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1216 PyObject* value;
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1217 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
1218
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1219 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1220 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
1221
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1222 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
1223 &default_value))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1224 return NULL;
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 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
1227 value = default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1228 else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1229 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
1230 if (!value)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1231 value = default_value;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1234 Py_INCREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1235 return value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1236 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1237
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1238 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1239 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
1240 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1241 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1242 PyObject* list;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1243
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1244 /* 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
1245
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1246 if (!PyArg_ParseTuple(args, ":getchildren"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1247 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1248
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1249 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1250 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1251
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1252 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
1253 if (!list)
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 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
1257 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
1258 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1259 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
1260 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1261
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1262 return list;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1263 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1264
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
1265
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
1266 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
1267 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
1268
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
1269
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
1270 static PyObject *
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1271 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
1272 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1273 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
1274 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
1275
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1276 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
1277 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1278
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
1279 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
1280 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1281
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1282
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1283 static PyObject*
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1284 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
1285 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1286 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
1287 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1288
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
1289 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
1290 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1291
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
1292
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1293 static PyObject*
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1294 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
1295 {
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1296 ElementObject* self = (ElementObject*) self_;
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1297
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1298 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
1299 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1300 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1301 "child index out of range"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1302 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1303 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1304 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1305
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1306 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
1307 return self->extra->children[index];
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1308 }
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 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1311 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
1312 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1313 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1314
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1315 int index;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1316 PyObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1317 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
1318 &Element_Type, &element))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1319 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1320
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1321 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1322 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
1323 return NULL;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1324 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1325
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1326 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
1327 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
1328 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
1329 index = 0;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1330 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1331 if (index > self->extra->length)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1332 index = self->extra->length;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1333
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1334 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
1335 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1336
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1337 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
1338 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
1339
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1340 Py_INCREF(element);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1341 self->extra->children[index] = element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1342
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1343 self->extra->length++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1344
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1345 Py_RETURN_NONE;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1348 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1349 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
1350 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1351 if (!PyArg_ParseTuple(args, ":items"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1352 return NULL;
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 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
1355 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1356
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1357 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
1358 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1359
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1360 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1361 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
1362 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1363 if (!PyArg_ParseTuple(args, ":keys"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1364 return NULL;
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 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
1367 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1368
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1369 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
1370 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1371
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1372 static Py_ssize_t
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1373 element_length(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1374 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1375 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1376 return 0;
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 return self->extra->length;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1379 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1380
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1381 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1382 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
1383 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1384 PyObject* elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1385
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1386 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1387 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1388 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
1389 return NULL;
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 attrib = PyDict_Copy(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1392 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1393 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1394
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
1395 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
1396
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1397 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1398
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1399 return elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1400 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1401
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1402 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1403 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
1404 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1405 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1406
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1407 PyObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1408 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
1409 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1410
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1411 if (!self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1412 /* 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
1413 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1414 PyExc_ValueError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1415 "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
1416 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1417 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1418 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1419
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1420 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
1421 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
1422 break;
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1423 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
1424 break;
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 if (i == self->extra->length) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1428 /* 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
1429 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1430 PyExc_ValueError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1431 "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
1432 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1433 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1434 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1435
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1436 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
1437
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1438 self->extra->length--;
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 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
1441 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
1442
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1443 Py_RETURN_NONE;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1446 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1447 element_repr(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1448 {
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
1449 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
1450 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
1451 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
1452 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
1453 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1454
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1455 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1456 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
1457 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1458 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1459
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1460 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1461 PyObject* value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1462 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
1463 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1464
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1465 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1466 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
1467 return NULL;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1468 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1469
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1470 attrib = element_get_attrib(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1471 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1472 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1473
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1474 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
1475 return NULL;
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 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1478 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1479
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1480 static int
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1481 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
1482 {
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1483 ElementObject* self = (ElementObject*) self_;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1484 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1485 PyObject* old;
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 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
1488 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1489 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1490 "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
1491 return -1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1492 }
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 old = self->extra->children[index];
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1495
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1496 if (item) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1497 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1498 self->extra->children[index] = item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1499 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1500 self->extra->length--;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1501 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
1502 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
1503 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1504
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1505 Py_DECREF(old);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1506
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1507 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1508 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1509
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1510 static PyObject*
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1511 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
1512 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1513 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
1514
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1515 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
1516 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
1517
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1518 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
1519 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1520 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1521 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
1522 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
1523 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
1524 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1525 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
1526 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
1527 PyObject* list;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1528
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1529 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
1530 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
1531
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65707
diff changeset
1532 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
1533 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
1534 &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
1535 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1536 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1537
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1538 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
1539 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
1540 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1541 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
1542 if (!list)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1543 return NULL;
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 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
1546 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
1547 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
1548 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
1549 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
1550 }
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 return list;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1553 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1554 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1555 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1556 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
1557 "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
1558 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1559 }
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 static int
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1563 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
1564 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1565 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
1566
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1567 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
1568 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
1569
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1570 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
1571 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1572 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1573 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
1574 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
1575 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
1576 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1577 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
1578 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
1579
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1580 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
1581 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
1582
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1583 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1584 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
1585 return -1;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1586 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1587
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65707
diff changeset
1588 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
1589 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
1590 &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
1591 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1592 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1593
75505
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1594 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
1595 /* Delete slice */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1596 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
1597 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
1598
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1599 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
1600 return 0;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1601
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1602 /* 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
1603 * 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
1604 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1605 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
1606 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
1607 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
1608 step = -step;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1609 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1610
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1611 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
1612
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1613 /* 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
1614 * 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
1615 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1616 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
1617 PyErr_NoMemory();
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1618 return -1;
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
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1621 /* 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
1622 * 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
1623 * 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
1624 * 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
1625 * 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
1626 * 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
1627 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1628 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
1629 /* 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
1630 * list end.
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1631 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1632 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
1633 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
1634 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
1635 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1636
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1637 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
1638
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1639 memmove(
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1640 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
1641 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
1642 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
1643 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1644
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1645 /* 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
1646 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
1647 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
1648 memmove(
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1649 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
1650 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
1651 (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
1652 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1653
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1654 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
1655
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1656 /* 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
1657 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
1658 return 0;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1659 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1660 else {
75505
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1661 /* 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
1662 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
1663 if (!seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1664 PyErr_Format(
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1665 PyExc_TypeError,
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1666 "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
1667 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1668 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1669 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1670 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
1671 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1672
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1673 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
1674 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1675 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
1676 "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
1677 "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
1678 newlen, slicelen
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 return -1;
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
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1683 /* 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
1684 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
1685 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
1686 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1687 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
1688 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1689 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1690 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1691 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1692
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1693 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
1694 /* 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
1695 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
1696 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
1697 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
1698 if (!recycle) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1699 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1700 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
1701 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1702 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1703 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1704 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
1705 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
1706 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
1707 }
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 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
1710 /* delete slice */
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1711 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
1712 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
1713 } 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
1714 /* insert slice */
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1715 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
1716 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
1717 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1718
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1719 /* 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
1720 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
1721 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
1722 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
1723 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
1724 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
1725 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1726
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1727 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
1728
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1729 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1730 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
1731 }
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 /* 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
1734 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
1735
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1736 return 0;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1737 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1738 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1739 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
1740 "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
1741 return -1;
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 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1744
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1745 static PyMethodDef element_methods[] = {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1746
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1747 {"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
1748
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1749 {"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
1750 {"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
1751
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1752 {"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
1753 {"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
1754 {"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
1755
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1756 {"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
1757 {"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
1758 {"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
1759 {"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
1760
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1761 {"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
1762 {"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
1763 {"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
1764
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1765 {"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
1766 {"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
1767
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1768 {"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
1769 {"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
1770
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1771 {"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
1772
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1773 {"__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
1774 {"__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
1775 {"__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
1776 {"__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
1777 {"__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
1778
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1779 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1780 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1781
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1782 static PyObject*
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1783 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
1784 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1785 PyObject* res;
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1786 char *name = "";
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1787
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1788 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
1789 name = _PyUnicode_AsString(nameobj);
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
1790
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
1791 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
1792 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
1793
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1794 /* 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
1795 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
1796 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
1797 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
1798 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1799 } 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
1800 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
1801 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
1802 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1803 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1804
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1805 /* methods */
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1806 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
1807 if (res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1808 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1809
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1810 /* 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
1811 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
1812 PyErr_Clear();
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1813 res = element_get_tail(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1814 } 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
1815 PyErr_Clear();
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1816 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1817 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
1818 return NULL;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1819 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1820 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
1821 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1822
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1823 if (!res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1824 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1825
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1826 Py_INCREF(res);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1827 return res;
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
83824
9682241dc8fc Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents: 83492
diff changeset
1830 static int
77062
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1831 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
1832 {
77062
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1833 char *name = "";
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1834 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
1835 name = _PyUnicode_AsString(nameobj);
84567
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
1836 if (name == NULL)
83824
9682241dc8fc Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents: 83492
diff changeset
1837 return -1;
84567
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
1838
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
1839 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
1840 Py_DECREF(self->tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1841 self->tag = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1842 Py_INCREF(self->tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1843 } 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
1844 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
1845 self->text = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1846 Py_INCREF(self->text);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1847 } 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
1848 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
1849 self->tail = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1850 Py_INCREF(self->tail);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1851 } 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
1852 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1853 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
1854 return -1;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1855 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1856 Py_DECREF(self->extra->attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1857 self->extra->attrib = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1858 Py_INCREF(self->extra->attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1859 } else {
83824
9682241dc8fc Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents: 83492
diff changeset
1860 PyErr_SetString(PyExc_AttributeError,
83849
65680e3a7f07 Issue #17989: fix typo in error message
Eli Bendersky <eliben@gmail.com>
parents: 83833
diff changeset
1861 "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
1862 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1863 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1864
83824
9682241dc8fc Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents: 83492
diff changeset
1865 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1866 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1867
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1868 static PySequenceMethods element_as_sequence = {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1869 (lenfunc) element_length,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1870 0, /* sq_concat */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1871 0, /* sq_repeat */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1872 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
1873 0,
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1874 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
1875 0,
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1876 };
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1877
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1878 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
1879 (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
1880 (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
1881 (objobjargproc) element_ass_subscr,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1882 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1883
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
1884 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
1885 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
1886 "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
1887 /* 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
1888 (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
1889 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
1890 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
1891 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
1892 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
1893 (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
1894 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
1895 &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
1896 &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
1897 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
1898 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
1899 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
1900 (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
1901 (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
1902 0, /* tp_as_buffer */
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1903 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
1904 /* 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
1905 0, /* tp_doc */
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1906 (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
1907 (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
1908 0, /* tp_richcompare */
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
1909 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
1910 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
1911 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
1912 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
1913 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
1914 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
1915 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
1916 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
1917 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
1918 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
1919 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
1920 (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
1921 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
1922 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
1923 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1924 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1925
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
1926 /******************************* 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
1927
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
1928 /* 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
1929 * 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
1930 * 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
1931 * 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
1932 * 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
1933 * 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
1934 * 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
1935 */
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 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
1937 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
1938 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
1939 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
1940 } 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
1941
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 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
1943 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
1944 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
1945 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
1946 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
1947 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
1948 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
1949 } 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
1950
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
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 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
1953 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
1954 {
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 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
1956 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
1957 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
1958 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
1959 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
1960 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
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
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 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
1964 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
1965
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 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
1967 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
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 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
1971 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
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 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
1974 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
1975 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
1976 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
1977 }
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
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 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
1980 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
1981 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
1982 }
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
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 /* 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
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 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
1987 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
1988 {
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 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
1990 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
1991 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
1992 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
1993 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
1994 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
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 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
1997 }
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
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 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
2000 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
2001 {
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 /* Sub-element iterator.
81479
7e072816b197 Clean trailing whitespace in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents: 81447
diff changeset
2003 *
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
2004 * 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
2005 * 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
2006 * 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
2007 * - 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
2008 * 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
2009 * 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
2010 * - 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
2011 * 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
2012 */
77432
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
2013 ElementObject *cur_parent;
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
2014 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
2015
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 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
2017 /* 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
2018 * 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
2019 * 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
2020 * 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
2021 * 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
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 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
2024 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
2025 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
2026 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
2027 } 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
2028 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
2029 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
2030 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
2031 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
2032 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
2033 }
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
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->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
2036 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
2037 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
2038 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
2039 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
2040 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
2041 if (!text)
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2042 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
2043 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
2044 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
2045 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
2046 }
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
2047 } 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
2048 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
2049 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
2050 }
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 }
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 }
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
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 /* 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
2056 * 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
2057 */
77432
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
2058 cur_parent = it->parent_stack->parent;
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
2059 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
2060 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
2061 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
2062 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
2063 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
2064 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
2065 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
2066 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
2067 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
2068 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
2069 }
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
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 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
2072 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
2073 if (!text)
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2074 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
2075 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
2076 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
2077 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
2078 }
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
2079 } 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
2080 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
2081 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
2082 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
2083 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
2084 }
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 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
2086 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
2087 }
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 else {
81363
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2089 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
2090 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
2091 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
2092 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
2093 if (!tail)
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2094 return NULL;
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2095 }
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2096 else
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2097 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
2098 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
2099 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
2100 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
2101
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
2102 /* 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
2103 * 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
2104 * 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
2105 */
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 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
2107 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
2108 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
2109 }
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 }
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 }
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 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
2114 }
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
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 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
2118 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
2119 /* 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
2120 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
2121 "_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
2122 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
2123 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
2124 /* 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
2125 (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
2126 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
2127 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
2128 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
2129 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
2130 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
2131 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
2132 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
2133 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
2134 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
2135 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
2136 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
2137 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
2138 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
2139 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
2140 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
2141 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
2142 (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
2143 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
2144 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
2145 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
2146 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
2147 (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
2148 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
2149 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
2150 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
2151 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
2152 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
2153 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
2154 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
2155 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
2156 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
2157 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
2158 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
2159 };
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
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
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 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
2163 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
2164 {
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 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
2166 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
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 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
2169 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
2170 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
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 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
2173 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
2174 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
2175 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
2176
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 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
2178 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
2179 Py_XDECREF(star);
84567
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
2180
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
2181 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
2182 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
2183 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
2184 it->gettext = gettext;
84567
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
2185 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
2186 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
2187
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
2188 PyObject_GC_Track(it);
84581
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2189
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2190 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
2191 if (it->parent_stack == NULL) {
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2192 Py_DECREF(it);
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2193 PyErr_NoMemory();
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2194 return NULL;
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2195 }
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2196 it->parent_stack->parent = NULL;
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2197 it->parent_stack->child_index = 0;
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2198 it->parent_stack->next = NULL;
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2199
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
2200 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
2201 }
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
2202
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
2203
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2204 /* ==================================================================== */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2205 /* the tree builder type */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2206
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2207 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2208 PyObject_HEAD
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2209
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2210 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
2211
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
2212 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
2213 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
2214
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2215 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
2216
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2217 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
2218 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
2219
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2220 PyObject *element_factory;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2221
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2222 /* 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
2223 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
2224 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
2225 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
2226 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
2227 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
2228 } TreeBuilderObject;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2229
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
2230 #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
2231
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2232 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2233 /* constructor and destructor */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2234
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2235 static PyObject *
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2236 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
2237 {
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2238 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
2239 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
2240 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
2241
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2242 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
2243 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
2244 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
2245 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
2246
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2247 t->data = NULL;
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2248 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
2249 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
2250 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
2251 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
2252 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
2253 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
2254 return NULL;
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2255 }
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2256 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
2257
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2258 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
2259 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
2260 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
2261 }
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2262 return (PyObject *)t;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2263 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2264
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2265 static int
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2266 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
2267 {
77313
eb1d633fe307 Fix unterminated keyword array passed to PyArg_ParseTupleAndKeywords
Eli Bendersky <eliben@gmail.com>
parents: 77279
diff changeset
2268 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
2269 PyObject *element_factory = NULL;
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2270 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
2271 PyObject *tmp;
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2272
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2273 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
2274 &element_factory)) {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2275 return -1;
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2276 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2277
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2278 if (element_factory) {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2279 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
2280 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
2281 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
2282 Py_XDECREF(tmp);
77246
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
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2285 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2286 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2287
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2288 static int
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2289 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
2290 {
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2291 Py_VISIT(self->root);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2292 Py_VISIT(self->this);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2293 Py_VISIT(self->last);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2294 Py_VISIT(self->data);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2295 Py_VISIT(self->stack);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2296 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
2297 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2298 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2299
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2300 static int
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2301 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
2302 {
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2303 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
2304 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
2305 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
2306 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
2307 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
2308 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
2309 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
2310 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
2311 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
2312 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
2313 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
2314 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2315 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2316
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2317 static void
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2318 treebuilder_dealloc(TreeBuilderObject *self)
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2319 {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2320 PyObject_GC_UnTrack(self);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2321 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
2322 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
2323 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2324
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2325 /* -------------------------------------------------------------------- */
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
2326 /* 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
2327
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
2328 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
2329 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
2330 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
2331 {
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
2332 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
2333 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
2334 *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
2335 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
2336 }
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 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
2338 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
2339 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
2340 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
2341 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
2342 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
2343 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
2344 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
2345 }
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 }
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
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 /* 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
2349 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
2350 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
2351 {
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 _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
2353 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
2354 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
2355 }
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
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 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
2358 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
2359 {
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 _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
2361 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
2362 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
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
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 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
2366 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
2367 {
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 _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
2369 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
2370 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
2371 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
2372 }
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 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
2374 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
2375 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
2376 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
2377 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
2378 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
2379 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
2380 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2381 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2382
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2383 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2384 /* handlers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2385
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2386 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2387 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
2388 PyObject* attrib)
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 PyObject* node;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2391 PyObject* this;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2392 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
2393
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2394 if (self->data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2395 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
2396 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
2397 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
2398 }
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
2399 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
2400 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
2401 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2402 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2403 self->data = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2404 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2405
83833
c430bea30457 Issue #17901: fix TreeBuilder construction for an explicit element_factory=None
Eli Bendersky <eliben@gmail.com>
parents: 83824
diff changeset
2406 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
2407 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
2408 } else {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2409 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
2410 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2411 if (!node) {
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2412 return NULL;
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2413 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2414
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
2415 this = self->this;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2416
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2417 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
2418 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
2419 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2420 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2421 if (self->root) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2422 PyErr_SetString(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2423 st->parseerror_obj,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2424 "multiple elements on top level"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2425 );
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2428 Py_INCREF(node);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2429 self->root = node;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2430 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2431
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2432 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
2433 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
2434 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2435 Py_INCREF(this);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2436 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2437 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
2438 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2439 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2440 self->index++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2441
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2442 Py_DECREF(this);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2443 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
2444 self->this = node;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2445
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2446 Py_DECREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2447 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
2448 self->last = node;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2449
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2450 if (self->start_event_obj) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2451 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2452 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
2453 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
2454 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2455 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2456 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2457 } else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2458 PyErr_Clear(); /* FIXME: propagate error */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2459 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2460
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2461 return node;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2462
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2463 error:
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2464 Py_DECREF(node);
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2465 return NULL;
36050
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 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2469 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
2470 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2471 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
2472 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
2473 /* 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
2474 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
2475 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2476 /* 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
2477 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
2478 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2479 /* 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
2480 if (PyBytes_CheckExact(self->data) && Py_REFCNT(self->data) == 1 &&
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2481 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
2482 /* 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
2483 /* 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
2484 the most common case by resizing the existing string... */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2485 Py_ssize_t size = PyBytes_GET_SIZE(self->data);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2486 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
2487 return NULL;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2488 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
2489 } 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
2490 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
2491 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2492 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2493 PyObject* list = PyList_New(2);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2494 if (!list)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2495 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2496 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
2497 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
2498 self->data = list;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2499 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2500 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2501
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2502 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2503 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2504
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2505 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2506 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
2507 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2508 PyObject* item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2509
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2510 if (self->data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2511 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
2512 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
2513 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2514 } 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
2515 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
2516 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2517 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2518 self->data = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2519 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2520
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2521 if (self->index == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2522 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2523 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2524 "pop from empty stack"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2525 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2526 return NULL;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2529 self->index--;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2530
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2531 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
2532 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2533
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2534 Py_DECREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2535
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
2536 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
2537 self->this = item;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2538
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2539 if (self->end_event_obj) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2540 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2541 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
2542 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
2543 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
2544 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2545 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2546 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2547 } else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2548 PyErr_Clear(); /* FIXME: propagate error */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2549 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2550
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2551 Py_INCREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2552 return (PyObject*) self->last;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2553 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2554
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2555 LOCAL(void)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2556 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
2557 PyObject *prefix, PyObject *uri)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2558 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2559 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2560 PyObject* action;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2561 PyObject* parcel;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2562
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2563 if (!self->events)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2564 return;
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 if (start) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2567 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
2568 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2569 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
2570 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
2571 if (!parcel)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2572 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2573 Py_INCREF(action);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2574 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2575 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
2576 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2577 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
2578 Py_INCREF(action);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2579 parcel = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2580 Py_INCREF(parcel);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2581 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2582
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2583 res = PyTuple_New(2);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2584
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2585 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2586 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
2587 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
2588 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2589 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
2590 }
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2591 else {
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2592 Py_DECREF(action);
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2593 Py_DECREF(parcel);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2594 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
2595 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2596 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2597
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2598 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2599 /* methods (in alphabetical order) */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2600
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2601 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2602 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
2603 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2604 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2605 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
2606 return NULL;
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 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
2609 }
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 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2612 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
2613 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2614 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2615 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
2616 return NULL;
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 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
2619 }
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 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2622 treebuilder_done(TreeBuilderObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2623 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2624 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2625
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2626 /* FIXME: check stack size? */
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 if (self->root)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2629 res = self->root;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2630 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2631 res = Py_None;
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 Py_INCREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2634 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2635 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2636
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2637 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2638 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
2639 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2640 if (!PyArg_ParseTuple(args, ":close"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2641 return NULL;
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 return treebuilder_done(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2644 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2645
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2646 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2647 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
2648 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2649 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2650 PyObject* attrib = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2651 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
2652 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2653
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2654 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
2655 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2656
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2657 static PyMethodDef treebuilder_methods[] = {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2658 {"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
2659 {"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
2660 {"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
2661 {"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
2662 {NULL, NULL}
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
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
2665 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
2666 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
2667 "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
2668 /* methods */
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2669 (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
2670 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
2671 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
2672 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
2673 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
2674 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
2675 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
2676 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
2677 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
2678 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
2679 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
2680 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
2681 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
2682 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
2683 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
2684 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
2685 /* 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
2686 0, /* tp_doc */
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2687 (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
2688 (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
2689 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
2690 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
2691 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
2692 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
2693 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
2694 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
2695 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
2696 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
2697 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
2698 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
2699 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
2700 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
2701 (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
2702 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
2703 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
2704 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2705 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2706
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2707 /* ==================================================================== */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2708 /* the expat interface */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2709
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2710 #include "expat.h"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2711 #include "pyexpat.h"
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2712
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2713 /* 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
2714 * 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
2715 */
77278
cf9c379a9859 We're always building _elementtree with USE_PYEXPAT_CAPI, so the #ifdefs in
Eli Bendersky <eliben@gmail.com>
parents: 77275
diff changeset
2716 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
2717 #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
2718
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
2719 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
2720 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
2721
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2722 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2723 PyObject_HEAD
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2724
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2725 XML_Parser parser;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2726
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2727 PyObject *target;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2728 PyObject *entity;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2729
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2730 PyObject *names;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2731
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2732 PyObject *handle_start;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2733 PyObject *handle_data;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2734 PyObject *handle_end;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2735
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2736 PyObject *handle_comment;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2737 PyObject *handle_pi;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2738 PyObject *handle_doctype;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2739
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2740 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
2741
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2742 } XMLParserObject;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2743
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2744 #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
2745
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2746 /* helpers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2747
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2748 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2749 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
2750 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2751 /* 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
2752 to a universal name string */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2753
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2754 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
2755 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2756 PyObject* value;
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 /* look the 'raw' name up in the names dictionary */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2759 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
2760 if (!key)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2761 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2762
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2763 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
2764
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2765 if (value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2766 Py_INCREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2767 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2768 /* 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
2769 necessary */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2770
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2771 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2772 char* p;
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2773 Py_ssize_t i;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2774
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2775 /* look for namespace separator */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2776 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
2777 if (string[i] == '}')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2778 break;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2779 if (i != size) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2780 /* convert to universal name */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2781 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
2782 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
2783 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
2784 return NULL;
0877e17fa25e Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84567
diff changeset
2785 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2786 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
2787 p[0] = '{';
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2788 memcpy(p+1, string, size);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2789 size++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2790 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2791 /* 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
2792 Py_INCREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2793 tag = key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2794 }
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
2795
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2796 /* decode universal name */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2797 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
2798 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
2799 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
2800 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
2801 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
2802 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
2803 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2804
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2805 /* add to names dictionary */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2806 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
2807 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2808 Py_DECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2809 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2810 }
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2813 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2814 return value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2815 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2816
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2817 /* 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
2818 * 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
2819 * 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
2820 */
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2821 static void
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2822 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
2823 {
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2824 PyObject *errmsg, *error, *position, *code;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2825 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
2826
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2827 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
2828 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
2829 line, column);
68805
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2830 if (errmsg == NULL)
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2831 return;
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2832
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2833 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
2834 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
2835 if (!error)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2836 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2837
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2838 /* 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
2839 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
2840 if (!code) {
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2841 Py_DECREF(error);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2842 return;
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2843 }
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2844 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
2845 Py_DECREF(error);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2846 Py_DECREF(code);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2847 return;
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2848 }
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2849 Py_DECREF(code);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2850
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2851 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
2852 if (!position) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2853 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
2854 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2855 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2856 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
2857 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
2858 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
2859 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2860 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2861 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
2862
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2863 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
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 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2866
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2867 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2868 /* handlers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2869
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2870 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2871 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
2872 int data_len)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2873 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2874 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2875 PyObject* value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2876 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2877
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2878 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
2879 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2880
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
2881 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
2882 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
2883
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
2884 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
2885 if (!key)
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2888 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
2889
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2890 if (value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2891 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2892 res = treebuilder_handle_data(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2893 (TreeBuilderObject*) self->target, value
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 else if (self->handle_data)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2896 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
2897 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2898 res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2899 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
2900 } 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
2901 /* 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
2902 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
2903 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
2904 expat_set_error(
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2905 XML_ERROR_UNDEFINED_ENTITY,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2906 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
2907 EXPAT(GetErrorColumnNumber)(self->parser),
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2908 message
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2909 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2910 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2911
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2912 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2913 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2914
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2915 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2916 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
2917 const XML_Char **attrib_in)
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 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2920 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2921 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2922 int ok;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2923
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
2924 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
2925 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
2926
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2927 /* tag name */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2928 tag = makeuniversal(self, tag_in);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2929 if (!tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2930 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
2931
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2932 /* attributes */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2933 if (attrib_in[0]) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2934 attrib = PyDict_New();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2935 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2936 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2937 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
2938 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
2939 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
2940 if (!key || !value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2941 Py_XDECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2942 Py_XDECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2943 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2944 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2945 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2946 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
2947 Py_DECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2948 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2949 if (ok < 0) {
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 attrib_in += 2;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2954 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2955 } else {
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2956 /* 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
2957 attrib = PyDict_New();
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2958 if (!attrib)
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2959 return;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2960 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2961
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2962 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
2963 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2964 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
2965 tag, attrib);
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2966 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2967 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
2968 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
2969 } else
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2970 res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2971
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2972 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2973 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2974
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2975 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2976 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2977
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2978 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2979 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
2980 int data_len)
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 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2983 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2984
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
2985 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
2986 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
2987
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
2988 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
2989 if (!data)
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2990 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
2991
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2992 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2993 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2994 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
2995 else if (self->handle_data)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2996 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
2997 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2998 res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2999
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3000 Py_DECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3001
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3002 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3003 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3004
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3005 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3006 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
3007 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3008 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3009 PyObject* res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3010
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
3011 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
3012 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
3013
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3014 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3015 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3016 /* 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
3017 res = treebuilder_handle_end(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3018 (TreeBuilderObject*) self->target, Py_None
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3019 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3020 else if (self->handle_end) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3021 tag = makeuniversal(self, tag_in);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3022 if (tag) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3023 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
3024 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3025 }
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3028 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3029 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3030
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3031 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3032 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
3033 const XML_Char *uri)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3034 {
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3035 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
3036 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
3037
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
3038 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
3039 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
3040
87625
68f1e5262a7a Issue #19815: Fix segfault when parsing empty namespace declaration.
Eli Bendersky <eliben@gmail.com>
parents: 86590
diff changeset
3041 if (uri)
87626
712ebde527c2 Fix indentation from previous commit
Eli Bendersky <eliben@gmail.com>
parents: 87625
diff changeset
3042 suri = PyUnicode_DecodeUTF8(uri, strlen(uri), "strict");
87625
68f1e5262a7a Issue #19815: Fix segfault when parsing empty namespace declaration.
Eli Bendersky <eliben@gmail.com>
parents: 86590
diff changeset
3043 else
87626
712ebde527c2 Fix indentation from previous commit
Eli Bendersky <eliben@gmail.com>
parents: 87625
diff changeset
3044 suri = PyUnicode_FromString("");
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3045 if (!suri)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3046 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3047
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3048 if (prefix)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3049 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
3050 else
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3051 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
3052 if (!sprefix) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3053 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
3054 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3055 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3056
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3057 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
3058 (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
3059 );
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3060
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3061 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
3062 Py_DECREF(suri);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3063 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3064
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3065 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3066 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
3067 {
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
3068 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
3069 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
3070
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3071 treebuilder_handle_namespace(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3072 (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
3073 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3074 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3075
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3076 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3077 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
3078 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3079 PyObject* comment;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3080 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3081
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
3082 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
3083 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
3084
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3085 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
3086 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
3087 if (comment) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3088 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
3089 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3090 Py_DECREF(comment);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3091 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3092 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3093 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3094
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3095 static void
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3096 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
3097 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
3098 const XML_Char *sysid,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3099 const XML_Char *pubid,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3100 int has_internal_subset)
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3101 {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3102 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
3103 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
3104 PyObject *parser_doctype = NULL;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3105 PyObject *res = NULL;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3106
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
3107 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
3108 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
3109
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3110 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
3111 if (!doctype_name_obj)
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3112 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3113
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3114 if (sysid) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3115 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
3116 if (!sysid_obj) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3117 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
3118 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3119 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3120 } else {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3121 Py_INCREF(Py_None);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3122 sysid_obj = Py_None;
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
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3125 if (pubid) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3126 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
3127 if (!pubid_obj) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3128 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
3129 Py_DECREF(sysid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3130 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3131 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3132 } else {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3133 Py_INCREF(Py_None);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3134 pubid_obj = Py_None;
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
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3137 /* 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
3138 if (self->handle_doctype) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3139 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
3140 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
3141 Py_CLEAR(res);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3142 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3143
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3144 /* 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
3145 * 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
3146 * (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
3147 */
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3148 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
3149 if (parser_doctype) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3150 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
3151 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
3152 "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
3153 " 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
3154 1) < 0) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3155 goto clear;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3156 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3157 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
3158 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
3159 Py_CLEAR(res);
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 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3162
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3163 clear:
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3164 Py_XDECREF(parser_doctype);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3165 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
3166 Py_DECREF(pubid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3167 Py_DECREF(sysid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3168 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3169
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3170 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3171 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
3172 const XML_Char* data_in)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3173 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3174 PyObject* target;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3175 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3176 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3177
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
3178 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
3179 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
3180
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3181 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
3182 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
3183 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
3184 if (target && data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3185 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
3186 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3187 Py_DECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3188 Py_DECREF(target);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3189 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3190 Py_XDECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3191 Py_XDECREF(target);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3192 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3193 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3194 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3195
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3196 /* -------------------------------------------------------------------- */
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3197
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3198 static PyObject *
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3199 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
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 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
3202 if (self) {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3203 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
3204 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
3205 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
3206 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
3207 self->handle_doctype = NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3208 }
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3209 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
3210 }
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3211
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3212 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3213 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
3214 {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3215 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
3216 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
3217 char *encoding = NULL;
77313
eb1d633fe307 Fix unterminated keyword array passed to PyArg_ParseTupleAndKeywords
Eli Bendersky <eliben@gmail.com>
parents: 77279
diff changeset
3218 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
3219
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3220 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
3221 &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
3222 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3223 }
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3224
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3225 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
3226 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
3227 return -1;
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3228
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->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
3230 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
3231 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
3232 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3233 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3234
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3235 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
3236 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
3237 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
3238 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
3239 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
3240 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3241 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3242
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3243 if (target) {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3244 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
3245 } else {
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
3246 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
3247 if (!target) {
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3248 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
3249 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
3250 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
3251 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3252 }
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3253 }
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3254 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
3255
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3256 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
3257 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
3258 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
3259 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
3260 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
3261 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
3262 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
3263
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3264 PyErr_Clear();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3265
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3266 /* 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
3267 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
3268 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
3269 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3270 (XML_StartElementHandler) expat_start_handler,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3271 (XML_EndElementHandler) expat_end_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3272 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3273 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
3274 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3275 (XML_DefaultHandler) expat_default_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(SetCharacterDataHandler)(
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_CharacterDataHandler) expat_data_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3280 );
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3281 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
3282 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
3283 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3284 (XML_CommentHandler) expat_comment_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3285 );
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3286 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
3287 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
3288 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3289 (XML_ProcessingInstructionHandler) expat_pi_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3290 );
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3291 EXPAT(SetStartDoctypeDeclHandler)(
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3292 self_xp->parser,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3293 (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
3294 );
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3295 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
3296 self_xp->parser,
83919
f7b47fb30169 Issue #13612: handle unknown encodings without a buffer overflow.
Eli Bendersky <eliben@gmail.com>
parents: 83890
diff changeset
3297 EXPAT(DefaultUnknownEncodingHandler), NULL
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3298 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3299
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3300 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3301 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3302
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3303 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3304 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
3305 {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3306 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
3307 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
3308 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
3309 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
3310 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
3311 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
3312
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->target);
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->entity);
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->names);
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 return 0;
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3318 }
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3319
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3320 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3321 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
3322 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3323 EXPAT(ParserFree)(self->parser);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3324
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3325 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
3326 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
3327 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
3328 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
3329 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
3330 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
3331 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
3332
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->target);
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->entity);
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->names);
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3336
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3337 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3338 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3339
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3340 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3341 xmlparser_dealloc(XMLParserObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3342 {
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3343 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
3344 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
3345 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
3346 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3347
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3348 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
3349 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
3350 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3351 int ok;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3352
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
3353 assert(!PyErr_Occurred());
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3354 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
3355
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3356 if (PyErr_Occurred())
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3357 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3358
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3359 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
3360 expat_set_error(
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
3361 EXPAT(GetErrorCode)(self->parser),
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3362 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
3363 EXPAT(GetErrorColumnNumber)(self->parser),
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
3364 NULL
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3365 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3366 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3367 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3368
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3369 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3370 }
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 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3373 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
3374 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3375 /* end feeding data to parser */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3376
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3377 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3378 if (!PyArg_ParseTuple(args, ":close"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3379 return NULL;
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 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
3382 if (!res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3383 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3384
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3385 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
3386 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3387 return treebuilder_done((TreeBuilderObject*) self->target);
85371
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3388 }
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3389 else if (self->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
3390 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
3391 return PyObject_CallFunction(self->handle_close, "");
85371
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3392 }
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3393 else {
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3394 return res;
85371
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3395 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3396 }
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 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
3399 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
3400 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3401 /* feed data to parser */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3402
83890
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3403 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
3404 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
3405 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
3406 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
3407 return NULL;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3408 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
3409 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
3410 return NULL;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3411 }
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3412 /* 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
3413 (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
3414 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
3415 }
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3416 else {
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3417 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
3418 PyObject *res;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3419 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
3420 return NULL;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3421 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
3422 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
3423 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
3424 return NULL;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3425 }
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3426 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
3427 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
3428 return res;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3429 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3430 }
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 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
3433 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
3434 {
83852
8425e8cc2bf2 Get rid of ugly code duplication for ElementTree.parse when the accelerator
Eli Bendersky <eliben@gmail.com>
parents: 83850
diff changeset
3435 /* (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
3436 PyObject* reader;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3437 PyObject* buffer;
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3438 PyObject* temp;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3439 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3440
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3441 PyObject* fileobj;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3442 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
3443 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3444
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3445 reader = PyObject_GetAttrString(fileobj, "read");
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3446 if (!reader)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3447 return NULL;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3448
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3449 /* read from open file object */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3450 for (;;) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3451
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3452 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
3453
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3454 if (!buffer) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3455 /* 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
3456 Py_DECREF(reader);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3457 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3458 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3459
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3460 if (PyUnicode_CheckExact(buffer)) {
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3461 /* A unicode object is encoded into bytes using UTF-8 */
87083
28f71af02b69 Don't use deprecated function PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@gmail.com>
parents: 86591
diff changeset
3462 if (PyUnicode_GET_LENGTH(buffer) == 0) {
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3463 Py_DECREF(buffer);
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3464 break;
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3465 }
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3466 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
3467 Py_DECREF(buffer);
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3468 if (!temp) {
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3469 /* 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
3470 Py_DECREF(reader);
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3471 return NULL;
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3472 }
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3473 buffer = temp;
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3474 }
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3475 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
3476 Py_DECREF(buffer);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3477 break;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3478 }
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 res = expat_parse(
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
3481 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
3482 );
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 Py_DECREF(buffer);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3485
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3486 if (!res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3487 Py_DECREF(reader);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3488 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3489 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3490 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3491
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 Py_DECREF(reader);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3495
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3496 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
3497
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3498 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
3499 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3500 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
3501 }
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 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3504 }
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 static PyObject*
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3507 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
3508 {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3509 Py_RETURN_NONE;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3510 }
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 static PyObject*
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3513 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
3514 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3515 /* 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
3516 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
3517 TreeBuilderObject *target;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3518
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3519 PyObject *events_queue;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3520 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
3521 PyObject *events_seq;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3522 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
3523 &events_to_report))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3524 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3525
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3526 if (!TreeBuilder_CheckExact(self->target)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3527 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3528 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
3529 "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
3530 "targets"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3531 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3532 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3533 }
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 target = (TreeBuilderObject*) self->target;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3536
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3537 Py_INCREF(events_queue);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3538 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
3539 target->events = events_queue;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3540
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3541 /* 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
3542 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
3543 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
3544 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
3545 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
3546
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3547 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
3548 /* 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
3549 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
3550 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3551 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3552
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3553 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
3554 "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
3555 return NULL;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3556 }
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 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
3559 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
3560 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
3561 char *event_name = NULL;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3562 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
3563 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
3564 } 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
3565 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
3566 }
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3567
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3568 if (event_name == NULL) {
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3569 Py_DECREF(events_seq);
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3570 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
3571 return NULL;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3572 } 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
3573 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
3574 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
3575 } 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
3576 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
3577 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
3578 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
3579 } 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
3580 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
3581 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
3582 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
3583 EXPAT(SetNamespaceDeclHandler)(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3584 self->parser,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3585 (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
3586 (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
3587 );
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3588 } 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
3589 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
3590 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
3591 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
3592 EXPAT(SetNamespaceDeclHandler)(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3593 self->parser,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3594 (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
3595 (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
3596 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3597 } else {
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3598 Py_DECREF(events_seq);
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3599 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
3600 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3601 }
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
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3604 Py_DECREF(events_seq);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3605 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3606 }
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 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
3609 {"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
3610 {"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
3611 {"_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
3612 {"_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
3613 {"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
3614 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3615 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3616
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3617 static PyObject*
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3618 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
3619 {
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3620 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
3621 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
3622 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
3623 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
3624 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
3625 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
3626 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
3627 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
3628 "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
3629 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
3630 }
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3631 else
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3632 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
3633
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3634 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
3635 return res;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3636 }
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3637 generic:
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3638 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
3639 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3640
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
3641 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
3642 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
3643 "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
3644 /* methods */
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3645 (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
3646 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
3647 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
3648 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
3649 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
3650 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
3651 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
3652 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
3653 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
3654 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
3655 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
3656 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
3657 (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
3658 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
3659 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
3660 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
3661 /* tp_flags */
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3662 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
3663 (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
3664 (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
3665 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
3666 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
3667 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
3668 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
3669 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
3670 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
3671 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
3672 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
3673 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
3674 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
3675 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
3676 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
3677 (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
3678 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
3679 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
3680 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3681 };
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 /* python module interface */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3685
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3686 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
3687 {"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
3688 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3689 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3690
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3691
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3692 static struct PyModuleDef elementtreemodule = {
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3693 PyModuleDef_HEAD_INIT,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3694 "_elementtree",
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3695 NULL,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3696 sizeof(elementtreestate),
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3697 _functions,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3698 NULL,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3699 elementtree_traverse,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3700 elementtree_clear,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3701 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
3702 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3703
40528
bce7e4a926a9 Cruft removal:
Neal Norwitz <nnorwitz@gmail.com>
parents: 39610
diff changeset
3704 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
3705 PyInit__elementtree(void)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3706 {
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
3707 PyObject *m, *temp;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3708 elementtreestate *st;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3709
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3710 m = PyState_FindModule(&elementtreemodule);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3711 if (m) {
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3712 Py_INCREF(m);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3713 return m;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3714 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3715
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3716 /* Initialize object types */
84714
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
3717 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
3718 return NULL;
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3719 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
3720 return NULL;
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3721 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
3722 return NULL;
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3723 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
3724 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3725
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3726 m = PyModule_Create(&elementtreemodule);
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
3727 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
3728 return NULL;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3729 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
3730
76110
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3731 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
3732 return NULL;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3733 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
3734 Py_XDECREF(temp);
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3735
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3736 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
3737 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3738
77278
cf9c379a9859 We're always building _elementtree with USE_PYEXPAT_CAPI, so the #ifdefs in
Eli Bendersky <eliben@gmail.com>
parents: 77275
diff changeset
3739 /* 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
3740 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
3741 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
3742 /* 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
3743 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
3744 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
3745 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
3746 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
3747 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
3748 PyErr_SetString(PyExc_ImportError,
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3749 "pyexpat version is incompatible");
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3750 return NULL;
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3751 }
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3752 } else {
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3753 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
3754 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3755
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3756 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
3757 "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
3758 );
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3759 Py_INCREF(st->parseerror_obj);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3760 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
3761
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
3762 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
3763 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
3764
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
3765 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
3766 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
3767
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3768 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
3769 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
3770
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3771 return m;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3772 }