From: Armin R. <ar...@us...> - 2002-02-05 20:08:28
|
Update of /cvsroot/psyco/psyco/c/Objects In directory usw-pr-cvs1:/tmp/cvs-serv27600/c/Objects Modified Files: pabstract.c pdictobject.c pfuncobject.c pfuncobject.h piterobject.c ptupleobject.h Log Message: major and numerous bug fixes. Psyco will now run most of Python's regresstion tests. Index: pabstract.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/pabstract.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** pabstract.c 2002/01/17 13:32:57 1.4 --- pabstract.c 2002/02/05 20:08:23 1.5 *************** *** 70,74 **** use_proxy: ! if (PsycoErr_Occurred(po)) return NULL; return psyco_generic_call(po, PyEval_CallObjectWithKeywords, --- 70,74 ---- use_proxy: ! if (PycException_Occurred(po)) return NULL; return psyco_generic_call(po, PyEval_CallObjectWithKeywords, Index: pdictobject.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/pdictobject.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** pdictobject.c 2001/12/04 16:12:07 1.1 --- pdictobject.c 2002/02/05 20:08:23 1.2 *************** *** 2,5 **** --- 2,9 ---- + #if NEW_STYLE_TYPES + # define DICT_MA_USED QUARTER(offsetof(PyDictObject, ma_used)) + #endif + DEFINEFN vinfo_t* PsycoDict_New(PsycoObject* po) *************** *** 17,20 **** --- 21,29 ---- } + static vinfo_t* psyco_dict_length(PsycoObject* po, vinfo_t* vi) + { + return read_array_item(po, vi, DICT_MA_USED); + } + DEFINEFN *************** *** 22,25 **** { PyMappingMethods *m = PyDict_Type.tp_as_mapping; ! Psyco_DefineMeta(m->mp_length, psyco_generic_mut_ob_size); } --- 31,34 ---- { PyMappingMethods *m = PyDict_Type.tp_as_mapping; ! Psyco_DefineMeta(m->mp_length, psyco_dict_length); } Index: pfuncobject.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/pfuncobject.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pfuncobject.c 2001/12/28 12:35:37 1.3 --- pfuncobject.c 2002/02/05 20:08:23 1.4 *************** *** 3,6 **** --- 3,77 ---- + /***************************************************************/ + /*** Virtual functions ***/ + + #define FUNC_CODE QUARTER(offsetof(PyFunctionObject, func_code)) + #define FUNC_GLOBALS QUARTER(offsetof(PyFunctionObject, func_globals)) + #define FUNC_DEFAULTS QUARTER(offsetof(PyFunctionObject, func_defaults)) + + static source_virtual_t psyco_computed_function; + + static bool compute_function(PsycoObject* po, vinfo_t* v) + { + vinfo_t* newobj; + vinfo_t* fcode; + vinfo_t* fglobals; + vinfo_t* fdefaults; + + fcode = get_array_item(po, v, FUNC_CODE); + if (fcode == NULL) + return false; + + fglobals = get_array_item(po, v, FUNC_GLOBALS); + if (fglobals == NULL) + return false; + + fdefaults = get_array_item(po, v, FUNC_DEFAULTS); + if (fdefaults == NULL) + return false; + + newobj = psyco_generic_call(po, PyFunction_New, + CfReturnRef|CfPyErrIfNull, + "vv", fcode, fglobals); + if (newobj == NULL) + return false; + + if (!psyco_knowntobe(fdefaults, (long) NULL)) { + if (!psyco_generic_call(po, PyFunction_SetDefaults, + CfNoReturnValue|CfPyErrIfNonNull, + "vv", newobj, fdefaults)) + return false; + } + + /* move the resulting non-virtual Python object back into 'v' */ + vinfo_move(po, v, newobj); + return true; + } + + + DEFINEFN + vinfo_t* PsycoFunction_New(PsycoObject* po, vinfo_t* fcode, + vinfo_t* fglobals, vinfo_t* fdefaults) + { + vinfo_t* r = vinfo_new(VirtualTime_New(&psyco_computed_function)); + r->array = array_new(MAX3(FUNC_CODE, FUNC_GLOBALS, FUNC_DEFAULTS)+1); + r->array->items[OB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyFunction_Type))); + vinfo_incref(fcode); + r->array->items[FUNC_CODE] = fcode; + vinfo_incref(fglobals); + r->array->items[FUNC_GLOBALS] = fglobals; + if (fdefaults == NULL) + fdefaults = psyco_vi_Zero(); + else + vinfo_incref(fdefaults); + r->array->items[FUNC_DEFAULTS] = fdefaults; + return r; + } + + + /***************************************************************/ + /*** function objects meta-implementation ***/ + static vinfo_t* pfunction_call(PsycoObject* po, vinfo_t* func, vinfo_t* arg, vinfo_t* kw) *************** *** 9,12 **** --- 80,88 ---- auto_recursion > 0. We promote the Python function to compile-time if it is not known yet. */ + + /* XXX this is not how it should be done! We must read the + function's func_code, func_globals and func_defaults + and pass them further. The code below forces all functions + out of virtual-time. */ if (po->pr.auto_recursion > 0 && psyco_knowntobe(kw, (long) NULL)) { PyObject* pyfunc = psyco_pyobj_atcompiletime(po, func); *************** *** 40,42 **** --- 116,119 ---- Psyco_DefineMeta(PyFunction_Type.tp_call, pfunction_call); Psyco_DefineMeta(PyFunction_Type.tp_descr_get, pfunc_descr_get); + psyco_computed_function.compute_fn = &compute_function; } Index: pfuncobject.h =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/pfuncobject.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** pfuncobject.h 2001/12/06 15:48:25 1.2 --- pfuncobject.h 2002/02/05 20:08:23 1.3 *************** *** 11,14 **** --- 11,21 ---- + /***************************************************************/ + /* virtual functions. */ + /* 'fdefaults' may be NULL. */ + EXTERNFN vinfo_t* PsycoFunction_New(PsycoObject* po, vinfo_t* fcode, + vinfo_t* fglobals, vinfo_t* fdefaults); + + EXTERNFN void psy_funcobject_init(void); Index: piterobject.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/piterobject.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** piterobject.c 2002/01/11 16:17:28 1.2 --- piterobject.c 2002/02/05 20:08:23 1.3 *************** *** 13,17 **** vinfo_t* index; vinfo_t* result; - vinfo_t* index_plus_1; seq = get_array_item(po, v, SEQITER_IT_SEQ); --- 13,16 ---- *************** *** 19,33 **** return NULL; ! index = get_array_item(po, v, SEQITER_IT_INDEX); if (index == NULL) return NULL; - index_plus_1 = integer_add_i(po, index, 1); - if (index_plus_1 == NULL) - return NULL; result = PsycoSequence_GetItem(po, seq, index); - - set_array_item(po, v, SEQITER_IT_INDEX, index_plus_1); - if (result == NULL) { vinfo_t* matches = PycException_Matches(po, PyExc_IndexError); --- 18,26 ---- return NULL; ! index = read_array_item(po, v, SEQITER_IT_INDEX); if (index == NULL) return NULL; result = PsycoSequence_GetItem(po, seq, index); if (result == NULL) { vinfo_t* matches = PycException_Matches(po, PyExc_IndexError); *************** *** 37,40 **** --- 30,52 ---- } } + else { + /* very remotely potential incompatibility: when exhausted, + the internal iterator index is not incremented. Python + is not consistent in this respect. This could be an + issue if an iterator of a mutable object is not + immediately deleted when exhausted. Well, I guess that + muting an object we iterate over is generally considered + as DDIWWY (Don't Do It -- We Warned You.) */ + vinfo_t* index_plus_1 = integer_add_i(po, index, 1); + if (index_plus_1 == NULL) { + vinfo_decref(result, po); + result = NULL; + } + else { + write_array_item(po, v, SEQITER_IT_INDEX, index_plus_1); + vinfo_decref(index_plus_1, po); + } + } + vinfo_decref(index, po); return result; } Index: ptupleobject.h =================================================================== RCS file: /cvsroot/psyco/psyco/c/Objects/ptupleobject.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ptupleobject.h 2001/12/06 15:48:25 1.2 --- ptupleobject.h 2002/02/05 20:08:23 1.3 *************** *** 29,33 **** /* get the (possibly virtual) array of items in the tuple, returning the length of the tuple or -1 if it fails (items not known). ! The items are then found in tuple->array->items[TUPLE_OB_ITEM+i]. */ EXTERNFN int PsycoTuple_Load(vinfo_t* tuple); --- 29,34 ---- /* get the (possibly virtual) array of items in the tuple, returning the length of the tuple or -1 if it fails (items not known). ! The items are then found in tuple->array->items[TUPLE_OB_ITEM+i]. ! Never sets a PycException. */ EXTERNFN int PsycoTuple_Load(vinfo_t* tuple); |