1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
/***************************************************************/
/*** A "regular" PyObject type with Psyco-optimized attributes ***/
/***************************************************************/
#ifndef _COMPACTOBJECT_H
#define _COMPACTOBJECT_H
#include "../psyco.h"
#include "../Python/pyver.h"
#define HAVE_COMPACT_OBJECT NEW_STYLE_TYPES
#if HAVE_COMPACT_OBJECT
#include "../vcompiler.h"
typedef struct compact_impl_s compact_impl_t; /* private structure */
typedef struct {
PyObject_HEAD
char* k_data; /* heap-allocated memory for the attributes */
compact_impl_t* k_impl; /* description of how the data is encoded */
} PyCompactObject;
EXTERNVAR PyTypeObject PyCompact_Type;
EXTERNVAR compact_impl_t* PyCompact_EmptyImpl;
#define PyCompact_Check(op) PyObject_TypeCheck(op, &PyCompact_Type)
/* EXTERNFN PyObject* PyCompact_New(void); */
/* EXTERNFN PyObject* PyCompact_GetSlot(PyObject* ko, PyObject* key); */
/* EXTERNFN PyObject* PyCompact_SetSlot(PyObject* ko, PyObject* key, */
/* PyObject* value); */
/* EXTERNFN int PyCompact_Extend(PyObject* ko, compact_impl_t* nimpl); */
/* EXTERNFN compact_impl_t* PyCompact_ExtendImpl(compact_impl_t* oldimpl, */
/* PyObject* attr, */
/* vinfo_t* v_descr); */
/*****************************************************************/
/* Private structures and routines exported for pcompactobject.c */
struct compact_impl_s {
PyObject* attrname; /* name of the last attr */
vinfo_t* vattr; /* storage format of the last attr */
int datasize; /* total size of the k_data buffer */
compact_impl_t* extensions; /* chained list of extensions */
compact_impl_t* next; /* next in chained list */
compact_impl_t* parent; /* of which this one is an extension */
};
#define K_ROUNDUP(sz) (((sz) + 7) & ~7)
#define K_INTERN(attr) do { \
PyString_InternInPlace(&attr); \
if (attr->ob_type != &PyString_Type || !PyString_CHECK_INTERNED(attr)) \
Py_FatalError("Psyco failed to intern an attribute name"); \
} while (0)
EXTERNFN vinfo_t* vinfo_copy_no_share(vinfo_t* vi);
EXTERNFN bool k_match_vinfo(vinfo_t* vnew, vinfo_t* vexisting);
EXTERNFN compact_impl_t* k_extend_impl(compact_impl_t* oldimpl, PyObject* attr,
vinfo_t* v);
EXTERNFN void k_attribute_range(vinfo_t* v, int* smin, int* smax);
EXTERNFN compact_impl_t* k_duplicate_impl(compact_impl_t* base,
compact_impl_t* first_excluded,
compact_impl_t* last,
int shift_delta);
#endif /* HAVE_COMPACT_OBJECT */
#endif /* _COMPACTOBJECT_H */
|