annotate Modules/_elementtree.c @ 87488:124e51c19e4f

Issue #19734: Also run pip version check in isolated mode
author Nick Coghlan <ncoghlan@gmail.com>
date Sun, 24 Nov 2013 16:49:20 +1000
parents 28f71af02b69
children e02bf9919f01
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,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
570 &PyDict_Type, &attrib))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
571 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
572
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
573 if (attrib) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
574 /* 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
575 attrib = PyDict_Copy(attrib);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
576 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
577 return NULL;
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
578 if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
579 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
580 return NULL;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
581 }
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 } else if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
584 /* have keyword args */
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
585 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
586 if (!attrib)
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
587 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
588 } else {
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
589 /* 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
590 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
591 attrib = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
592 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
593
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
594 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
595 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
596 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
597 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
598
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
599 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
600 Py_DECREF(elem);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
601 return NULL;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
602 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
603
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
604 return elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
605 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
606
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
607 static int
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
608 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
609 {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
610 Py_VISIT(self->tag);
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
611 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
612 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
613
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
614 if (self->extra) {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
615 int i;
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
616 Py_VISIT(self->extra->attrib);
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
617
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
618 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
619 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
620 }
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
621 return 0;
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
622 }
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 static int
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
625 element_gc_clear(ElementObject *self)
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
626 {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
627 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
628 _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
629 _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
630
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
631 /* 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
632 * so fully deallocate it.
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
633 */
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
634 dealloc_extra(self);
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
635 return 0;
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
636 }
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
637
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
638 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
639 element_dealloc(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
640 {
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
641 PyObject_GC_UnTrack(self);
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
642
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
643 if (self->weakreflist != NULL)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
644 PyObject_ClearWeakRefs((PyObject *) self);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
645
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
646 /* 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
647 */
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
648 element_gc_clear(self);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
649
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
650 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
651 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
652 }
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 /* methods (in alphabetical order) */
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(
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
699 self->tag, (self->extra) ? self->extra->attrib : Py_None
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
700 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
701 if (!element)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
702 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
703
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
704 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
705 element->text = self->text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
706 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
707
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
708 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
709 element->tail = self->tail;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
710 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
711
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
712 if (self->extra) {
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
713
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
714 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
715 Py_DECREF(element);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
716 return NULL;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
717 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
718
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
719 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
720 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
721 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
722 }
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 element->extra->length = self->extra->length;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
725
36050
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 return (PyObject*) element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
729 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
730
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
731 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
732 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
733 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
734 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
735 ElementObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
736 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
737 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
738 PyObject* text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
739 PyObject* tail;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
740 PyObject* id;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
741
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
742 PyObject* memo;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
743 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
744 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
745
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
746 tag = deepcopy(self->tag, memo);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
747 if (!tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
748 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
749
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
750 if (self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
751 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
752 if (!attrib) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
753 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
754 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
755 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
756 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
757 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
758 attrib = Py_None;
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
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
761 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
762
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
763 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
764 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
765
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
766 if (!element)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
767 return NULL;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
768
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
769 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
770 if (!text)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
771 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
772 Py_DECREF(element->text);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
773 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
774
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
775 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
776 if (!tail)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
777 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
778 Py_DECREF(element->tail);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
779 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
780
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
781 if (self->extra) {
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
782
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
783 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
784 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
785
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
786 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
787 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
788 if (!child) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
789 element->extra->length = i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
790 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
791 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
792 element->extra->children[i] = child;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
795 element->extra->length = self->extra->length;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
796
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
797 }
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 /* 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
800 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
801 if (!id)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
802 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
803
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
804 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
805
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
806 Py_DECREF(id);
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 if (i < 0)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
809 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
810
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
811 return (PyObject*) element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
812
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
813 error:
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
814 Py_DECREF(element);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
815 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
816 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
817
77485
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
818 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
819 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
820 {
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
821 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
822 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
823 if (self->extra) {
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
824 result += sizeof(ElementObjectExtra);
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
825 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
826 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
827 }
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
828 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
829 }
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
830
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
831 /* 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
832 #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
833 #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
834 #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
835 #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
836 #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
837
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
838 /* __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
839 * 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
840 * 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
841 * 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
842 * 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
843 */
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
844 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
845 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
846 {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
847 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
848 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
849
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
850 /* 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
851 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
852 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
853 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
854 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
855 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
856 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
857 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
858 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
859
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
860 /* 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
861 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
862 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
863 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
864 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
865 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
866 PICKLED_ATTRIB,
85676
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
867 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
868 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
869 else
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
870 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
871 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
872 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
873 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
874 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
875 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
876 if (instancedict) {
5b36768b9a11 Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents: 81363
diff changeset
877 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
878 return instancedict;
81445
5b36768b9a11 Issue #16076: fix refleak in pickling of Element.
Eli Bendersky <eliben@gmail.com>
parents: 81363
diff changeset
879 }
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
880 else {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
881 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
882 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
883 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
884
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
885 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
886 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
887 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
888
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
889 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
890 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
891 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
892 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
893 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
894 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
895 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
896 {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
897 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
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 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
900 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
901 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
902 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
903
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
904 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
905 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
906 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
907
85676
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
908 _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
909 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
910 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
911
39823ebfc731 Issue #18997: fix ElementTree crash with using pickle and __getstate__.
Eli Bendersky <eliben@gmail.com>
parents: 84734
diff changeset
912 _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
913 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
914 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
915
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
916 /* 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
917 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
918 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
919
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
920 /* 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
921 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
922 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
923 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
924 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
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 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
927 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
928 else {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
929 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
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
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
932 /* 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
933 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
934 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
935 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
936 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
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 /* 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
939 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
940 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
941 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
942 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
943
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
944 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
945 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
946
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
947 /* 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
948 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
949 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
950 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
951 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
952 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
953
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
954 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
955 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
956
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
957 /* __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
958 * '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
959 */
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
960 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
961 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
962 {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
963 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
964 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
965 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
966 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
967 PyObject *retval;
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
968
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
969 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
970 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
971 if (!args)
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
972 return NULL;
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
973
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
974 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
975 &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
976 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
977 tail, children);
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
978 else
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
979 retval = NULL;
4501813ea676 Issue #16076: check for return value of PyTuple_New for args (following
Eli Bendersky <eliben@gmail.com>
parents: 81445
diff changeset
980
81359
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
981 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
982 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
983 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
984
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
985 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
986 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
987 {
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
988 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
989 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
990 "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
991 state);
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
992 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
993 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
994 else
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
995 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
996 }
8d6dadfecf22 Issue #16076: make _elementtree.Element pickle-able in a way that is compatible
Eli Bendersky <eliben@gmail.com>
parents: 81296
diff changeset
997
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
998 LOCAL(int)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
999 checkpath(PyObject* tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1000 {
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
1001 Py_ssize_t i;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
1002 int check = 1;
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 /* 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
1005
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1006 #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
1007 (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
1008
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1009 if (PyUnicode_Check(tag)) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1010 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
1011 void *data = PyUnicode_DATA(tag);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1012 unsigned int kind = PyUnicode_KIND(tag);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1013 for (i = 0; i < len; i++) {
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1014 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1015 if (ch == '{')
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1016 check = 0;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1017 else if (ch == '}')
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1018 check = 1;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
1019 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
1020 return 1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1021 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1022 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1023 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
1024 if (PyBytes_Check(tag)) {
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
1025 char *p = PyBytes_AS_STRING(tag);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
1026 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
1027 if (p[i] == '{')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1028 check = 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1029 else if (p[i] == '}')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1030 check = 1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1031 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
1032 return 1;
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 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1035 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1036
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1037 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
1038 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1039
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1040 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
1041 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
1042 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1043 PyObject* seq;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1044 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
1045
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1046 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
1047 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
1048 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1049
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1050 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
1051 if (!seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1052 PyErr_Format(
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1053 PyExc_TypeError,
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1054 "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
1055 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1056 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1057 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1058
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1059 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
1060 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
1061 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
1062 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
1063 Py_DECREF(seq);
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1064 PyErr_Format(
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1065 PyExc_TypeError,
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1066 "expected an Element, not \"%.200s\"",
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1067 Py_TYPE(element)->tp_name);
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1068 return NULL;
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1069 }
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
1070
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1071 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
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 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1074 }
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 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
1078
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1079 Py_RETURN_NONE;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1080 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1081
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1082 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1083 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
1084 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1085 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1086 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
1087 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
1088 static char *kwlist[] = {"path", "namespaces", 0};
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1089 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
1090
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1091 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
1092 &tag, &namespaces))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1093 return NULL;
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 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
1096 _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
1097 return _PyObject_CallMethodId(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1098 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
1099 );
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1100 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1101
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1102 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1103 Py_RETURN_NONE;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
1104
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1105 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
1106 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
1107 if (Element_CheckExact(item) &&
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1108 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
1109 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1110 return item;
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1113
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1114 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1115 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1116
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1117 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1118 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
1119 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1120 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1121 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1122 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
1123 PyObject* namespaces = Py_None;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
1124 _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
1125 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
1126 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
1127
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1128 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
1129 &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 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1131
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1132 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
1133 return _PyObject_CallMethodId(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1134 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
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 if (!self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1138 Py_INCREF(default_value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1139 return default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1140 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1141
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1142 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
1143 ElementObject* item = (ElementObject*) self->extra->children[i];
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1144 if (Element_CheckExact(item) && (PyObject_RichCompareBool(item->tag, tag, Py_EQ) == 1)) {
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1145
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1146 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
1147 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
1148 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
1149 Py_XINCREF(text);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1150 return text;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1154 Py_INCREF(default_value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1155 return default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1156 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1157
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1158 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1159 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
1160 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1161 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1162 PyObject* out;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1163 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
1164 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
1165 static char *kwlist[] = {"path", "namespaces", 0};
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1166 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
1167
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1168 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
1169 &tag, &namespaces))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1170 return NULL;
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 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
1173 _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
1174 return _PyObject_CallMethodId(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1175 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
1176 );
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1177 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1178
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1179 out = PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1180 if (!out)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1181 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1182
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1183 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1184 return out;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1185
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1186 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
1187 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
1188 if (Element_CheckExact(item) &&
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1189 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
1190 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
1191 Py_DECREF(out);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1192 return NULL;
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1196
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1197 return out;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1198 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1199
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1200 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1201 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
1202 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1203 PyObject* tag;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1204 PyObject* namespaces = Py_None;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
1205 _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
1206 static char *kwlist[] = {"path", "namespaces", 0};
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1207 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
1208
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1209 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:iterfind", kwlist,
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1210 &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 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1212
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1213 return _PyObject_CallMethodId(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
1214 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
1215 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1216 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1217
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1218 static PyObject*
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1219 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
1220 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1221 PyObject* value;
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1222 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
1223
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1224 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1225 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
1226
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1227 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
1228 &default_value))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1229 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1230
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1231 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
1232 value = default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1233 else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1234 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
1235 if (!value)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1236 value = default_value;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1239 Py_INCREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1240 return value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1241 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1242
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1243 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1244 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
1245 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1246 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1247 PyObject* list;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1248
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1249 /* 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
1250
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1251 if (!PyArg_ParseTuple(args, ":getchildren"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1252 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1253
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1254 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1255 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1256
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1257 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
1258 if (!list)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1259 return NULL;
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 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
1262 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
1263 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1264 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
1265 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1266
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1267 return list;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1268 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1269
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
1270
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1271 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
1272 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
1273
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1274
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1275 static PyObject *
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1276 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
1277 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1278 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
1279 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
1280
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1281 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
1282 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1283
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
1284 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
1285 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1286
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1287
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1288 static PyObject*
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1289 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
1290 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1291 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
1292 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1293
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
1294 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
1295 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1296
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
1297
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1298 static PyObject*
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1299 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
1300 {
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1301 ElementObject* self = (ElementObject*) self_;
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1302
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1303 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
1304 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1305 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1306 "child index out of range"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1307 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1308 return NULL;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1311 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
1312 return self->extra->children[index];
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1313 }
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 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1316 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
1317 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1318 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1319
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1320 int index;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1321 PyObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1322 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
1323 &Element_Type, &element))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1324 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1325
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1326 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1327 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
1328 return NULL;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1329 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1330
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1331 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
1332 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
1333 if (index < 0)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1334 index = 0;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1335 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1336 if (index > self->extra->length)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1337 index = self->extra->length;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1338
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1339 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
1340 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1341
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1342 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
1343 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
1344
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1345 Py_INCREF(element);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1346 self->extra->children[index] = element;
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 self->extra->length++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1349
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1350 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1351 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1352
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1353 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1354 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
1355 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1356 if (!PyArg_ParseTuple(args, ":items"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1357 return NULL;
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 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
1360 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1361
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1362 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
1363 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1364
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1365 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1366 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
1367 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1368 if (!PyArg_ParseTuple(args, ":keys"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1369 return NULL;
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 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
1372 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1373
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1374 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
1375 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1376
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1377 static Py_ssize_t
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1378 element_length(ElementObject* self)
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 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1381 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1382
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1383 return self->extra->length;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1384 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1385
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1386 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1387 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
1388 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1389 PyObject* elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1390
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1391 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1392 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1393 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
1394 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1395
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1396 attrib = PyDict_Copy(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1397 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1398 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1399
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
1400 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
1401
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1402 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1403
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1404 return elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1405 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1406
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1407 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1408 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
1409 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1410 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1411
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1412 PyObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1413 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
1414 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1415
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1416 if (!self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1417 /* 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
1418 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1419 PyExc_ValueError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1420 "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
1421 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1422 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1423 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1424
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1425 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
1426 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
1427 break;
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1428 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
1429 break;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1430 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1431
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1432 if (i == self->extra->length) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1433 /* 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
1434 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1435 PyExc_ValueError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1436 "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
1437 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1438 return NULL;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1441 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
1442
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1443 self->extra->length--;
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 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
1446 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
1447
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1448 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1449 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1450
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1451 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1452 element_repr(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1453 {
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
1454 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
1455 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
1456 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
1457 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
1458 }
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 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1461 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
1462 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1463 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1464
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1465 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1466 PyObject* value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1467 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
1468 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1469
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1470 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1471 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
1472 return NULL;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1473 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1474
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1475 attrib = element_get_attrib(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1476 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1477 return NULL;
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 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
1480 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1481
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1482 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1483 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1484
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1485 static int
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1486 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
1487 {
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1488 ElementObject* self = (ElementObject*) self_;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1489 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1490 PyObject* old;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1491
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1492 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
1493 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1494 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1495 "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
1496 return -1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1497 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1498
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1499 old = self->extra->children[index];
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1500
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1501 if (item) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1502 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1503 self->extra->children[index] = item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1504 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1505 self->extra->length--;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1506 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
1507 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
1508 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1509
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1510 Py_DECREF(old);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1511
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1512 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1513 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1514
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1515 static PyObject*
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1516 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
1517 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1518 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
1519
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1520 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
1521 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
1522
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1523 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
1524 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1525 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1526 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
1527 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
1528 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
1529 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1530 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
1531 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
1532 PyObject* list;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1533
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1534 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
1535 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
1536
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65707
diff changeset
1537 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
1538 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
1539 &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
1540 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1541 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1542
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1543 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
1544 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
1545 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1546 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
1547 if (!list)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1548 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1549
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1550 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
1551 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
1552 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
1553 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
1554 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
1555 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1556
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1557 return list;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1558 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1559 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1560 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1561 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
1562 "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
1563 return NULL;
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 }
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 static int
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1568 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
1569 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1570 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
1571
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1572 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
1573 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
1574
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1575 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
1576 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1577 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1578 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
1579 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
1580 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
1581 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1582 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
1583 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
1584
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1585 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
1586 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
1587
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1588 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1589 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
1590 return -1;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1591 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1592
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65707
diff changeset
1593 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
1594 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
1595 &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
1596 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1597 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1598
75505
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1599 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
1600 /* Delete slice */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1601 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
1602 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
1603
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1604 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
1605 return 0;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1606
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1607 /* 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
1608 * 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
1609 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1610 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
1611 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
1612 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
1613 step = -step;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1614 }
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 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
1617
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1618 /* 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
1619 * 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
1620 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1621 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
1622 PyErr_NoMemory();
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1623 return -1;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1624 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1625
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1626 /* 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
1627 * 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
1628 * 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
1629 * 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
1630 * 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
1631 * 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
1632 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1633 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
1634 /* 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
1635 * list end.
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 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
1638 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
1639 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
1640 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1641
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1642 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
1643
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1644 memmove(
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1645 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
1646 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
1647 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
1648 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1649
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1650 /* 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
1651 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
1652 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
1653 memmove(
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->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
1655 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
1656 (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
1657 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1658
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1659 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
1660
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1661 /* 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
1662 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
1663 return 0;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1664 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1665 else {
75505
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1666 /* 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
1667 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
1668 if (!seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1669 PyErr_Format(
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1670 PyExc_TypeError,
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1671 "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
1672 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1673 return -1;
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 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
1676 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1677
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1678 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
1679 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1680 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
1681 "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
1682 "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
1683 newlen, slicelen
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1684 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1685 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1686 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1687
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1688 /* 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
1689 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
1690 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
1691 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1692 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
1693 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1694 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1695 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1696 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1697
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1698 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
1699 /* 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
1700 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
1701 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
1702 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
1703 if (!recycle) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1704 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1705 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
1706 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1707 return -1;
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 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
1710 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
1711 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
1712 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1713
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1714 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
1715 /* delete slice */
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1716 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
1717 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
1718 } 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
1719 /* insert 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 (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
1721 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
1722 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1723
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1724 /* 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
1725 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
1726 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
1727 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
1728 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
1729 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
1730 }
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 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
1733
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1734 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1735 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
1736 }
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 /* 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
1739 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
1740
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1741 return 0;
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 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1744 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
1745 "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
1746 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1747 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1748 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1749
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1750 static PyMethodDef element_methods[] = {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1751
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1752 {"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
1753
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1754 {"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
1755 {"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
1756
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1757 {"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
1758 {"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
1759 {"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
1760
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1761 {"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
1762 {"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
1763 {"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
1764 {"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
1765
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1766 {"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
1767 {"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
1768 {"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
1769
81296
c1fc6b6d1cfc The get() and iter() are now able to accept keyword arguments.
Eli Bendersky <eliben@gmail.com>
parents: 79460
diff changeset
1770 {"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
1771 {"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
1772
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1773 {"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
1774 {"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
1775
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1776 {"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
1777
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1778 {"__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
1779 {"__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
1780 {"__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
1781 {"__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
1782 {"__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
1783
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1784 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1785 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1786
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1787 static PyObject*
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1788 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
1789 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1790 PyObject* res;
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1791 char *name = "";
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1792
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1793 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
1794 name = _PyUnicode_AsString(nameobj);
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
1795
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
1796 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
1797 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
1798
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1799 /* 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
1800 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
1801 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
1802 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
1803 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1804 } 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
1805 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
1806 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
1807 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1808 }
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 /* methods */
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1811 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
1812 if (res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1813 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1814
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1815 /* 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
1816 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
1817 PyErr_Clear();
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1818 res = element_get_tail(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1819 } 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
1820 PyErr_Clear();
84566
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1821 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1822 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
1823 return NULL;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1824 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1825 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
1826 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1827
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1828 if (!res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1829 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1830
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1831 Py_INCREF(res);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1832 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1833 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1834
83824
9682241dc8fc Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents: 83492
diff changeset
1835 static int
77062
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1836 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
1837 {
77062
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1838 char *name = "";
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1839 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
1840 name = _PyUnicode_AsString(nameobj);
84567
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
1841 if (name == NULL)
83824
9682241dc8fc Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents: 83492
diff changeset
1842 return -1;
84567
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
1843
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
1844 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
1845 Py_DECREF(self->tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1846 self->tag = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1847 Py_INCREF(self->tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1848 } 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
1849 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
1850 self->text = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1851 Py_INCREF(self->text);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1852 } 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
1853 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
1854 self->tail = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1855 Py_INCREF(self->tail);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1856 } 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
1857 if (!self->extra) {
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1858 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
1859 return -1;
e11121b9bd09 Issue #18408: _elementtree.c now handles create_extra() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 83920
diff changeset
1860 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1861 Py_DECREF(self->extra->attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1862 self->extra->attrib = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1863 Py_INCREF(self->extra->attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1864 } else {
83824
9682241dc8fc Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents: 83492
diff changeset
1865 PyErr_SetString(PyExc_AttributeError,
83849
65680e3a7f07 Issue #17989: fix typo in error message
Eli Bendersky <eliben@gmail.com>
parents: 83833
diff changeset
1866 "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
1867 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1868 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1869
83824
9682241dc8fc Issue #17989: element_setattro returned incorrect error value.
Eli Bendersky <eliben@gmail.com>
parents: 83492
diff changeset
1870 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1871 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1872
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1873 static PySequenceMethods element_as_sequence = {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1874 (lenfunc) element_length,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1875 0, /* sq_concat */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1876 0, /* sq_repeat */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1877 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
1878 0,
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1879 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
1880 0,
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1881 };
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1882
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1883 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
1884 (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
1885 (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
1886 (objobjargproc) element_ass_subscr,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1887 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1888
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
1889 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
1890 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
1891 "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
1892 /* 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
1893 (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
1894 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
1895 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
1896 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
1897 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
1898 (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
1899 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
1900 &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
1901 &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
1902 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
1903 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
1904 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
1905 (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
1906 (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
1907 0, /* tp_as_buffer */
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1908 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
1909 /* 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
1910 0, /* tp_doc */
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1911 (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
1912 (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
1913 0, /* tp_richcompare */
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
1914 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
1915 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
1916 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
1917 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
1918 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
1919 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
1920 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
1921 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
1922 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
1923 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
1924 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
1925 (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
1926 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
1927 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
1928 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1929 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1930
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
1931 /******************************* 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
1932
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 /* 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
1934 * 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
1935 * 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
1936 * 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
1937 * 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
1938 * 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
1939 * 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
1940 */
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1942 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
1943 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
1944 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
1945 } 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
1946
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1948 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
1949 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
1950 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
1951 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
1952 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
1953 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
1954 } 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
1955
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1958 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
1959 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1961 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
1962 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
1963 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
1964 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
1965 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
1966 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1969 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
1970
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1972 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
1973 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1976 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
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 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
1979 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
1980 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
1981 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
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 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
1985 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
1986 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
1987 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 /* 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
1990 */
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1991 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
1992 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
1993 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1995 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
1996 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
1997 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
1998 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
1999 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
2000 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2002 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2003
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2005 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
2006 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 /* Sub-element iterator.
81479
7e072816b197 Clean trailing whitespace in _elementtree.c
Eli Bendersky <eliben@gmail.com>
parents: 81447
diff changeset
2008 *
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
2009 * 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
2010 * 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
2011 * 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
2012 * - 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
2013 * 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
2014 * 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
2015 * - 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
2016 * 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
2017 */
77432
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
2018 ElementObject *cur_parent;
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
2019 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
2020
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2022 /* 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
2023 * 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
2024 * 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
2025 * 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
2026 * 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
2027 */
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2029 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
2030 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
2031 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
2032 } 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
2033 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
2034 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
2035 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
2036 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
2037 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
2038 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2040 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
2041 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
2042 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
2043 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
2044 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
2045 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
2046 if (!text)
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2047 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
2048 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
2049 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
2050 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
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 } 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
2053 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
2054 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
2055 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2057 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2058 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2059
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2060 /* 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
2061 * 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
2062 */
77432
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
2063 cur_parent = it->parent_stack->parent;
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
2064 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
2065 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
2066 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
2067 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
2068 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
2069 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
2070 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
2071 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
2072 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
2073 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
2074 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2077 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
2078 if (!text)
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2079 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
2080 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
2081 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
2082 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
2083 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 } 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
2085 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
2086 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
2087 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
2088 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
2089 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2091 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
2092 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2093 else {
81363
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2094 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
2095 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
2096 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
2097 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
2098 if (!tail)
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2099 return NULL;
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2100 }
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2101 else
d965ff47cf94 Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
Eli Bendersky <eliben@gmail.com>
parents: 81359
diff changeset
2102 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
2103 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
2104 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
2105 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
2106
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 /* 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
2108 * 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
2109 * 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
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 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
2112 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
2113 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
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
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2119 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2120
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2121
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2122 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
2123 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
2124 /* 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
2125 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
2126 "_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
2127 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
2128 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
2129 /* 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
2130 (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
2131 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
2132 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
2133 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
2134 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
2135 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
2136 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
2137 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
2138 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
2139 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
2140 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
2141 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
2142 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
2143 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
2144 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
2145 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
2146 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
2147 (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
2148 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
2149 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
2150 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
2151 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
2152 (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
2153 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
2154 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
2155 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
2156 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
2157 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
2158 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
2159 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
2160 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
2161 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
2162 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
2163 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
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
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2166
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2167 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
2168 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
2169 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2171 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
2172
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2174 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
2175 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
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 (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
2178 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
2179 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
2180 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
2181
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
2183 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
2184 Py_XDECREF(star);
84567
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
2185
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
2186 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
2187 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
2188 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
2189 it->gettext = gettext;
84567
e1b398d0decb Cleanup _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84566
diff changeset
2190 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
2191 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
2192
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2193 PyObject_GC_Track(it);
84581
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2194
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2195 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
2196 if (it->parent_stack == NULL) {
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2197 Py_DECREF(it);
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2198 PyErr_NoMemory();
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2199 return NULL;
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2200 }
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2201 it->parent_stack->parent = NULL;
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2202 it->parent_stack->child_index = 0;
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2203 it->parent_stack->next = NULL;
1e0afd558ba3 Issue #18408: Fix constructors of _elementtree.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84580
diff changeset
2204
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
2205 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
2206 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2207
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
2208
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2209 /* ==================================================================== */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2210 /* the tree builder type */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2211
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2212 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2213 PyObject_HEAD
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2214
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2215 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
2216
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
2217 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
2218 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
2219
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2220 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
2221
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2222 PyObject *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
2223 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
2224
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2225 PyObject *element_factory;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2226
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2227 /* 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
2228 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
2229 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
2230 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
2231 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
2232 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
2233 } TreeBuilderObject;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2234
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
2235 #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
2236
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2237 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2238 /* constructor and destructor */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2239
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2240 static PyObject *
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2241 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
2242 {
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2243 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
2244 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
2245 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
2246
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2247 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
2248 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
2249 Py_INCREF(Py_None);
79460
7bd9626d8b4f Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79385
diff changeset
2250 t->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
2251
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2252 t->data = NULL;
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2253 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
2254 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
2255 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
2256 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
2257 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
2258 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
2259 return NULL;
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2260 }
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2261 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
2262
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2263 t->events = NULL;
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2264 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
2265 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
2266 }
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2267 return (PyObject *)t;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2268 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2269
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2270 static int
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2271 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
2272 {
77313
eb1d633fe307 Fix unterminated keyword array passed to PyArg_ParseTupleAndKeywords
Eli Bendersky <eliben@gmail.com>
parents: 77279
diff changeset
2273 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
2274 PyObject *element_factory = NULL;
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2275 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
2276 PyObject *tmp;
77246
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 (!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
2279 &element_factory)) {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2280 return -1;
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2281 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2282
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2283 if (element_factory) {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2284 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
2285 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
2286 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
2287 Py_XDECREF(tmp);
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2288 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2289
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2290 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2291 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2292
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2293 static int
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2294 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
2295 {
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2296 Py_VISIT(self->root);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2297 Py_VISIT(self->this);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2298 Py_VISIT(self->last);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2299 Py_VISIT(self->data);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2300 Py_VISIT(self->stack);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2301 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
2302 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2303 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2304
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2305 static int
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2306 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
2307 {
79385
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->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
2309 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
2310 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
2311 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
2312 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
2313 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
2314 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
2315 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
2316 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
2317 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
2318 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
2319 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2320 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2321
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2322 static void
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2323 treebuilder_dealloc(TreeBuilderObject *self)
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2324 {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2325 PyObject_GC_UnTrack(self);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2326 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
2327 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
2328 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2329
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2330 /* -------------------------------------------------------------------- */
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
2331 /* 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
2332
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 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
2334 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
2335 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
2336 {
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
2337 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
2338 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
2339 *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
2340 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
2341 }
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 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
2343 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
2344 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
2345 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
2346 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
2347 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
2348 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
2349 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
2350 }
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
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 /* 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
2354 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
2355 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
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 _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
2358 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
2359 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
2360 }
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
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 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
2363 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
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 _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
2366 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
2367 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
2368 }
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
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 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
2371 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
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 _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
2374 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
2375 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
2376 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
2377 }
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 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
2379 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
2380 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
2381 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
2382 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
2383 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
2384 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
2385 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2386 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2387
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2388 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2389 /* handlers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2390
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2391 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2392 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
2393 PyObject* attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2394 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2395 PyObject* node;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2396 PyObject* this;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2397 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
2398
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2399 if (self->data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2400 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
2401 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
2402 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
2403 }
7bd9626d8b4f Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element element_factory (fixes a regression in SimpleTAL).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79385
diff changeset
2404 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
2405 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
2406 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2407 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2408 self->data = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2409 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2410
83833
c430bea30457 Issue #17901: fix TreeBuilder construction for an explicit element_factory=None
Eli Bendersky <eliben@gmail.com>
parents: 83824
diff changeset
2411 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
2412 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
2413 } else {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2414 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
2415 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2416 if (!node) {
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2417 return NULL;
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2418 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2419
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
2420 this = self->this;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2421
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2422 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
2423 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
2424 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2425 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2426 if (self->root) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2427 PyErr_SetString(
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2428 st->parseerror_obj,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2429 "multiple elements on top level"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2430 );
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2431 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2432 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2433 Py_INCREF(node);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2434 self->root = node;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2435 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2436
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2437 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
2438 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
2439 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2440 Py_INCREF(this);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2441 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2442 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
2443 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2444 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2445 self->index++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2446
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2447 Py_DECREF(this);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2448 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
2449 self->this = node;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2450
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2451 Py_DECREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2452 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
2453 self->last = node;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2454
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2455 if (self->start_event_obj) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2456 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2457 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
2458 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
2459 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2460 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2461 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2462 } else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2463 PyErr_Clear(); /* FIXME: propagate error */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2464 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2465
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2466 return node;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2467
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2468 error:
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2469 Py_DECREF(node);
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2470 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2471 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2472
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2473 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2474 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
2475 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2476 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
2477 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
2478 /* 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
2479 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
2480 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2481 /* 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
2482 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
2483 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2484 /* 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
2485 if (PyBytes_CheckExact(self->data) && Py_REFCNT(self->data) == 1 &&
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2486 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
2487 /* 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
2488 /* 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
2489 the most common case by resizing the existing string... */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2490 Py_ssize_t size = PyBytes_GET_SIZE(self->data);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2491 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
2492 return NULL;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2493 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
2494 } 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
2495 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
2496 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2497 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2498 PyObject* list = PyList_New(2);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2499 if (!list)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2500 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2501 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
2502 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
2503 self->data = list;
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2506
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2507 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2508 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2509
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2510 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2511 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
2512 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2513 PyObject* item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2514
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2515 if (self->data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2516 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
2517 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
2518 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2519 } 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
2520 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
2521 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2522 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2523 self->data = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2524 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2525
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2526 if (self->index == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2527 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2528 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2529 "pop from empty stack"
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 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2532 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2533
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2534 self->index--;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2535
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2536 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
2537 Py_INCREF(item);
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 Py_DECREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2540
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
2541 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
2542 self->this = item;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2543
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2544 if (self->end_event_obj) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2545 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2546 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
2547 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
2548 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
2549 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2550 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2551 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2552 } else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2553 PyErr_Clear(); /* FIXME: propagate error */
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2556 Py_INCREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2557 return (PyObject*) self->last;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2560 LOCAL(void)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2561 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
2562 PyObject *prefix, PyObject *uri)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2563 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2564 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2565 PyObject* action;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2566 PyObject* parcel;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2567
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2568 if (!self->events)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2569 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2570
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2571 if (start) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2572 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
2573 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2574 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
2575 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
2576 if (!parcel)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2577 return;
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 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2580 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
2581 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2582 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
2583 Py_INCREF(action);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2584 parcel = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2585 Py_INCREF(parcel);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2586 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2587
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2588 res = PyTuple_New(2);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2589
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2590 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2591 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
2592 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
2593 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2594 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
2595 }
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2596 else {
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2597 Py_DECREF(action);
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2598 Py_DECREF(parcel);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2599 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
2600 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2601 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2602
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 /* methods (in alphabetical order) */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2605
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2606 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2607 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
2608 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2609 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2610 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
2611 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2612
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2613 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
2614 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2615
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2616 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2617 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
2618 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2619 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2620 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
2621 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2622
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2623 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
2624 }
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 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2627 treebuilder_done(TreeBuilderObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2628 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2629 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2630
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2631 /* FIXME: check stack size? */
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 if (self->root)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2634 res = self->root;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2635 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2636 res = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2637
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2638 Py_INCREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2639 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2640 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2641
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2642 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2643 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
2644 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2645 if (!PyArg_ParseTuple(args, ":close"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2646 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2647
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2648 return treebuilder_done(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2649 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2650
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2651 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2652 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
2653 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2654 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2655 PyObject* attrib = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2656 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
2657 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2658
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2659 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
2660 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2661
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2662 static PyMethodDef treebuilder_methods[] = {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2663 {"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
2664 {"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
2665 {"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
2666 {"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
2667 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2668 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2669
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
2670 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
2671 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
2672 "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
2673 /* methods */
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2674 (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
2675 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
2676 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
2677 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
2678 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
2679 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
2680 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
2681 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
2682 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
2683 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
2684 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
2685 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
2686 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
2687 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
2688 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
2689 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
2690 /* 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
2691 0, /* tp_doc */
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2692 (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
2693 (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
2694 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
2695 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
2696 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
2697 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
2698 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
2699 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
2700 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
2701 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
2702 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
2703 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
2704 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
2705 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
2706 (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
2707 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
2708 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
2709 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2710 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2711
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2712 /* ==================================================================== */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2713 /* the expat interface */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2714
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2715 #include "expat.h"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2716 #include "pyexpat.h"
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2717
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2718 /* 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
2719 * 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
2720 */
77278
cf9c379a9859 We're always building _elementtree with USE_PYEXPAT_CAPI, so the #ifdefs in
Eli Bendersky <eliben@gmail.com>
parents: 77275
diff changeset
2721 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
2722 #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
2723
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
2724 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
2725 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
2726
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2727 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2728 PyObject_HEAD
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2729
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2730 XML_Parser parser;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2731
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2732 PyObject *target;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2733 PyObject *entity;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2734
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2735 PyObject *names;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2736
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2737 PyObject *handle_start;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2738 PyObject *handle_data;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2739 PyObject *handle_end;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2740
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2741 PyObject *handle_comment;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2742 PyObject *handle_pi;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2743 PyObject *handle_doctype;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2744
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2745 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
2746
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2747 } XMLParserObject;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2748
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2749 #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
2750
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2751 /* helpers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2752
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2753 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2754 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
2755 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2756 /* 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
2757 to a universal name string */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2758
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2759 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
2760 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2761 PyObject* value;
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 /* look the 'raw' name up in the names dictionary */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2764 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
2765 if (!key)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2766 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2767
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2768 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
2769
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2770 if (value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2771 Py_INCREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2772 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2773 /* 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
2774 necessary */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2775
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2776 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2777 char* p;
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2778 Py_ssize_t i;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2779
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2780 /* look for namespace separator */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2781 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
2782 if (string[i] == '}')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2783 break;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2784 if (i != size) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2785 /* convert to universal name */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2786 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
2787 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
2788 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
2789 return NULL;
0877e17fa25e Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84567
diff changeset
2790 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2791 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
2792 p[0] = '{';
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2793 memcpy(p+1, string, size);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2794 size++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2795 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2796 /* 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
2797 Py_INCREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2798 tag = key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2799 }
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
2800
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2801 /* decode universal name */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2802 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
2803 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
2804 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
2805 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
2806 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
2807 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
2808 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2809
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2810 /* add to names dictionary */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2811 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
2812 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2813 Py_DECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2814 return NULL;
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2817
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2818 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2819 return value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2820 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2821
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2822 /* 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
2823 * 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
2824 * 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
2825 */
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2826 static void
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2827 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
2828 {
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2829 PyObject *errmsg, *error, *position, *code;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2830 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
2831
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2832 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
2833 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
2834 line, column);
68805
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2835 if (errmsg == NULL)
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2836 return;
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2837
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2838 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
2839 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
2840 if (!error)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2841 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2842
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2843 /* 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
2844 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
2845 if (!code) {
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2846 Py_DECREF(error);
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 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
2850 Py_DECREF(error);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2851 Py_DECREF(code);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2852 return;
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2853 }
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2854 Py_DECREF(code);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2855
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2856 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
2857 if (!position) {
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(error);
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 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
2862 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
2863 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
2864 return;
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 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
2867
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
2868 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
2869 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
2870 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2871
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2872 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2873 /* handlers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2874
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2875 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2876 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
2877 int data_len)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2878 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2879 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2880 PyObject* value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2881 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2882
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2883 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
2884 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2885
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
2886 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
2887 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
2888
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
2889 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
2890 if (!key)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2891 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2892
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2893 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
2894
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2895 if (value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2896 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2897 res = treebuilder_handle_data(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2898 (TreeBuilderObject*) self->target, value
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2899 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2900 else if (self->handle_data)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2901 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
2902 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2903 res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2904 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
2905 } 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
2906 /* 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
2907 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
2908 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
2909 expat_set_error(
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2910 XML_ERROR_UNDEFINED_ENTITY,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2911 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
2912 EXPAT(GetErrorColumnNumber)(self->parser),
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2913 message
36050
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2916
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2917 Py_DECREF(key);
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2920 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2921 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
2922 const XML_Char **attrib_in)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2923 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2924 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2925 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2926 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2927 int ok;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2928
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
2929 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
2930 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
2931
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2932 /* tag name */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2933 tag = makeuniversal(self, tag_in);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2934 if (!tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2935 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
2936
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2937 /* attributes */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2938 if (attrib_in[0]) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2939 attrib = PyDict_New();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2940 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2941 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2942 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
2943 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
2944 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
2945 if (!key || !value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2946 Py_XDECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2947 Py_XDECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2948 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2949 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2950 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2951 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
2952 Py_DECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2953 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2954 if (ok < 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2955 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2956 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2957 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2958 attrib_in += 2;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2959 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2960 } else {
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2961 /* 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
2962 attrib = PyDict_New();
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2963 if (!attrib)
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2964 return;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2965 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2966
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2967 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
2968 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2969 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
2970 tag, attrib);
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2971 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2972 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
2973 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
2974 } else
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2975 res = NULL;
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 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2978 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2979
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2980 Py_XDECREF(res);
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2983 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2984 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
2985 int data_len)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2986 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2987 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2988 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2989
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
2990 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
2991 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
2992
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
2993 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
2994 if (!data)
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2995 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
2996
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2997 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2998 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2999 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
3000 else if (self->handle_data)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3001 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
3002 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3003 res = NULL;
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 Py_DECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3006
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3007 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3008 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3009
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3010 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3011 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
3012 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3013 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3014 PyObject* res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3015
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
3016 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
3017 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
3018
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3019 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3020 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3021 /* 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
3022 res = treebuilder_handle_end(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3023 (TreeBuilderObject*) self->target, Py_None
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3024 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3025 else if (self->handle_end) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3026 tag = makeuniversal(self, tag_in);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3027 if (tag) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3028 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
3029 Py_DECREF(tag);
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3032
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3033 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3034 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3035
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3036 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3037 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
3038 const XML_Char *uri)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3039 {
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3040 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
3041 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
3042
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
3043 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
3044 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
3045
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3046 suri = PyUnicode_DecodeUTF8(uri, strlen(uri), "strict");
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3047 if (!suri)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3048 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3049
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3050 if (prefix)
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_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
3052 else
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3053 sprefix = PyUnicode_FromString("");
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3054 if (!sprefix) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3055 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
3056 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3057 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3058
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3059 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
3060 (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
3061 );
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3062
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3063 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
3064 Py_DECREF(suri);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3065 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3066
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3067 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3068 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
3069 {
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
3070 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
3071 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
3072
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3073 treebuilder_handle_namespace(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3074 (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
3075 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3076 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3077
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3078 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3079 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
3080 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3081 PyObject* comment;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3082 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3083
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
3084 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
3085 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
3086
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3087 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
3088 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
3089 if (comment) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3090 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
3091 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3092 Py_DECREF(comment);
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3096
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3097 static void
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3098 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
3099 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
3100 const XML_Char *sysid,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3101 const XML_Char *pubid,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3102 int has_internal_subset)
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3103 {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3104 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
3105 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
3106 PyObject *parser_doctype = NULL;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3107 PyObject *res = NULL;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3108
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
3109 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
3110 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
3111
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3112 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
3113 if (!doctype_name_obj)
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3114 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3115
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3116 if (sysid) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3117 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
3118 if (!sysid_obj) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3119 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
3120 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3121 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3122 } else {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3123 Py_INCREF(Py_None);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3124 sysid_obj = Py_None;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3125 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3126
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3127 if (pubid) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3128 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
3129 if (!pubid_obj) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3130 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
3131 Py_DECREF(sysid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3132 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3133 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3134 } else {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3135 Py_INCREF(Py_None);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3136 pubid_obj = Py_None;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3137 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3138
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3139 /* 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
3140 if (self->handle_doctype) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3141 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
3142 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
3143 Py_CLEAR(res);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3144 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3145
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3146 /* 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
3147 * 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
3148 * (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
3149 */
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3150 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
3151 if (parser_doctype) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3152 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
3153 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
3154 "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
3155 " 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
3156 1) < 0) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3157 goto clear;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3158 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3159 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
3160 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
3161 Py_CLEAR(res);
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 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3164
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3165 clear:
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3166 Py_XDECREF(parser_doctype);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3167 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
3168 Py_DECREF(pubid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3169 Py_DECREF(sysid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3170 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3171
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3172 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3173 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
3174 const XML_Char* data_in)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3175 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3176 PyObject* target;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3177 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3178 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3179
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
3180 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
3181 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
3182
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3183 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
3184 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
3185 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
3186 if (target && data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3187 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
3188 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3189 Py_DECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3190 Py_DECREF(target);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3191 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3192 Py_XDECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3193 Py_XDECREF(target);
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3197
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3198 /* -------------------------------------------------------------------- */
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3199
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3200 static PyObject *
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3201 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
3202 {
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3203 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
3204 if (self) {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3205 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
3206 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
3207 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
3208 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
3209 self->handle_doctype = NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3210 }
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3211 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
3212 }
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3213
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3214 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3215 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
3216 {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3217 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
3218 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
3219 char *encoding = NULL;
77313
eb1d633fe307 Fix unterminated keyword array passed to PyArg_ParseTupleAndKeywords
Eli Bendersky <eliben@gmail.com>
parents: 77279
diff changeset
3220 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
3221
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3222 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
3223 &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
3224 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3225 }
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3226
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3227 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
3228 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
3229 return -1;
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3230
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3231 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
3232 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
3233 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
3234 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3235 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3236
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3237 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
3238 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
3239 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
3240 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
3241 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
3242 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3243 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3244
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3245 if (target) {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3246 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
3247 } else {
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
3248 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
3249 if (!target) {
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3250 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
3251 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
3252 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
3253 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3254 }
77275
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->target = target;
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3257
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3258 self_xp->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
3259 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
3260 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
3261 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
3262 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
3263 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
3264 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
3265
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3266 PyErr_Clear();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3267
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3268 /* 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
3269 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
3270 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
3271 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3272 (XML_StartElementHandler) expat_start_handler,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3273 (XML_EndElementHandler) expat_end_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3274 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3275 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
3276 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3277 (XML_DefaultHandler) expat_default_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3278 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3279 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
3280 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3281 (XML_CharacterDataHandler) expat_data_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3282 );
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3283 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
3284 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
3285 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3286 (XML_CommentHandler) expat_comment_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3287 );
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3288 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
3289 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
3290 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3291 (XML_ProcessingInstructionHandler) expat_pi_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3292 );
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3293 EXPAT(SetStartDoctypeDeclHandler)(
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3294 self_xp->parser,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3295 (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
3296 );
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3297 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
3298 self_xp->parser,
83919
f7b47fb30169 Issue #13612: handle unknown encodings without a buffer overflow.
Eli Bendersky <eliben@gmail.com>
parents: 83890
diff changeset
3299 EXPAT(DefaultUnknownEncodingHandler), NULL
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3300 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3301
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3302 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3303 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3304
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3305 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3306 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
3307 {
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_close);
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_pi);
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_comment);
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_end);
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3312 Py_VISIT(self->handle_data);
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3313 Py_VISIT(self->handle_start);
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3314
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->target);
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3316 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
3317 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
3318
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3319 return 0;
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3320 }
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3321
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3322 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3323 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
3324 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3325 EXPAT(ParserFree)(self->parser);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3326
79385
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_close);
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_pi);
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_comment);
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_end);
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_data);
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3332 Py_CLEAR(self->handle_start);
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3333 Py_CLEAR(self->handle_doctype);
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3334
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->target);
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3336 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
3337 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
3338
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3339 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3340 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3341
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3342 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3343 xmlparser_dealloc(XMLParserObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3344 {
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3345 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
3346 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
3347 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
3348 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3349
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3350 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
3351 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
3352 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3353 int ok;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3354
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
3355 assert(!PyErr_Occurred());
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3356 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
3357
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3358 if (PyErr_Occurred())
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3359 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3360
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3361 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
3362 expat_set_error(
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
3363 EXPAT(GetErrorCode)(self->parser),
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3364 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
3365 EXPAT(GetErrorColumnNumber)(self->parser),
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
3366 NULL
36050
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 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3369 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3370
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3371 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3372 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3373
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3374 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3375 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
3376 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3377 /* end feeding data to parser */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3378
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3379 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3380 if (!PyArg_ParseTuple(args, ":close"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3381 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3382
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3383 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
3384 if (!res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3385 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3386
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3387 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
3388 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3389 return treebuilder_done((TreeBuilderObject*) self->target);
85371
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3390 }
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3391 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
3392 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
3393 return PyObject_CallFunction(self->handle_close, "");
85371
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3394 }
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3395 else {
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3396 return res;
85371
8123479ac0d7 Use consistent style for else if / else
Eli Bendersky <eliben@gmail.com>
parents: 85083
diff changeset
3397 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3398 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3399
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3400 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
3401 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
3402 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3403 /* feed data to parser */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3404
83890
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3405 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
3406 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
3407 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
3408 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
3409 return NULL;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3410 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
3411 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
3412 return NULL;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3413 }
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3414 /* 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
3415 (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
3416 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
3417 }
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3418 else {
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3419 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
3420 PyObject *res;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3421 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
3422 return NULL;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3423 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
3424 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
3425 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
3426 return NULL;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3427 }
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3428 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
3429 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
3430 return res;
7781ccae7b9a Issue #16986: ElementTree now correctly parses a string input not only when
Serhiy Storchaka <storchaka@gmail.com>
parents: 83849
diff changeset
3431 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3432 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3433
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3434 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
3435 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
3436 {
83852
8425e8cc2bf2 Get rid of ugly code duplication for ElementTree.parse when the accelerator
Eli Bendersky <eliben@gmail.com>
parents: 83850
diff changeset
3437 /* (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
3438 PyObject* reader;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3439 PyObject* buffer;
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3440 PyObject* temp;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3441 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3442
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3443 PyObject* fileobj;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3444 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
3445 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3446
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3447 reader = PyObject_GetAttrString(fileobj, "read");
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3448 if (!reader)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3449 return NULL;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3450
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3451 /* read from open file object */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3452 for (;;) {
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 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
3455
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3456 if (!buffer) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3457 /* 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
3458 Py_DECREF(reader);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3459 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3460 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3461
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3462 if (PyUnicode_CheckExact(buffer)) {
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3463 /* 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
3464 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
3465 Py_DECREF(buffer);
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3466 break;
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3467 }
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3468 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
3469 Py_DECREF(buffer);
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3470 if (!temp) {
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3471 /* 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
3472 Py_DECREF(reader);
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3473 return NULL;
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 buffer = temp;
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3476 }
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3477 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
3478 Py_DECREF(buffer);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3479 break;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3480 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3481
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3482 res = expat_parse(
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
3483 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
3484 );
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 Py_DECREF(buffer);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3487
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3488 if (!res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3489 Py_DECREF(reader);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3490 return NULL;
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 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3493
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3494 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3495
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3496 Py_DECREF(reader);
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 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
3499
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3500 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
3501 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3502 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
3503 }
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 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3506 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3507
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3508 static PyObject*
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3509 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
3510 {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3511 Py_RETURN_NONE;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3512 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3513
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3514 static PyObject*
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3515 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
3516 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3517 /* 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
3518 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
3519 TreeBuilderObject *target;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3520
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3521 PyObject *events_queue;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3522 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
3523 PyObject *events_seq;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3524 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
3525 &events_to_report))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3526 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3527
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3528 if (!TreeBuilder_CheckExact(self->target)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3529 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3530 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
3531 "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
3532 "targets"
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 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3535 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3536
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3537 target = (TreeBuilderObject*) self->target;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3538
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3539 Py_INCREF(events_queue);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3540 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
3541 target->events = events_queue;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3542
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3543 /* 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
3544 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
3545 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
3546 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
3547 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
3548
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3549 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
3550 /* 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
3551 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
3552 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3553 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3554
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3555 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
3556 "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
3557 return NULL;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3558 }
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3559
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3560 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
3561 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
3562 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
3563 char *event_name = NULL;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3564 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
3565 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
3566 } 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
3567 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
3568 }
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3569
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3570 if (event_name == NULL) {
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3571 Py_DECREF(events_seq);
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3572 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
3573 return NULL;
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3574 } 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
3575 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
3576 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
3577 } 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
3578 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
3579 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
3580 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
3581 } 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
3582 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
3583 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
3584 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
3585 EXPAT(SetNamespaceDeclHandler)(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3586 self->parser,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3587 (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
3588 (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
3589 );
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3590 } 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
3591 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
3592 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
3593 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
3594 EXPAT(SetNamespaceDeclHandler)(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3595 self->parser,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3596 (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
3597 (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
3598 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3599 } else {
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3600 Py_DECREF(events_seq);
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3601 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
3602 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3603 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3604 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3605
83843
b6c333579c2b _elementtree.XMLParser._setevents should support any sequence, not just tuples
Eli Bendersky <eliben@gmail.com>
parents: 83834
diff changeset
3606 Py_DECREF(events_seq);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3607 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3608 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3609
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3610 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
3611 {"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
3612 {"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
3613 {"_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
3614 {"_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
3615 {"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
3616 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3617 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3618
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3619 static PyObject*
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3620 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
3621 {
66799
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_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
3623 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
3624 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
3625 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
3626 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
3627 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
3628 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
3629 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
3630 "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
3631 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
3632 }
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3633 else
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3634 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
3635
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3636 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
3637 return res;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3638 }
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3639 generic:
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3640 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
3641 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3642
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
3643 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
3644 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
3645 "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
3646 /* methods */
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3647 (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
3648 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
3649 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
3650 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
3651 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
3652 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
3653 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
3654 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
3655 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
3656 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
3657 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
3658 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
3659 (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
3660 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
3661 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
3662 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
3663 /* tp_flags */
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3664 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
3665 (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
3666 (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
3667 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
3668 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
3669 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
3670 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
3671 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
3672 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
3673 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
3674 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
3675 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
3676 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
3677 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
3678 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
3679 (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
3680 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
3681 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
3682 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3683 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3684
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3685 /* ==================================================================== */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3686 /* python module interface */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3687
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3688 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
3689 {"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
3690 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3691 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3692
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3693
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3694 static struct PyModuleDef elementtreemodule = {
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3695 PyModuleDef_HEAD_INIT,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3696 "_elementtree",
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3697 NULL,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3698 sizeof(elementtreestate),
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3699 _functions,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3700 NULL,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3701 elementtree_traverse,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3702 elementtree_clear,
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3703 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
3704 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3705
40528
bce7e4a926a9 Cruft removal:
Neal Norwitz <nnorwitz@gmail.com>
parents: 39610
diff changeset
3706 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
3707 PyInit__elementtree(void)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3708 {
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
3709 PyObject *m, *temp;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3710 elementtreestate *st;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3711
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3712 m = PyState_FindModule(&elementtreemodule);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3713 if (m) {
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3714 Py_INCREF(m);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3715 return m;
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3716 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3717
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3718 /* Initialize object types */
84714
cd4c9d4bd88f #18480: Add missing PyType_Ready call to _elementtree extension
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 83919
diff changeset
3719 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
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(&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
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(&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
3724 return NULL;
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3725 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
3726 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3727
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3728 m = PyModule_Create(&elementtreemodule);
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
3729 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
3730 return NULL;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3731 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
3732
76110
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3733 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
3734 return NULL;
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3735 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
3736 Py_XDECREF(temp);
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3737
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3738 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
3739 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3740
77278
cf9c379a9859 We're always building _elementtree with USE_PYEXPAT_CAPI, so the #ifdefs in
Eli Bendersky <eliben@gmail.com>
parents: 77275
diff changeset
3741 /* 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
3742 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
3743 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
3744 /* 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
3745 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
3746 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
3747 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
3748 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
3749 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
3750 PyErr_SetString(PyExc_ImportError,
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3751 "pyexpat version is incompatible");
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3752 return NULL;
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3753 }
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3754 } else {
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3755 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
3756 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3757
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3758 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
3759 "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
3760 );
85083
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3761 Py_INCREF(st->parseerror_obj);
8a060e2de608 Issue #15651: PEP 3121 refactoring for _elementtree
Eli Bendersky <eliben@gmail.com>
parents: 84735
diff changeset
3762 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
3763
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
3764 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
3765 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
3766
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
3767 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
3768 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
3769
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3770 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
3771 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
3772
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3773 return m;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3774 }