From: Thomas V. S. <tho...@us...> - 2010-12-28 09:55:53
|
Update of /cvsroot/pychecker/pychecker/pychecker In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv16180/pychecker Modified Files: CodeChecks.py Log Message: * pychecker/CodeChecks.py: Implement BUILD_SLICE, opcode 133. Now dis can be pychecked. Not sure what to push on stack for non-const slices though. Index: CodeChecks.py =================================================================== RCS file: /cvsroot/pychecker/pychecker/pychecker/CodeChecks.py,v retrieving revision 1.205 retrieving revision 1.206 diff -u -d -r1.205 -r1.206 --- CodeChecks.py 27 Dec 2010 18:16:22 -0000 1.205 +++ CodeChecks.py 28 Dec 2010 09:55:45 -0000 1.206 @@ -1583,6 +1583,45 @@ code.popStackItems(3) code.pushStack(newValue) +# example disassembly: +# (' 18 BUILD_LIST', 6, None) +# (' 21 STORE_FAST', 0, 'l') +# (' 24 LOAD_FAST', 0, 'l') +# (' 27 LOAD_CONST', 7, 0) +# (' 30 LOAD_CONST', 0, None) +# (' 33 LOAD_CONST', 2, 2) +# (' 36 BUILD_SLICE', 3, None) +def _BUILD_SLICE(oparg, operand, codeSource, code): + argCount = oparg + assert argCount in [2, 3] + + if argCount == 3: + start = code.stack[-3].data + stop = code.stack[-2].data + step = code.stack[-1].data + sourceName = code.stack[-4].data + else: + start = code.stack[-2].data + stop = code.stack[-1].data + step = None + sourceName = code.stack[-3].data + + if sourceName in code.constants: + source = code.constants[sourceName] + if step: + sl = source[start:stop:step] + else: + sl = source[start:stop] + # push new slice on stack + code.stack[-argCount:] = [Stack.Item(sl, types.ListType, 1, len(sl)), ] + else: + # FIXME: not sure what we do with a non-constant slice ? + # push a non-constant slice of the source on stack + code.stack[-argCount:] = [Stack.Item( + sourceName, types.ListType, 0, 1), ] + + _checkNoEffect(code) + # old pre-2.7 LIST_APPEND, argumentless def _LIST_APPEND(oparg, operand, codeSource, code): code.popStackItems(2) @@ -2145,7 +2184,6 @@ _STORE_SLICE3 = _unimplemented # FIXME: probably pop argument number of items ? _DUP_TOPX = _unimplemented -_BUILD_SLICE = _unimplemented # new in 2.7 _BUILD_SET = _unimplemented |