From: <th...@us...> - 2008-10-20 11:13:43
|
Revision: 5480 http://jython.svn.sourceforge.net/jython/?rev=5480&view=rev Author: thobes Date: 2008-10-20 11:13:38 +0000 (Mon, 20 Oct 2008) Log Message: ----------- Fixed the evaluation order bug made visual by test_generators. Added a test file for evaluation order tests. Modified Paths: -------------- trunk/jython/src/org/python/compiler/CodeCompiler.java Added Paths: ----------- trunk/jython/Lib/test/test_evalorder.py Added: trunk/jython/Lib/test/test_evalorder.py =================================================================== --- trunk/jython/Lib/test/test_evalorder.py (rev 0) +++ trunk/jython/Lib/test/test_evalorder.py 2008-10-20 11:13:38 UTC (rev 5480) @@ -0,0 +1,65 @@ +from unittest import TestCase +from test import test_support + +class Bucket(object): + def __init__(self, value): + self.__value = value + def _get(self): + return self.__value + def _set(self, value): + assert self.__value == value, "Value changed!" + value = property(_get,_set) + +class PropBucket(object): + def __init__(self): + self.__dict__['_d'] = {} + def __getattr__(self, attr): + value = self._d.setdefault(attr, 0) + self._d[attr] = value + 1 + return Bucket(value) + def __setattr__(self, attr, value): + value.append(attr) + +class EvaluationOrder(TestCase): + def test_TestFunctionality(self): + bucket = PropBucket() + try: + bucket.prop.value = bucket.prop.value + 0 + except AssertionError: + pass + else: + assert False, "PropBucket is not working" + def test_augassign(self): + bucket = PropBucket() + bucket.prop.value += 0 + def test_AssignOrder(self): + bucket = PropBucket() + expected = ['one','two','three'] + result = [] + bucket.one = bucket.two = bucket.three = result + assert result == expected, "expected %s, got %s" % (expected, result) + def test_operands(self): + m = [(2,), (1,)].pop + assert m() + m() == (1,2), "faulty operand order" + def test_arguments(self): + def one(a,b,c,d,*extra): + return reduce(lambda r,x: r+x,extra,a+b+c+d) + m = list((x,) for x in xrange(100,0,-1)).pop + value = one(m(),m(),m(),m()) + assert value == (1,2,3,4), "simple call, got: %s " % (value,) + value = one(m(),m(),d=m(),c=m()) + assert value == (5,6,8,7), "call with keywords, got: %s" % (value,) + value = one(m(),m(),m(),m(),m(),m()) + assert value == (9,10,11,12,13,14), "long call, got: %s" % (value,) + value = one(m(),m(),*[m(),m(),m(),m()]) + assert value == (15,16,17,18,19,20), "varcalls, got: %s" % (value,) + value = one(m(),m(),**dict(c=m(),d=m())) + assert value == (21,22,23,24), "varkeywordcall, got: %s" % (value,) + value = one(*[m(),m()],**dict(c=m(),d=m())) + assert value == (25,26,27,28), "bothvarcalls, got: %s" % (value,) + +def test_main(): + test_support.run_unittest(EvaluationOrder) + +if __name__ == '__main__': + test_main() Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-10-20 06:29:50 UTC (rev 5479) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-10-20 11:13:38 UTC (rev 5480) @@ -457,13 +457,13 @@ visit(node.value); if (node.targets.length == 1) { set(node.targets[0]); - return null; + } else { + int tmp = storeTop(); + for (exprType target : node.targets) { + set(target, tmp); + } + code.freeLocal(tmp); } - int tmp = storeTop(); - for (int i=node.targets.length-1; i>=0; i--) { - set(node.targets[i], tmp); - } - code.freeLocal(tmp); return null; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |