From: <fwi...@us...> - 2006-05-19 19:04:33
|
Revision: 2746 Author: fwierzbicki Date: 2006-05-19 12:04:30 -0700 (Fri, 19 May 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2746&view=rev Log Message: ----------- cleanup of new-style class support. Modified Paths: -------------- trunk/jython/src/org/python/core/PyComplex.java Modified: trunk/jython/src/org/python/core/PyComplex.java =================================================================== --- trunk/jython/src/org/python/core/PyComplex.java 2006-05-19 19:04:09 UTC (rev 2745) +++ trunk/jython/src/org/python/core/PyComplex.java 2006-05-19 19:04:30 UTC (rev 2746) @@ -10,6 +10,7 @@ static PyComplex J = new PyComplex(0, 1.); + //~ BEGIN GENERATED REGION -- DO NOT EDIT SEE gexpose.py /* type info */ public static final String exposed_name="complex"; @@ -457,7 +458,7 @@ } dict.__setitem__("__rdiv__",new PyMethodDescr("__rdiv__",PyComplex.class,1,1,new exposed___rdiv__(null,null))); - class exposed__rdivmod__ extends PyBuiltinFunctionNarrow { + class exposed___rdivmod__ extends PyBuiltinFunctionNarrow { private PyComplex self; @@ -465,13 +466,13 @@ return self; } - exposed__rdivmod__(PyComplex self,PyBuiltinFunction.Info info) { + exposed___rdivmod__(PyComplex self,PyBuiltinFunction.Info info) { super(info); this.self=self; } public PyBuiltinFunction makeBound(PyObject self) { - return new exposed__rdivmod__((PyComplex)self,info); + return new exposed___rdivmod__((PyComplex)self,info); } public PyObject __call__(PyObject arg0) { @@ -490,7 +491,7 @@ } } - dict.__setitem__("_rdivmod__",new PyMethodDescr("_rdivmod__",PyComplex.class,1,1,new exposed__rdivmod__(null,null))); + dict.__setitem__("__rdivmod__",new PyMethodDescr("__rdivmod__",PyComplex.class,1,1,new exposed___rdivmod__(null,null))); class exposed___rfloordiv__ extends PyBuiltinFunctionNarrow { private PyComplex self; @@ -954,12 +955,13 @@ dict.__setitem__("__hash__",new PyMethodDescr("__hash__",PyComplex.class,0,0,new exposed___hash__(null,null))); dict.__setitem__("__new__",new PyNewWrapper(PyComplex.class,"__new__",-1,-1) { - public PyObject new_impl(boolean init,PyType subtype,PyObject[]args,String[]keywords) { - return complex_new(this,init,subtype,args,keywords); - } + public PyObject new_impl(boolean init,PyType subtype,PyObject[]args,String[]keywords) { + return complex_new(this,init,subtype,args,keywords); + } - }); + }); } + //~ END GENERATED REGION -- DO NOT EDIT SEE gexpose.py public static PyObject complex_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[] args, String[] keywords) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-04-07 05:01:28
|
Revision: 4313 http://jython.svn.sourceforge.net/jython/?rev=4313&view=rev Author: pjenvey Date: 2008-04-06 22:01:27 -0700 (Sun, 06 Apr 2008) Log Message: ----------- cleanup complex __new__ closes out #1514533 Modified Paths: -------------- trunk/jython/src/org/python/core/PyComplex.java Modified: trunk/jython/src/org/python/core/PyComplex.java =================================================================== --- trunk/jython/src/org/python/core/PyComplex.java 2008-04-07 03:56:47 UTC (rev 4312) +++ trunk/jython/src/org/python/core/PyComplex.java 2008-04-07 05:01:27 UTC (rev 4313) @@ -14,93 +14,93 @@ @ExposedType(name = "complex") public class PyComplex extends PyObject { + public static final PyType TYPE = PyType.fromClass(PyComplex.class); + @ExposedGet public double real, imag; static PyComplex J = new PyComplex(0, 1.); @ExposedNew - public static PyObject complex_new(PyNewWrapper new_, - boolean init, - PyType subtype, - PyObject[] args, - String[] keywords) { - if (args.length == 0) { - if (new_.for_type == subtype) { - return new PyComplex(0, 0); - } - return new PyComplexDerived(subtype, 0, 0); - } - - if (args.length > 2) - throw Py.TypeError("complex() "+"takes at most 2 arguments (" + - args.length + " given)"); - - // optimize complex(int, int) here? - + public static PyObject complex_new(PyNewWrapper new_, boolean init, PyType subtype, + PyObject[] args, String[] keywords) { ArgParser ap = new ArgParser("complex", args, keywords, "real", "imag"); PyObject real = ap.getPyObject(0, Py.Zero); PyObject imag = ap.getPyObject(1, null); - if (imag != null) { - if (real instanceof PyString) - throw Py.TypeError("complex() " + - "can't take second arg if first is a string"); - if (imag instanceof PyString) - throw Py.TypeError("complex() " + - "second arg can't be a string"); - } - // Special-case for single argument that is already complex if (real.getType() == TYPE && new_.for_type == subtype && imag == null) { return real; } + if (real instanceof PyString) { + if (imag != null) { + throw Py.TypeError("complex() can't take second arg if first is a string"); + } + return real.__complex__(); + } + if (imag != null && imag instanceof PyString) { + throw Py.TypeError("complex() second arg can't be a string"); + } - PyComplex ret = null; try { - ret = real.__complex__(); + real = real.__complex__(); } catch (PyException pye) { - // i.e PyString.__complex__ throws ValueError - if (!(Py.matchException(pye, Py.AttributeError))) throw pye; + if (!Py.matchException(pye, Py.AttributeError)) { + // __complex__ not supported + throw pye; + } + // otherwise try other means } - try { - if (ret == null) - ret = new PyComplex(real.__float__().getValue(), 0); - if (imag != null) { - if (ret == real) - ret = new PyComplex(ret.real, ret.imag); - if (imag instanceof PyComplex) { - // optimize away __mul__() - // IMO only allowed on pure PyComplex objects, but CPython - // does it on all complex subtypes, so I do too. - PyComplex c = (PyComplex) imag; - ret.real -= c.imag; - ret.imag += c.real; - } else { - // CPython doesn't call __complex__ on second argument - ret.imag += imag.__float__().getValue(); + PyComplex complexReal; + PyComplex complexImag; + PyObject toFloat = null; + if (real instanceof PyComplex) { + complexReal = (PyComplex)real; + } else { + try { + toFloat = real.__float__(); + } catch (PyException pye) { + if (Py.matchException(pye, Py.AttributeError)) { + // __float__ not supported + throw Py.TypeError("complex() argument must be a string or a number"); } + throw pye; } - if (new_.for_type == subtype) { - return ret; - } else { - return new PyComplexDerived(subtype, ret.real, ret.imag); + if (!(toFloat instanceof PyFloat)) { + throw Py.TypeError(String.format("__float__ returned non-float (type %.200s)", + imag.getType().fastGetName())); } - } catch (PyException pye) { - // convert all AttributeErrors except on PyInstance to TypeError - if (Py.matchException(pye, Py.AttributeError)) { - Object o = (ret == null ? real : imag); - if (!(o instanceof PyInstance)) - throw Py.TypeError("complex() " + - "argument must be a string or a number"); + complexReal = new PyComplex(((PyFloat)toFloat).getValue()); + } + + if (imag == null) { + complexImag = new PyComplex(0.0); + } else if (imag instanceof PyComplex) { + complexImag = (PyComplex)imag; + } else { + toFloat = null; + try { + toFloat = imag.__float__(); + } catch (PyException pye) { + if (Py.matchException(pye, Py.AttributeError)) { + // __float__ not supported + throw Py.TypeError("complex() argument must be a string or a number"); + } + throw pye; } - throw pye; + if (!(toFloat instanceof PyFloat)) { + throw Py.TypeError(String.format("__float__ returned non-float (type %.200s)", + imag.getType().fastGetName())); + } + complexImag = new PyComplex(((PyFloat)toFloat).getValue()); } + + complexReal.real -= complexImag.imag; + complexReal.imag += complexImag.real; + return complexReal; } - public static final PyType TYPE = PyType.fromClass(PyComplex.class); - public PyComplex(PyType subtype, double r, double i) { super(subtype); real = r; @@ -111,6 +111,10 @@ this(TYPE, r, i); } + public PyComplex(double r) { + this(r, 0.0); + } + public final PyFloat getReal() { return Py.newFloat(real); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-04-07 05:21:09
|
Revision: 4314 http://jython.svn.sourceforge.net/jython/?rev=4314&view=rev Author: pjenvey Date: 2008-04-06 22:21:05 -0700 (Sun, 06 Apr 2008) Log Message: ----------- oops, broke PyComplexDerived Modified Paths: -------------- trunk/jython/src/org/python/core/PyComplex.java Modified: trunk/jython/src/org/python/core/PyComplex.java =================================================================== --- trunk/jython/src/org/python/core/PyComplex.java 2008-04-07 05:01:27 UTC (rev 4313) +++ trunk/jython/src/org/python/core/PyComplex.java 2008-04-07 05:21:05 UTC (rev 4314) @@ -98,6 +98,9 @@ complexReal.real -= complexImag.imag; complexReal.imag += complexImag.real; + if (new_.for_type != subtype) { + complexReal = new PyComplexDerived(subtype, complexReal.real, complexReal.imag); + } return complexReal; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |