Index: src/org/python/core/PySequence.java =================================================================== --- src/org/python/core/PySequence.java (revision 3416) +++ src/org/python/core/PySequence.java (working copy) @@ -474,4 +474,32 @@ } return super.__tojava__(c); } + + /** + * Return sequence-specific error messages suitable for substitution. + * + * {0} is the op name. + * {1} is the left operand type. + * {2} is the right operand type. + */ + protected String unsupportedopMessage(String op, PyObject o2) { + if (op.equals("*")) { + return "can''t multiply sequence by non-int of type ''{2}''"; + } + return null; + } + + /** + * Return sequence-specific error messages suitable for substitution. + * + * {0} is the op name. + * {1} is the left operand type. + * {2} is the right operand type. + */ + protected String runsupportedopMessage(String op, PyObject o2) { + if (op.equals("*")) { + return "can''t multiply sequence by non-int of type ''{1}''"; + } + return null; + } } Index: src/org/python/core/PyString.java =================================================================== --- src/org/python/core/PyString.java (revision 3416) +++ src/org/python/core/PyString.java (working copy) @@ -126,142 +126,154 @@ } dict.__setitem__("__ge__",new PyMethodDescr("__ge__",PyString.class,1,1,new exposed___ge__(null,null))); - class exposed___getitem__ extends PyBuiltinMethodNarrow { + class exposed___add__ extends PyBuiltinMethodNarrow { - exposed___getitem__(PyObject self,PyBuiltinFunction.Info info) { + exposed___add__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___getitem__(self,info); + return new exposed___add__(self,info); } public PyObject __call__(PyObject arg0) { - PyObject ret=((PyString)self).seq___finditem__(arg0); - if (ret==null) { - throw Py.IndexError("index out of range: "+arg0); - } + PyObject ret=((PyString)self).str___add__(arg0); + if (ret==null) + return Py.NotImplemented; return ret; } } - dict.__setitem__("__getitem__",new PyMethodDescr("__getitem__",PyString.class,1,1,new exposed___getitem__(null,null))); - class exposed___getslice__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__add__",new PyMethodDescr("__add__",PyString.class,1,1,new exposed___add__(null,null))); + class exposed___mod__ extends PyBuiltinMethodNarrow { - exposed___getslice__(PyObject self,PyBuiltinFunction.Info info) { + exposed___mod__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___getslice__(self,info); + return new exposed___mod__(self,info); } - public PyObject __call__(PyObject arg0,PyObject arg1,PyObject arg2) { - return((PyString)self).seq___getslice__(arg0,arg1,arg2); + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyString)self).str___mod__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; } - public PyObject __call__(PyObject arg0,PyObject arg1) { - return((PyString)self).seq___getslice__(arg0,arg1); - } - } - dict.__setitem__("__getslice__",new PyMethodDescr("__getslice__",PyString.class,2,3,new exposed___getslice__(null,null))); - class exposed___contains__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__mod__",new PyMethodDescr("__mod__",PyString.class,1,1,new exposed___mod__(null,null))); + class exposed___mul__ extends PyBuiltinMethodNarrow { - exposed___contains__(PyObject self,PyBuiltinFunction.Info info) { + exposed___mul__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___contains__(self,info); + return new exposed___mul__(self,info); } public PyObject __call__(PyObject arg0) { - return Py.newBoolean(((PyString)self).str___contains__(arg0)); + PyObject ret=((PyString)self).str___mul__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; } } - dict.__setitem__("__contains__",new PyMethodDescr("__contains__",PyString.class,1,1,new exposed___contains__(null,null))); - class exposed___len__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__mul__",new PyMethodDescr("__mul__",PyString.class,1,1,new exposed___mul__(null,null))); + class exposed___rmul__ extends PyBuiltinMethodNarrow { - exposed___len__(PyObject self,PyBuiltinFunction.Info info) { + exposed___rmul__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___len__(self,info); + return new exposed___rmul__(self,info); } - public PyObject __call__() { - return Py.newInteger(((PyString)self).str___len__()); + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyString)self).str___rmul__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; } } - dict.__setitem__("__len__",new PyMethodDescr("__len__",PyString.class,0,0,new exposed___len__(null,null))); - class exposed___add__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__rmul__",new PyMethodDescr("__rmul__",PyString.class,1,1,new exposed___rmul__(null,null))); + class exposed___getitem__ extends PyBuiltinMethodNarrow { - exposed___add__(PyObject self,PyBuiltinFunction.Info info) { + exposed___getitem__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___add__(self,info); + return new exposed___getitem__(self,info); } public PyObject __call__(PyObject arg0) { - return((PyString)self).str___add__(arg0); + PyObject ret=((PyString)self).seq___finditem__(arg0); + if (ret==null) { + throw Py.IndexError("index out of range: "+arg0); + } + return ret; } } - dict.__setitem__("__add__",new PyMethodDescr("__add__",PyString.class,1,1,new exposed___add__(null,null))); - class exposed___mod__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__getitem__",new PyMethodDescr("__getitem__",PyString.class,1,1,new exposed___getitem__(null,null))); + class exposed___getslice__ extends PyBuiltinMethodNarrow { - exposed___mod__(PyObject self,PyBuiltinFunction.Info info) { + exposed___getslice__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___mod__(self,info); + return new exposed___getslice__(self,info); } - public PyObject __call__(PyObject arg0) { - return((PyString)self).str___mod__(arg0); + public PyObject __call__(PyObject arg0,PyObject arg1,PyObject arg2) { + return((PyString)self).seq___getslice__(arg0,arg1,arg2); } + public PyObject __call__(PyObject arg0,PyObject arg1) { + return((PyString)self).seq___getslice__(arg0,arg1); + } + } - dict.__setitem__("__mod__",new PyMethodDescr("__mod__",PyString.class,1,1,new exposed___mod__(null,null))); - class exposed___mul__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__getslice__",new PyMethodDescr("__getslice__",PyString.class,2,3,new exposed___getslice__(null,null))); + class exposed___contains__ extends PyBuiltinMethodNarrow { - exposed___mul__(PyObject self,PyBuiltinFunction.Info info) { + exposed___contains__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___mul__(self,info); + return new exposed___contains__(self,info); } public PyObject __call__(PyObject arg0) { - return((PyString)self).str___mul__(arg0); + return Py.newBoolean(((PyString)self).str___contains__(arg0)); } } - dict.__setitem__("__mul__",new PyMethodDescr("__mul__",PyString.class,1,1,new exposed___mul__(null,null))); - class exposed___rmul__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__contains__",new PyMethodDescr("__contains__",PyString.class,1,1,new exposed___contains__(null,null))); + class exposed___len__ extends PyBuiltinMethodNarrow { - exposed___rmul__(PyObject self,PyBuiltinFunction.Info info) { + exposed___len__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___rmul__(self,info); + return new exposed___len__(self,info); } - public PyObject __call__(PyObject arg0) { - return((PyString)self).str___rmul__(arg0); + public PyObject __call__() { + return Py.newInteger(((PyString)self).str___len__()); } } - dict.__setitem__("__rmul__",new PyMethodDescr("__rmul__",PyString.class,1,1,new exposed___rmul__(null,null))); + dict.__setitem__("__len__",new PyMethodDescr("__len__",PyString.class,0,0,new exposed___len__(null,null))); class exposed___str__ extends PyBuiltinMethodNarrow { exposed___str__(PyObject self,PyBuiltinFunction.Info info) { @@ -2182,14 +2194,14 @@ final PyObject str___mul__(PyObject o) { if (!(o instanceof PyInteger || o instanceof PyLong)) - throw Py.TypeError("can't multiply sequence to non-int"); + return null; int count = ((PyInteger)o.__int__()).getValue(); return repeat(count); } final PyObject str___rmul__(PyObject o) { if (!(o instanceof PyInteger || o instanceof PyLong)) - throw Py.TypeError("can't multiply sequence to non-int"); + return null; int count = ((PyInteger)o.__int__()).getValue(); return repeat(count); } @@ -3606,6 +3618,12 @@ return internedString(); } + protected String unsupportedopMessage(String op, PyObject o2) { + if (op.equals("+")) { + return "cannot concatenate ''{1}'' and ''{2}'' objects"; + } + return super.unsupportedopMessage(op, o2); + } } final class StringFormatter Index: src/org/python/core/PyTuple.java =================================================================== --- src/org/python/core/PyTuple.java (revision 3416) +++ src/org/python/core/PyTuple.java (working copy) @@ -139,126 +139,135 @@ } dict.__setitem__("__ge__",new PyMethodDescr("__ge__",PyTuple.class,1,1,new exposed___ge__(null,null))); - class exposed___getitem__ extends PyBuiltinMethodNarrow { + class exposed___add__ extends PyBuiltinMethodNarrow { - exposed___getitem__(PyObject self,PyBuiltinFunction.Info info) { + exposed___add__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___getitem__(self,info); + return new exposed___add__(self,info); } public PyObject __call__(PyObject arg0) { - PyObject ret=((PyTuple)self).seq___finditem__(arg0); - if (ret==null) { - throw Py.IndexError("index out of range: "+arg0); - } + PyObject ret=((PyTuple)self).tuple___add__(arg0); + if (ret==null) + return Py.NotImplemented; return ret; } } - dict.__setitem__("__getitem__",new PyMethodDescr("__getitem__",PyTuple.class,1,1,new exposed___getitem__(null,null))); - class exposed___getslice__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__add__",new PyMethodDescr("__add__",PyTuple.class,1,1,new exposed___add__(null,null))); + class exposed___mul__ extends PyBuiltinMethodNarrow { - exposed___getslice__(PyObject self,PyBuiltinFunction.Info info) { + exposed___mul__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___getslice__(self,info); + return new exposed___mul__(self,info); } - public PyObject __call__(PyObject arg0,PyObject arg1,PyObject arg2) { - return((PyTuple)self).seq___getslice__(arg0,arg1,arg2); + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyTuple)self).tuple___mul__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; } - public PyObject __call__(PyObject arg0,PyObject arg1) { - return((PyTuple)self).seq___getslice__(arg0,arg1); - } - } - dict.__setitem__("__getslice__",new PyMethodDescr("__getslice__",PyTuple.class,2,3,new exposed___getslice__(null,null))); - class exposed___contains__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__mul__",new PyMethodDescr("__mul__",PyTuple.class,1,1,new exposed___mul__(null,null))); + class exposed___rmul__ extends PyBuiltinMethodNarrow { - exposed___contains__(PyObject self,PyBuiltinFunction.Info info) { + exposed___rmul__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___contains__(self,info); + return new exposed___rmul__(self,info); } public PyObject __call__(PyObject arg0) { - return Py.newBoolean(((PyTuple)self).tuple___contains__(arg0)); + PyObject ret=((PyTuple)self).tuple___rmul__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; } } - dict.__setitem__("__contains__",new PyMethodDescr("__contains__",PyTuple.class,1,1,new exposed___contains__(null,null))); - class exposed___len__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__rmul__",new PyMethodDescr("__rmul__",PyTuple.class,1,1,new exposed___rmul__(null,null))); + class exposed___getitem__ extends PyBuiltinMethodNarrow { - exposed___len__(PyObject self,PyBuiltinFunction.Info info) { + exposed___getitem__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___len__(self,info); + return new exposed___getitem__(self,info); } - public PyObject __call__() { - return Py.newInteger(((PyTuple)self).tuple___len__()); + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyTuple)self).seq___finditem__(arg0); + if (ret==null) { + throw Py.IndexError("index out of range: "+arg0); + } + return ret; } } - dict.__setitem__("__len__",new PyMethodDescr("__len__",PyTuple.class,0,0,new exposed___len__(null,null))); - class exposed___add__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__getitem__",new PyMethodDescr("__getitem__",PyTuple.class,1,1,new exposed___getitem__(null,null))); + class exposed___getslice__ extends PyBuiltinMethodNarrow { - exposed___add__(PyObject self,PyBuiltinFunction.Info info) { + exposed___getslice__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___add__(self,info); + return new exposed___getslice__(self,info); } - public PyObject __call__(PyObject arg0) { - return((PyTuple)self).tuple___add__(arg0); + public PyObject __call__(PyObject arg0,PyObject arg1,PyObject arg2) { + return((PyTuple)self).seq___getslice__(arg0,arg1,arg2); } + public PyObject __call__(PyObject arg0,PyObject arg1) { + return((PyTuple)self).seq___getslice__(arg0,arg1); + } + } - dict.__setitem__("__add__",new PyMethodDescr("__add__",PyTuple.class,1,1,new exposed___add__(null,null))); - class exposed___mul__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__getslice__",new PyMethodDescr("__getslice__",PyTuple.class,2,3,new exposed___getslice__(null,null))); + class exposed___contains__ extends PyBuiltinMethodNarrow { - exposed___mul__(PyObject self,PyBuiltinFunction.Info info) { + exposed___contains__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___mul__(self,info); + return new exposed___contains__(self,info); } public PyObject __call__(PyObject arg0) { - return((PyTuple)self).tuple___mul__(arg0); + return Py.newBoolean(((PyTuple)self).tuple___contains__(arg0)); } } - dict.__setitem__("__mul__",new PyMethodDescr("__mul__",PyTuple.class,1,1,new exposed___mul__(null,null))); - class exposed___rmul__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__contains__",new PyMethodDescr("__contains__",PyTuple.class,1,1,new exposed___contains__(null,null))); + class exposed___len__ extends PyBuiltinMethodNarrow { - exposed___rmul__(PyObject self,PyBuiltinFunction.Info info) { + exposed___len__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___rmul__(self,info); + return new exposed___len__(self,info); } - public PyObject __call__(PyObject arg0) { - return((PyTuple)self).tuple___rmul__(arg0); + public PyObject __call__() { + return Py.newInteger(((PyTuple)self).tuple___len__()); } } - dict.__setitem__("__rmul__",new PyMethodDescr("__rmul__",PyTuple.class,1,1,new exposed___rmul__(null,null))); + dict.__setitem__("__len__",new PyMethodDescr("__len__",PyTuple.class,0,0,new exposed___len__(null,null))); class exposed___getnewargs__ extends PyBuiltinMethodNarrow { exposed___getnewargs__(PyObject self,PyBuiltinFunction.Info info) { @@ -458,14 +467,14 @@ final PyObject tuple___mul__(PyObject o) { if (!(o instanceof PyInteger || o instanceof PyLong)) - throw Py.TypeError("can't multiply sequence to non-int"); + return null; int count = ((PyInteger)o.__int__()).getValue(); return repeat(count); } final PyObject tuple___rmul__(PyObject o) { if (!(o instanceof PyInteger || o instanceof PyLong)) - throw Py.TypeError("can't multiply sequence to non-int"); + return null; int count = ((PyInteger)o.__int__()).getValue(); return repeat(count); } @@ -616,4 +625,11 @@ } }; } + + protected String unsupportedopMessage(String op, PyObject o2) { + if (op.equals("+")) { + return "can only concatenate tuple (not \"{2}\") to tuple"; + } + return super.unsupportedopMessage(op, o2); + } } Index: src/org/python/core/PyUnicode.java =================================================================== --- src/org/python/core/PyUnicode.java (revision 3416) +++ src/org/python/core/PyUnicode.java (working copy) @@ -53,126 +53,135 @@ } dict.__setitem__("__eq__",new PyMethodDescr("__eq__",PyUnicode.class,1,1,new exposed___eq__(null,null))); - class exposed___getitem__ extends PyBuiltinMethodNarrow { + class exposed___add__ extends PyBuiltinMethodNarrow { - exposed___getitem__(PyObject self,PyBuiltinFunction.Info info) { + exposed___add__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___getitem__(self,info); + return new exposed___add__(self,info); } public PyObject __call__(PyObject arg0) { - PyObject ret=((PyUnicode)self).seq___finditem__(arg0); - if (ret==null) { - throw Py.IndexError("index out of range: "+arg0); - } + PyObject ret=((PyUnicode)self).unicode___add__(arg0); + if (ret==null) + return Py.NotImplemented; return ret; } } - dict.__setitem__("__getitem__",new PyMethodDescr("__getitem__",PyUnicode.class,1,1,new exposed___getitem__(null,null))); - class exposed___getslice__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__add__",new PyMethodDescr("__add__",PyUnicode.class,1,1,new exposed___add__(null,null))); + class exposed___mul__ extends PyBuiltinMethodNarrow { - exposed___getslice__(PyObject self,PyBuiltinFunction.Info info) { + exposed___mul__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___getslice__(self,info); + return new exposed___mul__(self,info); } - public PyObject __call__(PyObject arg0,PyObject arg1,PyObject arg2) { - return((PyUnicode)self).seq___getslice__(arg0,arg1,arg2); + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyUnicode)self).unicode___mul__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; } - public PyObject __call__(PyObject arg0,PyObject arg1) { - return((PyUnicode)self).seq___getslice__(arg0,arg1); - } - } - dict.__setitem__("__getslice__",new PyMethodDescr("__getslice__",PyUnicode.class,2,3,new exposed___getslice__(null,null))); - class exposed___contains__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__mul__",new PyMethodDescr("__mul__",PyUnicode.class,1,1,new exposed___mul__(null,null))); + class exposed___rmul__ extends PyBuiltinMethodNarrow { - exposed___contains__(PyObject self,PyBuiltinFunction.Info info) { + exposed___rmul__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___contains__(self,info); + return new exposed___rmul__(self,info); } public PyObject __call__(PyObject arg0) { - return Py.newBoolean(((PyUnicode)self).unicode___contains__(arg0)); + PyObject ret=((PyUnicode)self).unicode___rmul__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; } } - dict.__setitem__("__contains__",new PyMethodDescr("__contains__",PyUnicode.class,1,1,new exposed___contains__(null,null))); - class exposed___len__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__rmul__",new PyMethodDescr("__rmul__",PyUnicode.class,1,1,new exposed___rmul__(null,null))); + class exposed___getitem__ extends PyBuiltinMethodNarrow { - exposed___len__(PyObject self,PyBuiltinFunction.Info info) { + exposed___getitem__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___len__(self,info); + return new exposed___getitem__(self,info); } - public PyObject __call__() { - return Py.newInteger(((PyUnicode)self).unicode___len__()); + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyUnicode)self).seq___finditem__(arg0); + if (ret==null) { + throw Py.IndexError("index out of range: "+arg0); + } + return ret; } } - dict.__setitem__("__len__",new PyMethodDescr("__len__",PyUnicode.class,0,0,new exposed___len__(null,null))); - class exposed___add__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__getitem__",new PyMethodDescr("__getitem__",PyUnicode.class,1,1,new exposed___getitem__(null,null))); + class exposed___getslice__ extends PyBuiltinMethodNarrow { - exposed___add__(PyObject self,PyBuiltinFunction.Info info) { + exposed___getslice__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___add__(self,info); + return new exposed___getslice__(self,info); } - public PyObject __call__(PyObject arg0) { - return((PyUnicode)self).unicode___add__(arg0); + public PyObject __call__(PyObject arg0,PyObject arg1,PyObject arg2) { + return((PyUnicode)self).seq___getslice__(arg0,arg1,arg2); } + public PyObject __call__(PyObject arg0,PyObject arg1) { + return((PyUnicode)self).seq___getslice__(arg0,arg1); + } + } - dict.__setitem__("__add__",new PyMethodDescr("__add__",PyUnicode.class,1,1,new exposed___add__(null,null))); - class exposed___mul__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__getslice__",new PyMethodDescr("__getslice__",PyUnicode.class,2,3,new exposed___getslice__(null,null))); + class exposed___contains__ extends PyBuiltinMethodNarrow { - exposed___mul__(PyObject self,PyBuiltinFunction.Info info) { + exposed___contains__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___mul__(self,info); + return new exposed___contains__(self,info); } public PyObject __call__(PyObject arg0) { - return((PyUnicode)self).unicode___mul__(arg0); + return Py.newBoolean(((PyUnicode)self).unicode___contains__(arg0)); } } - dict.__setitem__("__mul__",new PyMethodDescr("__mul__",PyUnicode.class,1,1,new exposed___mul__(null,null))); - class exposed___rmul__ extends PyBuiltinMethodNarrow { + dict.__setitem__("__contains__",new PyMethodDescr("__contains__",PyUnicode.class,1,1,new exposed___contains__(null,null))); + class exposed___len__ extends PyBuiltinMethodNarrow { - exposed___rmul__(PyObject self,PyBuiltinFunction.Info info) { + exposed___len__(PyObject self,PyBuiltinFunction.Info info) { super(self,info); } public PyBuiltinFunction bind(PyObject self) { - return new exposed___rmul__(self,info); + return new exposed___len__(self,info); } - public PyObject __call__(PyObject arg0) { - return((PyUnicode)self).unicode___rmul__(arg0); + public PyObject __call__() { + return Py.newInteger(((PyUnicode)self).unicode___len__()); } } - dict.__setitem__("__rmul__",new PyMethodDescr("__rmul__",PyUnicode.class,1,1,new exposed___rmul__(null,null))); + dict.__setitem__("__len__",new PyMethodDescr("__len__",PyUnicode.class,0,0,new exposed___len__(null,null))); class exposed___str__ extends PyBuiltinMethodNarrow { exposed___str__(PyObject self,PyBuiltinFunction.Info info) { Index: src/org/python/core/PyList.java =================================================================== --- src/org/python/core/PyList.java (revision 3416) +++ src/org/python/core/PyList.java (working copy) @@ -282,6 +282,82 @@ } dict.__setitem__("__setslice__",new PyMethodDescr("__setslice__",PyList.class,3,4,new exposed___setslice__(null,null))); + class exposed___add__ extends PyBuiltinMethodNarrow { + + exposed___add__(PyObject self,PyBuiltinFunction.Info info) { + super(self,info); + } + + public PyBuiltinFunction bind(PyObject self) { + return new exposed___add__(self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyList)self).list___add__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__add__",new PyMethodDescr("__add__",PyList.class,1,1,new exposed___add__(null,null))); + class exposed___radd__ extends PyBuiltinMethodNarrow { + + exposed___radd__(PyObject self,PyBuiltinFunction.Info info) { + super(self,info); + } + + public PyBuiltinFunction bind(PyObject self) { + return new exposed___radd__(self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyList)self).list___radd__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__radd__",new PyMethodDescr("__radd__",PyList.class,1,1,new exposed___radd__(null,null))); + class exposed___mul__ extends PyBuiltinMethodNarrow { + + exposed___mul__(PyObject self,PyBuiltinFunction.Info info) { + super(self,info); + } + + public PyBuiltinFunction bind(PyObject self) { + return new exposed___mul__(self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyList)self).list___mul__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__mul__",new PyMethodDescr("__mul__",PyList.class,1,1,new exposed___mul__(null,null))); + class exposed___rmul__ extends PyBuiltinMethodNarrow { + + exposed___rmul__(PyObject self,PyBuiltinFunction.Info info) { + super(self,info); + } + + public PyBuiltinFunction bind(PyObject self) { + return new exposed___rmul__(self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyList)self).list___rmul__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__rmul__",new PyMethodDescr("__rmul__",PyList.class,1,1,new exposed___rmul__(null,null))); class exposed_append extends PyBuiltinMethodNarrow { exposed_append(PyObject self,PyBuiltinFunction.Info info) { @@ -514,38 +590,6 @@ } dict.__setitem__("__len__",new PyMethodDescr("__len__",PyList.class,0,0,new exposed___len__(null,null))); - class exposed___add__ extends PyBuiltinMethodNarrow { - - exposed___add__(PyObject self,PyBuiltinFunction.Info info) { - super(self,info); - } - - public PyBuiltinFunction bind(PyObject self) { - return new exposed___add__(self,info); - } - - public PyObject __call__(PyObject arg0) { - return((PyList)self).list___add__(arg0); - } - - } - dict.__setitem__("__add__",new PyMethodDescr("__add__",PyList.class,1,1,new exposed___add__(null,null))); - class exposed___radd__ extends PyBuiltinMethodNarrow { - - exposed___radd__(PyObject self,PyBuiltinFunction.Info info) { - super(self,info); - } - - public PyBuiltinFunction bind(PyObject self) { - return new exposed___radd__(self,info); - } - - public PyObject __call__(PyObject arg0) { - return((PyList)self).list___radd__(arg0); - } - - } - dict.__setitem__("__radd__",new PyMethodDescr("__radd__",PyList.class,1,1,new exposed___radd__(null,null))); class exposed___iadd__ extends PyBuiltinMethodNarrow { exposed___iadd__(PyObject self,PyBuiltinFunction.Info info) { @@ -578,38 +622,6 @@ } dict.__setitem__("__imul__",new PyMethodDescr("__imul__",PyList.class,1,1,new exposed___imul__(null,null))); - class exposed___mul__ extends PyBuiltinMethodNarrow { - - exposed___mul__(PyObject self,PyBuiltinFunction.Info info) { - super(self,info); - } - - public PyBuiltinFunction bind(PyObject self) { - return new exposed___mul__(self,info); - } - - public PyObject __call__(PyObject arg0) { - return((PyList)self).list___mul__(arg0); - } - - } - dict.__setitem__("__mul__",new PyMethodDescr("__mul__",PyList.class,1,1,new exposed___mul__(null,null))); - class exposed___rmul__ extends PyBuiltinMethodNarrow { - - exposed___rmul__(PyObject self,PyBuiltinFunction.Info info) { - super(self,info); - } - - public PyBuiltinFunction bind(PyObject self) { - return new exposed___rmul__(self,info); - } - - public PyObject __call__(PyObject arg0) { - return((PyList)self).list___rmul__(arg0); - } - - } - dict.__setitem__("__rmul__",new PyMethodDescr("__rmul__",PyList.class,1,1,new exposed___rmul__(null,null))); class exposed___hash__ extends PyBuiltinMethodNarrow { exposed___hash__(PyObject self,PyBuiltinFunction.Info info) { @@ -913,26 +925,23 @@ } public PyObject __imul__(PyObject o) { - try { - return list___imul__(o); - } catch(PyException e) { - if(Py.matchException(e, Py.TypeError)) { - // We can't perform an in-place multiplication on o's type, so - // let o try to rmul this list. A new list will be created - // instead of modifying this one, but that's preferable to just - // blowing up on this operation. - PyObject result = o.__rmul__(this); - if(result != null) { - return result; - } + PyObject result = list___imul__(o); + if (result == null) { + // We can't perform an in-place multiplication on o's + // type, so let o try to rmul this list. A new list will + // be created instead of modifying this one, but that's + // preferable to just blowing up on this operation. + result = o.__rmul__(this); + if (result == null) { + throw Py.TypeError(_unsupportedop("*", o)); } - throw e; } + return result; } final PyObject list___imul__(PyObject o) { if (!(o instanceof PyInteger || o instanceof PyLong)) - throw Py.TypeError("can't multiply sequence to non-int"); + return null; int l = size(); int count = ((PyInteger)o.__int__()).getValue(); @@ -948,14 +957,14 @@ final PyObject list___mul__(PyObject o) { if (!(o instanceof PyInteger || o instanceof PyLong)) - throw Py.TypeError("can't multiply sequence to non-int"); + return null; int count = ((PyInteger)o.__int__()).getValue(); return repeat(count); } final PyObject list___rmul__(PyObject o) { if (!(o instanceof PyInteger || o instanceof PyLong)) - throw Py.TypeError("can't multiply sequence to non-int"); + return null; int count = ((PyInteger)o.__int__()).getValue(); return repeat(count); } @@ -1013,15 +1022,8 @@ if (op.equals("+")) { return "can only concatenate list (not \"{2}\") to list"; } - return null; + return super.unsupportedopMessage(op, o2); } - - protected String runsupportedopMessage(String op, PyObject o2) { - if (op.equals("+")) { - return "can only concatenate list (not \"{1}\") to list"; - } - return null; - } public String toString() { return list_toString(); Index: src/templates/tuple.expose =================================================================== --- src/templates/tuple.expose (revision 3416) +++ src/templates/tuple.expose (working copy) @@ -7,12 +7,10 @@ expose_meth: seq_> __getslice__ ooo? #expose_meth: seq_> __iter__ # -expose_binary: __ne__ __eq__ __lt__ __le__ __gt__ __ge__ +expose_binary: __ne__ __eq__ __lt__ __le__ __gt__ __ge__ __add__ __mul__ \ + __rmul__ expose_meth: :b __contains__ o expose_meth: :i __len__ -expose_meth: __add__ o -expose_meth: __mul__ o -expose_meth: __rmul__ o expose_meth: __getnewargs__ expose_meth: __hash__ `ideleg`(hashCode); Index: src/templates/list.expose =================================================================== --- src/templates/list.expose (revision 3416) +++ src/templates/list.expose (working copy) @@ -5,6 +5,7 @@ incl: sequence #expose_meth: seq_> __iter__ # exposed methods +expose_binary: __add__ __radd__ __mul__ __rmul__ expose_meth: :- append o expose_meth: :i count o expose_meth: :- extend o @@ -15,12 +16,8 @@ expose_meth: :- reverse expose_meth: :- sort o? expose_meth: :i __len__ -expose_meth: __add__ o -expose_meth: __radd__ o expose_meth: __iadd__ o expose_meth: __imul__ o -expose_meth: __mul__ o -expose_meth: __rmul__ o expose_meth: __hash__ `ideleg`(hashCode); expose_meth: __repr__ Index: src/templates/unicode.expose =================================================================== --- src/templates/unicode.expose (revision 3416) +++ src/templates/unicode.expose (working copy) @@ -5,12 +5,9 @@ expose_index_getitem: seq_> expose_meth: seq_> __getslice__ ooo? # -expose_binary: __ne__ __eq__ +expose_binary: __ne__ __eq__ __add__ __mul__ __rmul__ expose_meth: :b __contains__ o expose_meth: :i __len__ -expose_meth: __add__ o -expose_meth: __mul__ o -expose_meth: __rmul__ o expose_meth: __str__ expose_meth: __unicode__ expose_meth: __hash__ Index: src/templates/str.expose =================================================================== --- src/templates/str.expose (revision 3416) +++ src/templates/str.expose (working copy) @@ -5,13 +5,10 @@ expose_index_getitem: seq_> expose_meth: seq_> __getslice__ ooo? # -expose_binary: __ne__ __eq__ __lt__ __le__ __gt__ __ge__ +expose_binary: __ne__ __eq__ __lt__ __le__ __gt__ __ge__ __add__ __mod__ \ + __mul__ __rmul__ expose_meth: :b __contains__ o expose_meth: :i __len__ -expose_meth: __add__ o -expose_meth: __mod__ o -expose_meth: __mul__ o -expose_meth: __rmul__ o expose_meth: __str__ expose_meth: __unicode__ expose_meth: __hash__ Index: Lib/test/test_descr.py =================================================================== --- Lib/test/test_descr.py (revision 3416) +++ Lib/test/test_descr.py (working copy) @@ -3909,6 +3909,71 @@ except RuntimeError: pass +def subclass_binop(): + if verbose: + print "Testing binary ops with subclasses" + + def raises(exc, expected, callable, *args): + try: + callable(*args) + except exc, msg: + if str(msg) != expected: + raise TestFailed, "Message %r, expected %r" % (str(msg), + expected) + else: + raise TestFailed, "Expected %s" % exc + + class B(object): + pass + + class C(object): + def __radd__(self, o): + return '%r + C()' % (o,) + + def __rmul__(self, o): + return '%r * C()' % (o,) + + # Test strs, unicode, lists and tuples + mapping = [] + + # + binop + mapping.append((lambda o: 'foo' + o, + TypeError, "cannot concatenate 'str' and 'B' objects", + "'foo' + C()")) + # XXX: There's probably work to be done here besides just emulating this + # message + #mapping.append((lambda o: u'foo' + o, + # TypeError, + # 'coercing to Unicode: need string or buffer, B found', + # "u'foo' + C()")) + mapping.append((lambda o: u'foo' + o, + TypeError, "cannot concatenate 'unicode' and 'B' objects", + "u'foo' + C()")) + mapping.append((lambda o: [1, 2] + o, + TypeError, 'can only concatenate list (not "B") to list', + '[1, 2] + C()')) + mapping.append((lambda o: ('foo', 'bar') + o, + TypeError, 'can only concatenate tuple (not "B") to tuple', + "('foo', 'bar') + C()")) + + # * binop + mapping.append((lambda o: 'foo' * o, + TypeError, "can't multiply sequence by non-int of type 'B'", + "'foo' * C()")) + mapping.append((lambda o: u'foo' * o, + TypeError, "can't multiply sequence by non-int of type 'B'", + "u'foo' * C()")) + mapping.append((lambda o: [1, 2] * o, + TypeError, "can't multiply sequence by non-int of type 'B'", + '[1, 2] * C()')) + mapping.append((lambda o: ('foo', 'bar') * o, + TypeError, "can't multiply sequence by non-int of type 'B'", + "('foo', 'bar') * C()")) + + for func, bexc, bexc_msg, cresult in mapping: + raises(bexc, bexc_msg, lambda : func(B())) + vereq(func(C()), cresult) + def test_main(): testfuncs = [ weakref_segfault, # Must be first, somehow @@ -3998,6 +4063,7 @@ proxysuper, carloverre, filefault, + subclass_binop, ] if __name__ == '__main__': import sys