File: compactobject.h

package info (click to toggle)
psyco 1.5.1-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 1,864 kB
  • ctags: 3,295
  • sloc: ansic: 24,491; python: 5,573; perl: 1,309; makefile: 166; sh: 1
file content (72 lines) | stat: -rw-r--r-- 2,835 bytes parent folder | download | duplicates (3)
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 */