~pythonregexp2.7/python/issue2636-11

« back to all changes in this revision

Viewing changes to Modules/_ctypes/_ctypes.c

  • Committer: Jeffrey C. "The TimeHorse" Jacobs
  • Date: 2008-09-21 17:53:26 UTC
  • mfrom: (39025.1.14 Regexp-2.7)
  • Revision ID: darklord@timehorse.com-20080921175326-92vaej2hc3yuecxb
Merged in changes from the core Regexp branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
386
386
        }
387
387
        Py_DECREF(result->tp_dict);
388
388
        result->tp_dict = (PyObject *)dict;
 
389
        dict->format = alloc_format_string(NULL, "B");
 
390
        if (dict->format == NULL) {
 
391
                Py_DECREF(result);
 
392
                return NULL;
 
393
        }
389
394
 
390
395
        dict->paramfunc = StructUnionType_paramfunc;
391
396
 
907
912
        if (proto) {
908
913
                StgDictObject *itemdict = PyType_stgdict(proto);
909
914
                assert(itemdict);
910
 
                stgdict->format = alloc_format_string("&", itemdict->format);
 
915
                /* If itemdict->format is NULL, then this is a pointer to an
 
916
                   incomplete type.  We create a generic format string
 
917
                   'pointer to bytes' in this case.  XXX Better would be to
 
918
                   fix the format string later...
 
919
                */
 
920
                stgdict->format = alloc_format_string("&",
 
921
                              itemdict->format ? itemdict->format : "B");
911
922
                if (stgdict->format == NULL) {
912
923
                        Py_DECREF((PyObject *)stgdict);
913
924
                        return NULL;
1852
1863
                return NULL;
1853
1864
        }
1854
1865
        if (PyString_Check(proto)) {
1855
 
                proto_str = PyBytes_AS_STRING(proto);
1856
 
                proto_len = PyBytes_GET_SIZE(proto);
 
1866
                proto_str = PyString_AS_STRING(proto);
 
1867
                proto_len = PyString_GET_SIZE(proto);
1857
1868
        } else {
1858
1869
                PyErr_SetString(PyExc_TypeError,
1859
1870
                        "class must define a '_type_' string attribute");
2495
2506
        { NULL },
2496
2507
};
2497
2508
 
 
2509
#if (PY_VERSION_HEX >= 0x02060000)
2498
2510
static int CData_NewGetBuffer(PyObject *_self, Py_buffer *view, int flags)
2499
2511
{
2500
2512
        CDataObject *self = (CDataObject *)_self;
2504
2516
        if (view == NULL) return 0;
2505
2517
 
2506
2518
        view->buf = self->b_ptr;
 
2519
        view->obj = _self;
 
2520
        Py_INCREF(_self);
2507
2521
        view->len = self->b_size;
2508
2522
        view->readonly = 0;
2509
2523
        /* use default format character if not set */
2519
2533
        view->internal = NULL;
2520
2534
        return 0;
2521
2535
}
 
2536
#endif
2522
2537
 
2523
2538
static Py_ssize_t CData_GetSegcount(PyObject *_self, Py_ssize_t *lenp)
2524
2539
{
2543
2558
        (writebufferproc)CData_GetBuffer,
2544
2559
        (segcountproc)CData_GetSegcount,
2545
2560
        (charbufferproc)NULL,
 
2561
#if (PY_VERSION_HEX >= 0x02060000)
2546
2562
        (getbufferproc)CData_NewGetBuffer,
2547
2563
        (releasebufferproc)NULL,
 
2564
#endif
2548
2565
};
2549
2566
 
2550
2567
/*
3921
3938
}
3922
3939
 
3923
3940
static int
3924
 
Pointer_nonzero(CDataObject *self)
 
3941
CFuncPtr_nonzero(CFuncPtrObject *self)
3925
3942
{
3926
 
        return *(void **)self->b_ptr != NULL;
 
3943
        return ((*(void **)self->b_ptr != NULL)
 
3944
#ifdef MS_WIN32
 
3945
                || (self->index != 0)
 
3946
#endif
 
3947
                );
3927
3948
}
3928
3949
 
3929
 
static PyNumberMethods Pointer_as_number = {
 
3950
static PyNumberMethods CFuncPtr_as_number = {
3930
3951
        0, /* nb_add */
3931
3952
        0, /* nb_subtract */
3932
3953
        0, /* nb_multiply */
3937
3958
        0, /* nb_negative */
3938
3959
        0, /* nb_positive */
3939
3960
        0, /* nb_absolute */
3940
 
        (inquiry)Pointer_nonzero, /* nb_nonzero */
 
3961
        (inquiry)CFuncPtr_nonzero, /* nb_nonzero */
3941
3962
};
3942
3963
 
3943
3964
PyTypeObject CFuncPtr_Type = {
3951
3972
        0,                                      /* tp_setattr */
3952
3973
        0,                                      /* tp_compare */
3953
3974
        (reprfunc)CFuncPtr_repr,                /* tp_repr */
3954
 
        &Pointer_as_number,                     /* tp_as_number */
 
3975
        &CFuncPtr_as_number,                    /* tp_as_number */
3955
3976
        0,                                      /* tp_as_sequence */
3956
3977
        0,                                      /* tp_as_mapping */
3957
3978
        0,                                      /* tp_hash */
5159
5180
        Pointer_subscript,
5160
5181
};
5161
5182
 
 
5183
static int
 
5184
Pointer_nonzero(CDataObject *self)
 
5185
{
 
5186
        return (*(void **)self->b_ptr != NULL);
 
5187
}
 
5188
 
 
5189
static PyNumberMethods Pointer_as_number = {
 
5190
        0, /* nb_add */
 
5191
        0, /* nb_subtract */
 
5192
        0, /* nb_multiply */
 
5193
        0, /* nb_divide */
 
5194
        0, /* nb_remainder */
 
5195
        0, /* nb_divmod */
 
5196
        0, /* nb_power */
 
5197
        0, /* nb_negative */
 
5198
        0, /* nb_positive */
 
5199
        0, /* nb_absolute */
 
5200
        (inquiry)Pointer_nonzero, /* nb_nonzero */
 
5201
};
 
5202
 
5162
5203
PyTypeObject Pointer_Type = {
5163
5204
        PyVarObject_HEAD_INIT(NULL, 0)
5164
5205
        "_ctypes._Pointer",