From: Skip M. <mon...@us...> - 2004-07-15 03:39:54
|
Update of /cvsroot/pychecker/pychecker/pychecker In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10421/pychecker Modified Files: checker.py Log Message: Python spells "abstract method" as "raise NotImplementedError...". This patch more-or-less enforces that dictum. If a "LOAD_GLOBAL NotImplementedError" is seen before the raise statement that triggers a return, assume "raise NotImplementedError" was executed. This can obviously be fooled: def f(self): x = NotImplementedError raise SystemError and note that arbitrarily complex expressions can be involved in the raise statement: def f(self): raise NotImplementedError, "*"*14 + " msg " + "*"*14 so the distance between LOAD_GLOBAL "NotImplementedError" and RAISE_VARARGS can vary. Still, this seems like a better approximation to the truth than assuming a priori that all raise statements imply abstract methods. Index: checker.py =================================================================== RCS file: /cvsroot/pychecker/pychecker/pychecker/checker.py,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** checker.py 6 Jun 2004 15:12:24 -0000 1.74 --- checker.py 15 Jul 2004 03:39:44 -0000 1.75 *************** *** 361,369 **** func_code, bytes, i, maxCode, extended_arg = \ OP.initFuncCode(self.methods[m].function) ! # abstract if the first conditional is RAISE_VARARGS while i < maxCode: op, oparg, i, extended_arg = OP.getInfo(bytes, i, extended_arg) ! if OP.RAISE_VARARGS(op): ! return 1 if OP.conditional(op): break --- 361,375 ---- func_code, bytes, i, maxCode, extended_arg = \ OP.initFuncCode(self.methods[m].function) ! # abstract if the first opcode is RAISE_VARARGS and it raises ! # NotImplementedError ! arg = "" while i < maxCode: op, oparg, i, extended_arg = OP.getInfo(bytes, i, extended_arg) ! if OP.LOAD_GLOBAL(op): ! arg = func_code.co_names[oparg] ! elif OP.RAISE_VARARGS(op): ! # if we saw NotImplementedError sometime before the raise ! # assume it's related to this raise stmt ! return arg == "NotImplementedError" if OP.conditional(op): break |