mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Fixed so the Res.Resource() accepts either another resource, a string
or no argument (giving an empty resource).
This commit is contained in:
parent
dd888a6cff
commit
5f61a05d7f
3 changed files with 129 additions and 66 deletions
|
@ -612,6 +612,48 @@ static PyGetSetDef ResObj_getsetlist[] = {
|
||||||
#define ResObj_repr NULL
|
#define ResObj_repr NULL
|
||||||
|
|
||||||
#define ResObj_hash NULL
|
#define ResObj_hash NULL
|
||||||
|
static int ResObj_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
|
||||||
|
{
|
||||||
|
char *srcdata = NULL;
|
||||||
|
int srclen = 0;
|
||||||
|
Handle itself;
|
||||||
|
char *kw[] = {"itself", 0};
|
||||||
|
|
||||||
|
if (PyArg_ParseTupleAndKeywords(args, kwds, "O&", kw, ResObj_Convert, &itself))
|
||||||
|
{
|
||||||
|
((ResourceObject *)self)->ob_itself = itself;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
PyErr_Clear();
|
||||||
|
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s#", kw, &srcdata, &srclen)) return -1;
|
||||||
|
if ((itself = NewHandle(srclen)) == NULL)
|
||||||
|
{
|
||||||
|
PyErr_NoMemory();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
((ResourceObject *)self)->ob_itself = itself;
|
||||||
|
if (srclen && srcdata)
|
||||||
|
{
|
||||||
|
HLock(itself);
|
||||||
|
memcpy(*itself, srcdata, srclen);
|
||||||
|
HUnlock(itself);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ResObj_tp_alloc PyType_GenericAlloc
|
||||||
|
|
||||||
|
static PyObject *ResObj_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
|
{
|
||||||
|
PyObject *self;
|
||||||
|
if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;
|
||||||
|
((ResourceObject *)self)->ob_itself = NULL;
|
||||||
|
((ResourceObject *)self)->ob_freeit = NULL;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ResObj_tp_free PyObject_Del
|
||||||
|
|
||||||
|
|
||||||
PyTypeObject Resource_Type = {
|
PyTypeObject Resource_Type = {
|
||||||
PyObject_HEAD_INIT(NULL)
|
PyObject_HEAD_INIT(NULL)
|
||||||
|
@ -634,19 +676,27 @@ PyTypeObject Resource_Type = {
|
||||||
0, /*tp_str*/
|
0, /*tp_str*/
|
||||||
PyObject_GenericGetAttr, /*tp_getattro*/
|
PyObject_GenericGetAttr, /*tp_getattro*/
|
||||||
PyObject_GenericSetAttr, /*tp_setattro */
|
PyObject_GenericSetAttr, /*tp_setattro */
|
||||||
0, /*outputHook_tp_as_buffer*/
|
0, /*tp_as_buffer*/
|
||||||
0, /*outputHook_tp_flags*/
|
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
|
||||||
0, /*outputHook_tp_doc*/
|
0, /*tp_doc*/
|
||||||
0, /*outputHook_tp_traverse*/
|
0, /*tp_traverse*/
|
||||||
0, /*outputHook_tp_clear*/
|
0, /*tp_clear*/
|
||||||
0, /*outputHook_tp_richcompare*/
|
0, /*tp_richcompare*/
|
||||||
0, /*outputHook_tp_weaklistoffset*/
|
0, /*tp_weaklistoffset*/
|
||||||
0, /*outputHook_tp_iter*/
|
0, /*tp_iter*/
|
||||||
0, /*outputHook_tp_iternext*/
|
0, /*tp_iternext*/
|
||||||
ResObj_methods, /* tp_methods */
|
ResObj_methods, /* tp_methods */
|
||||||
0, /*outputHook_tp_members*/
|
0, /*tp_members*/
|
||||||
ResObj_getsetlist, /*tp_getset*/
|
ResObj_getsetlist, /*tp_getset*/
|
||||||
0, /*outputHook_tp_base*/
|
0, /*tp_base*/
|
||||||
|
0, /*tp_dict*/
|
||||||
|
0, /*tp_descr_get*/
|
||||||
|
0, /*tp_descr_set*/
|
||||||
|
0, /*tp_dictoffset*/
|
||||||
|
ResObj_tp_init, /* tp_init */
|
||||||
|
ResObj_tp_alloc, /* tp_alloc */
|
||||||
|
ResObj_tp_new, /* tp_new */
|
||||||
|
ResObj_tp_free, /* tp_free */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* -------------------- End object type Resource -------------------- */
|
/* -------------------- End object type Resource -------------------- */
|
||||||
|
@ -1694,29 +1744,6 @@ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static PyObject *Res_Resource(PyObject *_self, PyObject *_args)
|
|
||||||
{
|
|
||||||
PyObject *_res = NULL;
|
|
||||||
|
|
||||||
char *buf;
|
|
||||||
int len;
|
|
||||||
Handle h;
|
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
|
|
||||||
return NULL;
|
|
||||||
h = NewHandle(len);
|
|
||||||
if ( h == NULL ) {
|
|
||||||
PyErr_NoMemory();
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
HLock(h);
|
|
||||||
memcpy(*h, buf, len);
|
|
||||||
HUnlock(h);
|
|
||||||
_res = ResObj_New(h);
|
|
||||||
return _res;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *Res_Handle(PyObject *_self, PyObject *_args)
|
static PyObject *Res_Handle(PyObject *_self, PyObject *_args)
|
||||||
{
|
{
|
||||||
PyObject *_res = NULL;
|
PyObject *_res = NULL;
|
||||||
|
@ -1871,8 +1898,6 @@ static PyMethodDef Res_methods[] = {
|
||||||
{"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1,
|
{"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1,
|
||||||
PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")},
|
PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")},
|
||||||
#endif
|
#endif
|
||||||
{"Resource", (PyCFunction)Res_Resource, 1,
|
|
||||||
PyDoc_STR("Convert a string to a resource object.\n\nThe created resource object is actually just a handle,\napply AddResource() to write it to a resource file.\nSee also the Handle() docstring.\n")},
|
|
||||||
{"Handle", (PyCFunction)Res_Handle, 1,
|
{"Handle", (PyCFunction)Res_Handle, 1,
|
||||||
PyDoc_STR("Convert a string to a Handle object.\n\nResource() and Handle() are very similar, but objects created with Handle() are\nby default automatically DisposeHandle()d upon object cleanup. Use AutoDispose()\nto change this.\n")},
|
PyDoc_STR("Convert a string to a Handle object.\n\nResource() and Handle() are very similar, but objects created with Handle() are\nby default automatically DisposeHandle()d upon object cleanup. Use AutoDispose()\nto change this.\n")},
|
||||||
{NULL, NULL, 0}
|
{NULL, NULL, 0}
|
||||||
|
@ -1937,8 +1962,10 @@ void init_Res(void)
|
||||||
return;
|
return;
|
||||||
Resource_Type.ob_type = &PyType_Type;
|
Resource_Type.ob_type = &PyType_Type;
|
||||||
Py_INCREF(&Resource_Type);
|
Py_INCREF(&Resource_Type);
|
||||||
if (PyDict_SetItemString(d, "ResourceType", (PyObject *)&Resource_Type) != 0)
|
PyModule_AddObject(m, "Resource", (PyObject *)&Resource_Type);
|
||||||
Py_FatalError("can't initialize ResourceType");
|
/* Backward-compatible name */
|
||||||
|
Py_INCREF(&Resource_Type);
|
||||||
|
PyModule_AddObject(m, "ResourceType", (PyObject *)&Resource_Type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ======================== End module _Res ========================= */
|
/* ======================== End module _Res ========================= */
|
||||||
|
|
|
@ -1,30 +1,30 @@
|
||||||
resource_body = """
|
##resource_body = """
|
||||||
char *buf;
|
##char *buf;
|
||||||
int len;
|
##int len;
|
||||||
Handle h;
|
##Handle h;
|
||||||
|
##
|
||||||
if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
|
##if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
|
||||||
return NULL;
|
## return NULL;
|
||||||
h = NewHandle(len);
|
##h = NewHandle(len);
|
||||||
if ( h == NULL ) {
|
##if ( h == NULL ) {
|
||||||
PyErr_NoMemory();
|
## PyErr_NoMemory();
|
||||||
return NULL;
|
## return NULL;
|
||||||
}
|
##}
|
||||||
HLock(h);
|
##HLock(h);
|
||||||
memcpy(*h, buf, len);
|
##memcpy(*h, buf, len);
|
||||||
HUnlock(h);
|
##HUnlock(h);
|
||||||
_res = ResObj_New(h);
|
##_res = ResObj_New(h);
|
||||||
return _res;
|
##return _res;
|
||||||
"""
|
##"""
|
||||||
|
##
|
||||||
f = ManualGenerator("Resource", resource_body)
|
##f = ManualGenerator("Resource", resource_body)
|
||||||
f.docstring = lambda: """Convert a string to a resource object.
|
##f.docstring = lambda: """Convert a string to a resource object.
|
||||||
|
##
|
||||||
The created resource object is actually just a handle,
|
##The created resource object is actually just a handle,
|
||||||
apply AddResource() to write it to a resource file.
|
##apply AddResource() to write it to a resource file.
|
||||||
See also the Handle() docstring.
|
##See also the Handle() docstring.
|
||||||
"""
|
##"""
|
||||||
functions.append(f)
|
##functions.append(f)
|
||||||
|
|
||||||
handle_body = """
|
handle_body = """
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
|
@ -100,7 +100,7 @@ initstuff = initstuff + """
|
||||||
|
|
||||||
module = MacModule('_Res', 'Res', includestuff, finalstuff, initstuff)
|
module = MacModule('_Res', 'Res', includestuff, finalstuff, initstuff)
|
||||||
|
|
||||||
class ResDefinition(PEP252Mixin, GlobalObjectDefinition):
|
class ResDefinition(PEP253Mixin, GlobalObjectDefinition):
|
||||||
getsetlist = [
|
getsetlist = [
|
||||||
('data',
|
('data',
|
||||||
"""
|
"""
|
||||||
|
@ -176,6 +176,42 @@ class ResDefinition(PEP252Mixin, GlobalObjectDefinition):
|
||||||
OutRbrace()
|
OutRbrace()
|
||||||
Output("self->ob_itself = NULL;")
|
Output("self->ob_itself = NULL;")
|
||||||
|
|
||||||
|
def output_tp_newBody(self):
|
||||||
|
Output("PyObject *self;")
|
||||||
|
Output
|
||||||
|
Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
|
||||||
|
Output("((%s *)self)->ob_itself = NULL;", self.objecttype)
|
||||||
|
Output("((%s *)self)->ob_freeit = NULL;", self.objecttype)
|
||||||
|
Output("return self;")
|
||||||
|
|
||||||
|
def output_tp_initBody(self):
|
||||||
|
Output("char *srcdata = NULL;")
|
||||||
|
Output("int srclen = 0;")
|
||||||
|
Output("%s itself;", self.itselftype);
|
||||||
|
Output("char *kw[] = {\"itself\", 0};")
|
||||||
|
Output()
|
||||||
|
Output("if (PyArg_ParseTupleAndKeywords(args, kwds, \"O&\", kw, %s_Convert, &itself))",
|
||||||
|
self.prefix);
|
||||||
|
OutLbrace()
|
||||||
|
Output("((%s *)self)->ob_itself = itself;", self.objecttype)
|
||||||
|
Output("return 0;")
|
||||||
|
OutRbrace()
|
||||||
|
Output("PyErr_Clear();")
|
||||||
|
Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|s#\", kw, &srcdata, &srclen)) return -1;")
|
||||||
|
Output("if ((itself = NewHandle(srclen)) == NULL)")
|
||||||
|
OutLbrace()
|
||||||
|
Output("PyErr_NoMemory();")
|
||||||
|
Output("return 0;")
|
||||||
|
OutRbrace()
|
||||||
|
Output("((%s *)self)->ob_itself = itself;", self.objecttype)
|
||||||
|
# XXXX Output("((%s *)self)->ob_freeit = PyMac_AutoDisposeHandle;")
|
||||||
|
Output("if (srclen && srcdata)")
|
||||||
|
OutLbrace()
|
||||||
|
Output("HLock(itself);")
|
||||||
|
Output("memcpy(*itself, srcdata, srclen);")
|
||||||
|
Output("HUnlock(itself);")
|
||||||
|
OutRbrace()
|
||||||
|
Output("return 0;")
|
||||||
|
|
||||||
resobject = ResDefinition('Resource', 'ResObj', 'Handle')
|
resobject = ResDefinition('Resource', 'ResObj', 'Handle')
|
||||||
module.addobject(resobject)
|
module.addobject(resobject)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue