From: Armin R. <ar...@us...> - 2003-04-26 21:02:00
|
Update of /cvsroot/psyco/psyco/c/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv5479/c/Objects Modified Files: pintobject.c pintobject.h pobject.c Added Files: pboolobject.c pboolobject.h Log Message: Py2.3 compatibility: 'True' and 'False' --- NEW FILE: pboolobject.c --- #include "pboolobject.h" #include "pintobject.h" #if BOOLEAN_TYPE /* Booleans were introduced in Python 2.3 */ static bool compute_bool(PsycoObject* po, vinfo_t* boolobj) { vinfo_t* newobj; vinfo_t* x; condition_code_t cc; /* get the field 'ob_ival' from the Python object 'boolobj' */ x = vinfo_getitem(boolobj, iBOOL_OB_IVAL); if (x == NULL) return false; cc = integer_non_null(po, x); if (cc == CC_ERROR) return false; newobj = integer_conditional(po, cc, (long) Py_True, (long) Py_False); if (newobj == NULL) return false; /* move the resulting non-virtual Python object back into 'boolobj' */ vinfo_move(po, boolobj, newobj); return true; } DEFINEVAR source_virtual_t psyco_computed_bool; /***************************************************************/ /*** boolean objects meta-implementation ***/ #define CONVERT_TO_BOOL(vobj, vlng) \ switch (Psyco_VerifyType(po, vobj, &PyBool_Type)) { \ case true: /* vobj is a PyBoolObject */ \ vlng = PsycoInt_AS_LONG(po, vobj); \ if (vlng == NULL) \ return NULL; \ break; \ case false: /* vobj is not a PyBoolObject */ \ return pint_base2op(po, v, w, op); \ default: /* error or promotion */ \ return NULL; \ } static vinfo_t* pbool_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)) { vinfo_t* a; vinfo_t* b; vinfo_t* x; CONVERT_TO_BOOL(v, a); CONVERT_TO_BOOL(w, b); x = op (po, a, b); if (x != NULL) x = PsycoBool_FROM_LONG(x); return x; } static vinfo_t* pbool_or(PsycoObject* po, vinfo_t* v, vinfo_t* w) { return pbool_base2op(po, v, w, integer_or); } static vinfo_t* pbool_xor(PsycoObject* po, vinfo_t* v, vinfo_t* w) { return pbool_base2op(po, v, w, integer_xor); } static vinfo_t* pbool_and(PsycoObject* po, vinfo_t* v, vinfo_t* w) { return pbool_base2op(po, v, w, integer_and); } INITIALIZATIONFN void psy_boolobject_init(void) { PyNumberMethods *m = PyBool_Type.tp_as_number; Psyco_DefineMeta(m->nb_or, pbool_or); Psyco_DefineMeta(m->nb_xor, pbool_xor); Psyco_DefineMeta(m->nb_and, pbool_and); INIT_SVIRTUAL(psyco_computed_bool, compute_bool, 0, 0); } #else /* !BOOLEAN_TYPE */ INITIALIZATIONFN void psy_boolobject_init(void) { } #endif /* BOOLEAN_TYPE */ --- NEW FILE: pboolobject.h --- /***************************************************************/ /*** Psyco equivalent of boolobject.h ***/ /***************************************************************/ #ifndef _PSY_BOOLOBJECT_H #define _PSY_BOOLOBJECT_H #include "pobject.h" #include "pabstract.h" #if BOOLEAN_TYPE /* Booleans were introduced in Python 2.3 */ #define BOOL_ob_ival DEF_FIELD(PyBoolObject, long, ob_ival, OB_type) #define iBOOL_OB_IVAL FIELD_INDEX(BOOL_ob_ival) #define BOOL_TOTAL FIELDS_TOTAL(BOOL_ob_ival) #define PsycoBool_Check(tp) PyType_TypeCheck(tp, &PyBool_Type) /***************************************************************/ /*** Virtual-time object builder ***/ /* not-yet-computed booleans */ EXTERNVAR source_virtual_t psyco_computed_bool; /* !! consumes a reference to vlong. PsycoBool_FromLong() does not. */ inline vinfo_t* PsycoBool_FROM_LONG(vinfo_t* vlong) { vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_bool)); result->array = array_new(BOOL_TOTAL); result->array->items[iOB_TYPE] = vinfo_new(CompileTime_New((long)(&PyBool_Type))); result->array->items[iBOOL_OB_IVAL] = vlong; return result; } inline vinfo_t* PsycoBool_FromLong(vinfo_t* vlong) { vinfo_incref(vlong); return PsycoBool_FROM_LONG(vlong); } #else /* !BOOLEAN_TYPE */ /* define the booleans as synonims for integers */ # define PsycoBool_FROM_LONG(v) PsycoInt_FROM_LONG(v) # define PsycoBool_FromLong(v) PsycoInt_FromLong(v) #endif /* BOOLEAN_TYPE */ /* utility */ #define PsycoBool_FromCondition(po, cc) \ PsycoBool_FROM_LONG(psyco_vinfo_condition(po, cc)) #endif /* _PSY_INTOBJECT_H */ Index: pintobject.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/pintobject.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** pintobject.c 9 Mar 2003 21:06:46 -0000 1.11 --- pintobject.c 26 Apr 2003 21:01:23 -0000 1.12 *************** *** 187,192 **** } ! static vinfo_t* pint_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, ! vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)) { vinfo_t* a; --- 187,193 ---- } ! DEFINEFN ! vinfo_t* pint_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, ! vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)) { vinfo_t* a; Index: pintobject.h =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/pintobject.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** pintobject.h 17 Jan 2003 14:41:26 -0000 1.4 --- pintobject.h 26 Apr 2003 21:01:24 -0000 1.5 *************** *** 9,12 **** --- 9,13 ---- #include "pobject.h" #include "pabstract.h" + #include "pboolobject.h" *************** *** 62,67 **** cc = integer_cmp(po, a, b, op); if (cc == CC_ERROR) return NULL; ! return PsycoInt_FROM_LONG(psyco_vinfo_condition(po, cc)); } --- 63,73 ---- cc = integer_cmp(po, a, b, op); if (cc == CC_ERROR) return NULL; ! return PsycoBool_FromCondition(po, cc); } + + + EXTERNFN /* internal, for pboolobject.c */ + vinfo_t* pint_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, + vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)); Index: pobject.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/pobject.c,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** pobject.c 17 Jan 2003 14:41:34 -0000 1.13 --- pobject.c 26 Apr 2003 21:01:24 -0000 1.14 *************** *** 1,4 **** --- 1,5 ---- #include "pobject.h" #include "pintobject.h" + #include "pboolobject.h" #include "pstringobject.h" *************** *** 426,430 **** if (cc == CC_ERROR) return NULL; ! return PsycoInt_FROM_LONG(psyco_vinfo_condition(po, cc)); } --- 427,431 ---- if (cc == CC_ERROR) return NULL; ! return PsycoBool_FromCondition(po, cc); } |