From: Armin R. <ar...@us...> - 2002-02-26 23:08:04
|
Update of /cvsroot/psyco/psyco/c In directory usw-pr-cvs1:/tmp/cvs-serv17507/c Modified Files: codemanager.c encoding.h mergepoints.c mergepoints.h pycencoding.h vcompiler.c Log Message: Python 2.1 compatibility Index: codemanager.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/codemanager.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** codemanager.c 5 Feb 2002 20:08:23 -0000 1.6 --- codemanager.c 26 Feb 2002 23:08:00 -0000 1.7 *************** *** 159,162 **** --- 159,173 ---- self->codeptr, self)); fpo_release(&self->snapshot); + + #if defined(ALL_CHECKS) && defined(STORE_CODE_END) + if (self->codeend != NULL) + { + /* do not actully release, to detect calls to released code */ + /* 0xCC is the breakpoint instruction (INT 3) */ + memset(self->codeptr, 0xCC, self->codeend - self->codeptr); + return; + } + #endif + PyObject_Del(self); } Index: encoding.h =================================================================== RCS file: /cvsroot/psyco/psyco/c/encoding.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** encoding.h 15 Feb 2002 12:46:36 -0000 1.8 --- encoding.h 26 Feb 2002 23:08:00 -0000 1.9 *************** *** 442,445 **** --- 442,446 ---- code += 5 \ ) + #define SIZE_OF_LOAD_REG_FROM_IMMED 5 /* loads 0 in a register. The macro name reminds you that this Index: mergepoints.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/mergepoints.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** mergepoints.c 11 Feb 2002 19:14:14 -0000 1.7 --- mergepoints.c 26 Feb 2002 23:08:00 -0000 1.8 *************** *** 31,44 **** /* instructions with a target: */ ! #define HAS_JREL_INSTR(op) ((op) == JUMP_FORWARD || \ (op) == JUMP_IF_FALSE || \ (op) == JUMP_IF_TRUE || \ ! /* (op) == FOR_LOOP || */ \ ! (op) == FOR_ITER || \ (op) == SETUP_LOOP || \ (op) == SETUP_EXCEPT || \ (op) == SETUP_FINALLY || \ 0) ! #define HAS_JABS_INSTR(op) ((op) == JUMP_ABSOLUTE || \ (op) == CONTINUE_LOOP || \ --- 31,49 ---- /* instructions with a target: */ ! #define HAS_JREL_INSTR_1(op) ((op) == JUMP_FORWARD || \ (op) == JUMP_IF_FALSE || \ (op) == JUMP_IF_TRUE || \ ! (op) == FOR_LOOP || \ (op) == SETUP_LOOP || \ (op) == SETUP_EXCEPT || \ (op) == SETUP_FINALLY || \ 0) ! #ifdef FOR_ITER ! # define HAS_JREL_INSTR(op) ((op) == FOR_ITER || \ ! HAS_JREL_INSTR_1(op)) ! #else ! # define HAS_JREL_INSTR(op) (HAS_JREL_INSTR_1(op)) ! #endif ! #define HAS_JABS_INSTR(op) ((op) == JUMP_ABSOLUTE || \ (op) == CONTINUE_LOOP || \ *************** *** 136,140 **** --- 141,147 ---- LOAD_ATTR, /* COMPARE_OP see below */ + #ifdef GET_ITER GET_ITER, + #endif SET_LINENO, CALL_FUNCTION, *************** *** 196,199 **** --- 203,207 ---- PyObject* s; mergepoint_t* mp; + int mp_flags = MP_FLAGS_EXTRA; int length = PyString_GET_SIZE(co->co_code); unsigned char* source = (unsigned char*) PyString_AS_STRING(co->co_code); *************** *** 223,226 **** --- 231,236 ---- oparg = oparg<<16 | ((source[i-1]<<8) + source[i-2]); } + if (op == SETUP_EXCEPT) + mp_flags |= MP_FLAGS_HAS_EXCEPT; } flags = instr_control_flow[(int) op]; *************** *** 273,277 **** /* allocate the string buffer, one mergepoint_t per merge point plus ! the room for a final '-1'. */ count = count * sizeof(mergepoint_t) + sizeof(int); s = PyString_FromStringAndSize(NULL, count); --- 283,287 ---- /* allocate the string buffer, one mergepoint_t per merge point plus ! the room for a final negative bitfield flags. */ count = count * sizeof(mergepoint_t) + sizeof(int); s = PyString_FromStringAndSize(NULL, count); *************** *** 287,291 **** mp++; } ! mp->bytecode_position = -1; PyCore_FREE(paths); return s; --- 297,301 ---- mp++; } ! mp->bytecode_position = mp_flags; PyCore_FREE(paths); return s; *************** *** 299,308 **** init_merge_points(); ! /* cache results */ ! s = PyDict_GetItem(CodeMergePoints, co->co_code); if (s == NULL) { s = build_merge_points(co); ! if (PyDict_SetItem(CodeMergePoints, co->co_code, s)) OUT_OF_MEMORY(); Py_DECREF(s); /* one ref left in the dict */ --- 309,322 ---- init_merge_points(); ! /* cache results -- warning, don't cache on 'co->co_code' because ! although the position of the merge points really depend on the ! bytecode only, we use the 'entries' field to store pointer to ! already-compiled code, which depends on the other things in ! 'co'. */ ! s = PyDict_GetItem(CodeMergePoints, (PyObject*) co); if (s == NULL) { s = build_merge_points(co); ! if (PyDict_SetItem(CodeMergePoints, (PyObject*) co, s)) OUT_OF_MEMORY(); Py_DECREF(s); /* one ref left in the dict */ Index: mergepoints.h =================================================================== RCS file: /cvsroot/psyco/psyco/c/mergepoints.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** mergepoints.h 24 Dec 2001 17:01:18 -0000 1.2 --- mergepoints.h 26 Feb 2002 23:08:00 -0000 1.3 *************** *** 60,62 **** --- 60,72 ---- + #define MP_FLAGS_HAS_EXCEPT 1 /* the code block has an 'except' clause */ + #define MP_FLAGS_EXTRA (~0xFF) + + inline int psyco_mp_flags(PyObject* mergepoints) + { + char* endptr = PyString_AS_STRING(mergepoints)+PyString_GET_SIZE(mergepoints); + return ((int*) endptr)[-1]; + } + + #endif /* _MERGEPOINTS_H */ Index: pycencoding.h =================================================================== RCS file: /cvsroot/psyco/psyco/c/pycencoding.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pycencoding.h 15 Feb 2002 12:46:36 -0000 1.3 --- pycencoding.h 26 Feb 2002 23:08:00 -0000 1.4 *************** *** 12,35 **** #include "Objects/pobject.h" /* Note: the following macro must output a fixed number of bytes of ! code, so that it can be called again with different arguments later to update an existing code buffer */ ! #define DICT_ITEM_IFCHANGED(code, mp, index, key, value, jmptarget) do { \ ! char _mprg; \ ! NEED_FREE_REG(_mprg); \ ! LOAD_REG_FROM_IMMED(_mprg, (long)(mp)); \ ! extra_assert(0 < offsetof(PyDictObject, ma_mask) && \ ! offsetof(PyDictObject, ma_mask) < 128); \ extra_assert(0 < offsetof(PyDictObject, ma_table) && \ offsetof(PyDictObject, ma_table) < 128); \ code[0] = 0x81; /* CMP [...], imm32 */ \ ! code[1] = 0x40 | (7<<3) | _mprg; /* CMP [mpreg->ma_mask], ... */ \ ! code[2] = offsetof(PyDictObject, ma_mask); \ ! *(long*)(code+3) = (index); \ /* perform the load before checking the CMP outcome */ \ code[7] = 0x8B; \ ! code[8] = 0x40 | (_mprg<<3) | _mprg; /* MOV mpreg, [mpreg->ma_table] */ \ CODE_FOUR_BYTES(code+9, \ offsetof(PyDictObject, ma_table), \ --- 12,41 ---- #include "Objects/pobject.h" + #include "Objects/pdictobject.h" + #if HAVE_struct_dictobject + # define ma_SIZE ma_mask + # define MA_SIZE_TO_LAST_USED 0 + #else + # define ma_SIZE ma_size + # define MA_SIZE_TO_LAST_USED (-1) + #endif + /* Note: the following macro must output a fixed number of bytes of ! code, so that DICT_ITEM_UPDCHANGED() can be called later to update an existing code buffer */ ! #define DICT_ITEM_IFCHANGED(code, index, key, value, jmptarget, mprg) do { \ ! extra_assert(0 < offsetof(PyDictObject, ma_SIZE) && \ ! offsetof(PyDictObject, ma_SIZE) < 128); \ extra_assert(0 < offsetof(PyDictObject, ma_table) && \ offsetof(PyDictObject, ma_table) < 128); \ code[0] = 0x81; /* CMP [...], imm32 */ \ ! code[1] = 0x40 | (7<<3) | mprg; /* CMP [mpreg->ma_mask], ... */ \ ! code[2] = offsetof(PyDictObject, ma_SIZE); \ ! *(long*)(code+3) = (index) - MA_SIZE_TO_LAST_USED; \ /* perform the load before checking the CMP outcome */ \ code[7] = 0x8B; \ ! code[8] = 0x40 | (mprg<<3) | mprg; /* MOV mpreg, [mpreg->ma_table] */ \ CODE_FOUR_BYTES(code+9, \ offsetof(PyDictObject, ma_table), \ *************** *** 37,41 **** 34 - 12, \ 0x81); /* CMP [mpreg+dictentry*index+me_key], key */ \ ! code[13] = 0x80 | (7<<3) | _mprg; \ *(long*)(code+14) = (index)*sizeof(PyDictEntry) + \ offsetof(PyDictEntry, me_key); \ --- 43,47 ---- 34 - 12, \ 0x81); /* CMP [mpreg+dictentry*index+me_key], key */ \ ! code[13] = 0x80 | (7<<3) | mprg; \ *(long*)(code+14) = (index)*sizeof(PyDictEntry) + \ offsetof(PyDictEntry, me_key); \ *************** *** 45,49 **** 34 - 24, \ 0x81, /* CMP [mpreg+dictentry*index+me_value], value */ \ ! 0x80 | (7<<3) | _mprg); \ *(long*)(code+26) = (index)*sizeof(PyDictEntry) + \ offsetof(PyDictEntry, me_value); \ --- 51,55 ---- 34 - 24, \ 0x81, /* CMP [mpreg+dictentry*index+me_value], value */ \ ! 0x80 | (7<<3) | mprg); \ *(long*)(code+26) = (index)*sizeof(PyDictEntry) + \ offsetof(PyDictEntry, me_value); \ *************** *** 53,56 **** --- 59,71 ---- code += 40; \ *(long*)(code-4) = ((code_t*)(jmptarget)) - code; \ + } while (0) + + #define DICT_ITEM_UPDCHANGED(code, index) do { \ + *(long*)(code+3) = (index) - MA_SIZE_TO_LAST_USED; \ + *(long*)(code+14) = (index)*sizeof(PyDictEntry) + \ + offsetof(PyDictEntry, me_key); \ + *(long*)(code+26) = (index)*sizeof(PyDictEntry) + \ + offsetof(PyDictEntry, me_value); \ + code += 40; \ } while (0) Index: vcompiler.c =================================================================== RCS file: /cvsroot/psyco/psyco/c/vcompiler.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** vcompiler.c 18 Feb 2002 07:54:22 -0000 1.12 --- vcompiler.c 26 Feb 2002 23:08:00 -0000 1.13 *************** *** 510,514 **** { code_t* code2 = psyco_unify(po, &oldcodebuf); ! Py_DECREF(oldcodebuf); return code2; } --- 510,514 ---- { code_t* code2 = psyco_unify(po, &oldcodebuf); ! /* XXX store reference to oldcodebuf somewhere */ return code2; } *************** *** 591,595 **** po2->codelimit = code2 + RANGE_OF_SHORT_CONDITIONAL_JUMP; codeend = psyco_unify(po2, &oldcodebuf); ! Py_DECREF(oldcodebuf); BEGIN_CODE if (IS_A_SINGLE_JUMP(code2, codeend, target)) --- 591,595 ---- po2->codelimit = code2 + RANGE_OF_SHORT_CONDITIONAL_JUMP; codeend = psyco_unify(po2, &oldcodebuf); ! /* XXX store reference to oldcodebuf somewhere */ BEGIN_CODE if (IS_A_SINGLE_JUMP(code2, codeend, target)) |