annotate Modules/_elementtree.c @ 80779:10d04bdb05ab 3.3

Issue #16248: Disable code execution from the user's home directory by tkinter when the -E flag is passed to Python. Patch by Zachary Ware.
author Antoine Pitrou <solipsis@pitrou.net>
date Sun, 09 Dec 2012 14:46:46 +0100
parents 7bd9626d8b4f
children c1fc6b6d1cfc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1 /*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2 * ElementTree
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3 * $Id: _elementtree.c 3473 2009-01-11 22:53:55Z fredrik $
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
4 *
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
5 * elementtree accelerator
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
6 *
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
7 * History:
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
8 * 1999-06-20 fl created (as part of sgmlop)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
9 * 2001-05-29 fl effdom edition
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
10 * 2003-02-27 fl elementtree edition (alpha)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
11 * 2004-06-03 fl updates for elementtree 1.2
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
12 * 2005-01-05 fl major optimization effort
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
13 * 2005-01-11 fl first public release (cElementTree 0.8)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
14 * 2005-01-12 fl split element object into base and extras
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
15 * 2005-01-13 fl use tagged pointers for tail/text (cElementTree 0.9)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
16 * 2005-01-17 fl added treebuilder close method
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
17 * 2005-01-17 fl fixed crash in getchildren
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
18 * 2005-01-18 fl removed observer api, added iterparse (cElementTree 0.9.3)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
19 * 2005-01-23 fl revised iterparse api; added namespace event support (0.9.8)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
20 * 2005-01-26 fl added VERSION module property (cElementTree 1.0)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
21 * 2005-01-28 fl added remove method (1.0.1)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
22 * 2005-03-01 fl added iselement function; fixed makeelement aliasing (1.0.2)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
23 * 2005-03-13 fl export Comment and ProcessingInstruction/PI helpers
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
24 * 2005-03-26 fl added Comment and PI support to XMLParser
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
25 * 2005-03-27 fl event optimizations; complain about bogus events
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
26 * 2005-08-08 fl fixed read error handling in parse
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
27 * 2005-08-11 fl added runtime test for copy workaround (1.0.3)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
28 * 2005-12-13 fl added expat_capi support (for xml.etree) (1.0.4)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
29 * 2005-12-16 fl added support for non-standard encodings
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
30 * 2006-03-08 fl fixed a couple of potential null-refs and leaks
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
31 * 2006-03-12 fl merge in 2.5 ssize_t changes
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
32 * 2007-08-25 fl call custom builder's close method from XMLParser
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
33 * 2007-08-31 fl added iter, extend from ET 1.3
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
34 * 2007-09-01 fl fixed ParseError exception, setslice source type, etc
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
35 * 2007-09-03 fl fixed handling of negative insert indexes
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
36 * 2007-09-04 fl added itertext from ET 1.3
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
37 * 2007-09-06 fl added position attribute to ParseError exception
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
38 * 2008-06-06 fl delay error reporting in iterparse (from Hrvoje Niksic)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
39 *
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
40 * 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
41 * 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
42 *
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
43 * info@pythonware.com
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
44 * http://www.pythonware.com
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
45 */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
46
36051
9b897fb7ac6a updating to cElementTree 1.0.5 (step 3 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents: 36050
diff changeset
47 /* Licensed to PSF under a Contributor Agreement. */
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
48 /* See http://www.python.org/psf/license for licensing details. */
36051
9b897fb7ac6a updating to cElementTree 1.0.5 (step 3 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents: 36050
diff changeset
49
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
50 #include "Python.h"
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
51 #include "structmember.h"
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
52
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
53 #define VERSION "1.0.6"
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
54
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
55 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
56 /* configuration */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
57
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
58 /* Leave defined to include the expat-based XMLParser type */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
59 #define USE_EXPAT
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
60
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
61 /* 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
62 allocations. */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
63 #define STATIC_CHILDREN 4
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
64
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
65 /* 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
66 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
67 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
68 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
69
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
70 /* 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
71 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
72 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
73 32-bit platforms. */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
74
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
75 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
76
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
77 #if 0
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
78 static int memory = 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
79 #define ALLOC(size, comment)\
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
80 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
81 #define RELEASE(size, comment)\
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
82 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
83 #else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
84 #define ALLOC(size, comment)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
85 #define RELEASE(size, comment)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
86 #endif
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
87
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
88 /* compiler tweaks */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
89 #if defined(_MSC_VER)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
90 #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
91 #else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
92 #define LOCAL(type) static type
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
93 #endif
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
94
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
95 /* 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
96 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
97 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
98 info. */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
99 #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
100 #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
101 #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
102
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
103 /* glue functions (see the init function for details) */
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
104 static PyObject* elementtree_parseerror_obj;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
105 static PyObject* elementtree_deepcopy_obj;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
106 static PyObject* elementpath_obj;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
107
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
108 /* helpers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
109
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
110 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
111 deepcopy(PyObject* object, PyObject* memo)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
112 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
113 /* 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
114
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
115 PyObject* args;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
116 PyObject* result;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
117
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
118 if (!elementtree_deepcopy_obj) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
119 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
120 PyExc_RuntimeError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
121 "deepcopy helper not found"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
122 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
123 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
124 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
125
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
126 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
127 if (!args)
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
128 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
129 result = PyObject_CallObject(elementtree_deepcopy_obj, args);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
130 Py_DECREF(args);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
131 return result;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
132 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
133
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
134 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
135 list_join(PyObject* list)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
136 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
137 /* 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
138 PyObject* joiner;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
139 PyObject* result;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
140
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
141 joiner = PyUnicode_FromStringAndSize("", 0);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
142 if (!joiner)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
143 return NULL;
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
144 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
145 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
146 if (result)
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
147 Py_DECREF(list);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
148 return result;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
149 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
150
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
151 /* 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
152 */
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
153 static int
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
154 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
155 {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
156 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
157 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
158
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
159
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
160 /* -------------------------------------------------------------------- */
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
161 /* the Element type */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
162
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
163 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
164
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
165 /* 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
166 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
167
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
168 /* child elements */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
169 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
170 int allocated; /* allocated items */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
171
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
172 /* 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
173 PyObject* *children;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
174
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
175 PyObject* _children[STATIC_CHILDREN];
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
176
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
177 } ElementObjectExtra;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
178
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
179 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
180 PyObject_HEAD
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 /* element tag (a string). */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
183 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
184
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
185 /* 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
186 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
187 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
188 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
189 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
190 should be left intact. */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
191 PyObject* text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
192
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
193 /* 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
194 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
195 PyObject* tail;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
196
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
197 ElementObjectExtra* extra;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
198
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
199 PyObject *weakreflist; /* For tp_weaklistoffset */
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
200
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
201 } ElementObject;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
202
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
203 static PyTypeObject Element_Type;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
204
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
205 #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
206
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
207 /* -------------------------------------------------------------------- */
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
208 /* Element constructors and destructor */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
209
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
210 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
211 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
212 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
213 self->extra = PyObject_Malloc(sizeof(ElementObjectExtra));
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
214 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
215 return -1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
216
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
217 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
218 attrib = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
219
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
220 Py_INCREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
221 self->extra->attrib = attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
222
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
223 self->extra->length = 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
224 self->extra->allocated = STATIC_CHILDREN;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
225 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
226
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
227 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
228 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
229
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
230 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
231 dealloc_extra(ElementObject* self)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
232 {
76101
118729090dc5 Fix Windows compilation errors
Eli Bendersky <eliben@gmail.com>
parents: 76098
diff changeset
233 ElementObjectExtra *myextra;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
234 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
235
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
236 if (!self->extra)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
237 return;
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
238
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
239 /* Avoid DECREFs calling into this code again (cycles, etc.)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
240 */
76101
118729090dc5 Fix Windows compilation errors
Eli Bendersky <eliben@gmail.com>
parents: 76098
diff changeset
241 myextra = self->extra;
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
242 self->extra = NULL;
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
243
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
244 Py_DECREF(myextra->attrib);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
245
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
246 for (i = 0; i < myextra->length; i++)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
247 Py_DECREF(myextra->children[i]);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
248
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
249 if (myextra->children != myextra->_children)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
250 PyObject_Free(myextra->children);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
251
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
252 PyObject_Free(myextra);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
253 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
254
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
255 /* 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
256 * 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
257 */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
258 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
259 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
260 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
261 ElementObject* self;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
262
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
263 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
264 if (self == NULL)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
265 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
266 self->extra = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
267
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
268 if (attrib != Py_None && !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
269 if (create_extra(self, attrib) < 0) {
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37144
diff changeset
270 PyObject_Del(self);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
271 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
272 }
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
275 Py_INCREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
276 self->tag = tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
277
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
278 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
279 self->text = Py_None;
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 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
282 self->tail = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
283
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
284 self->weakreflist = NULL;
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
285
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
286 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
287 PyObject_GC_Track(self);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
288 return (PyObject*) self;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
289 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
290
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
291 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
292 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
293 {
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
294 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
295 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
296 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
297 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
298
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
299 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
300 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
301
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
302 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
303 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
304
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
305 e->extra = NULL;
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
306 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
307 }
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
308 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
309 }
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
310
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
311 /* 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
312 * This is required by some constructors/functions in this module that can
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
313 * either accept attrib as a keyword argument or all attributes splashed
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
314 * directly into *kwds.
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
315 * If there is no 'attrib' keyword, return an empty dict.
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
316 */
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
317 static PyObject*
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
318 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
319 {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
320 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
321 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
322
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
323 if (attrib) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
324 /* 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
325 * kwds
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
326 */
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
327 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
328 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
329 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
330 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
331 return NULL;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
332 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
333 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
334 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
335 } else {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
336 attrib = PyDict_New();
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
337 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
338
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
339 Py_DECREF(attrib_str);
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
340
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
341 if (attrib)
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
342 PyDict_Update(attrib, kwds);
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
343 return attrib;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
344 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
345
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
346 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
347 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
348 {
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
349 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
350 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
351 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
352 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
353
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
354 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
355 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
356
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
357 if (attrib) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
358 /* 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
359 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
360 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
361 return -1;
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
362 if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
363 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
364 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
365 return -1;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
366 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
367 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
368 } else if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
369 /* have keywords args */
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
370 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
371 if (!attrib)
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
372 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
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
ce1c26cbe5fb 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 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
376
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
377 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
378 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
379 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
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 }
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
382 }
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
383
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
384 /* 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
385 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
386
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
387 /* 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
388 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
389 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
390 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
391 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
392
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
393 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
394 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
395 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
396 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
397
ce1c26cbe5fb 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 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
399 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
400 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
401 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
402
ce1c26cbe5fb 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 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
404 }
ce1c26cbe5fb 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
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
406 LOCAL(int)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
407 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
408 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
409 int size;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
410 PyObject* *children;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
411
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
412 /* 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
413 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
414
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
415 if (!self->extra)
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
416 create_extra(self, NULL);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
417
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
418 size = self->extra->length + extra;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
419
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
420 if (size > self->extra->allocated) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
421 /* 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
422 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
423 /* 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
424 * which needs at least 4 bytes.
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
425 * 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
426 * be safe.
14d4104976fc Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
427 */
14d4104976fc Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
428 size = size ? size : 1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
429 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
430 /* 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
431 * "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
432 * 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
433 */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
434 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
435 size * sizeof(PyObject*));
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
436 if (!children)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
437 goto nomemory;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
438 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
439 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
440 if (!children)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
441 goto nomemory;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
442 /* 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
443 memcpy(children, self->extra->children,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
444 self->extra->length * sizeof(PyObject*));
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
445 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
446 self->extra->children = children;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
447 self->extra->allocated = size;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
448 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
449
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
450 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
451
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
452 nomemory:
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
453 PyErr_NoMemory();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
454 return -1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
455 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
456
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
457 LOCAL(int)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
458 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
459 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
460 /* 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
461
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
462 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
463 return -1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
464
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
465 Py_INCREF(element);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
466 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
467
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
468 self->extra->length++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
469
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
470 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
471 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
472
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
473 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
474 element_get_attrib(ElementObject* self)
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 /* 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
477 /* 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
478
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
479 PyObject* res = self->extra->attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
480
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
481 if (res == Py_None) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
482 /* create missing dictionary */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
483 res = PyDict_New();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
484 if (!res)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
485 return NULL;
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
486 Py_DECREF(Py_None);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
487 self->extra->attrib = res;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
490 return res;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
493 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
494 element_get_text(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
495 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
496 /* 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
497
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
498 PyObject* res = self->text;
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 if (JOIN_GET(res)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
501 res = JOIN_OBJ(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
502 if (PyList_CheckExact(res)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
503 res = list_join(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
504 if (!res)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
505 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
506 self->text = res;
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
509
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
510 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
511 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
512
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
513 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
514 element_get_tail(ElementObject* self)
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 /* 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
517
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
518 PyObject* res = self->tail;
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 if (JOIN_GET(res)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
521 res = JOIN_OBJ(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
522 if (PyList_CheckExact(res)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
523 res = list_join(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
524 if (!res)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
525 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
526 self->tail = res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
527 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
528 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
529
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
530 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
531 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
532
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
533 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
534 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
535 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
536 PyObject* elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
537
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
538 ElementObject* parent;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
539 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
540 PyObject* attrib = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
541 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
542 &Element_Type, &parent, &tag,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
543 &PyDict_Type, &attrib))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
544 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
545
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
546 if (attrib) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
547 /* 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
548 attrib = PyDict_Copy(attrib);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
549 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
550 return NULL;
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
551 if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
552 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
553 return NULL;
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
554 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
555 }
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
556 } else if (kwds) {
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
557 /* have keyword args */
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
558 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
559 if (!attrib)
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
560 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
561 } else {
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
562 /* 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
563 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
564 attrib = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
565 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
566
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
567 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
568
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
569 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
570
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
571 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
572 Py_DECREF(elem);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
573 return NULL;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
574 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
575
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
576 return elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
577 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
578
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
579 static int
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
580 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
581 {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
582 Py_VISIT(self->tag);
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
583 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
584 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
585
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
586 if (self->extra) {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
587 int i;
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
588 Py_VISIT(self->extra->attrib);
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
589
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
590 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
591 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
592 }
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
593 return 0;
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
594 }
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
595
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
596 static int
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
597 element_gc_clear(ElementObject *self)
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
598 {
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
599 Py_CLEAR(self->tag);
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
600
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
601 /* The following is like Py_CLEAR for self->text and self->tail, but
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
602 * written explicitily because the real pointers hide behind access
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
603 * macros.
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
604 */
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
605 if (self->text) {
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
606 PyObject *tmp = JOIN_OBJ(self->text);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
607 self->text = NULL;
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
608 Py_DECREF(tmp);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
609 }
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
610
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
611 if (self->tail) {
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
612 PyObject *tmp = JOIN_OBJ(self->tail);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
613 self->tail = NULL;
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
614 Py_DECREF(tmp);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
615 }
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
616
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
617 /* 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
618 * so fully deallocate it.
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
619 */
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
620 dealloc_extra(self);
75997
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
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
624 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
625 element_dealloc(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
626 {
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
627 PyObject_GC_UnTrack(self);
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
628
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
629 if (self->weakreflist != NULL)
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
630 PyObject_ClearWeakRefs((PyObject *) self);
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
631
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
632 /* 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
633 */
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
634 element_gc_clear(self);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
635
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
636 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
637 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
638 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
639
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
640 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
641 /* methods (in alphabetical order) */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
642
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
643 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
644 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
645 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
646 PyObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
647 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
648 return NULL;
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 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
651 return NULL;
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 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
654 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
655
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
656 static PyObject*
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
657 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
658 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
659 if (!PyArg_ParseTuple(args, ":clear"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
660 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
661
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
662 dealloc_extra(self);
36050
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 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
665 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
666 self->text = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
667
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
668 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
669 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
670 self->tail = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
671
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
672 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
673 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
674
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
675 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
676 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
677 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
678 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
679 ElementObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
680
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
681 if (!PyArg_ParseTuple(args, ":__copy__"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
682 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
683
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
684 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
685 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
686 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
687 if (!element)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
688 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
689
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
690 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
691 element->text = self->text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
692 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
693
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
694 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
695 element->tail = self->tail;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
696 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
697
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
698 if (self->extra) {
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
699
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
700 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
701 Py_DECREF(element);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
702 return NULL;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
703 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
704
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
705 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
706 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
707 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
708 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
709
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
710 element->extra->length = self->extra->length;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
711
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
712 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
713
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
714 return (PyObject*) element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
715 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
716
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
717 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
718 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
719 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
720 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
721 ElementObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
722 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
723 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
724 PyObject* text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
725 PyObject* tail;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
726 PyObject* id;
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 PyObject* memo;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
729 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
730 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
731
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
732 tag = deepcopy(self->tag, memo);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
733 if (!tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
734 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
735
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
736 if (self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
737 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
738 if (!attrib) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
739 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
740 return NULL;
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 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
743 Py_INCREF(Py_None);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
744 attrib = Py_None;
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
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
747 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
748
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
749 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
750 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
751
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
752 if (!element)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
753 return NULL;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
754
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
755 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
756 if (!text)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
757 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
758 Py_DECREF(element->text);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
759 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
760
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
761 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
762 if (!tail)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
763 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
764 Py_DECREF(element->tail);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
765 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
766
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
767 if (self->extra) {
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 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
770 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
771
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
772 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
773 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
774 if (!child) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
775 element->extra->length = i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
776 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
777 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
778 element->extra->children[i] = child;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
779 }
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 element->extra->length = self->extra->length;
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 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
784
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
785 /* 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
786 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
787 if (!id)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
788 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
789
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
790 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
791
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
792 Py_DECREF(id);
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 if (i < 0)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
795 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
796
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
797 return (PyObject*) element;
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 error:
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
800 Py_DECREF(element);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
801 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
802 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
803
77485
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
804 static PyObject*
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
805 element_sizeof(PyObject* _self, PyObject* args)
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
806 {
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
807 ElementObject *self = (ElementObject*)_self;
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
808 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
809 if (self->extra) {
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
810 result += sizeof(ElementObjectExtra);
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
811 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
812 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
813 }
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
814 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
815 }
093dec81ea1f Issue #14055: Add __sizeof__ support to _elementtree.
Martin v. Löwis <martin@v.loewis.de>
parents: 77432
diff changeset
816
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
817 LOCAL(int)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
818 checkpath(PyObject* tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
819 {
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
820 Py_ssize_t i;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
821 int check = 1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
822
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
823 /* 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
824
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
825 #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
826 (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
827
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
828 if (PyUnicode_Check(tag)) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
829 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
830 void *data = PyUnicode_DATA(tag);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
831 unsigned int kind = PyUnicode_KIND(tag);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
832 for (i = 0; i < len; i++) {
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
833 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
834 if (ch == '{')
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
835 check = 0;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
836 else if (ch == '}')
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
837 check = 1;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
838 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
839 return 1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
840 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
841 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
842 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
843 if (PyBytes_Check(tag)) {
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
844 char *p = PyBytes_AS_STRING(tag);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
845 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
846 if (p[i] == '{')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
847 check = 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
848 else if (p[i] == '}')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
849 check = 1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
850 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
851 return 1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
852 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
853 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
854 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
855
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
856 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
857 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
858
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
859 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
860 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
861 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
862 PyObject* seq;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
863 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
864
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
865 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
866 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
867 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
868
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
869 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
870 if (!seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
871 PyErr_Format(
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
872 PyExc_TypeError,
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
873 "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
874 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
875 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
876 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
877
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
878 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
879 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
880 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
881 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
882 Py_DECREF(seq);
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
883 PyErr_Format(
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
884 PyExc_TypeError,
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
885 "expected an Element, not \"%.200s\"",
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
886 Py_TYPE(element)->tp_name);
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
887 return NULL;
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
888 }
75268a773455 Issue #13782: streamline argument type-checking in ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75722
diff changeset
889
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
890 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
891 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
892 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
893 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
894 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
895
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
896 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
897
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
898 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
899 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
900
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
901 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
902 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
903 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
904 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
905 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
906 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
907 static char *kwlist[] = {"path", "namespaces", 0};
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
908
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
909 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
910 &tag, &namespaces))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
911 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
912
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
913 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
914 _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
915 return _PyObject_CallMethodId(
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
916 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
917 );
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
918 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
919
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
920 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
921 Py_RETURN_NONE;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
922
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
923 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
924 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
925 if (Element_CheckExact(item) &&
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
926 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
927 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
928 return item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
929 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
930 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
931
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
932 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
933 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
934
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
935 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
936 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
937 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
938 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
939 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
940 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
941 PyObject* namespaces = Py_None;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
942 _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
943 static char *kwlist[] = {"path", "default", "namespaces", 0};
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
944
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
945 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
946 &tag, &default_value, &namespaces))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
947 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
948
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
949 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
950 return _PyObject_CallMethodId(
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
951 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
952 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
953
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
954 if (!self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
955 Py_INCREF(default_value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
956 return default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
957 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
958
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
959 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
960 ElementObject* item = (ElementObject*) self->extra->children[i];
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
961 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
962
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
963 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
964 if (text == Py_None)
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
965 return PyBytes_FromString("");
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
966 Py_XINCREF(text);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
967 return text;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
968 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
969 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
970
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
971 Py_INCREF(default_value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
972 return default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
973 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
974
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
975 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
976 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
977 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
978 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
979 PyObject* out;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
980 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
981 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
982 static char *kwlist[] = {"path", "namespaces", 0};
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
983
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
984 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
985 &tag, &namespaces))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
986 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
987
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
988 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
989 _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
990 return _PyObject_CallMethodId(
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
991 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
992 );
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
993 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
994
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
995 out = PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
996 if (!out)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
997 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
998
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
999 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1000 return out;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1001
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1002 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
1003 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
1004 if (Element_CheckExact(item) &&
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1005 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
1006 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
1007 Py_DECREF(out);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1008 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1009 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1010 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1011 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1012
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1013 return out;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1014 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1015
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1016 static PyObject*
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1017 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
1018 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1019 PyObject* tag;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1020 PyObject* namespaces = Py_None;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
1021 _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
1022 static char *kwlist[] = {"path", "namespaces", 0};
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1023
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1024 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
1025 &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
1026 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1027
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1028 return _PyObject_CallMethodId(
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
1029 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
1030 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1031 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1032
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1033 static PyObject*
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1034 element_get(ElementObject* self, PyObject* args)
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 PyObject* value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1037
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1038 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1039 PyObject* default_value = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1040 if (!PyArg_ParseTuple(args, "O|O:get", &key, &default_value))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1041 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1042
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1043 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
1044 value = default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1045 else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1046 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
1047 if (!value)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1048 value = default_value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1049 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1051 Py_INCREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1052 return value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1053 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1054
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1055 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1056 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
1057 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1058 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1059 PyObject* list;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1060
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1061 /* 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
1062
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1063 if (!PyArg_ParseTuple(args, ":getchildren"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1064 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1065
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1066 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1067 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1068
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1069 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
1070 if (!list)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1071 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1072
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1073 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
1074 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
1075 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1076 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
1077 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1078
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1079 return list;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1080 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1081
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
1082
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1083 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
1084 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
1085
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1086
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1087 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
1088 element_iter(ElementObject *self, PyObject *args)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1089 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1090 PyObject* tag = 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
1091 if (!PyArg_ParseTuple(args, "|O:iter", &tag))
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1092 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1093
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
1094 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
1095 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1096
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1097
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1098 static PyObject*
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1099 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
1100 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1101 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
1102 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1103
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
1104 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
1105 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1106
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
1107
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1108 static PyObject*
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1109 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
1110 {
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1111 ElementObject* self = (ElementObject*) self_;
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1112
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1113 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
1114 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1115 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1116 "child index out of range"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1117 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1118 return NULL;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1121 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
1122 return self->extra->children[index];
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1123 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1124
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1125 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1126 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
1127 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1128 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1129
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1130 int index;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1131 PyObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1132 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
1133 &Element_Type, &element))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1134 return NULL;
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 if (!self->extra)
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
1137 create_extra(self, NULL);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1138
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1139 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
1140 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
1141 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
1142 index = 0;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1143 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1144 if (index > self->extra->length)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1145 index = self->extra->length;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1146
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1147 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
1148 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1149
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1150 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
1151 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
1152
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1153 Py_INCREF(element);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1154 self->extra->children[index] = element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1155
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1156 self->extra->length++;
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 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1159 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1160
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1161 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1162 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
1163 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1164 if (!PyArg_ParseTuple(args, ":items"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1165 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1166
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1167 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
1168 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1169
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1170 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
1171 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1172
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1173 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1174 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
1175 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1176 if (!PyArg_ParseTuple(args, ":keys"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1177 return NULL;
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 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
1180 return PyList_New(0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1181
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1182 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
1183 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1184
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1185 static Py_ssize_t
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1186 element_length(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1187 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1188 if (!self->extra)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1189 return 0;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1190
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1191 return self->extra->length;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1192 }
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 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1195 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
1196 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1197 PyObject* elem;
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 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1200 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1201 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
1202 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1203
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1204 attrib = PyDict_Copy(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1205 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1206 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1207
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
1208 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
1209
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1210 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1211
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1212 return elem;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1213 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1214
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1215 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1216 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
1217 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1218 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1219
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1220 PyObject* element;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1221 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
1222 return NULL;
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 if (!self->extra) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1225 /* 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
1226 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1227 PyExc_ValueError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1228 "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
1229 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1230 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1231 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1232
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1233 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
1234 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
1235 break;
51244
e9675d72e3e3 Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48660
diff changeset
1236 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
1237 break;
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
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1240 if (i == self->extra->length) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1241 /* 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
1242 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1243 PyExc_ValueError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1244 "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
1245 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1246 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1247 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1248
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1249 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
1250
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1251 self->extra->length--;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1252
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1253 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
1254 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
1255
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1256 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1257 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1258
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1259 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1260 element_repr(ElementObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1261 {
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
1262 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
1263 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
1264 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
1265 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
1266 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1267
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1268 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1269 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
1270 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1271 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1272
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1273 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1274 PyObject* value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1275 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
1276 return NULL;
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 if (!self->extra)
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
1279 create_extra(self, NULL);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1280
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1281 attrib = element_get_attrib(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1282 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1283 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1284
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1285 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
1286 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1287
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1288 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1289 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1290
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1291 static int
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1292 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
1293 {
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
1294 ElementObject* self = (ElementObject*) self_;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1295 int i;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1296 PyObject* old;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1297
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1298 if (!self->extra || index < 0 || index >= self->extra->length) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1299 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1300 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1301 "child assignment index out of range");
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1302 return -1;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1303 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1304
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1305 old = self->extra->children[index];
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1306
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1307 if (item) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1308 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1309 self->extra->children[index] = item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1310 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1311 self->extra->length--;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1312 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
1313 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
1314 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1315
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1316 Py_DECREF(old);
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 return 0;
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
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1321 static PyObject*
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1322 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
1323 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1324 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
1325
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1326 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
1327 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
1328
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1329 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
1330 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1331 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1332 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
1333 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
1334 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
1335 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1336 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
1337 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
1338 PyObject* list;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1339
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1340 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
1341 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
1342
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65707
diff changeset
1343 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
1344 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
1345 &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
1346 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1347 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1348
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1349 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
1350 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
1351 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1352 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
1353 if (!list)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1354 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1355
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1356 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
1357 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
1358 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
1359 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
1360 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
1361 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1362
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1363 return list;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1364 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1365 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1366 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1367 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
1368 "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
1369 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1370 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1371 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1372
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1373 static int
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1374 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
1375 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1376 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
1377
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1378 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
1379 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
1380
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1381 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
1382 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1383 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1384 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
1385 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
1386 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
1387 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1388 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
1389 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
1390
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1391 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
1392 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
1393
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1394 if (!self->extra)
75379
ce1c26cbe5fb Issue #14128: Exposing Element as an actual type from _elementtree, rather than a factory function.
Eli Bendersky <eliben@gmail.com>
parents: 74903
diff changeset
1395 create_extra(self, NULL);
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1396
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65707
diff changeset
1397 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
1398 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
1399 &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
1400 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1401 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1402
75505
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1403 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
1404 /* Delete slice */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1405 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
1406 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
1407
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1408 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
1409 return 0;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1410
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1411 /* 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
1412 * 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
1413 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1414 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
1415 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
1416 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
1417 step = -step;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1418 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1419
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1420 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
1421
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1422 /* 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
1423 * 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
1424 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1425 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
1426 PyErr_NoMemory();
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1427 return -1;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1428 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1429
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1430 /* 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
1431 * 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
1432 * 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
1433 * 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
1434 * 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
1435 * 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
1436 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1437 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
1438 /* 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
1439 * list end.
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1440 */
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1441 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
1442 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
1443 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
1444 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1445
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1446 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
1447
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1448 memmove(
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1449 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
1450 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
1451 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
1452 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1453
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1454 /* 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
1455 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
1456 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
1457 memmove(
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1458 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
1459 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
1460 (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
1461 }
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1462
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1463 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
1464
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1465 /* 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
1466 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
1467 return 0;
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1468 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1469 else {
75505
1a721b9a4039 Issue #14178: Problem deleting slices with steps != +1 in the _elementtree module.
Eli Bendersky <eliben@gmail.com>
parents: 75410
diff changeset
1470 /* 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
1471 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
1472 if (!seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1473 PyErr_Format(
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1474 PyExc_TypeError,
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1475 "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
1476 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1477 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1478 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1479 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
1480 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1481
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1482 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
1483 {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1484 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
1485 "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
1486 "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
1487 newlen, slicelen
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1488 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1489 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1490 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1491
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1492 /* 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
1493 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
1494 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
1495 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1496 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
1497 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1498 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1499 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1500 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1501
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1502 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
1503 /* 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
1504 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
1505 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
1506 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
1507 if (!recycle) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1508 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1509 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
1510 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1511 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1512 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1513 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
1514 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
1515 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
1516 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1517
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1518 if (newlen < slicelen) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1519 /* delete slice */
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1520 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
1521 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
1522 } 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
1523 /* insert slice */
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1524 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
1525 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
1526 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1527
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1528 /* 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
1529 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
1530 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
1531 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
1532 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
1533 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
1534 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1535
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1536 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
1537
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1538 if (seq) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1539 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
1540 }
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 /* 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
1543 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
1544
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1545 return 0;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1546 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1547 else {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1548 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
1549 "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
1550 return -1;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1551 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1552 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1553
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1554 static PyMethodDef element_methods[] = {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1555
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1556 {"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
1557
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1558 {"get", (PyCFunction) element_get, METH_VARARGS},
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1559 {"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
1560
77217
7d252dbfbee3 Issue 14814: Add namespaces keyword arg to find(*) methods in _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77062
diff changeset
1561 {"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
1562 {"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
1563 {"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
1564
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1565 {"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
1566 {"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
1567 {"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
1568 {"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
1569
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1570 {"iter", (PyCFunction) element_iter, METH_VARARGS},
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1571 {"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
1572 {"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
1573
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1574 {"getiterator", (PyCFunction) element_iter, METH_VARARGS},
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1575 {"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
1576
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1577 {"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
1578 {"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
1579
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1580 {"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
1581
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1582 {"__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
1583 {"__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
1584 {"__sizeof__", element_sizeof, METH_NOARGS},
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1585
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1586 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1587 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1588
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1589 static PyObject*
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1590 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
1591 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1592 PyObject* res;
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1593 char *name = "";
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1594
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1595 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
1596 name = _PyUnicode_AsString(nameobj);
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
1597
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
1598 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
1599 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
1600
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1601 /* 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
1602 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
1603 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
1604 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
1605 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1606 } 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
1607 res = element_get_text(self);
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1608 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
1609 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1610 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1611
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1612 /* methods */
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1613 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
1614 if (res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1615 return res;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1616
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1617 /* 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
1618 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
1619 PyErr_Clear();
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1620 res = element_get_tail(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1621 } 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
1622 PyErr_Clear();
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1623 if (!self->extra)
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
1624 create_extra(self, NULL);
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1625 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
1626 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1627
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1628 if (!res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1629 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1630
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1631 Py_INCREF(res);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1632 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1633 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1634
77062
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1635 static PyObject*
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1636 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
1637 {
77062
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1638 char *name = "";
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1639 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
1640 name = _PyUnicode_AsString(nameobj);
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1641
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1642 if (name == NULL)
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1643 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1644
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1645 if (strcmp(name, "tag") == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1646 Py_DECREF(self->tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1647 self->tag = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1648 Py_INCREF(self->tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1649 } 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
1650 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
1651 self->text = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1652 Py_INCREF(self->text);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1653 } 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
1654 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
1655 self->tail = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1656 Py_INCREF(self->tail);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1657 } else if (strcmp(name, "attrib") == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1658 if (!self->extra)
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
1659 create_extra(self, NULL);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1660 Py_DECREF(self->extra->attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1661 self->extra->attrib = value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1662 Py_INCREF(self->extra->attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1663 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1664 PyErr_SetString(PyExc_AttributeError, name);
77062
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1665 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1666 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1667
77062
41a9d24d075e Issue #14849: setup Element data members to be assignable in subclasses
Eli Bendersky <eliben@gmail.com>
parents: 76110
diff changeset
1668 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1669 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1670
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1671 static PySequenceMethods element_as_sequence = {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1672 (lenfunc) element_length,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1673 0, /* sq_concat */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1674 0, /* sq_repeat */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1675 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
1676 0,
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36450
diff changeset
1677 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
1678 0,
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
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
1681 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
1682 (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
1683 (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
1684 (objobjargproc) element_ass_subscr,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1685 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1686
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
1687 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
1688 PyVarObject_HEAD_INIT(NULL, 0)
e70cdce0e8b2 Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41782
diff changeset
1689 "Element", sizeof(ElementObject), 0,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1690 /* 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
1691 (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
1692 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
1693 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
1694 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
1695 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
1696 (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
1697 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
1698 &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
1699 &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
1700 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
1701 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
1702 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
1703 (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
1704 (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
1705 0, /* tp_as_buffer */
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1706 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
1707 /* 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
1708 0, /* tp_doc */
75997
0ca32013d77e Issue #14065: Added cyclic GC support to ET.Element
Eli Bendersky <eliben@gmail.com>
parents: 75894
diff changeset
1709 (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
1710 (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
1711 0, /* tp_richcompare */
76098
14abfa27ff19 Fixes and enhancements to _elementtree:
Eli Bendersky <eliben@gmail.com>
parents: 75997
diff changeset
1712 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
1713 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
1714 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
1715 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
1716 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
1717 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
1718 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
1719 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
1720 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
1721 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
1722 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
1723 (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
1724 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
1725 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
1726 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1727 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1728
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
1729 /******************************* 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
1730
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1731 /* 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
1732 * 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
1733 * 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
1734 * 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
1735 * 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
1736 * 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
1737 * 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
1738 */
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1739 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
1740 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
1741 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
1742 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
1743 } 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
1744
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1745 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
1746 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
1747 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
1748 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
1749 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
1750 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
1751 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
1752 } 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
1753
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1754
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1755 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
1756 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
1757 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1758 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
1759 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
1760 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
1761 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
1762 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
1763 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
1764 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1765
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1766 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
1767 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
1768
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1769 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
1770 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
1771 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1772
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1773 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
1774 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
1775 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1776 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
1777 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
1778 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
1779 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
1780 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1781
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1782 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
1783 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
1784 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
1785 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1786
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1787 /* 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
1788 */
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1789 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
1790 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
1791 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1792 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
1793 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
1794 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
1795 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
1796 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
1797 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
1798 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1799 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
1800 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1801
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1802 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
1803 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
1804 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1805 /* Sub-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
1806 *
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1807 * 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
1808 * 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
1809 * 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
1810 * - 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
1811 * 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
1812 * 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
1813 * - 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
1814 * 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
1815 */
77432
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
1816 ElementObject *cur_parent;
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
1817 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
1818
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1819 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
1820 /* 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
1821 * 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
1822 * 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
1823 * 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
1824 * 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
1825 */
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1826 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
1827 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
1828 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
1829 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
1830 } 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
1831 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
1832 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
1833 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
1834 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
1835 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
1836 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1837
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1838 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
1839 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
1840 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
1841 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
1842 if (it->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
1843 PyObject *text = JOIN_OBJ(it->root_element->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
1844 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
1845 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
1846 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
1847 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1848 } 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
1849 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
1850 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
1851 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1852 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1853 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1854 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1855
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1856 /* 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
1857 * 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
1858 */
77432
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
1859 cur_parent = it->parent_stack->parent;
3c089edbf02c Fix windows compilation problems caused by previous commit.
Eli Bendersky <eliben@gmail.com>
parents: 77431
diff changeset
1860 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
1861 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
1862 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
1863 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
1864 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
1865 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
1866 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
1867 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
1868 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
1869 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
1870 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1871
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1872 if (it->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
1873 PyObject *text = JOIN_OBJ(child->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
1874 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
1875 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
1876 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
1877 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1878 } 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
1879 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
1880 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
1881 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
1882 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
1883 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1884 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
1885 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
1886 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1887 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
1888 PyObject *tail = it->gettext ? JOIN_OBJ(cur_parent->tail) : 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
1889 ParentLocator *next = 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
1890 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
1891 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
1892 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
1893
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1894 /* 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
1895 * 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
1896 * 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
1897 */
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1898 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
1899 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
1900 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
1901 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1902 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1903 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1904
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1905 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
1906 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1907
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1908
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1909 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
1910 PyVarObject_HEAD_INIT(NULL, 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
1911 "_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
1912 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
1913 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
1914 /* 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
1915 (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
1916 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
1917 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
1918 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
1919 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
1920 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
1921 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
1922 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
1923 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
1924 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
1925 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
1926 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
1927 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
1928 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
1929 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
1930 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
1931 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
1932 (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
1933 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
1934 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
1935 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
1936 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
1937 (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
1938 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
1939 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
1940 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
1941 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
1942 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
1943 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
1944 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
1945 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
1946 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
1947 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
1948 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
1949 };
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1950
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1951
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1952 static 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
1953 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
1954 {
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1955 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
1956 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
1957
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1958 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
1959 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
1960 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
1961 if (!(it->parent_stack = 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
1962 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
1963 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
1964 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1965
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1966 it->parent_stack->parent = 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
1967 it->parent_stack->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
1968 it->parent_stack->next = 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
1969
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1970 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
1971 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
1972 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
1973 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
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 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
1976 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
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 Py_XDECREF(star);
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 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
1980 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
1981 it->gettext = 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
1982 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
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_INCREF(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
1985 Py_INCREF(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
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the 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 PyObject_GC_Track(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
1988 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
1989 }
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1990
652d148bdc1d Replace the iter/itertext methods of Element in _elementtree with true C implementations, instead of the bootstrapped Python code. In addition to being cleaner (removing the last remains of the bootstrapping code in _elementtree), this gives a 10x performance boost for iter() on large documents.
Eli Bendersky <eliben@gmail.com>
parents: 77313
diff changeset
1991
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1992 /* ==================================================================== */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1993 /* the tree builder type */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1994
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1995 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1996 PyObject_HEAD
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1997
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
1998 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
1999
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
2000 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
2001 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
2002
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2003 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
2004
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2005 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
2006 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
2007
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2008 PyObject *element_factory;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2009
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2010 /* 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
2011 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
2012 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
2013 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
2014 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
2015 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
2016 } TreeBuilderObject;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2017
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
2018 static PyTypeObject TreeBuilder_Type;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2019
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
2020 #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
2021
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2022 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2023 /* constructor and destructor */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2024
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2025 static PyObject *
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2026 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
2027 {
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2028 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
2029 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
2030 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
2031
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2032 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
2033 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
2034 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
2035 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
2036
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2037 t->data = NULL;
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2038 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
2039 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
2040 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
2041 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
2042 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
2043 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
2044 return NULL;
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2045 }
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2046 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
2047
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2048 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
2049 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
2050 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
2051 }
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2052 return (PyObject *)t;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2053 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2054
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2055 static int
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2056 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
2057 {
77313
eb1d633fe307 Fix unterminated keyword array passed to PyArg_ParseTupleAndKeywords
Eli Bendersky <eliben@gmail.com>
parents: 77279
diff changeset
2058 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
2059 PyObject *element_factory = NULL;
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2060 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
2061 PyObject *tmp;
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2062
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2063 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
2064 &element_factory)) {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2065 return -1;
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2066 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2067
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2068 if (element_factory) {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2069 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
2070 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
2071 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
2072 Py_XDECREF(tmp);
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2073 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2074
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2075 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2076 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2077
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2078 static int
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2079 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
2080 {
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2081 Py_VISIT(self->root);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2082 Py_VISIT(self->this);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2083 Py_VISIT(self->last);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2084 Py_VISIT(self->data);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2085 Py_VISIT(self->stack);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2086 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
2087 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2088 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2089
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2090 static int
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2091 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
2092 {
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2093 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
2094 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
2095 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
2096 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
2097 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
2098 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
2099 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
2100 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
2101 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
2102 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
2103 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
2104 return 0;
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2105 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2106
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2107 static void
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2108 treebuilder_dealloc(TreeBuilderObject *self)
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2109 {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2110 PyObject_GC_UnTrack(self);
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2111 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
2112 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
2113 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2114
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2115 /* -------------------------------------------------------------------- */
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
2116 /* 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
2117
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
2118 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
2119 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
2120 PyObject **dest, _Py_Identifier *name)
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
2121 {
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
2122 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
2123 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
2124 *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
2125 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
2126 }
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
2127 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
2128 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
2129 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
2130 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
2131 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
2132 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
2133 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
2134 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
2135 }
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
2136 }
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
2137
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
2138 /* 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
2139 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
2140 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
2141 {
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
2142 _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
2143 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
2144 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
2145 }
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
2146
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
2147 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
2148 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
2149 {
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
2150 _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
2151 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
2152 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
2153 }
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
2154
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
2155 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
2156 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
2157 {
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
2158 _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
2159 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
2160 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
2161 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
2162 }
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
2163 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
2164 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
2165 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
2166 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
2167 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
2168 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
2169 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
2170 }
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
2171 }
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
2172
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
2173 /* -------------------------------------------------------------------- */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2174 /* handlers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2175
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2176 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2177 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
2178 PyObject* attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2179 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2180 PyObject* node;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2181 PyObject* this;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2182
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2183 if (self->data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2184 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
2185 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
2186 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
2187 }
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
2188 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
2189 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
2190 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2191 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2192 self->data = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2193 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2194
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2195 if (self->element_factory) {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2196 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
2197 } else {
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2198 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
2199 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2200 if (!node) {
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2201 return NULL;
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2202 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2203
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
2204 this = self->this;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2205
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2206 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
2207 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
2208 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2209 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2210 if (self->root) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2211 PyErr_SetString(
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2212 elementtree_parseerror_obj,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2213 "multiple elements on top level"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2214 );
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2215 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2216 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2217 Py_INCREF(node);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2218 self->root = node;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2219 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2220
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2221 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
2222 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
2223 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2224 Py_INCREF(this);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2225 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2226 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
2227 goto error;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2228 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2229 self->index++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2230
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2231 Py_DECREF(this);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2232 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
2233 self->this = node;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2234
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2235 Py_DECREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2236 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
2237 self->last = node;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2238
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2239 if (self->start_event_obj) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2240 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2241 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
2242 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
2243 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2244 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2245 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2246 } else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2247 PyErr_Clear(); /* FIXME: propagate error */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2248 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2249
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2250 return node;
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2251
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2252 error:
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2253 Py_DECREF(node);
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2254 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2255 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2256
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2257 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2258 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
2259 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2260 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
2261 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
2262 /* 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
2263 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
2264 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2265 /* 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
2266 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
2267 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2268 /* 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
2269 if (PyBytes_CheckExact(self->data) && Py_REFCNT(self->data) == 1 &&
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2270 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
2271 /* 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
2272 /* 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
2273 the most common case by resizing the existing string... */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2274 Py_ssize_t size = PyBytes_GET_SIZE(self->data);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2275 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
2276 return NULL;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2277 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
2278 } 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
2279 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
2280 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2281 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2282 PyObject* list = PyList_New(2);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2283 if (!list)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2284 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2285 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
2286 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
2287 self->data = list;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2288 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2289 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2290
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2291 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2292 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2293
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2294 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2295 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
2296 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2297 PyObject* item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2298
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2299 if (self->data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2300 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
2301 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
2302 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2303 } 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
2304 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
2305 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2306 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2307 self->data = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2308 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2309
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2310 if (self->index == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2311 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2312 PyExc_IndexError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2313 "pop from empty stack"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2314 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2315 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2316 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2317
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2318 self->index--;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2319
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2320 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
2321 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2322
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2323 Py_DECREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2324
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
2325 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
2326 self->this = item;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2327
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2328 if (self->end_event_obj) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2329 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2330 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
2331 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
2332 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
2333 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2334 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2335 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2336 } else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2337 PyErr_Clear(); /* FIXME: propagate error */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2338 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2339
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2340 Py_INCREF(self->last);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2341 return (PyObject*) self->last;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2342 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2343
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2344 LOCAL(void)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2345 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
2346 PyObject *prefix, PyObject *uri)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2347 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2348 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2349 PyObject* action;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2350 PyObject* parcel;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2351
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2352 if (!self->events)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2353 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2354
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2355 if (start) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2356 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
2357 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2358 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
2359 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
2360 if (!parcel)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2361 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2362 Py_INCREF(action);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2363 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2364 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
2365 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2366 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
2367 Py_INCREF(action);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2368 parcel = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2369 Py_INCREF(parcel);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2370 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2371
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2372 res = PyTuple_New(2);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2373
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2374 if (res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2375 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
2376 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
2377 PyList_Append(self->events, res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2378 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
2379 }
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2380 else {
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2381 Py_DECREF(action);
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2382 Py_DECREF(parcel);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2383 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
2384 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2385 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2386
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 /* methods (in alphabetical order) */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2389
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2390 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2391 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
2392 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2393 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2394 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
2395 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2396
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2397 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
2398 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2399
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2400 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2401 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
2402 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2403 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2404 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
2405 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2406
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2407 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
2408 }
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 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2411 treebuilder_done(TreeBuilderObject* self)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2412 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2413 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2414
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2415 /* FIXME: check stack size? */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2416
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2417 if (self->root)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2418 res = self->root;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2419 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2420 res = Py_None;
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 Py_INCREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2423 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2424 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2425
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2426 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2427 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
2428 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2429 if (!PyArg_ParseTuple(args, ":close"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2430 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2431
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2432 return treebuilder_done(self);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2433 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2434
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2435 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2436 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
2437 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2438 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2439 PyObject* attrib = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2440 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
2441 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2442
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2443 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
2444 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2445
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2446 static PyMethodDef treebuilder_methods[] = {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2447 {"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
2448 {"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
2449 {"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
2450 {"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
2451 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2452 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2453
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
2454 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
2455 PyVarObject_HEAD_INIT(NULL, 0)
e70cdce0e8b2 Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41782
diff changeset
2456 "TreeBuilder", sizeof(TreeBuilderObject), 0,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2457 /* methods */
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
2458 (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
2459 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
2460 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
2461 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
2462 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
2463 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
2464 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
2465 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
2466 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
2467 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
2468 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
2469 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
2470 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
2471 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
2472 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
2473 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
2474 /* 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
2475 0, /* tp_doc */
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2476 (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
2477 (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
2478 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
2479 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
2480 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
2481 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
2482 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
2483 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
2484 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
2485 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
2486 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
2487 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
2488 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
2489 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
2490 (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
2491 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
2492 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
2493 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2494 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2495
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2496 /* ==================================================================== */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2497 /* the expat interface */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2498
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2499 #if defined(USE_EXPAT)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2500
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2501 #include "expat.h"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2502 #include "pyexpat.h"
77278
cf9c379a9859 We're always building _elementtree with USE_PYEXPAT_CAPI, so the #ifdefs in
Eli Bendersky <eliben@gmail.com>
parents: 77275
diff changeset
2503 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
2504 #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
2505
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
2506 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
2507 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
2508
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2509 typedef struct {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2510 PyObject_HEAD
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2511
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2512 XML_Parser parser;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2513
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2514 PyObject *target;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2515 PyObject *entity;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2516
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2517 PyObject *names;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2518
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2519 PyObject *handle_start;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2520 PyObject *handle_data;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2521 PyObject *handle_end;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2522
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2523 PyObject *handle_comment;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2524 PyObject *handle_pi;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2525 PyObject *handle_doctype;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2526
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2527 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
2528
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2529 } XMLParserObject;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2530
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
2531 static PyTypeObject XMLParser_Type;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2532
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2533 #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
2534
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2535 /* helpers */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2536
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2537 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2538 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
2539 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2540 /* 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
2541 to a universal name string */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2542
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2543 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
2544 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2545 PyObject* value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2546
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2547 /* look the 'raw' name up in the names dictionary */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2548 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
2549 if (!key)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2550 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2551
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2552 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
2553
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2554 if (value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2555 Py_INCREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2556 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2557 /* 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
2558 necessary */
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 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2561 char* p;
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2562 Py_ssize_t i;
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 /* look for namespace separator */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2565 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
2566 if (string[i] == '}')
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2567 break;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2568 if (i != size) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2569 /* convert to universal name */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2570 tag = PyBytes_FromStringAndSize(NULL, size+1);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2571 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
2572 p[0] = '{';
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2573 memcpy(p+1, string, size);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2574 size++;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2575 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2576 /* 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
2577 Py_INCREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2578 tag = key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2579 }
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
2580
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2581 /* decode universal name */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
2582 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
2583 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
2584 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
2585 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
2586 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
2587 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
2588 }
36050
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 /* add to names dictionary */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2591 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
2592 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2593 Py_DECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2594 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2595 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2596 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2597
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2598 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2599 return value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2600 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2601
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2602 /* 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
2603 * 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
2604 * 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
2605 */
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2606 static void
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2607 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
2608 {
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2609 PyObject *errmsg, *error, *position, *code;
68805
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2610
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2611 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
2612 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
2613 line, column);
68805
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2614 if (errmsg == NULL)
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2615 return;
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2616
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2617 error = PyObject_CallFunction(elementtree_parseerror_obj, "O", errmsg);
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68804
diff changeset
2618 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
2619 if (!error)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2620 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2621
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2622 /* 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
2623 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
2624 if (!code) {
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2625 Py_DECREF(error);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2626 return;
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2627 }
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2628 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
2629 Py_DECREF(error);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2630 Py_DECREF(code);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2631 return;
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2632 }
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2633 Py_DECREF(code);
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2634
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2635 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
2636 if (!position) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2637 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
2638 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2639 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2640 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
2641 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
2642 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
2643 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2644 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2645 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
2646
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2647 PyErr_SetObject(elementtree_parseerror_obj, error);
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2648 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
2649 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2650
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2651 /* -------------------------------------------------------------------- */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2652 /* handlers */
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 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2655 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
2656 int data_len)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2657 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2658 PyObject* key;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2659 PyObject* value;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2660 PyObject* res;
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 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
2663 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2664
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
2665 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
2666 if (!key)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2667 return;
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 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
2670
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2671 if (value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2672 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2673 res = treebuilder_handle_data(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2674 (TreeBuilderObject*) self->target, value
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2675 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2676 else if (self->handle_data)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2677 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
2678 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2679 res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2680 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
2681 } 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
2682 /* 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
2683 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
2684 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
2685 expat_set_error(
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2686 XML_ERROR_UNDEFINED_ENTITY,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2687 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
2688 EXPAT(GetErrorColumnNumber)(self->parser),
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
2689 message
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2690 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2691 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2692
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2693 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2694 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2695
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2696 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2697 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
2698 const XML_Char **attrib_in)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2699 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2700 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2701 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2702 PyObject* attrib;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2703 int ok;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2704
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2705 /* tag name */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2706 tag = makeuniversal(self, tag_in);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2707 if (!tag)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2708 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
2709
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2710 /* attributes */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2711 if (attrib_in[0]) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2712 attrib = PyDict_New();
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2713 if (!attrib)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2714 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2715 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
2716 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
2717 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
2718 if (!key || !value) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2719 Py_XDECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2720 Py_XDECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2721 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2722 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2723 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2724 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
2725 Py_DECREF(value);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2726 Py_DECREF(key);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2727 if (ok < 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2728 Py_DECREF(attrib);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2729 return;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2730 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2731 attrib_in += 2;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2732 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2733 } else {
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
2734 /* 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
2735 attrib = PyDict_New();
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2736 if (!attrib)
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2737 return;
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2738 }
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2739
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2740 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
2741 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2742 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
2743 tag, attrib);
77246
20b8f0ee3d64 Issue #14007: implemented the 'element_factory' feature of TreeBuilder in
Eli Bendersky <eliben@gmail.com>
parents: 77226
diff changeset
2744 }
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2745 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
2746 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
2747 } else
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2748 res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2749
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2750 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2751 Py_DECREF(attrib);
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 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2754 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2755
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2756 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2757 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
2758 int data_len)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2759 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2760 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2761 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2762
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
2763 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
2764 if (!data)
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
2765 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
2766
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2767 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2768 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2769 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
2770 else if (self->handle_data)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2771 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
2772 else
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2773 res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2774
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2775 Py_DECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2776
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2777 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2778 }
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 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2781 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
2782 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2783 PyObject* tag;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2784 PyObject* res = NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2785
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2786 if (TreeBuilder_CheckExact(self->target))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2787 /* shortcut */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2788 /* 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
2789 res = treebuilder_handle_end(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2790 (TreeBuilderObject*) self->target, Py_None
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2791 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2792 else if (self->handle_end) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2793 tag = makeuniversal(self, tag_in);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2794 if (tag) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2795 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
2796 Py_DECREF(tag);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2797 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2798 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2799
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2800 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2801 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2802
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2803 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2804 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
2805 const XML_Char *uri)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2806 {
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2807 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
2808 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
2809
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2810 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
2811 if (!suri)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2812 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2813
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2814 if (prefix)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2815 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
2816 else
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2817 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
2818 if (!sprefix) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2819 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
2820 return;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2821 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2822
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2823 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
2824 (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
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
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2827 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
2828 Py_DECREF(suri);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2829 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2830
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2831 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2832 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
2833 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2834 treebuilder_handle_namespace(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2835 (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
2836 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2837 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2838
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2839 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2840 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
2841 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2842 PyObject* comment;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2843 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2844
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2845 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
2846 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
2847 if (comment) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2848 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
2849 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2850 Py_DECREF(comment);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2851 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2852 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2853 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2854
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2855 static void
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2856 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
2857 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
2858 const XML_Char *sysid,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2859 const XML_Char *pubid,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2860 int has_internal_subset)
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2861 {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2862 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
2863 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
2864 PyObject *parser_doctype = NULL;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2865 PyObject *res = NULL;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2866
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2867 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
2868 if (!doctype_name_obj)
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2869 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2870
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2871 if (sysid) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2872 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
2873 if (!sysid_obj) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2874 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
2875 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2876 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2877 } else {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2878 Py_INCREF(Py_None);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2879 sysid_obj = Py_None;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2880 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2881
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2882 if (pubid) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2883 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
2884 if (!pubid_obj) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2885 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
2886 Py_DECREF(sysid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2887 return;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2888 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2889 } else {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2890 Py_INCREF(Py_None);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2891 pubid_obj = Py_None;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2892 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2893
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2894 /* 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
2895 if (self->handle_doctype) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2896 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
2897 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
2898 Py_CLEAR(res);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2899 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2900
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2901 /* 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
2902 * 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
2903 * (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
2904 */
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2905 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
2906 if (parser_doctype) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2907 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
2908 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
2909 "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
2910 " 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
2911 1) < 0) {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2912 goto clear;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2913 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2914 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
2915 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
2916 Py_CLEAR(res);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2917 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2918 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2919
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2920 clear:
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2921 Py_XDECREF(parser_doctype);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2922 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
2923 Py_DECREF(pubid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2924 Py_DECREF(sysid_obj);
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2925 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
2926
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2927 static void
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2928 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
2929 const XML_Char* data_in)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2930 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2931 PyObject* target;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2932 PyObject* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2933 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2934
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2935 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
2936 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
2937 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
2938 if (target && data) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2939 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
2940 Py_XDECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2941 Py_DECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2942 Py_DECREF(target);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2943 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2944 Py_XDECREF(data);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2945 Py_XDECREF(target);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2946 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2947 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2948 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2949
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2950 static int
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2951 expat_unknown_encoding_handler(XMLParserObject *self, const XML_Char *name,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2952 XML_Encoding *info)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2953 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2954 PyObject* u;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2955 unsigned char s[256];
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2956 int i;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2957 void *data;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2958 unsigned int kind;
36050
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 memset(info, 0, sizeof(XML_Encoding));
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2961
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2962 for (i = 0; i < 256; i++)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2963 s[i] = i;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
2964
36117
7d6ab9f39996 SF#1389809
Fredrik Lundh <fredrik@pythonware.com>
parents: 36083
diff changeset
2965 u = PyUnicode_Decode((char*) s, 256, name, "replace");
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2966 if (!u)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2967 return XML_STATUS_ERROR;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2968 if (PyUnicode_READY(u))
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2969 return XML_STATUS_ERROR;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2970
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2971 if (PyUnicode_GET_LENGTH(u) != 256) {
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2972 Py_DECREF(u);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2973 return XML_STATUS_ERROR;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2974 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2975
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2976 kind = PyUnicode_KIND(u);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2977 data = PyUnicode_DATA(u);
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2978 for (i = 0; i < 256; i++) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2979 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2980 if (ch != Py_UNICODE_REPLACEMENT_CHARACTER)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
2981 info->map[i] = ch;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2982 else
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
2983 info->map[i] = -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2984 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2985
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2986 Py_DECREF(u);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2987
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2988 return XML_STATUS_OK;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2989 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2990
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2991 /* -------------------------------------------------------------------- */
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
2992
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
2993 static PyObject *
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
2994 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
2995 {
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
2996 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
2997 if (self) {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
2998 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
2999 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
3000 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
3001 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
3002 self->handle_doctype = NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3003 }
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3004 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
3005 }
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3006
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3007 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3008 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
3009 {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3010 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
3011 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
3012 char *encoding = NULL;
77313
eb1d633fe307 Fix unterminated keyword array passed to PyArg_ParseTupleAndKeywords
Eli Bendersky <eliben@gmail.com>
parents: 77279
diff changeset
3013 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
3014
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3015 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
3016 &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
3017 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3018 }
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3019
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3020 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
3021 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
3022 return -1;
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3023
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3024 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
3025 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
3026 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
3027 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3028 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3029
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3030 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
3031 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
3032 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
3033 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
3034 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
3035 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3036 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3037
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3038 if (target) {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3039 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
3040 } else {
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
3041 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
3042 if (!target) {
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3043 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
3044 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
3045 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
3046 return -1;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3047 }
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3048 }
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3049 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
3050
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3051 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
3052 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
3053 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
3054 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
3055 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
3056 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
3057 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
3058
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3059 PyErr_Clear();
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3060
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3061 /* 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
3062 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
3063 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
3064 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3065 (XML_StartElementHandler) expat_start_handler,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3066 (XML_EndElementHandler) expat_end_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3067 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3068 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
3069 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3070 (XML_DefaultHandler) expat_default_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3071 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3072 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
3073 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3074 (XML_CharacterDataHandler) expat_data_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3075 );
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3076 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
3077 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
3078 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3079 (XML_CommentHandler) expat_comment_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3080 );
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3081 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
3082 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
3083 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3084 (XML_ProcessingInstructionHandler) expat_pi_handler
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3085 );
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3086 EXPAT(SetStartDoctypeDeclHandler)(
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3087 self_xp->parser,
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3088 (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
3089 );
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3090 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
3091 self_xp->parser,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3092 (XML_UnknownEncodingHandler) expat_unknown_encoding_handler, NULL
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
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3095 return 0;
36050
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
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3098 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3099 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
3100 {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3101 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
3102 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
3103 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
3104 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
3105 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
3106 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
3107
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3108 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
3109 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
3110 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
3111
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3112 return 0;
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3113 }
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3114
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3115 static int
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3116 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
3117 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3118 EXPAT(ParserFree)(self->parser);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3119
79385
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3120 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
3121 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
3122 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
3123 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
3124 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
3125 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
3126 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
3127
f9224f23f473 Sanitize and modernize some of the _elementtree code (see issue #16089).
Antoine Pitrou <solipsis@pitrou.net>
parents: 79065
diff changeset
3128 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
3129 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
3130 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
3131
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3132 return 0;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3133 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3134
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3135 static void
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3136 xmlparser_dealloc(XMLParserObject* self)
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3137 {
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3138 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
3139 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
3140 Py_TYPE(self)->tp_free((PyObject *)self);
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3141 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3142
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3143 LOCAL(PyObject*)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3144 expat_parse(XMLParserObject* self, char* data, int data_len, int final)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3145 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3146 int ok;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3147
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3148 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
3149
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3150 if (PyErr_Occurred())
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3151 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3152
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3153 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
3154 expat_set_error(
75722
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
3155 EXPAT(GetErrorCode)(self->parser),
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3156 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
3157 EXPAT(GetErrorColumnNumber)(self->parser),
b76fa310e73d Issue #14207: the ParseError exception raised by _elementtree was made
Eli Bendersky <eliben@gmail.com>
parents: 75721
diff changeset
3158 NULL
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3159 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3160 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3161 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3162
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3163 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3164 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3165
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3166 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3167 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
3168 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3169 /* end feeding data to parser */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3170
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3171 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3172 if (!PyArg_ParseTuple(args, ":close"))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3173 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3174
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3175 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
3176 if (!res)
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3177 return NULL;
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3178
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3179 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
3180 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3181 return treebuilder_done((TreeBuilderObject*) self->target);
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3182 } if (self->handle_close) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3183 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
3184 return PyObject_CallFunction(self->handle_close, "");
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3185 } else
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3186 return res;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3187 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3188
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3189 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3190 xmlparser_feed(XMLParserObject* self, PyObject* args)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3191 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3192 /* feed data to parser */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3193
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3194 char* data;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3195 int data_len;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3196 if (!PyArg_ParseTuple(args, "s#:feed", &data, &data_len))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3197 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3198
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3199 return expat_parse(self, data, data_len, 0);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3200 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3201
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3202 static PyObject*
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3203 xmlparser_parse(XMLParserObject* self, PyObject* args)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3204 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3205 /* (internal) parse until end of input stream */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3206
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3207 PyObject* reader;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3208 PyObject* buffer;
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3209 PyObject* temp;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3210 PyObject* res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3211
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3212 PyObject* fileobj;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3213 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
3214 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3215
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3216 reader = PyObject_GetAttrString(fileobj, "read");
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3217 if (!reader)
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3218 return NULL;
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3219
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3220 /* read from open file object */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3221 for (;;) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3222
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3223 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
3224
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3225 if (!buffer) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3226 /* 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
3227 Py_DECREF(reader);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3228 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3229 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3230
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3231 if (PyUnicode_CheckExact(buffer)) {
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3232 /* A unicode object is encoded into bytes using UTF-8 */
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3233 if (PyUnicode_GET_SIZE(buffer) == 0) {
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3234 Py_DECREF(buffer);
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3235 break;
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3236 }
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3237 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
3238 Py_DECREF(buffer);
75721
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3239 if (!temp) {
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3240 /* 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
3241 Py_DECREF(reader);
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3242 return NULL;
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3243 }
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3244 buffer = temp;
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3245 }
7bdf5c96fdc0 Closes Issue #14246: _elementtree parser will now handle io.StringIO
Eli Bendersky <eliben@gmail.com>
parents: 75505
diff changeset
3246 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
3247 Py_DECREF(buffer);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3248 break;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3249 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3250
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3251 res = expat_parse(
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 44742
diff changeset
3252 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
3253 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3254
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3255 Py_DECREF(buffer);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3256
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3257 if (!res) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3258 Py_DECREF(reader);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3259 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3260 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3261 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3262
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3263 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3264
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3265 Py_DECREF(reader);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3266
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3267 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
3268
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3269 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
3270 Py_DECREF(res);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3271 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
3272 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3273
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3274 return res;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3275 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3276
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3277 static PyObject*
77279
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3278 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
3279 {
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3280 Py_RETURN_NONE;
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3281 }
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3282
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3283 static PyObject*
6f9bfcc1896f Issue #14007: implement doctype() method calling in XMLParser of _elementtree.
Eli Bendersky <eliben@gmail.com>
parents: 77278
diff changeset
3284 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
3285 {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3286 /* activate element event reporting */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3287
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
3288 Py_ssize_t i;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3289 TreeBuilderObject* target;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3290
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3291 PyObject* events; /* event collector */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3292 PyObject* event_set = Py_None;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3293 if (!PyArg_ParseTuple(args, "O!|O:_setevents", &PyList_Type, &events,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3294 &event_set))
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3295 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3296
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3297 if (!TreeBuilder_CheckExact(self->target)) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3298 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3299 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
3300 "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
3301 "targets"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3302 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3303 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3304 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3305
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3306 target = (TreeBuilderObject*) self->target;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3307
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3308 Py_INCREF(events);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3309 Py_XDECREF(target->events);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3310 target->events = events;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3311
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3312 /* 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
3313 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
3314 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
3315 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
3316 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
3317
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3318 if (event_set == Py_None) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3319 /* 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
3320 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
3321 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3322 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3323
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3324 if (!PyTuple_Check(event_set)) /* FIXME: handle arbitrary sequences */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3325 goto error;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3326
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3327 for (i = 0; i < PyTuple_GET_SIZE(event_set); i++) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3328 PyObject* item = PyTuple_GET_ITEM(event_set, i);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3329 char* event;
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3330 if (PyUnicode_Check(item)) {
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3331 event = _PyUnicode_AsString(item);
59893
2d6178480cc7 Fix a crash in _elementtree related to lone unicode surrogates.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 59601
diff changeset
3332 if (event == NULL)
2d6178480cc7 Fix a crash in _elementtree related to lone unicode surrogates.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 59601
diff changeset
3333 goto error;
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3334 } else if (PyBytes_Check(item))
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3335 event = PyBytes_AS_STRING(item);
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3336 else {
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3337 goto error;
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3338 }
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3339 if (strcmp(event, "start") == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3340 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3341 target->start_event_obj = item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3342 } else if (strcmp(event, "end") == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3343 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3344 Py_XDECREF(target->end_event_obj);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3345 target->end_event_obj = item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3346 } else if (strcmp(event, "start-ns") == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3347 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3348 Py_XDECREF(target->start_ns_event_obj);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3349 target->start_ns_event_obj = item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3350 EXPAT(SetNamespaceDeclHandler)(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3351 self->parser,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3352 (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
3353 (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
3354 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3355 } else if (strcmp(event, "end-ns") == 0) {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3356 Py_INCREF(item);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3357 Py_XDECREF(target->end_ns_event_obj);
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3358 target->end_ns_event_obj = item;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3359 EXPAT(SetNamespaceDeclHandler)(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3360 self->parser,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3361 (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
3362 (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
3363 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3364 } else {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3365 PyErr_Format(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3366 PyExc_ValueError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3367 "unknown event '%s'", event
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3368 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3369 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3370 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3371 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3372
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3373 Py_RETURN_NONE;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3374
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3375 error:
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3376 PyErr_SetString(
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3377 PyExc_TypeError,
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3378 "invalid event tuple"
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3379 );
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3380 return NULL;
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3381 }
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 static PyMethodDef xmlparser_methods[] = {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3384 {"feed", (PyCFunction) xmlparser_feed, METH_VARARGS},
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3385 {"close", (PyCFunction) xmlparser_close, METH_VARARGS},
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3386 {"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS},
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3387 {"_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
3388 {"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
3389 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3390 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3391
68804
d0fe7489c4cc _elementtree.c: remove trailing spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66799
diff changeset
3392 static PyObject*
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3393 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
3394 {
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3395 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
3396 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
3397 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
3398 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
3399 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
3400 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
3401 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
3402 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
3403 "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
3404 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
3405 }
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3406 else
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3407 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
3408
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3409 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
3410 return res;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3411 }
66799
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3412 generic:
50d170bb71c7 Issue #6697: Fixed instances of _PyUnicode_AsString() result not checked for NULL
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66664
diff changeset
3413 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
3414 }
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3415
37144
91dd4d44d3bc Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents: 36954
diff changeset
3416 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
3417 PyVarObject_HEAD_INIT(NULL, 0)
e70cdce0e8b2 Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41782
diff changeset
3418 "XMLParser", sizeof(XMLParserObject), 0,
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3419 /* methods */
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3420 (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
3421 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
3422 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
3423 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
3424 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
3425 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
3426 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
3427 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
3428 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
3429 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
3430 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
3431 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
3432 (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
3433 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
3434 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
3435 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
3436 /* tp_flags */
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3437 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
3438 (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
3439 (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
3440 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
3441 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
3442 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
3443 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
3444 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
3445 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
3446 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
3447 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
3448 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
3449 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
3450 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
3451 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
3452 (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
3453 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
3454 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
3455 0, /* tp_free */
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3456 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3457
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3458 #endif
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3459
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3460 /* ==================================================================== */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3461 /* python module interface */
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3462
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3463 static PyMethodDef _functions[] = {
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3464 {"SubElement", (PyCFunction) subelement, METH_VARARGS|METH_KEYWORDS},
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3465 {NULL, NULL}
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3466 };
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3467
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3468
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3469 static struct PyModuleDef _elementtreemodule = {
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
3470 PyModuleDef_HEAD_INIT,
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
3471 "_elementtree",
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
3472 NULL,
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
3473 -1,
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
3474 _functions,
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
3475 NULL,
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
3476 NULL,
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
3477 NULL,
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
3478 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3479 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3480
40528
bce7e4a926a9 Cruft removal:
Neal Norwitz <nnorwitz@gmail.com>
parents: 39610
diff changeset
3481 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
3482 PyInit__elementtree(void)
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3483 {
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
3484 PyObject *m, *temp;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3485
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3486 /* Initialize object types */
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3487 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
3488 return NULL;
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3489 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
3490 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3491 #if defined(USE_EXPAT)
48414
4025f638911f #3247: Get rid of Py_FindMethod:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
3492 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
3493 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3494 #endif
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3495
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3496 m = PyModule_Create(&_elementtreemodule);
36954
db5e720b0cef merged with cElementTree development trunk (1.0.6 snapshot):
Fredrik Lundh <fredrik@pythonware.com>
parents: 36684
diff changeset
3497 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
3498 return NULL;
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3499
76110
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3500 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
3501 return NULL;
76110
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3502 elementtree_deepcopy_obj = PyObject_GetAttrString(temp, "deepcopy");
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3503 Py_XDECREF(temp);
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3504
1ddf58262706 Replace bootstrap imports with real C API calls.
Eli Bendersky <eliben@gmail.com>
parents: 76101
diff changeset
3505 if (!(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
3506 return NULL;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3507
77278
cf9c379a9859 We're always building _elementtree with USE_PYEXPAT_CAPI, so the #ifdefs in
Eli Bendersky <eliben@gmail.com>
parents: 77275
diff changeset
3508 /* 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
3509 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
3510 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
3511 /* 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
3512 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
3513 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
3514 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
3515 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
3516 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
3517 PyErr_SetString(PyExc_ImportError,
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3518 "pyexpat version is incompatible");
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3519 return NULL;
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3520 }
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3521 } else {
c8534d55c5e6 Raise ImportError if pyexpat's version is incompatible
Eli Bendersky <eliben@gmail.com>
parents: 78152
diff changeset
3522 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
3523 }
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3524
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3525 elementtree_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
3526 "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
3527 );
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3528 Py_INCREF(elementtree_parseerror_obj);
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3529 PyModule_AddObject(m, "ParseError", elementtree_parseerror_obj);
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 53816
diff changeset
3530
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
3531 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
3532 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
3533
77226
717632ae7b3f Issue #14007: make TreeBuilder an actual type exposed from _elementtree, and subclassable.
Eli Bendersky <eliben@gmail.com>
parents: 77217
diff changeset
3534 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
3535 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
3536
77275
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3537 #if defined(USE_EXPAT)
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3538 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
3539 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
3540 #endif
a29ae1c2b8b2 Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups
Eli Bendersky <eliben@gmail.com>
parents: 77246
diff changeset
3541
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
3542 return m;
36050
6586cd9920e7 updating to cElementTree 1.0.5 (step 2 of 3)
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3543 }