From: Armin R. <ar...@us...> - 2002-01-11 16:15:42
|
Update of /cvsroot/psyco/psyco/c In directory usw-pr-cvs1:/tmp/cvs-serv27321 Modified Files: psyco.c codemanager.h codemanager.c Log Message: Reorganized code buffer dumps. Unsupported kind of fns (e.g. **kw arg or free vars) no longer cause an exception but are executed by regular Python. Index: psyco.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/psyco.c,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** psyco.c 2002/01/04 23:28:09 1.13 --- psyco.c 2002/01/11 16:15:38 1.14 *************** *** 69,76 **** if (merge_points == Py_None) ! { ! array_delete(arginfo, NULL); ! return BF_UNSUPPORTED; ! } globals = PyFunction_GET_GLOBALS(function); --- 69,73 ---- if (merge_points == Py_None) ! goto unsupported; globals = PyFunction_GET_GLOBALS(function); *************** *** 80,90 **** if (co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) { ! PyErr_SetString(PyExc_PsycoError, "* and ** arguments not supported yet"); ! goto error; } if (ncells != 0 || nfrees != 0) { ! PyErr_SetString(PyExc_PsycoError, "free and cell variables not supported yet"); ! goto error; } minargcnt = co->co_argcount - (defaults ? PyTuple_GET_SIZE(defaults) : 0); --- 77,87 ---- if (co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) { ! debug_printf(("psyco: unsupported: functions with * or ** arguments\n")); ! goto unsupported; } if (ncells != 0 || nfrees != 0) { ! debug_printf(("psyco: unsupported: functions with free or cell variables\n")); ! goto unsupported; } minargcnt = co->co_argcount - (defaults ? PyTuple_GET_SIZE(defaults) : 0); *************** *** 165,172 **** /* the rest of locals is uninitialized */ for (; i<co->co_nlocals; i++) ! { ! vinfo_incref(psyco_viZero); ! LOC_LOCALS_PLUS[i] = psyco_viZero; ! } /* the rest of the array is the currently empty stack, set to NULL by array_new(). */ --- 162,166 ---- /* the rest of locals is uninitialized */ for (; i<co->co_nlocals; i++) ! LOC_LOCALS_PLUS[i] = psyco_vi_Zero(); /* the rest of the array is the currently empty stack, set to NULL by array_new(). */ *************** *** 184,187 **** --- 178,185 ---- array_delete(arginfo, NULL); return NULL; + + unsupported: + array_delete(arginfo, NULL); + return BF_UNSUPPORTED; } *************** *** 324,327 **** --- 322,329 ---- #endif + if (result==NULL) + extra_assert(PyErr_Occurred()); + else + extra_assert(!PyErr_Occurred()); return result; } *************** *** 405,413 **** #ifdef CODE_DUMP_FILE - struct sd_s { - PyObject* spec_dict; - long kflags; - long signature; - }; static void vinfo_array_dump(vinfo_array_t* array, FILE* f, PyObject* d) { --- 407,410 ---- *************** *** 451,454 **** --- 448,452 ---- CodeBufferObject* obj; PyObject *exc, *val, *tb; + void** chain; #ifdef CODE_DUMP_SYMBOLS int i1; *************** *** 491,531 **** } #endif ! if (nsize > sizeof(struct sd_s) && ! ((struct sd_s*)(obj->codeptr+nsize))[-1].signature == ! SPEC_DICT_SIGNATURE) /* unelegant hack */ { ! struct sd_s* sd = ((struct sd_s*)(obj->codeptr+nsize)) - 1; ! int i = 0; ! PyObject *key, *value; ! fprintf(f, "spec_dict\n"); ! while (PyDict_Next(sd->spec_dict, &i, &key, &value)) { - PyObject* repr; - if (PyInt_Check(key)) - { #ifdef CODE_DUMP_SYMBOLS ! PyDict_SetItem(global_addrs, key, Py_None); #endif ! repr = (key->ob_type->tp_as_number->nb_hex)(key); ! } ! else ! { #ifdef CODE_DUMP_SYMBOLS ! PyObject* key = PyInt_FromLong((long) key); ! assert(key); ! PyDict_SetItem(global_addrs, key, Py_None); ! Py_DECREF(key); #endif ! repr = PyObject_Repr(key); ! } ! assert(!PyErr_Occurred()); ! assert(PyString_Check(repr)); ! assert(CodeBuffer_Check(value)); ! fprintf(f, "%p %s\n", ((CodeBufferObject*)value)->codeptr, ! PyString_AsString(repr)); ! Py_DECREF(repr); } ! fprintf(f, "\n"); } } #ifdef CODE_DUMP_SYMBOLS --- 489,530 ---- } #endif ! } ! ! for (chain = psyco_codebuf_spec_dict_list; chain; chain=(void**)*chain) ! { ! PyObject* spec_dict = (PyObject*)(chain[-1]); ! int i = 0; ! PyObject *key, *value; ! fprintf(f, "spec_dict %p\n", chain); ! while (PyDict_Next(spec_dict, &i, &key, &value)) { ! PyObject* repr; ! if (PyInt_Check(key)) { #ifdef CODE_DUMP_SYMBOLS ! PyDict_SetItem(global_addrs, key, Py_None); #endif ! repr = (key->ob_type->tp_as_number->nb_hex)(key); ! } ! else ! { #ifdef CODE_DUMP_SYMBOLS ! key = PyInt_FromLong((long) key); ! assert(key); ! PyDict_SetItem(global_addrs, key, Py_None); #endif ! repr = PyObject_Repr(key); ! #ifdef CODE_DUMP_SYMBOLS ! Py_DECREF(key); ! #endif } ! assert(!PyErr_Occurred()); ! assert(PyString_Check(repr)); ! assert(CodeBuffer_Check(value)); ! fprintf(f, "%p %s\n", ((CodeBufferObject*)value)->codeptr, ! PyString_AsString(repr)); ! Py_DECREF(repr); } + fprintf(f, "\n"); } #ifdef CODE_DUMP_SYMBOLS Index: codemanager.h =================================================================== RCS file: /cvsroot/psyco/psyco/c/codemanager.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** codemanager.h 2001/12/04 16:12:07 1.1 --- codemanager.h 2002/01/11 16:15:38 1.2 *************** *** 43,46 **** --- 43,47 ---- #ifdef CODE_DUMP_FILE EXTERNVAR CodeBufferObject* psyco_codebuf_chained_list; + EXTERNVAR void** psyco_codebuf_spec_dict_list; #endif Index: codemanager.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/codemanager.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** codemanager.c 2001/12/28 12:36:48 1.3 --- codemanager.c 2002/01/11 16:15:38 1.4 *************** *** 76,79 **** --- 76,80 ---- #ifdef CODE_DUMP_FILE DEFINEVAR CodeBufferObject* psyco_codebuf_chained_list = NULL; + DEFINEVAR void** psyco_codebuf_spec_dict_list = NULL; #endif *************** *** 139,142 **** --- 140,144 ---- #ifdef CODE_DUMP_FILE CodeBufferObject** ptr = &psyco_codebuf_chained_list; + void** chain; while (*ptr != NULL) { *************** *** 148,151 **** --- 150,156 ---- ptr = &((*ptr)->chained_list); } + for (chain = psyco_codebuf_spec_dict_list; chain; chain=(void**)*chain) + if (self->codeptr < (code_t*)chain && (code_t*)chain <= self->codeend) + assert(!"releasing a code buffer with a spec_dict"); #endif if (VERBOSE_LEVEL > 1) |