Mercurial > hg
annotate mercurial/dirs.c @ 23717:d8663e6153c1
namespaces: use namespace object instead of dictionary
This isn't as bad as the diff seems, it only looks like scary. In this patch,
we use the 'namespace' object instead of accessing keys in a dictionary.
This required the 'templatename' and 'names' method to change their
implementation. Later, we will remove these functions entirely due to a better
api.
author | Sean Farley <sean.michael.farley@gmail.com> |
---|---|
date | Fri, 19 Dec 2014 17:27:20 -0800 |
parents | e250b8300e6e |
children | bca4b6f126f2 |
rev | line source |
---|---|
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
1 /* |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
2 dirs.c - dynamic directory diddling for dirstates |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
3 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
4 Copyright 2013 Facebook |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
5 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
6 This software may be used and distributed according to the terms of |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
7 the GNU General Public License, incorporated herein by reference. |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
8 */ |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
9 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
10 #define PY_SSIZE_T_CLEAN |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
11 #include <Python.h> |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
12 #include "util.h" |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
13 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
14 /* |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
15 * This is a multiset of directory names, built from the files that |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
16 * appear in a dirstate or manifest. |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
17 * |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
18 * A few implementation notes: |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
19 * |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
20 * We modify Python integers for refcounting, but those integers are |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
21 * never visible to Python code. |
18902
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
22 * |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
23 * We mutate strings in-place, but leave them immutable once they can |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
24 * be seen by Python code. |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
25 */ |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
26 typedef struct { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
27 PyObject_HEAD |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
28 PyObject *dict; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
29 } dirsObject; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
30 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
31 static inline Py_ssize_t _finddir(PyObject *path, Py_ssize_t pos) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
32 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
33 const char *s = PyString_AS_STRING(path); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
34 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
35 while (pos != -1) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
36 if (s[pos] == '/') |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
37 break; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
38 pos -= 1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
39 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
40 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
41 return pos; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
42 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
43 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
44 static int _addpath(PyObject *dirs, PyObject *path) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
45 { |
18902
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
46 const char *cpath = PyString_AS_STRING(path); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
47 Py_ssize_t pos = PyString_GET_SIZE(path); |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
48 PyObject *key = NULL; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
49 int ret = -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
50 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
51 while ((pos = _finddir(path, pos - 1)) != -1) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
52 PyObject *val; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
53 |
18902
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
54 /* It's likely that every prefix already has an entry |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
55 in our dict. Try to avoid allocating and |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
56 deallocating a string for each prefix we check. */ |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
57 if (key != NULL) |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
58 ((PyStringObject *)key)->ob_shash = -1; |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
59 else { |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
60 /* Force Python to not reuse a small shared string. */ |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
61 key = PyString_FromStringAndSize(cpath, |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
62 pos < 2 ? 2 : pos); |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
63 if (key == NULL) |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
64 goto bail; |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
65 } |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
66 PyString_GET_SIZE(key) = pos; |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
67 PyString_AS_STRING(key)[pos] = '\0'; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
68 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
69 val = PyDict_GetItem(dirs, key); |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
70 if (val != NULL) { |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
71 PyInt_AS_LONG(val) += 1; |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
72 continue; |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
73 } |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
74 |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
75 /* Force Python to not reuse a small shared int. */ |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
76 val = PyInt_FromLong(0x1eadbeef); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
77 |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
78 if (val == NULL) |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
79 goto bail; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
80 |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
81 PyInt_AS_LONG(val) = 1; |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
82 ret = PyDict_SetItem(dirs, key, val); |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
83 Py_DECREF(val); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
84 if (ret == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
85 goto bail; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
86 Py_CLEAR(key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
87 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
88 ret = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
89 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
90 bail: |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
91 Py_XDECREF(key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
92 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
93 return ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
94 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
95 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
96 static int _delpath(PyObject *dirs, PyObject *path) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
97 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
98 Py_ssize_t pos = PyString_GET_SIZE(path); |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
99 PyObject *key = NULL; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
100 int ret = -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
101 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
102 while ((pos = _finddir(path, pos - 1)) != -1) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
103 PyObject *val; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
104 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
105 key = PyString_FromStringAndSize(PyString_AS_STRING(path), pos); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
106 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
107 if (key == NULL) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
108 goto bail; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
109 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
110 val = PyDict_GetItem(dirs, key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
111 if (val == NULL) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
112 PyErr_SetString(PyExc_ValueError, |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
113 "expected a value, found none"); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
114 goto bail; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
115 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
116 |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
117 if (--PyInt_AS_LONG(val) <= 0 && |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
118 PyDict_DelItem(dirs, key) == -1) |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
119 goto bail; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
120 Py_CLEAR(key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
121 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
122 ret = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
123 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
124 bail: |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
125 Py_XDECREF(key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
126 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
127 return ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
128 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
129 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
130 static int dirs_fromdict(PyObject *dirs, PyObject *source, char skipchar) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
131 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
132 PyObject *key, *value; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
133 Py_ssize_t pos = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
134 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
135 while (PyDict_Next(source, &pos, &key, &value)) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
136 if (!PyString_Check(key)) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
137 PyErr_SetString(PyExc_TypeError, "expected string key"); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
138 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
139 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
140 if (skipchar) { |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
18902
diff
changeset
|
141 if (!dirstate_tuple_check(value)) { |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
142 PyErr_SetString(PyExc_TypeError, |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
18902
diff
changeset
|
143 "expected a dirstate tuple"); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
144 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
145 } |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
18902
diff
changeset
|
146 if (((dirstateTupleObject *)value)->state == skipchar) |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
147 continue; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
148 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
149 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
150 if (_addpath(dirs, key) == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
151 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
152 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
153 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
154 return 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
155 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
156 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
157 static int dirs_fromiter(PyObject *dirs, PyObject *source) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
158 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
159 PyObject *iter, *item = NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
160 int ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
161 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
162 iter = PyObject_GetIter(source); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
163 if (iter == NULL) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
164 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
165 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
166 while ((item = PyIter_Next(iter)) != NULL) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
167 if (!PyString_Check(item)) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
168 PyErr_SetString(PyExc_TypeError, "expected string"); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
169 break; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
170 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
171 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
172 if (_addpath(dirs, item) == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
173 break; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
174 Py_CLEAR(item); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
175 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
176 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
177 ret = PyErr_Occurred() ? -1 : 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
178 Py_XDECREF(item); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
179 return ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
180 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
181 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
182 /* |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
183 * Calculate a refcounted set of directory names for the files in a |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
184 * dirstate. |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
185 */ |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
186 static int dirs_init(dirsObject *self, PyObject *args) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
187 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
188 PyObject *dirs = NULL, *source = NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
189 char skipchar = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
190 int ret = -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
191 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
192 self->dict = NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
193 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
194 if (!PyArg_ParseTuple(args, "|Oc:__init__", &source, &skipchar)) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
195 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
196 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
197 dirs = PyDict_New(); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
198 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
199 if (dirs == NULL) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
200 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
201 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
202 if (source == NULL) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
203 ret = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
204 else if (PyDict_Check(source)) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
205 ret = dirs_fromdict(dirs, source, skipchar); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
206 else if (skipchar) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
207 PyErr_SetString(PyExc_ValueError, |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
208 "skip character is only supported " |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
209 "with a dict source"); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
210 else |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
211 ret = dirs_fromiter(dirs, source); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
212 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
213 if (ret == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
214 Py_XDECREF(dirs); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
215 else |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
216 self->dict = dirs; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
217 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
218 return ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
219 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
220 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
221 PyObject *dirs_addpath(dirsObject *self, PyObject *args) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
222 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
223 PyObject *path; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
224 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
225 if (!PyArg_ParseTuple(args, "O!:addpath", &PyString_Type, &path)) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
226 return NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
227 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
228 if (_addpath(self->dict, path) == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
229 return NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
230 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
231 Py_RETURN_NONE; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
232 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
233 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
234 static PyObject *dirs_delpath(dirsObject *self, PyObject *args) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
235 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
236 PyObject *path; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
237 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
238 if (!PyArg_ParseTuple(args, "O!:delpath", &PyString_Type, &path)) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
239 return NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
240 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
241 if (_delpath(self->dict, path) == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
242 return NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
243 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
244 Py_RETURN_NONE; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
245 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
246 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
247 static int dirs_contains(dirsObject *self, PyObject *value) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
248 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
249 return PyString_Check(value) ? PyDict_Contains(self->dict, value) : 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
250 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
251 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
252 static void dirs_dealloc(dirsObject *self) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
253 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
254 Py_XDECREF(self->dict); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
255 PyObject_Del(self); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
256 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
257 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
258 static PyObject *dirs_iter(dirsObject *self) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
259 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
260 return PyObject_GetIter(self->dict); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
261 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
262 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
263 static PySequenceMethods dirs_sequence_methods; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
264 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
265 static PyMethodDef dirs_methods[] = { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
266 {"addpath", (PyCFunction)dirs_addpath, METH_VARARGS, "add a path"}, |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
267 {"delpath", (PyCFunction)dirs_delpath, METH_VARARGS, "remove a path"}, |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
268 {NULL} /* Sentinel */ |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
269 }; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
270 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
271 static PyTypeObject dirsType = { PyObject_HEAD_INIT(NULL) }; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
272 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
273 void dirs_module_init(PyObject *mod) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
274 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
275 dirs_sequence_methods.sq_contains = (objobjproc)dirs_contains; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
276 dirsType.tp_name = "parsers.dirs"; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
277 dirsType.tp_new = PyType_GenericNew; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
278 dirsType.tp_basicsize = sizeof(dirsObject); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
279 dirsType.tp_dealloc = (destructor)dirs_dealloc; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
280 dirsType.tp_as_sequence = &dirs_sequence_methods; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
281 dirsType.tp_flags = Py_TPFLAGS_DEFAULT; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
282 dirsType.tp_doc = "dirs"; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
283 dirsType.tp_iter = (getiterfunc)dirs_iter; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
284 dirsType.tp_methods = dirs_methods; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
285 dirsType.tp_init = (initproc)dirs_init; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
286 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
287 if (PyType_Ready(&dirsType) < 0) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
288 return; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
289 Py_INCREF(&dirsType); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
290 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
291 PyModule_AddObject(mod, "dirs", (PyObject *)&dirsType); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
292 } |