ยปCore Development>Code coverage>Mac/Modules/res/ressupport.py

Python code coverage for Mac/Modules/res/ressupport.py

#countcontent
1n/a# This script will generate the Resources interface for Python.
2n/a# It uses the "bgen" package to generate C code.
3n/a# It execs the file resgen.py which contain the function definitions
4n/a# (resgen.py was generated by resscan.py, scanning the <Resources.h> header file).
5n/a
6n/afrom macsupport import *
7n/a
8n/aclass ResMixIn:
9n/a
10n/a def checkit(self):
11n/a if self.returntype.__class__ != OSErrType:
12n/a OutLbrace()
13n/a Output("OSErr _err = ResError();")
14n/a Output("if (_err != noErr) return PyMac_Error(_err);")
15n/a OutRbrace()
16n/a FunctionGenerator.checkit(self) # XXX
17n/a
18n/aclass ResFunction(ResMixIn, OSErrWeakLinkFunctionGenerator): pass
19n/aclass ResMethod(ResMixIn, OSErrWeakLinkMethodGenerator): pass
20n/a
21n/aRsrcChainLocation = Type("RsrcChainLocation", "h")
22n/aFSCatalogInfoBitmap = FakeType("0") # Type("FSCatalogInfoBitmap", "l")
23n/aFSCatalogInfo_ptr = FakeType("(FSCatalogInfo *)0")
24n/a
25n/a# includestuff etc. are imported from macsupport
26n/a
27n/aincludestuff = includestuff + """
28n/a#include <Carbon/Carbon.h>
29n/a
30n/a#ifdef USE_TOOLBOX_OBJECT_GLUE
31n/aextern PyObject *_ResObj_New(Handle);
32n/aextern int _ResObj_Convert(PyObject *, Handle *);
33n/aextern PyObject *_OptResObj_New(Handle);
34n/aextern int _OptResObj_Convert(PyObject *, Handle *);
35n/a#define ResObj_New _ResObj_New
36n/a#define ResObj_Convert _ResObj_Convert
37n/a#define OptResObj_New _OptResObj_New
38n/a#define OptResObj_Convert _OptResObj_Convert
39n/a#endif
40n/a
41n/a/* Function to dispose a resource, with a "normal" calling sequence */
42n/astatic void
43n/aPyMac_AutoDisposeHandle(Handle h)
44n/a{
45n/a DisposeHandle(h);
46n/a}
47n/a"""
48n/a
49n/afinalstuff = finalstuff + """
50n/a
51n/a/* Alternative version of ResObj_New, which returns None for null argument */
52n/aPyObject *OptResObj_New(Handle itself)
53n/a{
54n/a if (itself == NULL) {
55n/a Py_INCREF(Py_None);
56n/a return Py_None;
57n/a }
58n/a return ResObj_New(itself);
59n/a}
60n/a
61n/aint OptResObj_Convert(PyObject *v, Handle *p_itself)
62n/a{
63n/a PyObject *tmp;
64n/a
65n/a if ( v == Py_None ) {
66n/a *p_itself = NULL;
67n/a return 1;
68n/a }
69n/a if (ResObj_Check(v))
70n/a {
71n/a *p_itself = ((ResourceObject *)v)->ob_itself;
72n/a return 1;
73n/a }
74n/a /* If it isn't a resource yet see whether it is convertible */
75n/a if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) ) {
76n/a *p_itself = ((ResourceObject *)tmp)->ob_itself;
77n/a Py_DECREF(tmp);
78n/a return 1;
79n/a }
80n/a PyErr_Clear();
81n/a PyErr_SetString(PyExc_TypeError, "Resource required");
82n/a return 0;
83n/a}
84n/a"""
85n/a
86n/ainitstuff = initstuff + """
87n/a PyMac_INIT_TOOLBOX_OBJECT_NEW(Handle, ResObj_New);
88n/a PyMac_INIT_TOOLBOX_OBJECT_CONVERT(Handle, ResObj_Convert);
89n/a PyMac_INIT_TOOLBOX_OBJECT_NEW(Handle, OptResObj_New);
90n/a PyMac_INIT_TOOLBOX_OBJECT_CONVERT(Handle, OptResObj_Convert);
91n/a"""
92n/a
93n/amodule = MacModule('_Res', 'Res', includestuff, finalstuff, initstuff)
94n/a
95n/aclass ResDefinition(PEP253Mixin, GlobalObjectDefinition):
96n/a getsetlist = [
97n/a ('data',
98n/a """
99n/a PyObject *res;
100n/a char state;
101n/a
102n/a state = HGetState(self->ob_itself);
103n/a HLock(self->ob_itself);
104n/a res = PyString_FromStringAndSize(
105n/a *self->ob_itself,
106n/a GetHandleSize(self->ob_itself));
107n/a HUnlock(self->ob_itself);
108n/a HSetState(self->ob_itself, state);
109n/a return res;
110n/a """,
111n/a """
112n/a char *data;
113n/a long size;
114n/a
115n/a if ( v == NULL )
116n/a return -1;
117n/a if ( !PyString_Check(v) )
118n/a return -1;
119n/a size = PyString_Size(v);
120n/a data = PyString_AsString(v);
121n/a /* XXXX Do I need the GetState/SetState calls? */
122n/a SetHandleSize(self->ob_itself, size);
123n/a if ( MemError())
124n/a return -1;
125n/a HLock(self->ob_itself);
126n/a memcpy((char *)*self->ob_itself, data, size);
127n/a HUnlock(self->ob_itself);
128n/a /* XXXX Should I do the Changed call immedeately? */
129n/a return 0;
130n/a """,
131n/a 'The resource data'
132n/a ), (
133n/a 'size',
134n/a 'return PyInt_FromLong(GetHandleSize(self->ob_itself));',
135n/a None,
136n/a 'The length of the resource data'
137n/a )]
138n/a
139n/a def outputCheckNewArg(self):
140n/a Output("if (itself == NULL) return PyMac_Error(resNotFound);")
141n/a
142n/a def outputCheckConvertArg(self):
143n/a # if it isn't a resource we may be able to coerce it
144n/a Output("if (!%s_Check(v))", self.prefix)
145n/a OutLbrace()
146n/a Output("PyObject *tmp;")
147n/a Output('if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) )')
148n/a OutLbrace()
149n/a Output("*p_itself = ((ResourceObject *)tmp)->ob_itself;")
150n/a Output("Py_DECREF(tmp);")
151n/a Output("return 1;")
152n/a OutRbrace()
153n/a Output("PyErr_Clear();")
154n/a OutRbrace()
155n/a
156n/a def outputStructMembers(self):
157n/a GlobalObjectDefinition.outputStructMembers(self)
158n/a Output("void (*ob_freeit)(%s ptr);", self.itselftype)
159n/a
160n/a def outputInitStructMembers(self):
161n/a GlobalObjectDefinition.outputInitStructMembers(self)
162n/a Output("it->ob_freeit = NULL;")
163n/a
164n/a def outputCleanupStructMembers(self):
165n/a Output("if (self->ob_freeit && self->ob_itself)")
166n/a OutLbrace()
167n/a Output("self->ob_freeit(self->ob_itself);")
168n/a OutRbrace()
169n/a Output("self->ob_itself = NULL;")
170n/a
171n/a def output_tp_newBody(self):
172n/a Output("PyObject *self;")
173n/a Output
174n/a Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
175n/a Output("((%s *)self)->ob_itself = NULL;", self.objecttype)
176n/a Output("((%s *)self)->ob_freeit = NULL;", self.objecttype)
177n/a Output("return self;")
178n/a
179n/a def output_tp_initBody(self):
180n/a Output("char *srcdata = NULL;")
181n/a Output("int srclen = 0;")
182n/a Output("%s itself;", self.itselftype);
183n/a Output("char *kw[] = {\"itself\", 0};")
184n/a Output()
185n/a Output("if (PyArg_ParseTupleAndKeywords(_args, _kwds, \"O&\", kw, %s_Convert, &itself))",
186n/a self.prefix);
187n/a OutLbrace()
188n/a Output("((%s *)_self)->ob_itself = itself;", self.objecttype)
189n/a Output("return 0;")
190n/a OutRbrace()
191n/a Output("PyErr_Clear();")
192n/a Output("if (!PyArg_ParseTupleAndKeywords(_args, _kwds, \"|s#\", kw, &srcdata, &srclen)) return -1;")
193n/a Output("if ((itself = NewHandle(srclen)) == NULL)")
194n/a OutLbrace()
195n/a Output("PyErr_NoMemory();")
196n/a Output("return 0;")
197n/a OutRbrace()
198n/a Output("((%s *)_self)->ob_itself = itself;", self.objecttype)
199n/a# XXXX Output("((%s *)self)->ob_freeit = PyMac_AutoDisposeHandle;")
200n/a Output("if (srclen && srcdata)")
201n/a OutLbrace()
202n/a Output("HLock(itself);")
203n/a Output("memcpy(*itself, srcdata, srclen);")
204n/a Output("HUnlock(itself);")
205n/a OutRbrace()
206n/a Output("return 0;")
207n/a
208n/aresobject = ResDefinition('Resource', 'ResObj', 'Handle')
209n/amodule.addobject(resobject)
210n/a
211n/afunctions = []
212n/aresmethods = []
213n/a
214n/aexecfile('resgen.py')
215n/aexecfile('resedit.py')
216n/a
217n/afor f in functions: module.add(f)
218n/afor f in resmethods: resobject.add(f)
219n/a
220n/aSetOutputFileName('_Resmodule.c')
221n/amodule.generate()