~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_static_tuple_c.h

  • Committer: John Arbash Meinel
  • Date: 2009-10-01 19:06:35 UTC
  • mto: (4679.6.1 2.1-export-c-api)
  • mto: This revision was merged to the branch mainline in revision 4735.
  • Revision ID: john@arbash-meinel.com-20091001190635-m0531rj2mebmhjq0
Add a _static_tuple_c.pxd file to define the C api to pyrex code.

I had to drop the notion of void*items[1] and then subtracting it from tp_basicsize
because Pyrex directly checks that sizeof(struct) == tp_basicsize. I understand
why it was doing so, but it was very hard to track down. The error during
import was basically suppressed, and then I just got segfaults because
the type wasn't actually available.

Anyway, I'm reasonably happy with using a .pxd file, because then I don't have
to worry about getting the invocation right in all callers, though I still
have to repeat the 'from x cimport a,b,c,d' which is a bit annoying.

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
    unsigned char _unused0;
53
53
    unsigned char _unused1;
54
54
    // Note that on 64-bit, we actually have 4-more unused bytes
55
 
    // because key_bits will always be aligned to a 64-bit boundary
 
55
    // because items will always be aligned to a 64-bit boundary
56
56
#if STATIC_TUPLE_HAS_HASH
57
57
    long hash;
58
58
#endif
59
 
    PyObject *key_bits[1];
 
59
    PyObject *items[0];
60
60
} StaticTuple;
61
61
extern PyTypeObject StaticTuple_Type;
62
62
 
63
63
typedef struct {
64
64
    PyObject_VAR_HEAD
65
 
    PyObject *table[1];
 
65
    PyObject *table[0];
66
66
} KeyIntern;
67
67
// extern PyTypeObject StaticTuple_Type;
68
68
 
69
69
#define StaticTuple_CheckExact(op) (Py_TYPE(op) == &StaticTuple_Type)
70
70
#define StaticTuple_SET_ITEM(key, offset, val) \
71
 
    ((((StaticTuple*)(key))->key_bits[(offset)]) = ((PyObject *)(val)))
72
 
#define StaticTuple_GET_ITEM(key, offset) (((StaticTuple*)key)->key_bits[offset])
 
71
    ((((StaticTuple*)(key))->items[(offset)]) = ((PyObject *)(val)))
 
72
#define StaticTuple_GET_ITEM(key, offset) (((StaticTuple*)key)->items[offset])
73
73
 
74
74
 
75
75
/* C API Functions */
83
83
#ifdef STATIC_TUPLE_MODULE
84
84
/* Used when compiling _static_tuple_c.c */
85
85
 
86
 
static PyObject * StaticTuple_New(Py_ssize_t);
 
86
static StaticTuple * StaticTuple_New(Py_ssize_t);
87
87
static StaticTuple * StaticTuple_intern(StaticTuple *self);
88
88
 
89
89
#else
90
90
/* Used by foriegn callers */
91
91
static void **StaticTuple_API;
92
92
 
93
 
static PyObject *(*StaticTuple_New)(Py_ssize_t);
94
 
static PyObject *(*StaticTuple_intern)(PyObject *);
 
93
static StaticTuple *(*StaticTuple_New)(Py_ssize_t);
 
94
static StaticTuple *(*StaticTuple_intern)(StaticTuple *);
95
95
#undef StaticTuple_CheckExact
96
96
static int (*StaticTuple_CheckExact)(PyObject *);
97
97